diff options
Diffstat (limited to 'Src/Wasabi/api/skin/widgets/pslider.cpp')
-rw-r--r-- | Src/Wasabi/api/skin/widgets/pslider.cpp | 371 |
1 files changed, 371 insertions, 0 deletions
diff --git a/Src/Wasabi/api/skin/widgets/pslider.cpp b/Src/Wasabi/api/skin/widgets/pslider.cpp new file mode 100644 index 00000000..8d960f21 --- /dev/null +++ b/Src/Wasabi/api/skin/widgets/pslider.cpp @@ -0,0 +1,371 @@ +#include <precomp.h> +#include <wasabicfg.h> +#include "pslider.h" +#include <api/script/scriptmgr.h> +#include <api/script/vcpu.h> +#include <api/skin/skinparse.h> + +#ifdef WASABI_WIDGETS_MEDIASLIDERS +#include "seqband.h" +#include "seqpreamp.h" +#include "svolbar.h" +#include "sseeker.h" +#include "spanbar.h" +#endif + +char sliderObjectStr[] = "Slider"; // This is the xml tag +char sliderXuiSvcName[] = "Slider xui object"; // this is the name of the xuiservice +XMLParamPair PSliderWnd::params[] = +{ + {PSLIDER_SETBARLEFT, L"BARLEFT"}, + {PSLIDER_SETBARMIDDLE, L"BARMIDDLE"}, + {PSLIDER_SETBARRIGHT, L"BARRIGHT"}, + {PSLIDER_SETDOWNTHUMB, L"DOWNTHUMB"}, + {PSLIDER_SETHIGH, L"HIGH"}, + {PSLIDER_SETHOTPOS, L"HOTPOS"}, + {PSLIDER_SETHOTRANGE, L"HOTRANGE"}, + {PSLIDER_SETHOVERTHUMB, L"HOVERTHUMB"}, + {PSLIDER_SETLOW, L"LOW"}, + {PSLIDER_SETORIENTATION, L"ORIENTATION"}, + {PSLIDER_SETTHUMB, L"THUMB"}, + {PSLIDER_SETSTRETCHTHUMB, L"STRETCHTHUMB"}, + }; + +PSliderWnd::PSliderWnd() +{ + setLimits(0, 255); + getScriptObject()->vcpu_setInterface(sliderGuid, (void *)static_cast<PSliderWnd *>(this)); + getScriptObject()->vcpu_setClassName(L"Slider"); + getScriptObject()->vcpu_setController(sliderController); + + xuihandle = newXuiHandle(); + CreateXMLParameters(xuihandle); +} + +void PSliderWnd::CreateXMLParameters(int master_handle) +{ + //PSLIDER_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); +} + +PSliderWnd::~PSliderWnd() +{} + +int PSliderWnd::setXuiParam(int _xuihandle, int attrid, const wchar_t *paramname, const wchar_t *strvalue) +{ + if (xuihandle != _xuihandle) return PSLIDER_PARENT::setXuiParam(_xuihandle, attrid, paramname, strvalue); + switch (attrid) + { + case PSLIDER_SETBARLEFT: + setLeftBmp(strvalue); + break; + case PSLIDER_SETBARMIDDLE: + setMiddleBmp(strvalue); + break; + case PSLIDER_SETBARRIGHT: + setRightBmp(strvalue); + break; + case PSLIDER_SETTHUMB: + setThumbBmp(strvalue); + break; + case PSLIDER_SETDOWNTHUMB: + setThumbDownBmp(strvalue); + break; + case PSLIDER_SETHOVERTHUMB: + setThumbHiliteBmp(strvalue); + break; + case PSLIDER_SETSTRETCHTHUMB: + setThumbStretched(_wtoi(strvalue)); + break; + case PSLIDER_SETORIENTATION: + setOrientation(SkinParser::getOrientation(strvalue)); + break; + case PSLIDER_SETLOW: + { + int mx = getMaxLimit(); + setLimits(WTOI(strvalue), mx); +#ifdef WASABI_COMPILE_CONFIG + reloadConfig(); +#endif + break; + } + case PSLIDER_SETHIGH: + { + int mn = getMinLimit(); + setLimits(mn, WTOI(strvalue)); +#ifdef WASABI_COMPILE_CONFIG + reloadConfig(); +#endif + break; + } + case PSLIDER_SETHOTPOS: + { + int a = WTOI(strvalue); + setHotPosition(a); + break; + } + case PSLIDER_SETHOTRANGE: + { + int a = WTOI(strvalue); + setHotPosRange(a); + break; + } + default: + return 0; + } + return 1; +} + +int PSliderWnd::onInit() +{ + setNoDefaultBackground(1); + PSLIDER_PARENT::onInit(); + return 1; +} + +#ifdef WASABI_COMPILE_CONFIG +void PSliderWnd::reloadConfig() +{ + if (getGuiObject()->guiobject_hasCfgAttrib()) + onReloadConfig(); +} +#endif + +#ifdef WASABI_COMPILE_CONFIG +int PSliderWnd::onReloadConfig() +{ + int newVal = getGuiObject()->guiobject_getCfgInt(); + setPosition(newVal, 0); + + return PSLIDER_PARENT::onReloadConfig(); +} +#endif + +int PSliderWnd::onSetPosition() +{ + int r = PSLIDER_PARENT::onSetPosition(); + scriptVar p = SOM::makeVar(SCRIPT_INT); + int intVal = getSliderPosition(); +#ifdef WASABI_COMPILE_CONFIG + getGuiObject()->guiobject_setCfgInt(intVal); +#endif + SOM::assign(&p, intVal / scriptDivisor()); + script_onSetPosition(SCRIPT_CALL, getScriptObject(), p); + return r; +} + +int PSliderWnd::onPostedPosition(int pp) +{ + scriptVar p = SOM::makeVar(SCRIPT_INT); + int intVal = getSliderPosition(); +#ifdef WASABI_COMPILE_CONFIG + getGuiObject()->guiobject_setCfgInt(intVal); +#endif + SOM::assign(&p, intVal / scriptDivisor()); + script_onPostedPosition(SCRIPT_CALL, getScriptObject(), p); + return 1; +} + +int PSliderWnd::onSetFinalPosition() +{ + int r = PSLIDER_PARENT::onSetPosition(); + scriptVar p = SOM::makeVar(SCRIPT_INT); + int intVal = getSliderPosition(); +#ifdef WASABI_COMPILE_CONFIG + getGuiObject()->guiobject_setCfgInt(intVal); +#endif + SOM::assign(&p, intVal / scriptDivisor()); + script_onSetFinalPosition(SCRIPT_CALL, getScriptObject(), p); + return r; +} + +SliderScriptController _sliderController; +SliderScriptController *sliderController = &_sliderController; + +// -- Functions table ------------------------------------- +function_descriptor_struct SliderScriptController::exportedFunction[] = { + {L"setPosition", 1, (void*)PSliderWnd::script_setPosition }, + {L"getPosition", 0, (void*)PSliderWnd::script_getPosition }, + {L"onSetPosition", 1, (void*)PSliderWnd::script_onSetPosition }, + {L"onPostedPosition", 1, (void*)PSliderWnd::script_onPostedPosition }, + {L"onSetFinalPosition", 1, (void*)PSliderWnd::script_onSetFinalPosition }, + {L"lock", 0, (void*)PSliderWnd::script_lock}, + {L"unlock", 0, (void*)PSliderWnd::script_unlock}, + }; +// -------------------------------------------------------- + +const wchar_t *SliderScriptController::getClassName() +{ + return L"Slider"; +} + +const wchar_t *SliderScriptController::getAncestorClassName() +{ + return L"GuiObject"; +} + +ScriptObject *SliderScriptController::instantiate() +{ + PSliderWnd *s = new PSliderWnd; + ASSERT(s != NULL); + return s->getScriptObject(); +} + +void SliderScriptController::destroy(ScriptObject *o) +{ + PSliderWnd *s = static_cast<PSliderWnd *>(o->vcpu_getInterface(sliderGuid)); + ASSERT(s != NULL); + delete s; +} + +void *SliderScriptController::encapsulate(ScriptObject *o) +{ + return NULL; // no encapsulation for sliders yet +} + +void SliderScriptController::deencapsulate(void *o) +{} + +int SliderScriptController::getNumFunctions() +{ + return sizeof(exportedFunction) / sizeof(function_descriptor_struct); +} + +const function_descriptor_struct *SliderScriptController::getExportedFunctions() +{ + return exportedFunction; +} + +GUID SliderScriptController::getClassGuid() +{ + return sliderGuid; +} + + +const wchar_t *PSliderWnd::vcpu_getClassName() +{ + return L"Slider"; +} + +void PSliderWnd::lock () +{} + +void PSliderWnd::unlock() +{} + +//------------------------------------------------------------------------ + +scriptVar PSliderWnd::script_onSetPosition(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar p) +{ + SCRIPT_FUNCTION_INIT; + PROCESS_HOOKS1(o, sliderController, p); + SCRIPT_FUNCTION_CHECKABORTEVENT; + SCRIPT_EXEC_EVENT1(o, p); +} + +scriptVar PSliderWnd::script_onPostedPosition(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar p) +{ + SCRIPT_FUNCTION_INIT; + PROCESS_HOOKS1(o, sliderController, p); + SCRIPT_FUNCTION_CHECKABORTEVENT; + SCRIPT_EXEC_EVENT1(o, p); +} + +scriptVar PSliderWnd::script_onSetFinalPosition(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar p) +{ + SCRIPT_FUNCTION_INIT; + PROCESS_HOOKS1(o, sliderController, p); + SCRIPT_FUNCTION_CHECKABORTEVENT; + SCRIPT_EXEC_EVENT1(o, p); +} + +scriptVar PSliderWnd::script_setPosition(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar v) +{ + SCRIPT_FUNCTION_INIT + ASSERT(SOM::isNumeric(&v)); + PSliderWnd *s = static_cast<PSliderWnd *>(o->vcpu_getInterface(sliderGuid)); + if (s) s->setPosition(GET_SCRIPT_INT(v) * s->scriptDivisor()); + RETURN_SCRIPT_VOID; +} + +scriptVar PSliderWnd::script_getPosition(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) +{ + SCRIPT_FUNCTION_INIT + PSliderWnd *s = static_cast<PSliderWnd *>(o->vcpu_getInterface(sliderGuid)); + if (s) return MAKE_SCRIPT_INT(s->getSliderPosition() / s->scriptDivisor()); + return MAKE_SCRIPT_FLOAT(0); +} + +scriptVar PSliderWnd::script_lock(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) +{ + SCRIPT_FUNCTION_INIT + PSliderWnd *s = static_cast<PSliderWnd *>(o->vcpu_getInterface(sliderGuid)); + if (s) s->lock (); + RETURN_SCRIPT_VOID; +} + +scriptVar PSliderWnd::script_unlock(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) +{ + SCRIPT_FUNCTION_INIT + PSliderWnd *s = static_cast<PSliderWnd *>(o->vcpu_getInterface(sliderGuid)); + if (s) s->unlock(); + RETURN_SCRIPT_VOID; +} + +GuiObject *SliderXuiSvc::instantiate(const wchar_t *xmltag, ifc_xmlreaderparams *params) +{ +#ifdef WASABI_WIDGETS_MEDIASLIDERS + if (!params) + { + PSliderWnd *r = new PSliderWnd; + return r->getGuiObject(); + } + const wchar_t *action = params->getItemValue(L"action"); + const wchar_t *param = params->getItemValue(L"param"); + if (!action) + action=L""; + PSliderWnd *r = NULL; +#ifdef WASABI_WIDGETS_MEDIASLIDERS + if (!_wcsicmp(action, L"seek")) + r = new SSeeker; + else if (!_wcsicmp(action, L"volume")) + r = new SVolBar; + else if (!_wcsicmp(action, L"pan")) + r = new SPanBar; + else if (!_wcsicmp(action, L"eq_band")) + { + if (!_wcsicmp(param, L"preamp")) + r = new SEQPreamp; + else + r = new SEQBand; + } + else if (!_wcsicmp(action, L"eq_preamp")) + { + r = new SEQPreamp; + } + else + { +#endif + + r = new PSliderWnd; + +#ifdef WASABI_WIDGETS_MEDIASLIDERS + + } +#endif + + return r->getGuiObject(); +#else + PSliderWnd *r = new PSliderWnd; + return r->getGuiObject(); +#endif +} + +void SliderXuiSvc::destroy(GuiObject *g) +{ + PSliderWnd *obj = static_cast<PSliderWnd *>(g->guiobject_getRootWnd()); + delete obj; +} |