aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/skin/widgets/wa2
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/skin/widgets/wa2')
-rw-r--r--Src/Wasabi/api/skin/widgets/wa2/xuiwa2slider.cpp186
-rw-r--r--Src/Wasabi/api/skin/widgets/wa2/xuiwa2slider.h63
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