diff options
Diffstat (limited to 'Src/Wasabi/api/skin/widgets/sseeker.cpp')
-rw-r--r-- | Src/Wasabi/api/skin/widgets/sseeker.cpp | 128 |
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 |