diff options
Diffstat (limited to 'Src/Wasabi/api/skin/widgets/xuiprogressgrid.cpp')
-rw-r--r-- | Src/Wasabi/api/skin/widgets/xuiprogressgrid.cpp | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/Src/Wasabi/api/skin/widgets/xuiprogressgrid.cpp b/Src/Wasabi/api/skin/widgets/xuiprogressgrid.cpp new file mode 100644 index 00000000..edb9e918 --- /dev/null +++ b/Src/Wasabi/api/skin/widgets/xuiprogressgrid.cpp @@ -0,0 +1,162 @@ +#include <precomp.h> +#include "xuiprogressgrid.h" +#include <tataki/canvas/ifc_canvas.h> +#include <bfc/string/stringdict.h> +#include <api/core/api_core.h> + +#define ProgressGrid_TIMER_POS 1 +#define PROGRESSGRID_INTERVAL 500 + +#ifndef _WASABIRUNTIME + +BEGIN_SERVICES(ProgressGrid_Svc); +DECLARE_SERVICE(XuiObjectCreator<ProgressGridXuiSvc>); +END_SERVICES(ProgressGrid_Svc, _ProgressGrid_Svc); + +#ifdef _X86_ +extern "C" { int _link_ProgressGridXuiSvc; } +#else +extern "C" { int __link_ProgressGridXuiSvc; } +#endif + +#endif + +BEGIN_STRINGDICTIONARY(_pgorientationvalues) +SDI(L"top", PROGRESSGRID_TOP); +SDI(L"left", PROGRESSGRID_LEFT); +SDI(L"right", PROGRESSGRID_RIGHT); +SDI(L"bottom", PROGRESSGRID_BOTTOM); +END_STRINGDICTIONARY(_pgorientationvalues, pgorientationvalues) + +// ----------------------------------------------------------------------- + +const wchar_t ProgressGridXuiObjectStr[] = L"ProgressGrid"; // xml tag +char ProgressGridXuiSvcName[] = "ProgressGrid xui object"; +XMLParamPair ProgressGrid::params[] = { + { PROGRESSGRID_SETORIENTATION, L"ORIENTATION"}, + { PROGRESSGRID_SETINTERVAL, L"INTERVAL"}, +}; + +// ----------------------------------------------------------------------- +ProgressGrid::ProgressGrid() { + myxuihandle = newXuiHandle(); + CreateXMLParameters(myxuihandle); + + orientation = PROGRESSGRID_RIGHT; + progress = 0; + started = 0; + update_interval = PROGRESSGRID_INTERVAL; +} + +void ProgressGrid::CreateXMLParameters(int master_handle) +{ + //PROGRESSGRID_PARENT::CreateXMLParameters(master_handle); + int numParams = sizeof(params) / sizeof(params[0]); + hintNumberOfParams(myxuihandle, numParams); + for (int i = 0;i < numParams;i++) + addParam(myxuihandle, params[i], XUI_ATTRIBUTE_IMPLIED); +} + +// ----------------------------------------------------------------------- +ProgressGrid::~ProgressGrid() { + killTimer(ProgressGrid_TIMER_POS); + WASABI_API_MEDIACORE->core_delCallback(0, this); +} + +// ----------------------------------------------------------------------- +int ProgressGrid::setXuiParam(int xuihandle, int xmlattributeid, const wchar_t *xmlattributename, const wchar_t *value) { + if (xuihandle != myxuihandle) + return PROGRESSGRID_PARENT::setXuiParam(xuihandle, xmlattributeid, xmlattributename, value); + + switch (xmlattributeid) { + case PROGRESSGRID_SETORIENTATION: + setOrientation(value); + break; + + case PROGRESSGRID_SETINTERVAL: + if ((update_interval = WTOI(value)) <= 20) + update_interval = PROGRESSGRID_INTERVAL; + break; + + default: + return 0; + } + return 1; +} + +// ----------------------------------------------------------------------- +void ProgressGrid::setOrientation(const wchar_t *or) { + int a = pgorientationvalues.getId(or); + if (orientation == a) return; + orientation = a; + invalidate(); +} + +// ----------------------------------------------------------------------- +void ProgressGrid::getGridRect(RECT *r) { + RECT cr; + getClientRect(&cr); + float p = started ? progress : 0.0f; + int height = (int)((float)(cr.bottom - cr.top) * p); + int width = (int)((float)(cr.right - cr.left) * p); + + switch (orientation) { + case PROGRESSGRID_LEFT: cr.left = cr.right - width; break; + case PROGRESSGRID_TOP: cr.top = cr.bottom - height; break; + case PROGRESSGRID_RIGHT: cr.right = cr.left + width; break; + case PROGRESSGRID_BOTTOM: cr.bottom = cr.top + height; break; + } + *r = cr; +} + +// ----------------------------------------------------------------------- +int ProgressGrid::onInit() { + PROGRESSGRID_PARENT::onInit(); + timerCallback(ProgressGrid_TIMER_POS); + setTimer(ProgressGrid_TIMER_POS, update_interval); + WASABI_API_MEDIACORE->core_addCallback(0, this); + if (WASABI_API_MEDIACORE->core_getStatus(0) != 0) started = 1; else started = 0; + return 1; +} + +// ----------------------------------------------------------------------- +int ProgressGrid::corecb_onSeeked(int newpos) { + if(!started) corecb_onStarted(); + int len = WASABI_API_MEDIACORE->core_getLength(0); + if (newpos == -1 || len <= 0) setProgress(0); + else setProgress(((float)newpos/(float)len)); + return 0; +} + +// ----------------------------------------------------------------------- +int ProgressGrid::corecb_onStarted() { + started = 1; + invalidate(); + return 0; +} + +// ----------------------------------------------------------------------- +int ProgressGrid::corecb_onStopped() { + started = 0; + progress = 0.0f; + invalidate(); + return 0; +} + +void ProgressGrid::setProgress(float p) { + if (progress == p) return; + progress = p; + invalidate(); +} + +void ProgressGrid::timerCallback(int id) { + switch (id) { + case ProgressGrid_TIMER_POS: { + int playpos = WASABI_API_MEDIACORE->core_getPosition(0); + corecb_onSeeked(playpos); + } + break; + default: + PROGRESSGRID_PARENT::timerCallback(id); + } +}
\ No newline at end of file |