Initial community commit
This commit is contained in:
parent
537bcbc862
commit
fc06254474
16440 changed files with 4239995 additions and 2 deletions
262
Src/Wasabi/api/skin/widgets/checkbox.cpp
Normal file
262
Src/Wasabi/api/skin/widgets/checkbox.cpp
Normal file
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue