#include #include #include "pslider.h" #include #include #include #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(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(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(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(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(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(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(g->guiobject_getRootWnd()); delete obj; }