aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/skin/widgets/checkbox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/skin/widgets/checkbox.cpp')
-rw-r--r--Src/Wasabi/api/skin/widgets/checkbox.cpp262
1 files changed, 262 insertions, 0 deletions
diff --git a/Src/Wasabi/api/skin/widgets/checkbox.cpp b/Src/Wasabi/api/skin/widgets/checkbox.cpp
new file mode 100644
index 00000000..505687b2
--- /dev/null
+++ b/Src/Wasabi/api/skin/widgets/checkbox.cpp
@@ -0,0 +1,262 @@
+#include <precomp.h>
+#include "checkbox.h"
+#include <api/service/svcs/svc_action.h>
+#include <api/script/objects/c_script/c_text.h>
+#include <api/script/objects/c_script/c_button.h>
+#include <api/script/objects/guiobject.h>
+#include <api/script/scriptguid.h>
+#include <api/script/api_maki.h>
+
+// -----------------------------------------------------------------------
+CheckBox::CheckBox(const wchar_t *_text, const wchar_t *_radioid) :
+ textclicks(NULL), toggleclicks(NULL), text(_text), radioid(_radioid),
+ buttonGuiObj(NULL), use_radioval(0),
+ CHECKBOX_PARENT() { }
+
+CheckBox::~CheckBox() {
+ delete textclicks;
+ delete toggleclicks;
+}
+
+int CheckBox::onInit() {
+ int r = CHECKBOX_PARENT::onInit();
+ if (radioid.len()) {
+ abstract_setContent(L"wasabi.radiobutton.group");
+ // After we set the content for radio, we should register ourselves
+ // as a radio button under the radio group we are assigned.
+ GuiObject *radioGuiObj = abstract_findObject(radioid); // this will actually go down a level
+ if (radioGuiObj != NULL) {
+ ifc_window *radioRootWnd = *radioGuiObj; // explicit cast operator :)
+ // Now, once we have the rootwnd, we can send our radio group object a message, it will turn off other items as we turn on specific ones
+ if (radioRootWnd != NULL) {
+ sendAction(radioRootWnd, L"REGISTER", NULL, -1, -1, 0, 0, (void *)getGuiObject(), 4);
+ }
+ }
+ } else {
+ abstract_setContent(L"wasabi.checkbox.group");
+ }
+ return r;
+}
+
+void CheckBox::onNewContent() {
+ // remove all previous hooks because our content changed
+ delete toggleclicks;
+ toggleclicks = NULL;
+
+ delete textclicks;
+ textclicks = NULL;
+
+ // Capture the clicks on the button
+ buttonGuiObj = abstract_findObject(L"checkbox.toggle");
+ if (buttonGuiObj != NULL) {
+ toggleclicks = new ToggleClicks(*buttonGuiObj, this);
+ }
+
+ // Capture the clicks on the text
+ GuiObject *textGuiObj = abstract_findObject(L"checkbox.text");
+ if (textGuiObj != NULL) {
+ textclicks = new TextClicks(*textGuiObj, this);
+ }
+
+ // Set the text object to display the requested text.
+ updateText();
+}
+
+int CheckBox::getPreferences(int what) {
+ ifc_window *w = abstract_getContentRootWnd();
+ if (w != NULL)
+ return w->getPreferences(what);
+ return CHECKBOX_PARENT::getPreferences(what);
+}
+
+void CheckBox::setActivated(int activated, int writetocfg) {
+ // this is usually called as a response to onReloadConfig, but could also be called
+ // directly by a 3rd party, so if we can, we read the current value and do nothing if
+ // it hasn't changed.
+ GuiObject *toggleGuiObj = abstract_findObject(L"checkbox.toggle");
+ if (toggleGuiObj != NULL) {
+ C_Button buttonObj(*toggleGuiObj);
+ int act = buttonObj.getActivated();
+ if (!!act == !!activated) return;
+ buttonObj.setActivatedNoCallback(!!activated);
+ }
+ if (writetocfg) {
+ if (use_radioval) {
+ if (activated) {
+#ifdef WASABI_COMPILE_CONFIG
+ getGuiObject()->guiobject_setCfgString(radioval);
+#endif
+ if (radioval != 0) doAction();
+ }
+ } else {
+#ifdef WASABI_COMPILE_CONFIG
+ getGuiObject()->guiobject_setCfgInt(activated);
+#endif
+ if (activated) doAction();
+ }
+ }
+}
+
+// This is called by the click catchers
+void CheckBox::toggle(int self_switch) {
+
+ if (!buttonGuiObj) return;
+
+ int activated = !!isActivated();
+ if (self_switch) activated = !activated;
+
+/* int no_setactive = self_switch;
+
+ if (radioid.len() > 0 && activated) { // but if we're a radiobox, do not toggle if we're already activated
+ no_setactive = 1;
+ }
+
+ if (self_switch) activated = !!!activated;
+*/
+
+ if (!(activated && !radioid.isempty()))
+ activated = !activated;
+
+ if (!use_radioval || activated) {
+ C_Button b(*buttonGuiObj);
+ b.setActivatedNoCallback(activated);
+ }
+
+ if (activated) {
+ if (use_radioval) {
+#ifdef WASABI_COMPILE_CONFIG
+ getGuiObject()->guiobject_setCfgString(radioval);
+#endif
+ if (radioval != 0) doAction();
+ } else {
+#ifdef WASABI_COMPILE_CONFIG
+ getGuiObject()->guiobject_setCfgInt(activated);
+#endif
+ if (activated) doAction();
+ }
+ } else
+#ifdef WASABI_COMPILE_CONFIG
+ if (radioid.len() == 0) getGuiObject()->guiobject_setCfgInt(0); // if we're a radioid being turned off, we shouldn't write our value, as we'll prolly be sharing the same cfgattr with other radioboxes, todo: make that optional
+#endif
+
+ if (radioid.len() > 0 && activated) {
+ GuiObject *radioGuiObj = abstract_findObject(radioid);
+ ifc_window *radioRootWnd = *radioGuiObj;
+ if (radioRootWnd != NULL)
+ sendAction(radioRootWnd, L"TOGGLE", NULL, -1, -1, 0, 0, (void *)getGuiObject(), 4);
+ }
+
+ onToggle();
+}
+
+void CheckBox::onToggle() {
+}
+
+void CheckBox::setText(const wchar_t *_text)
+{
+ text = _text;
+ setName(text);
+ if (isInited()) {
+ updateText();
+ }
+}
+
+const wchar_t *CheckBox::getText() {
+ return text;
+}
+
+void CheckBox::setRadioid(const wchar_t *_radioid)
+{
+ radioid = _radioid;
+}
+
+void CheckBox::setRadioVal(const wchar_t *val, int _use_radioval)
+{
+ radioval = val;
+ use_radioval = _use_radioval;
+}
+
+#ifdef WASABI_COMPILE_CONFIG
+int CheckBox::onReloadConfig()
+{
+ StringW newVal = getGuiObject()->guiobject_getCfgString();
+ int checkit = use_radioval ? (newVal == radioval) : WTOI(newVal);
+ setActivated(checkit, 0);
+ return CHECKBOX_PARENT::onReloadConfig();
+}
+#endif
+
+void CheckBox::updateText() {
+ GuiObject *textGuiObj = abstract_findObject(L"checkbox.text");
+ if (textGuiObj != NULL) {
+ textGuiObj->guiobject_setXmlParam(L"text", text);
+ }
+}
+int CheckBox::isActivated() {
+ if (!buttonGuiObj) return 0;
+ C_Button b(*buttonGuiObj);
+ return b.getActivated();
+}
+
+int CheckBox::onChar(unsigned int c) {
+ switch (c) {
+#ifdef _WIN32
+ case VK_SPACE:
+ toggle(0);
+ break;
+#else
+#warning port me
+#endif
+ default:
+ return CHECKBOX_PARENT::onChar(c);
+ }
+ return 1;
+}
+
+void CheckBox::setAction(const wchar_t *str)
+{
+ action = str;
+}
+
+void CheckBox::setActionTarget(const wchar_t *target) {
+ action_target = target;
+}
+
+void CheckBox::setActionParam(const wchar_t *param) {
+ action_param = param;
+}
+
+const wchar_t *CheckBox::getActionParam()
+{
+ return action_param;
+}
+
+void CheckBox::doAction()
+{
+ if (!action_target.isempty())
+ {
+ GuiObject *go = getGuiObject()->guiobject_findObject(action_target);
+ if (!go) {
+ ScriptObject *so = WASABI_API_MAKI->maki_findObject(action_target);
+ if (so != NULL)
+ go = static_cast<GuiObject *>(so->vcpu_getInterface(guiObjectGuid));
+ }
+ if (go) {
+ ifc_window *w = go->guiobject_getRootWnd();
+ if (w) {
+ RECT cr;
+ getClientRect(&cr);
+ int _x = cr.left;
+ int _y = cr.top;
+ clientToScreen(&_x, &_y);
+ sendAction(w, action, action_target, _x, _y);
+ }
+ }
+ } else {
+ svc_action *act = ActionEnum(action).getNext();
+ if (act) {
+ act->onAction(action, getActionParam());
+ SvcEnum::release(act);
+ }
+ }
+}