summaryrefslogtreecommitdiff
path: root/xml/object.c
diff options
context:
space:
mode:
Diffstat (limited to 'xml/object.c')
-rw-r--r--xml/object.c111
1 files changed, 85 insertions, 26 deletions
diff --git a/xml/object.c b/xml/object.c
index 587eab5..eae47e5 100644
--- a/xml/object.c
+++ b/xml/object.c
@@ -16,6 +16,7 @@ cxObject::cxObject(cxDisplay *Parent):
mType((eType)__COUNT_OBJECT__),
mPos1(0, 0),
mPos2(-1, -1),
+ mVirtSize(-1,-1),
mAlpha(255),
mColors(0),
mArc(0),
@@ -31,7 +32,8 @@ cxObject::cxObject(cxDisplay *Parent):
mDelay(150),
mIndex(0),
mRefresh(this),
- mObjects(NULL)
+ mObjects(NULL),
+ mListIndex(0)
{
}
@@ -41,11 +43,13 @@ cxObject::cxObject(const cxObject &Src):
mType(Src.mType),
mPos1(Src.mPos1),
mPos2(Src.mPos2),
+ mVirtSize(Src.mVirtSize),
mAlpha(Src.mAlpha),
mColors(Src.mColors),
mArc(Src.mArc),
mFg(Src.mFg),
mBg(Src.mBg),
+ mBl(Src.mBl),
mMask(Src.mMask),
mMark(Src.mMark),
mActive(Src.mActive),
@@ -61,7 +65,8 @@ cxObject::cxObject(const cxObject &Src):
mFontWidth(Src.mFontWidth),
mDelay(Src.mDelay),
mRefresh(Src.mRefresh),
- mObjects(NULL)
+ mObjects(NULL),
+ mListIndex(Src.mListIndex)
{
if (Src.mCondition)
mCondition = new cxFunction(*Src.mCondition);
@@ -130,7 +135,8 @@ bool cxObject::ParseFontFace(const std::string &Text)
void cxObject::SetListIndex(uint Index, int Tab)
{
- mIndex = mDisplay->Objects() + (Index * cSkinDisplayMenu::MaxTabs + Tab);
+ Tab = Tab>=0 ? Tab : -1;
+ mListIndex = 1 + Index * cSkinDisplayMenu::MaxTabs + Tab;
mText.SetListIndex(Index, Tab);
mPath.SetListIndex(Index, Tab);
if (mCondition != NULL)
@@ -157,24 +163,38 @@ const cFont *cxObject::Font(void) const
return cFont::GetFont(fontOsd);
}
-txPoint cxObject::Pos(const txPoint &BaseOffset, const txSize &BaseSize) const
+txPoint cxObject::Pos(const txPoint &BaseOffset, const txSize &BaseSize, const txSize &VirtSize) const
{
txPoint bOffset = BaseOffset.x < 0 ? mSkin->BaseOffset() : BaseOffset;
txSize bSize = BaseSize.w < 0 ? mSkin->BaseSize() : BaseSize;
- return txPoint(bOffset.x + (mPos1.x < 0 ? bSize.w + mPos1.x : mPos1.x),
- bOffset.y + (mPos1.y < 0 ? bSize.h + mPos1.y : mPos1.y));
+ double scale_x = VirtSize.w>0 ? (double)BaseSize.w / VirtSize.w : 1.0,
+ scale_y = VirtSize.h>0 ? (double)BaseSize.h / VirtSize.h : 1.0;
+
+ int x1 = mPos1.x < 0 ? (int)((mPos1.x + 1) * scale_x - 1) : (int)(mPos1.x * scale_x);
+ int y1 = mPos1.y < 0 ? (int)((mPos1.y + 1) * scale_x - 1) : (int)(mPos1.y * scale_y);
+
+ return txPoint(bOffset.x + (x1 < 0 ? bSize.w + x1 : x1),
+ bOffset.y + (y1 < 0 ? bSize.h + y1 : y1));
}
-txSize cxObject::Size(const txPoint &BaseOffset, const txSize &BaseSize) const
+txSize cxObject::Size(const txPoint &BaseOffset, const txSize &BaseSize, const txSize &VirtSize) const
{
- txPoint bOffset = BaseOffset.x < 0 ? mSkin->BaseOffset() : BaseOffset;
+ //txPoint bOffset = BaseOffset.x < 0 ? mSkin->BaseOffset() : BaseOffset;
txSize bSize = BaseSize.w < 0 ? mSkin->BaseSize() : BaseSize;
- txPoint p1(bOffset.x + (mPos1.x < 0 ? bSize.w + mPos1.x : mPos1.x),
- bOffset.y + (mPos1.y < 0 ? bSize.h + mPos1.y : mPos1.y));
- txPoint p2(bOffset.x + (mPos2.x < 0 ? bSize.w + mPos2.x : mPos2.x),
- bOffset.y + (mPos2.y < 0 ? bSize.h + mPos2.y : mPos2.y));
+ double scale_x = VirtSize.w>0 ? (double)BaseSize.w / VirtSize.w : 1.0,
+ scale_y = VirtSize.h>0 ? (double)BaseSize.h / VirtSize.h : 1.0;
+
+ int x1 = mPos1.x < 0 ? (int)((mPos1.x + 1) * scale_x - 1) : (int)(mPos1.x * scale_x);
+ int y1 = mPos1.y < 0 ? (int)((mPos1.y + 1) * scale_x - 1) : (int)(mPos1.y * scale_y);
+ int x2 = mPos2.x < 0 ? (int)((mPos2.x + 1) * scale_x - 1) : (int)(mPos2.x * scale_x);
+ int y2 = mPos2.y < 0 ? (int)((mPos2.y + 1) * scale_x - 1) : (int)(mPos2.y * scale_y);
+
+ txPoint p1(x1 < 0 ? bSize.w + x1 : x1,
+ y1 < 0 ? bSize.h + y1 : y1);
+ txPoint p2(x2 < 0 ? bSize.w + x2 : x2,
+ y2 < 0 ? bSize.h + y2 : y2);
return txSize(p2.x - p1.x + 1, p2.y - p1.y + 1);
}
@@ -191,6 +211,12 @@ const tColor *cxObject::Bg(void) const
return cText2SkinRender::ItemColor(mBg, Bg) ? &Bg : NULL;
}
+const tColor *cxObject::Bl(void) const
+{
+ static tColor Bl;
+ return cText2SkinRender::ItemColor(mBl, Bl) ? &Bl : NULL;
+}
+
const tColor *cxObject::Mask(void) const
{
static tColor Mask;
@@ -230,6 +256,11 @@ cxObjects::~cxObjects()
+
+
+///////////////////////////////////////////////////////////////////////////////
+// ---------- class cxRefresh ---------------------------------------------- //
+
cxRefresh::cxRefresh( cxObject *Object ):
mRefreshType(0xFF),
mText(NULL),
@@ -245,27 +276,55 @@ cxRefresh::~cxRefresh()
delete mText;
}
-bool cxRefresh::Dirty(uint dirty, bool force)
+bool cxRefresh::Dirty(uint dirty, uint &updatein, bool force, uint now)
{
- bool need_changed = !mForce && !force && !(mRefreshType & dirty & ~(1<<update));
+ // check if the timeout of the object has expired
+ uint nexttime = mObject->State().nexttime;
+
+ bool to = force || mForce ||
+ mObject->Type() == cxObject::block || mObject->Type() == cxObject::list;
+ bool changed = force || mForce;
+
+ if( now>0 && nexttime>0 ) {
+ // timeout was set
+ if( now >= nexttime ) {
+ // timeout has expired
+ to = true;
+ } else {
+ // time left -> set new update interval
+ uint nextin = nexttime - now;
+ if (updatein == 0 || nextin < updatein)
+ updatein = nextin;
+ }
+ }
- if( !(mRefreshType & dirty) )
- return false;
+ // Objaect has changed since last redraw
+ if( mChanged != NULL ) {
+ mEval = mChanged->Evaluate();
+ if( mEval != mLastEval ) {
+ changed = true;
+ }
+ }
- if( mChanged == NULL && need_changed )
- return false;
- else if( mChanged == NULL )
+ // refresh
+ if( (mRefreshType & dirty & ~(1<<timeout) & ~(1<<update)) ) {
+ if( changed ) mLastEval = mEval;
return true;
+ }
- mEval = mChanged->Evaluate();
-
- if( mEval == mLastEval && need_changed ) {
- return false;
- } else {
- mLastEval = mEval;
+ // timeout
+ if( (mRefreshType & dirty & (1<<timeout)) && to ) {
+ if( changed ) mLastEval = mEval;
+ return true;
}
- return true;
+ // update
+ if( (mRefreshType & dirty & (1<<update)) && changed ) {
+ mLastEval = mEval;
+ return true;
+ }
+
+ return false;
}