diff options
Diffstat (limited to 'Src/Wasabi/api/skin/widgets/wa2')
-rw-r--r-- | Src/Wasabi/api/skin/widgets/wa2/xuiwa2slider.cpp | 186 | ||||
-rw-r--r-- | Src/Wasabi/api/skin/widgets/wa2/xuiwa2slider.h | 63 |
2 files changed, 249 insertions, 0 deletions
diff --git a/Src/Wasabi/api/skin/widgets/wa2/xuiwa2slider.cpp b/Src/Wasabi/api/skin/widgets/wa2/xuiwa2slider.cpp new file mode 100644 index 00000000..d4799a06 --- /dev/null +++ b/Src/Wasabi/api/skin/widgets/wa2/xuiwa2slider.cpp @@ -0,0 +1,186 @@ +#include <precomp.h> + +#include "xuiwa2slider.h" +#include <tataki/canvas/canvas.h> +#include <tataki/bitmap/bitmap.h> +#include <api/core/api_core.h> + +#define WA2SLIDER_SEEK_INTERVAL 500 + +const wchar_t Wa2SliderXuiObjectStr[] = L"images"; // This is the xml tag +char Wa2SliderXuiSvcName[] = "Images XuiObject Service"; + +XMLParamPair Wa2Slider::params[] = + { + {WA2SLIDER_IMAGES, L"IMAGES"}, + {WA2SLIDER_IMAGESSPACING, L"IMAGESSPACING"}, + {WA2SLIDER_SOURCE, L"SOURCE"}, + }; + +Wa2Slider::Wa2Slider() + : started(false) +{ + realpos = 0; + imagesBitmap = 0; + spacing = 0; + action = ACT_NONE; + + xuihandle = newXuiHandle(); + CreateXMLParameters(xuihandle); +} + +void Wa2Slider::CreateXMLParameters(int master_handle) +{ + //WA2SLIDER_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); +} + +Wa2Slider::~Wa2Slider() +{ + killTimer(Wa2Slider_TIMER_POS); + WASABI_API_MEDIACORE->core_delCallback(0, this); + delete(imagesBitmap); +} + +int Wa2Slider::setXuiParam(int _xuihandle, int xmlattributeid, const wchar_t *xmlattributename, const wchar_t *value) +{ + if (xuihandle == _xuihandle) + { + switch (xmlattributeid) + { + case WA2SLIDER_IMAGES: images = value; return 1; + case WA2SLIDER_IMAGESSPACING: spacing = WTOI(value); return 1; + case WA2SLIDER_SOURCE: + if (!_wcsicmp(value, L"volume")) action = ACT_VOLUME; + if (!_wcsicmp(value, L"balance")) action = ACT_BALANCE; + if (!_wcsicmp(value, L"seek")) action = ACT_SEEK; + return 1; + } + } + return WA2SLIDER_PARENT::setXuiParam(_xuihandle, xmlattributeid, xmlattributename, value); +} + +int Wa2Slider::onInit() +{ + WA2SLIDER_PARENT::onInit(); + + imagesBitmap = new SkinBitmap(images); + + if (action == ACT_VOLUME) + corecb_onVolumeChange(WASABI_API_MEDIACORE->core_getVolume(0)); + if (action == ACT_BALANCE) + corecb_onPanChange(WASABI_API_MEDIACORE->core_getPan(0)); + if (action == ACT_SEEK) + { + corecb_onSeeked(WASABI_API_MEDIACORE->core_getPosition(0)); + started = (WASABI_API_MEDIACORE->core_getStatus(0) != 0); + setTimer(Wa2Slider_TIMER_POS, WA2SLIDER_SEEK_INTERVAL); + } + + WASABI_API_MEDIACORE->core_addCallback(0, this); + + return 0; +} + +int Wa2Slider::onPaint(Canvas *canvas) +{ + if (imagesBitmap->getHeight() && spacing) + { + RECT r, r2; + getClientRect(&r2); + int nb = (imagesBitmap->getHeight() / spacing) - 1; + int which = 0; + switch (action) + { + case ACT_BALANCE: + { + int p = realpos; + int f = 32768; //FULL/2; + if (p > f) + { + which = (realpos - f) * nb / f; + } + else if (p < f) + { + which = (f - realpos) * nb / f; + } + else which = 0; + } + break; + case ACT_SEEK: + if (!started) + which = 0; + else + which = realpos * nb / 65536; + break; + case ACT_VOLUME: + which = realpos * nb / 65536; + break; + } + + r.left = 0; + r.top = which * spacing; + r.bottom = which * spacing + (r2.bottom - r2.top); + r.right = r2.right - r2.left; + imagesBitmap->blitToRect(canvas, &r, &r2); + } + return WA2SLIDER_PARENT::onPaint(canvas); +} + +int Wa2Slider::corecb_onVolumeChange(int newvol) +{ + if (action != ACT_VOLUME) return 0; + realpos = (int)(((double)newvol * 65535.f) / 255.f); + invalidate(); + return 0; +} + +int Wa2Slider::corecb_onPanChange(int newpan) +{ + if (action != ACT_BALANCE) return 0; + + realpos = (int)(((double)(newpan + 127) * 65535.f) / 255.f); +invalidate(); + return 0; +} + +int Wa2Slider::corecb_onSeeked(int newpos) +{ + if (action != ACT_SEEK) return 0; + + int len = WASABI_API_MEDIACORE->core_getLength(0); + + realpos = (int)(((float)(newpos) * 65535.f) / (float)len); +invalidate(); + return 0; +} + +int Wa2Slider::corecb_onStarted() +{ + started = true; + corecb_onSeeked(0); + invalidate(); + return 0; +} + +int Wa2Slider::corecb_onStopped() +{ + started = false; + corecb_onSeeked(0); + invalidate(); + return 0; +} +void Wa2Slider::timerCallback(int id) +{ + switch (id) + { + case Wa2Slider_TIMER_POS: + corecb_onSeeked(WASABI_API_MEDIACORE->core_getPosition(0)); + break; + default: + WA2SLIDER_PARENT::timerCallback(id); + } +} diff --git a/Src/Wasabi/api/skin/widgets/wa2/xuiwa2slider.h b/Src/Wasabi/api/skin/widgets/wa2/xuiwa2slider.h new file mode 100644 index 00000000..1f24fe9c --- /dev/null +++ b/Src/Wasabi/api/skin/widgets/wa2/xuiwa2slider.h @@ -0,0 +1,63 @@ +#ifndef _XUIWA2SLIDER_H +#define _XUIWA2SLIDER_H + +#include <api/script/objects/guiobj.h> +#include <api/skin/widgets.h> +#include <api/syscb/callbacks/corecbi.h> + +#define WA2SLIDER_PARENT GuiObjectWnd + +class Wa2Slider : public WA2SLIDER_PARENT, public CoreCallbackI +{ +public: + Wa2Slider(); + virtual ~Wa2Slider(); + + virtual int setXuiParam(int xuihandle, int xmlattributeid, const wchar_t *xmlattributename, const wchar_t *value); + + virtual int onInit(); + virtual int onPaint(Canvas *canvas); + + virtual int corecb_onVolumeChange(int newvol); + virtual int corecb_onPanChange(int newpan); + virtual int corecb_onSeeked(int newpos); + virtual int corecb_onStarted(); + virtual int corecb_onStopped(); + virtual void timerCallback(int id); + +protected: + /*static */void CreateXMLParameters(int master_handle); +private: + int realpos; + StringW images; + SkinBitmap *imagesBitmap; + int spacing; + int action; + static XMLParamPair params[]; + int xuihandle; + bool started; + + enum { + ACT_NONE = 0, + ACT_VOLUME, + ACT_BALANCE, + ACT_SEEK, + }; + + enum { + Wa2Slider_TIMER_POS = 1, + }; + enum { + WA2SLIDER_IMAGES, + WA2SLIDER_IMAGESSPACING, + WA2SLIDER_SOURCE, + WA2SLIDER_NUMPARAMS, + }; +}; + +// ----------------------------------------------------------------------- +extern const wchar_t Wa2SliderXuiObjectStr[]; +extern char Wa2SliderXuiSvcName[]; +class Wa2SliderXuiSvc : public XuiObjectSvc<Wa2Slider, Wa2SliderXuiObjectStr, Wa2SliderXuiSvcName> {}; + +#endif |