aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/skin/widgets/sseeker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/skin/widgets/sseeker.cpp')
-rw-r--r--Src/Wasabi/api/skin/widgets/sseeker.cpp128
1 files changed, 128 insertions, 0 deletions
diff --git a/Src/Wasabi/api/skin/widgets/sseeker.cpp b/Src/Wasabi/api/skin/widgets/sseeker.cpp
new file mode 100644
index 00000000..fb2cbe5b
--- /dev/null
+++ b/Src/Wasabi/api/skin/widgets/sseeker.cpp
@@ -0,0 +1,128 @@
+#include <precomp.h>
+
+#include "sseeker.h"
+#include <api/script/scriptmgr.h>
+#include <api/core/api_core.h>
+
+#define SSeeker_TIMER_POS 1
+#define SSEEKER_INTERVAL 500
+
+const wchar_t seekBarXuiStr[] = L"SeekBar"; // This is the xml tag
+char seekBarXuiSvcName[] = "SeekBar xui object"; // this is the name of the xuiservice
+
+XMLParamPair SSeeker::params[] = {
+ {SSEEKER_SETINTERVAL, L"INTERVAL"},
+};
+SSeeker::SSeeker() {
+ setDrawOnBorders(TRUE);
+ status = STOP;
+ update_interval = SSEEKER_INTERVAL;
+ locked = 0;
+ xuihandle = newXuiHandle();
+ CreateXMLParameters(xuihandle);
+
+ setLimits(0, 65535);
+}
+
+void SSeeker::CreateXMLParameters(int master_handle)
+{
+ //SSEEKER_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);
+}
+
+SSeeker::~SSeeker() {
+ killTimer(SSeeker_TIMER_POS);
+ WASABI_API_MEDIACORE->core_delCallback(0, this);
+}
+
+int SSeeker::setXuiParam(int _xuihandle, int attribid, const wchar_t *name, const wchar_t *strval) {
+ if (xuihandle != _xuihandle) return SSEEKER_PARENT::setXuiParam(_xuihandle, attribid, name, strval);
+ switch (attribid) {
+ case SSEEKER_SETINTERVAL:
+ if ((update_interval = WTOI(strval)) <= 20)
+ update_interval = SSEEKER_INTERVAL;
+ break;
+ default:
+ return 0;
+ }
+ return 1;
+}
+
+int SSeeker::onInit() {
+ SSEEKER_PARENT::onInit();
+
+ timerCallback(SSeeker_TIMER_POS);
+ setTimer(SSeeker_TIMER_POS, update_interval);
+
+ WASABI_API_MEDIACORE->core_addCallback(0, this);
+
+ return 1;
+}
+
+int SSeeker::onSetFinalPosition() {
+ SSEEKER_PARENT::onSetFinalPosition();
+ if (WASABI_API_MEDIACORE->core_getPosition(0) == -1) return 1;
+ int pos = getSliderPosition(); // get slider pos
+ int len = WASABI_API_MEDIACORE->core_getLength(0);
+ int corepos = (int)(((double)pos * (double)len) / 65535.f);
+ WASABI_API_MEDIACORE->core_setPosition(0,corepos);
+ return 1;
+}
+
+void SSeeker::timerCallback(int id) {
+ switch (id) {
+ case SSeeker_TIMER_POS: {
+ if (getSeekStatus()) return;
+
+ int playpos = WASABI_API_MEDIACORE->core_getPosition(0);
+ int len = WASABI_API_MEDIACORE->core_getLength(0);
+ if (playpos < 0 || len <= 0) {
+ setVisible(0);
+ status=STOP;
+ return;
+ }
+ int newpos = (int)(((double)playpos / (double)len) * 65535.f);
+ if (getSliderPosition() != newpos) {
+ setPosition(newpos, 0);
+ onPostedPosition(newpos / scriptDivisor());
+ }
+ if (len > 0 && !isVisible()) {
+ status=PLAY;
+ setVisible(1);
+ }
+ }
+ break;
+ default:
+ SSEEKER_PARENT::timerCallback(id);
+ }
+}
+
+int SSeeker::corecb_onStarted() {
+ timerCallback(SSeeker_TIMER_POS);
+ return 0;
+}
+
+int SSeeker::corecb_onStopped() {
+ timerCallback(SSeeker_TIMER_POS);
+ return 0;
+}
+
+int SSeeker::corecb_onSeeked(int newpos) {
+ timerCallback(SSeeker_TIMER_POS);
+ return 0;
+}
+
+void SSeeker::lock() {
+ if (locked) return;
+ locked = 1;
+ WASABI_API_MEDIACORE->core_delCallback(0, this);
+}
+
+void SSeeker::unlock() {
+ if (!locked) return;
+ locked = 0;
+ WASABI_API_MEDIACORE->core_addCallback(0, this);
+} \ No newline at end of file