/*
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not
distributed with this file, You can
obtain one at
http://mozilla.org/MPL/2.0/.
*/

#include "system.hpp"
#include "classes.hpp"
#pragma hdrstop

#include "Button.h"
#include "Console.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

TButton::TButton()
{
    iFeedbackBit = 0;
    bData = NULL;
    Clear();
};

TButton::~TButton(){};

void TButton::Clear(int i)
{
    pModelOn = NULL;
    pModelOff = NULL;
    bOn = false;
    if (i >= 0)
        FeedbackBitSet(i);
    Update(); // kasowanie bitu Feedback, o ile jakiś ustawiony
};

void TButton::Init(AnsiString asName, TModel3d *pModel, bool bNewOn)
{
    if (!pModel)
        return; // nie ma w czym szukać
    pModelOn = pModel->GetFromName(AnsiString(asName + "_on").c_str());
    pModelOff = pModel->GetFromName(AnsiString(asName + "_off").c_str());
    bOn = bNewOn;
    Update();
};

void TButton::Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel2)
{
    AnsiString str = Parser->GetNextSymbol().LowerCase();
    if (pModel1)
    { // poszukiwanie submodeli w modelu
        Init(str, pModel1, false);
        if (pModel2)
            if (!pModelOn && !pModelOff)
                Init(str, pModel2, false); // może w drugim będzie (jak nie w kabinie,
        // to w zewnętrznym)
    }
    else
    {
        pModelOn = NULL;
        pModelOff = NULL;
    }
};

void TButton::Update()
{
    if (bData != NULL)
        bOn = (*bData);
    if (pModelOn)
        pModelOn->iVisible = bOn;
    if (pModelOff)
        pModelOff->iVisible = !bOn;
    if (iFeedbackBit) // jeżeli generuje informację zwrotną
    {
        if (bOn) // zapalenie
            Console::BitsSet(iFeedbackBit);
        else
            Console::BitsClear(iFeedbackBit);
    }
};

void TButton::AssignBool(bool *bValue)
{
    bData = bValue;
}
