123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- #include <precomp.h>
- #include "tgbutton.h"
- #include <api/script/scriptmgr.h>
- #include <bfc/parse/paramparser.h>
- const wchar_t toggleButtonXuiObjectStr[] = L"ToggleButton"; // This is the xml tag
- char toggleButtonXuiSvcName[] = "ToggleButton xui object"; // this is the name of the xuiservice
- XMLParamPair ToggleButton::params[] = {
- {TOGGLEBUTTON_AUTOTOGGLE, L"AUTOTOGGLE"},
- #ifdef WASABI_COMPILE_CONFIG
- {TOGGLEBUTTON_CFGVAL, L"CFGVAL"},
- #endif
- };
- ToggleButton::ToggleButton() {
- param=0;
- getScriptObject()->vcpu_setInterface(toggleButtonGuid, (void *)static_cast<ToggleButton *>(this));
- getScriptObject()->vcpu_setClassName(L"ToggleButton");
- getScriptObject()->vcpu_setController(tgbuttonController);
- autotoggle = 1;
- #ifdef WASABI_COMPILE_CONFIG
- cfgVal = 1;
- #endif
- xuihandle = newXuiHandle();
- CreateXMLParameters(xuihandle);
-
- }
- void ToggleButton::CreateXMLParameters(int master_handle)
- {
- //TOGGLEBUTTON_PARENT::CreateXMLParameters(master_handle);
- int numParams = sizeof(params) / sizeof(params[0]);
- hintNumberOfParams(xuihandle, numParams);
- for (int i = 0;i < numParams;i++)
- addParam(xuihandle, params[i], XUI_ATTRIBUTE_IMPLIED);
- }
- ToggleButton::~ToggleButton() {
- }
- void ToggleButton::onLeftPush(int x, int y) {
- autoToggle();
- TOGGLEBUTTON_PARENT::onLeftPush(x, y);
- onToggle(getActivatedButton());
- }
- void ToggleButton::autoToggle() {
- if (autotoggle) {
- if (!getActivatedButton())
- setActivatedButton(1);
- else
- setActivatedButton(0);
- }
- }
- void ToggleButton::onToggle(int i) {
- scriptVar _y = SOM::makeVar(SCRIPT_INT);
- SOM::assign(&_y, i ? 1 : 0);
- script_onToggle(SCRIPT_CALL, getScriptObject(), _y);
- #ifdef WASABI_COMPILE_CONFIG
- getGuiObject()->guiobject_setCfgInt(i ? cfgVal : 0);
- #endif
- }
- int ToggleButton::setXuiParam(int _xuihandle, int xmlattributeid, const wchar_t *name, const wchar_t *value) {
- if (xuihandle == _xuihandle) {
- switch (xmlattributeid) {
- case TOGGLEBUTTON_AUTOTOGGLE: autotoggle = WTOI(value); return 1;
- #ifdef WASABI_COMPILE_CONFIG
- case TOGGLEBUTTON_CFGVAL:
- cfgVal = WTOI(value); return 1;
- #endif
- }
- }
- return TOGGLEBUTTON_PARENT::setXuiParam(_xuihandle, xmlattributeid, name, value);
- }
- #ifdef WASABI_COMPILE_CONFIG
- int ToggleButton::onReloadConfig() {
- TOGGLEBUTTON_PARENT::onReloadConfig();
- setActivatedButton(getGuiObject()->guiobject_getCfgInt());
- return 1;
- }
- #endif
- int ToggleButton::getCurCfgVal() {
- return cfgVal;
- }
- TgButtonScriptController _tgbuttonController;
- TgButtonScriptController *tgbuttonController=&_tgbuttonController;
- // -- Functions table -------------------------------------
- function_descriptor_struct TgButtonScriptController::exportedFunction[] = {
- {L"onToggle", 1, (void*)ToggleButton::script_onToggle },
- {L"getCurCfgVal", 0, (void*)ToggleButton::script_getCurCfgVal},
- };
- // --------------------------------------------------------
- const wchar_t *TgButtonScriptController::getClassName() {
- return L"ToggleButton";
- }
- const wchar_t *TgButtonScriptController::getAncestorClassName() {
- return L"Button";
- }
- ScriptObject *TgButtonScriptController::instantiate() {
- ToggleButton *tb = new ToggleButton;
- ASSERT(tb != NULL);
- return tb->getScriptObject();
- }
- void TgButtonScriptController::destroy(ScriptObject *o) {
- ToggleButton *tb = static_cast<ToggleButton *>(o->vcpu_getInterface(toggleButtonGuid));
- ASSERT(tb != NULL);
- delete tb;
- }
- void *TgButtonScriptController::encapsulate(ScriptObject *o) {
- return NULL;
- }
- void TgButtonScriptController::deencapsulate(void *o) {
- }
- int TgButtonScriptController::getNumFunctions() {
- return sizeof(exportedFunction) / sizeof(function_descriptor_struct);
- }
- const function_descriptor_struct *TgButtonScriptController::getExportedFunctions() {
- return exportedFunction;
- }
- GUID TgButtonScriptController::getClassGuid() {
- return toggleButtonGuid;
- }
- const wchar_t *ToggleButton::vcpu_getClassName() {
- return L"ToggleButton";
- }
- scriptVar ToggleButton::script_onToggle(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar is) {
- SCRIPT_FUNCTION_INIT;
- PROCESS_HOOKS1(o, tgbuttonController, is);
- SCRIPT_FUNCTION_CHECKABORTEVENT;
- SCRIPT_EXEC_EVENT1(o, is);
- }
- scriptVar ToggleButton::script_getCurCfgVal(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
- SCRIPT_FUNCTION_INIT;
- ToggleButton *tg = static_cast<ToggleButton*>(o->vcpu_getInterface(toggleButtonGuid));
- return MAKE_SCRIPT_INT(tg->getCurCfgVal());
- }
- //---
- const wchar_t nStatesTgButtonXuiObjectStr[] = L"NStatesButton"; // This is the xml tag
- char nStatesTgButtonXuiSvcName[] = "NStatesButton xui object"; // this is the name of the xuiservice
- XMLParamPair NStatesTgButton::params[] = {
- {NSTATESTGBUTTON_NSTATES, L"NSTATES"},
- {NSTATESTGBUTTON_ONEVSTATE, L"AUTOELEMENTS"},
- #ifdef WASABI_COMPILE_CONFIG
- {NSTATESTGBUTTON_CFGVALS, L"CFGVALS"},
- #endif
- };
- NStatesTgButton::NStatesTgButton() {
- getScriptObject()->vcpu_setInterface(NStatesTgButtonGuid, (void *)static_cast<NStatesTgButton*>(this));
- xuihandle = newXuiHandle();
- CreateXMLParameters(xuihandle);
- onevstate = 0;
- }
- void NStatesTgButton::CreateXMLParameters(int master_handle)
- {
- //NSTATESTGBUTTON_PARENT::CreateXMLParameters(master_handle);
- int numParams = sizeof(params) / sizeof(params[0]);
- hintNumberOfParams(xuihandle, numParams);
- for (int i = 0;i < numParams;i++)
- addParam(xuihandle, params[i], XUI_ATTRIBUTE_IMPLIED);
- }
- NStatesTgButton::~NStatesTgButton() {
- }
- int NStatesTgButton::setXuiParam(int _xuihandle, int xmlattributeid, const wchar_t *paramname, const wchar_t *strvalue) {
- if (_xuihandle == btn_getXuiHandle()) {
- switch (xmlattributeid) {
- case BUTTON_IMAGE: image = strvalue; break;
- case BUTTON_HOVERIMAGE: hover = strvalue; break;
- case BUTTON_DOWNIMAGE: down = strvalue; break;
- case BUTTON_ACTIVEIMAGE: active = strvalue; break;
- }
- }
- if (xuihandle == _xuihandle) {
- switch (xmlattributeid) {
- case NSTATESTGBUTTON_NSTATES:
- setNStates(WTOI(strvalue));
- return 1;
- case NSTATESTGBUTTON_ONEVSTATE:
- setOneVisualState(!WTOI(strvalue));
- return 1;
- #ifdef WASABI_COMPILE_CONFIG
- case NSTATESTGBUTTON_CFGVALS:
- cfgvals = strvalue;
- return 1;
- #endif
- }
- }
- return NSTATESTGBUTTON_PARENT::setXuiParam(_xuihandle, xmlattributeid, paramname, strvalue);
- }
- int NStatesTgButton::onInit() {
- setState(0);
- return NSTATESTGBUTTON_PARENT::onInit();
- }
- void NStatesTgButton::setOneVisualState(int v) {
- if (!!onevstate == !!v) return;
- onevstate = v;
- if (isPostOnInit()) {
- setupBitmaps();
- invalidate();
- }
- }
- void NStatesTgButton::setState(int n) {
- if (nstates <= 1) return;
- state = n;
- setupBitmaps();
- #ifdef WASABI_COMPILE_CONFIG
- if (!cfgvals.isempty()) {
- ParamParser pp(cfgvals);
- const wchar_t *p = pp.enumItem(state);
- if (p != NULL)
- setXmlParam(L"cfgval", p);
- } else {
- // if the skinner doesn't ask for custom config values,
- // simply use the current state number as the cfgval.
- setXmlParam(L"cfgval", StringPrintfW(L"%d", state));
- }
- #endif
- }
- int NStatesTgButton::getActivatedButton() {
- if (nstates <= 1) return NSTATESTGBUTTON_PARENT::getActivatedButton();
- return (getState() != 0);
- }
- void NStatesTgButton::autoToggle() {
- if (nstates <= 1) {
- NSTATESTGBUTTON_PARENT::autoToggle();
- return;
- } else {
- int s = (state+1) % nstates;
- setState(s);
- }
- }
- void NStatesTgButton::setupBitmaps() {
- if (nstates <= 1 || onevstate)
- setBitmaps(image, down, hover, active);
- else
- setBitmaps(StringPrintfW(L"%s%d", image.v(), state),
- StringPrintfW(L"%s%d", down.v(), state),
- StringPrintfW(L"%s%d", hover.v(), state) /*, StringPrintf("%s%d", image.v(), (state+1) % nstates)*/);
- }
- void NStatesTgButton::setActivatedButton(int a) {
- if (nstates <= 1) {
- NSTATESTGBUTTON_PARENT::setActivatedButton(a);
- return;
- }
-
- #ifdef WASABI_COMPILE_CONFIG
- if (!cfgvals.isempty()) {
- ParamParser pp(cfgvals);
- wchar_t t[64] = {0};
- wcsncpy(t, StringPrintfW(L"%d", a), 64);
- for (int i=0;i<pp.getNumItems();i++) {
- const wchar_t *p = pp.enumItem(i);
- if (WCSCASEEQLSAFE(p, t)) {
- setState(i);
- return;
- }
- }
- } else {
- if (!a)
- setState(0);
- else
- setState(a);
- }
- #endif
- }
- int NStatesTgButton::getCurCfgVal() {
- #ifdef WASABI_COMPILE_CONFIG
- if (!cfgvals.isempty()) {
- ParamParser pp(cfgvals);
- const wchar_t *p = pp.enumItem(state);
- if (p) return WTOI(p);
- return 0;
- } else {
- // if the skinner doesn't ask for custom config values,
- // simply use the current state number as the cfgval.
- return state;
- }
- #else
- return ToggleButton::getCurCfgVal();
- #endif
- }
|