162 lines
4.6 KiB
C++
162 lines
4.6 KiB
C++
#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);
|
|
}
|
|
} |