aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/skin/widgets/tgbutton.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/skin/widgets/tgbutton.cpp')
-rw-r--r--Src/Wasabi/api/skin/widgets/tgbutton.cpp313
1 files changed, 313 insertions, 0 deletions
diff --git a/Src/Wasabi/api/skin/widgets/tgbutton.cpp b/Src/Wasabi/api/skin/widgets/tgbutton.cpp
new file mode 100644
index 00000000..1e19d021
--- /dev/null
+++ b/Src/Wasabi/api/skin/widgets/tgbutton.cpp
@@ -0,0 +1,313 @@
+#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
+}