diff options
Diffstat (limited to 'display.c')
-rw-r--r-- | display.c | 826 |
1 files changed, 616 insertions, 210 deletions
@@ -1,271 +1,554 @@ /* - * $Id: display.c,v 1.19 2004/07/02 19:00:22 lordjaxom Exp $ + * $Id: display.c,v 1.5 2004/12/08 18:47:37 lordjaxom Exp $ */ #include "render.h" -#include "data.h" #include "loader.h" #include "display.h" #include "scroller.h" +#include "status.h" +#include "xml/string.h" +#include <vdr/menu.h> // --- cText2SkinDisplayChannel ----------------------------------------------- -cText2SkinDisplayChannel::cText2SkinDisplayChannel(cText2SkinLoader *Loader, bool WithInfo) { - mWithInfo = WithInfo; - mRender = new cText2SkinRender(Loader, WithInfo ? sectionChannel : sectionChannelSmall); - mDirty = false; +cText2SkinDisplayChannel::cText2SkinDisplayChannel(cText2SkinLoader *Loader, bool WithInfo): + cText2SkinRender(Loader, WithInfo ? cxDisplay::channelInfo : cxDisplay::channelSmall), + mChannel(NULL), + mNumber(0), + mPresent(NULL), + mFollowing(NULL), + mType(mtStatus), + mText("") { } cText2SkinDisplayChannel::~cText2SkinDisplayChannel() { - delete mRender; } void cText2SkinDisplayChannel::SetChannel(const cChannel *Channel, int Number) { - mRender->Lock(); - if (mRender->mChannel != Channel || mRender->mChannelNumber != Number) { - mRender->mChannel = Channel; - mRender->mChannelNumber = Number; - mDirty = true; + if (mChannel != Channel || mNumber != Number) { + mChannel = Channel; + mNumber = Number; + SetDirty(); } - mRender->Unlock(); } -void cText2SkinDisplayChannel::SetEvents(const cEvent *Present, const cEvent *Following) { - mRender->Lock(); - if (mRender->mChannelPresent != Present || mRender->mChannelFollowing != Following) { - mRender->mChannelPresent = Present; - mRender->mChannelFollowing = Following; - mDirty = true; +void cText2SkinDisplayChannel::SetEvents(const cEvent *Present, + const cEvent *Following) { + if (mPresent != Present || mFollowing != Following) { + mPresent = Present; + mFollowing = Following; + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayChannel::SetMessage(eMessageType Type, const char *Text) { if (Text == NULL) Text = ""; - mRender->Lock(); - if (mRender->mMessageType != Type || mRender->mMessageText != Text) { - mRender->mMessageType = Type; - mRender->mMessageText = Text; - mDirty = true; + if (mType != Type || mText != Text) { + mType = Type; + mText = Text; + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayChannel::Flush(void) { - if (mDirty) { - Dprintf("Flushing\n"); - mRender->Flush(); - Dprintf("Flushing done\n"); - mDirty = false; + cText2SkinRender::Flush(); +} + +cxType cText2SkinDisplayChannel::GetTokenData(const txToken &Token) { + switch (Token.Type) { + case tChannelNumber: + return mChannel != NULL + ? (cxType)ChannelNumber(mChannel, mNumber) + : (cxType)false; + + case tChannelName: + return mChannel != NULL + ? (cxType)ChannelName(mChannel, mNumber) + : (cxType)false; + + case tChannelShortName: + return mChannel != NULL + ? (cxType)ChannelShortName(mChannel, mNumber) + : (cxType)false; + + case tChannelBouquet: + return mChannel != NULL + ? (cxType)ChannelBouquet(mChannel, mNumber) + : (cxType)false; + + case tPresentStartDateTime: + return mPresent != NULL + ? (cxType)TimeType(mPresent->StartTime(), Token.Attrib) + : (cxType)false; + + case tPresentVPSDateTime: + return mPresent != NULL + ? (cxType)TimeType(mPresent->Vps(), Token.Attrib) + : (cxType)false; + + case tPresentEndDateTime: + return mPresent != NULL + ? (cxType)TimeType(mPresent->EndTime(), Token.Attrib) + : (cxType)false; + + case tPresentProgress: + return mPresent != NULL + ? (cxType)TimeType(time(NULL) - mPresent->StartTime(), Token.Attrib) + : (cxType)false; + + case tPresentDuration: + return mPresent != NULL + ? (cxType)TimeType(mPresent->Duration(), Token.Attrib) + : (cxType)false; + + case tPresentTitle: + return mPresent != NULL + ? (cxType)mPresent->Title() + : (cxType)false; + + case tPresentShortText: + return mPresent != NULL + ? (cxType)mPresent->ShortText() + : (cxType)false; + + case tPresentDescription: + return mPresent != NULL + ? (cxType)mPresent->Description() + : (cxType)false; + + case tFollowingStartDateTime: + return mFollowing != NULL + ? (cxType)TimeType(mFollowing->StartTime(), Token.Attrib) + : (cxType)false; + + case tFollowingVPSDateTime: + return mFollowing != NULL + ? (cxType)TimeType(mFollowing->Vps(), Token.Attrib) + : (cxType)false; + + case tFollowingEndDateTime: + return mFollowing != NULL + ? (cxType)TimeType(mFollowing->EndTime(), Token.Attrib) + : (cxType)false; + + case tFollowingDuration: + return mFollowing != NULL + ? (cxType)TimeType(mFollowing->Duration(), Token.Attrib) + : (cxType)false; + + case tFollowingTitle: + return mFollowing != NULL + ? (cxType)mFollowing->Title() + : (cxType)false; + + case tFollowingShortText: + return mFollowing != NULL + ? (cxType)mFollowing->ShortText() + : (cxType)false; + + case tFollowingDescription: + return mFollowing != NULL + ? (cxType)mFollowing->Description() + : (cxType)false; + + case tLanguage: { + int cur; + const char **tracks = cDevice::PrimaryDevice()->GetAudioTracks(&cur); + if (tracks) { + int i = 0; + while (tracks[i] != NULL) + ++i; + if (cur < i) + return tracks[cur]; + } + } + return false; + + case tHasTeletext: + return mChannel != NULL && mChannel->Tpid() != 0; + + case tHasMultilang: + return mChannel != NULL && mChannel->Apid2() != 0; + + case tHasDolby: + return mChannel != NULL && mChannel->Dpid1() != 0; + + case tIsEncrypted: + return mChannel != NULL && mChannel->Ca() != 0; + + case tIsRadio: + return mChannel != NULL && ISRADIO(mChannel); + + case tIsRecording: + return cRecordControls::Active(); + + case tHasVPS: + return mPresent != NULL && mPresent->Vps() != 0; + + case tHasTimer: + return mPresent != NULL && mPresent->HasTimer(); + + case tIsRunning: + return mPresent != NULL && mPresent->IsRunning(); + + case tMessage: + return mText; + + case tMessageInfo: + return mType == mtInfo + ? (cxType)mText + : (cxType)false; + + case tMessageWarning: + return mType == mtWarning + ? (cxType)mText + : (cxType)false; + + case tMessageStatus: + return mType == mtStatus + ? (cxType)mText + : (cxType)false; + + case tMessageError: + return mType == mtError + ? (cxType)mText + : (cxType)false; + + default: break; } + + return cText2SkinRender::GetTokenData(Token); } // --- cText2SkinDisplayVolume ------------------------------------------------ -cText2SkinDisplayVolume::cText2SkinDisplayVolume(cText2SkinLoader *Loader) { - mRender = new cText2SkinRender(Loader, sectionVolume); - mDirty = false; +cText2SkinDisplayVolume::cText2SkinDisplayVolume(cText2SkinLoader *Loader): + cText2SkinRender(Loader, cxDisplay::volume), + mCurrent(0), + mTotal(0), + mMute(false) { } cText2SkinDisplayVolume::~cText2SkinDisplayVolume() { - delete mRender; } void cText2SkinDisplayVolume::SetVolume(int Current, int Total, bool Mute) { - mRender->Lock(); - if (mRender->mVolumeCurrent != Current || mRender->mVolumeTotal != Total || mRender->mVolumeMute != Mute) { - mRender->mVolumeCurrent = Current; - mRender->mVolumeTotal = Total; - mRender->mVolumeMute = Mute; - mDirty = true; + if (mCurrent != Current || mTotal != Total || mMute != Mute) { + mCurrent = Current; + mTotal = Total; + mMute = Mute; + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayVolume::Flush(void) { - if (mDirty) { - mRender->Flush(); - mDirty = false; + cText2SkinRender::Flush(); +} + +cxType cText2SkinDisplayVolume::GetTokenData(const txToken &Token) { + switch (Token.Type) { + case tVolumeCurrent: + return mCurrent; + + case tVolumeTotal: + return mTotal; + + case tIsMute: + return mMute; + + default: break; } + + return cText2SkinRender::GetTokenData(Token); } // --- cText2SkinDisplayReplay ------------------------------------------------ -cText2SkinDisplayReplay::cText2SkinDisplayReplay(cText2SkinLoader *Loader, bool ModeOnly) { - Dprintf("ModeOnly: %d\n", ModeOnly); - mRender = new cText2SkinRender(Loader, ModeOnly ? sectionReplayMode : sectionReplay); - mDirty = false; +cText2SkinDisplayReplay::cText2SkinDisplayReplay(cText2SkinLoader *Loader, bool ModeOnly): + cText2SkinRender(Loader, ModeOnly ? cxDisplay::replaySmall : cxDisplay::replayInfo), + mTitle(""), + mStateInfo(false), + mPlay(false), + mForward(false), + mSpeed(0), + mCurrent(0), + mTotal(0), + mMarks(NULL), + mPrompt(""), + mType(mtStatus), + mText("") { } cText2SkinDisplayReplay::~cText2SkinDisplayReplay() { - delete mRender; } void cText2SkinDisplayReplay::SetTitle(const char *Title) { if (Title == NULL) Title = ""; - mRender->Lock(); - if (mRender->mReplayTitle != Title) { - mRender->mReplayTitle = Title; - mDirty = true; + if (mTitle != Title) { + mTitle = Title; + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayReplay::SetMode(bool Play, bool Forward, int Speed) { - Dprintf("speed: Play = %s, Forward = %s, Speed = %d\n", Play ? "true" : "false", Forward ? "true" : "false", Speed); - mRender->Lock(); - if (mRender->mReplayInfo == false || mRender->mReplayPlay != Play || mRender->mReplayForward != Forward || mRender->mReplaySpeed != Speed) { - mRender->mReplayInfo = true; - mRender->mReplayPlay = Play; - mRender->mReplayForward = Forward; - mRender->mReplaySpeed = Speed; - mDirty = true; + if (!mStateInfo || mPlay != Play || mForward != Forward || mSpeed != Speed) { + mStateInfo = true; + mPlay = Play; + mForward = Forward; + mSpeed = Speed; + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayReplay::SetProgress(int Current, int Total) { - mRender->Lock(); - if (mRender->mReplayCurrent != Current || mRender->mReplayTotal != Total) { - mRender->mReplayCurrent = Current; - mRender->mReplayTotal = Total; - mDirty = true; + Dprintf("SetProgress: %d %d\n", Current, Total); + if (mCurrent != Current || mTotal != Total) { + mCurrent = Current; + mTotal = Total; + // SetDirty(); TODO: let this cause a display update every frame? } - mRender->Unlock(); } void cText2SkinDisplayReplay::SetMarks(const cMarks *Marks) { - mRender->Lock(); - if (mRender->mReplayMarks != Marks) { - mRender->mReplayMarks = Marks; - mDirty = true; + if (mMarks != Marks) { + mMarks = Marks; + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayReplay::SetCurrent(const char *Current) { if (Current == NULL) Current = ""; - mRender->Lock(); - if (mRender->mReplayCurrentText != Current) { - mRender->mReplayCurrentText = Current; - mDirty = true; - } - mRender->Unlock(); + if (mPosition != Current) { + mPosition = Current; + SetDirty(); + } } void cText2SkinDisplayReplay::SetTotal(const char *Total) { if (Total == NULL) Total = ""; - mRender->Lock(); - if (mRender->mReplayTotalText != Total) { - mRender->mReplayTotalText = Total; - mDirty = true; - } - mRender->Unlock(); + if (mDuration != Total) { + mDuration = Total; + SetDirty(); + } } void cText2SkinDisplayReplay::SetJump(const char *Jump) { if (Jump == NULL) Jump = ""; - mRender->Lock(); - if (mRender->mReplayJump != Jump) { - mRender->mReplayJump = Jump; - mDirty = true; + if (mPrompt != Jump) { + mPrompt = Jump; + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayReplay::SetMessage(eMessageType Type, const char *Text) { if (Text == NULL) Text = ""; - mRender->Lock(); - if (mRender->mMessageType != Type || mRender->mMessageText != Text) { - mRender->mMessageType = Type; - mRender->mMessageText = Text; - mDirty = true; + if (mType != Type || mText != Text) { + mType = Type; + mText = Text; + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayReplay::Flush(void) { - if (mDirty) { - mRender->Flush(); - mDirty = false; + cText2SkinRender::Flush(); +} + +cxType cText2SkinDisplayReplay::GetTokenData(const txToken &Token) { + switch (Token.Type) { + case tReplayTitle: + return mTitle; + + case tReplayPositionIndex: + return TimeType(mCurrent, Token.Attrib); + + case tReplayDurationIndex: + return TimeType(mTotal, Token.Attrib); + + case tReplayPosition: + return mPosition; + + case tReplayDuration: + return mDuration; + + case tReplayPrompt: + return mPrompt; + + case tIsPlaying: + return mStateInfo && (mSpeed == -1 && mPlay); + + case tIsPausing: + return mStateInfo && (mSpeed == -1 && !mPlay); + + case tIsFastForward: + if (mStateInfo && (mSpeed != -1 && mPlay && mForward)) { + return Token.Attrib.length() > 0 + ? (cxType)(mSpeed == atoi(Token.Attrib.c_str())) + : (cxType)true; + } + return false; + + case tIsFastRewind: + if (mStateInfo && (mSpeed != -1 && mPlay && !mForward)) { + return Token.Attrib.length() > 0 + ? (cxType)(mSpeed == atoi(Token.Attrib.c_str())) + : (cxType)true; + } + return false; + + case tIsSlowForward: + if (mStateInfo && (mSpeed != -1 && !mPlay && mForward)) { + return Token.Attrib.length() > 0 + ? (cxType)(mSpeed == atoi(Token.Attrib.c_str())) + : (cxType)true; + } + return false; + + case tIsSlowRewind: + if (mStateInfo && (mSpeed != -1 && !mPlay && !mForward)) { + return Token.Attrib.length() > 0 + ? (cxType)(mSpeed == atoi(Token.Attrib.c_str())) + : (cxType)true; + } + return false; + + case tMessage: + return mText; + + case tMessageInfo: + return mType == mtInfo + ? (cxType)mText + : (cxType)false; + + case tMessageWarning: + return mType == mtWarning + ? (cxType)mText + : (cxType)false; + + case tMessageStatus: + return mType == mtStatus + ? (cxType)mText + : (cxType)false; + + case tMessageError: + return mType == mtError + ? (cxType)mText + : (cxType)false; + + case tReplayMode: + return cText2SkinStatus::ReplayMode(); + + default: break; } + + return cText2SkinRender::GetTokenData(Token); } // --- cText2SkinDisplayMessage ----------------------------------------------- -cText2SkinDisplayMessage::cText2SkinDisplayMessage(cText2SkinLoader *Loader) { - mRender = new cText2SkinRender(Loader, sectionMessage); - mDirty = false; +cText2SkinDisplayMessage::cText2SkinDisplayMessage(cText2SkinLoader *Loader): + cText2SkinRender(Loader, cxDisplay::message), + mText("") { } cText2SkinDisplayMessage::~cText2SkinDisplayMessage() { - delete mRender; } void cText2SkinDisplayMessage::SetMessage(eMessageType Type, const char *Text) { if (Text == NULL) Text = ""; - mRender->Lock(); - if (mRender->mMessageType != Type || mRender->mMessageText != Text) { - mRender->mMessageType = Type; - mRender->mMessageText = Text; - mDirty = true; + if (mType != Type || mText != Text) { + mType = Type; + mText = Text; + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayMessage::Flush(void) { - if (mDirty) { - mRender->Flush(); - mDirty = false; + cText2SkinRender::Flush(); +} + +cxType cText2SkinDisplayMessage::GetTokenData(const txToken &Token) { + switch (Token.Type) { + case tMessage: + return mText; + + case tMessageInfo: + return mType == mtInfo + ? (cxType)mText + : (cxType)false; + + case tMessageWarning: + return mType == mtWarning + ? (cxType)mText + : (cxType)false; + + case tMessageStatus: + return mType == mtStatus + ? (cxType)mText + : (cxType)false; + + case tMessageError: + return mType == mtError + ? (cxType)mText + : (cxType)false; + + default: break; } + + return cText2SkinRender::GetTokenData(Token); } // --- cText2SkinDisplayMenu -------------------------------------------------- -cText2SkinDisplayMenu::cText2SkinDisplayMenu(cText2SkinLoader *Loader) { - mRender = new cText2SkinRender(Loader, sectionMenu); - mDirty = false; - mMaxItems = 0; +cText2SkinDisplayMenu::cText2SkinDisplayMenu(cText2SkinLoader *Loader): + cText2SkinRender(Loader, cxDisplay::menu), + mMaxItems(0), + mTitle(""), + mButtonRed(""), + mButtonGreen(""), + mButtonYellow(""), + mButtonBlue(""), + mMessageType(mtStatus), + mMessageText(""), + mEvent(NULL), + mItems(), + mCurrentItem((uint)-1) +{ + cxDisplay *disp = Loader->Data()->Get(cxDisplay::menu); + const cxObject *area = NULL; + for (uint i = 0; i < disp->Objects(); ++i) { + const cxObject *o = disp->GetObject(i); + if (disp->GetObject(i)->Type() == cxObject::list) { + area = o; + break; + } + } - cText2SkinItem *area = Loader->Data()->Get(sectionMenu, itemMenuArea); - cText2SkinItem *item = Loader->Data()->Get(sectionMenu, itemMenuItem); - if (area && item) - mMaxItems = area->Size().h / item->Size().h; - else - esyslog("ERROR: text2skin: Skin is missing the items MenuArea and/or MenuItem"); + if (area != NULL) { + const cxObject *item = area->GetObject(0); + if (item != NULL && item->Type() == cxObject::item) + mMaxItems = area->Size().h / item->Size().h; + } } cText2SkinDisplayMenu::~cText2SkinDisplayMenu() { - delete mRender; } void cText2SkinDisplayMenu::Clear(void) { - mRender->Lock(); - mRender->mMenuItems.clear(); - mRender->mMenuTitle = ""; - mRender->mMenuCurrent = -1; - mRender->mMenuRed = ""; - mRender->mMenuGreen = ""; - mRender->mMenuYellow = ""; - mRender->mMenuBlue = ""; - mRender->mMenuEvent = NULL; - mRender->mMenuRecording = NULL; - mRender->mMenuText = ""; Dprintf("Clear\n"); - //mRender->mMessageText = ""; - DELETENULL(mRender->mScroller); - mRender->Unlock(); - mDirty = true; + mItems.clear(); + mEvent = NULL; + mRecording = NULL; + mText = ""; + SetDirty(); } void cText2SkinDisplayMenu::SetTitle(const char *Title) { if (Title == NULL) Title = ""; - mRender->Lock(); - if (mRender->mMenuTitle != Title) { - mRender->mMenuTitle = Title; - mDirty = true; + if (mTitle != Title) { + mTitle = Title; + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue) { @@ -273,33 +556,32 @@ void cText2SkinDisplayMenu::SetButtons(const char *Red, const char *Green, const if (Green == NULL) Green = ""; if (Yellow == NULL) Yellow = ""; if (Blue == NULL) Blue = ""; - mRender->Lock(); - if (mRender->mMenuRed != Red || mRender->mMenuGreen != Green || mRender->mMenuYellow != Yellow || mRender->mMenuBlue != Blue) { - mRender->mMenuRed = Red; - mRender->mMenuGreen = Green; - mRender->mMenuYellow = Yellow; - mRender->mMenuBlue = Blue; - mDirty = true; + if (mButtonRed != Red || mButtonGreen != Green || mButtonYellow != Yellow || mButtonBlue != Blue) { + mButtonRed = Red; + mButtonGreen = Green; + mButtonYellow = Yellow; + mButtonBlue = Blue; + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayMenu::SetMessage(eMessageType Type, const char *Text) { - Dprintf("SetMessage %s\n", Text); if (Text == NULL) Text = ""; - mRender->Lock(); - if (mRender->mMessageType != Type || mRender->mMessageText != Text) { - mRender->mMessageType = Type; - mRender->mMessageText = Text; - mDirty = true; + if (mMessageType != Type || mMessageText != Text) { + mMessageType = Type; + mMessageText = Text; + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayMenu::SetItem(const char *Text, int Index, bool Current, bool Selectable) { - cText2SkinRender::MenuItem item; + if (Text == NULL) + return; + + tListItem item; item.text = Text; item.sel = Selectable; + for (int i = 0; i < MaxTabs; ++i) { const char *tab = GetTabbedText(Text, i); if (tab) @@ -307,78 +589,202 @@ void cText2SkinDisplayMenu::SetItem(const char *Text, int Index, bool Current, b if (!Tab(i + 1)) break; } - mRender->Lock(); - SetEditableWidth(mRender->GetEditableWidth(item, Current)); - if ((int)mRender->mMenuItems.size() <= Index) { - mRender->mMenuItems.push_back(item); - mDirty = true; - } else if (mRender->mMenuItems[Index] != item) { - mRender->mMenuItems[Index] = item; - mDirty = true; + + if (mItems.size() <= (uint)Index) { + mItems.push_back(item); + SetDirty(); } - if (Current && mRender->mMenuCurrent != Index) { - mRender->mMenuCurrent = Index; - mDirty = true; + else if (mItems[Index] != item) { + mItems[Index] = item; + SetDirty(); + } + + if (Current && mCurrentItem != Index) { + mCurrentItem = Index; + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayMenu::SetEvent(const cEvent *Event) { - mRender->Lock(); - if (mRender->mMenuEvent != Event) { - mRender->mMenuEvent = Event; - mDirty = true; + if (mEvent != Event) { + mEvent = Event; + if (mEvent != NULL) + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayMenu::SetRecording(const cRecording *Recording) { - mRender->Lock(); - if (mRender->mMenuRecording != Recording) { - mRender->mMenuRecording = Recording; - mDirty = true; + // yet unused + if (mRecording != Recording) { + mRecording = Recording; + if (mRecording != NULL) + SetDirty(); } - mRender->Unlock(); } -void cText2SkinDisplayMenu::SetText(const char *Text, bool FixedFont) { +void cText2SkinDisplayMenu::SetText(const char *Text, bool /*FixedFont*/) { if (Text == NULL) Text = ""; - mRender->Lock(); - if (mRender->mMenuText != Text || mRender->mMenuTextFixedFont != FixedFont) { - mRender->mMenuText = Text; - mRender->mMenuTextFixedFont = FixedFont; - mDirty = true; + if (mText != Text) { + mText = Text; + SetDirty(); } - mRender->Unlock(); } void cText2SkinDisplayMenu::SetTabs(int Tab1, int Tab2, int Tab3, int Tab4, int Tab5) { cSkinDisplayMenu::SetTabs(Tab1, Tab2, Tab3, Tab4, Tab5); - mRender->Lock(); - mRender->mMenuTabs[0] = Tab(0); - mRender->mMenuTabs[1] = Tab(1); - mRender->mMenuTabs[2] = Tab(2); - mRender->mMenuTabs[3] = Tab(3); - mRender->mMenuTabs[4] = Tab(4); - mRender->mMenuTabs[5] = Tab(5); - mRender->Unlock(); } void cText2SkinDisplayMenu::Scroll(bool Up, bool Page) { - mRender->Lock(); - if (mRender->mScroller && (Up ? mRender->mScroller->CanScrollUp() : mRender->mScroller->CanScrollDown())) { - mRender->mMenuScroll = true; - mRender->mMenuScrollUp = Up; - mRender->mMenuScrollPage = Page; - mDirty = true; - } - mRender->Unlock(); + cText2SkinRender::Scroll(Up, Page); + SetDirty(); } void cText2SkinDisplayMenu::Flush(void) { - if (mDirty) { - mRender->Flush(); - mDirty = false; + cText2SkinRender::Flush(); +} + +cxType cText2SkinDisplayMenu::GetTokenData(const txToken &Token) { + switch (Token.Type) { + case tMenuItem: + case tMenuGroup: + case tIsMenuItem: + case tIsMenuGroup: + case tIsMenuCurrent: + if (Token.Index < 0) return false; + case tMenuCurrent: + Dprintf("MenuCurrent: index %d\n", Token.Index); + if (Token.Index >= 0 && Token.Tab == -1) return false; + break; + + default: + if (Token.Tab >= 0) return false; + break; } -} + switch (Token.Type) { + case tMenuTitle: + return mTitle; + + case tMenuItem: + return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel + && mCurrentItem != Token.Index + ? (cxType)mItems[Token.Index].tabs[Token.Tab] + : (cxType)false; + + case tIsMenuItem: + return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel + && mCurrentItem != Token.Index; + + case tMenuCurrent: + if (Token.Index < 0) + return mItems[mCurrentItem].text; + + return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel + && mCurrentItem == Token.Index + ? (cxType)mItems[Token.Index].tabs[Token.Tab] + : (cxType)false; + + case tIsMenuCurrent: + return mItems.size() > (uint)Token.Index && mItems[Token.Index].sel + && mCurrentItem == Token.Index; + + case tMenuGroup: + return mItems.size() > (uint)Token.Index && !mItems[Token.Index].sel + ? (cxType)mItems[Token.Index].tabs[Token.Tab] + : (cxType)false; + + case tIsMenuGroup: + return mItems.size() > (uint)Token.Index && !mItems[Token.Index].sel; + + case tButtonRed: + return mButtonRed; + + case tButtonGreen: + return mButtonGreen; + + case tButtonYellow: + return mButtonYellow; + + case tButtonBlue: + return mButtonBlue; + + case tMessage: + return mMessageText; + + case tMessageInfo: + return mMessageType == mtInfo + ? (cxType)mMessageText + : (cxType)false; + + case tMessageWarning: + return mMessageType == mtWarning + ? (cxType)mMessageText + : (cxType)false; + + case tMessageStatus: + return mMessageType == mtStatus + ? (cxType)mMessageText + : (cxType)false; + + case tMessageError: + return mMessageType == mtError + ? (cxType)mMessageText + : (cxType)false; + + case tPresentStartDateTime: + return mEvent != NULL + ? (cxType)TimeType(mEvent->StartTime(), Token.Attrib) + : (cxType)false; + + case tPresentVPSDateTime: + return mEvent != NULL + ? (cxType)TimeType(mEvent->Vps(), Token.Attrib) + : (cxType)false; + + case tPresentEndDateTime: + return mEvent != NULL + ? (cxType)TimeType(mEvent->EndTime(), Token.Attrib) + : (cxType)false; + + case tPresentProgress: + return mEvent != NULL + ? (cxType)TimeType(time(NULL) - mEvent->StartTime(), Token.Attrib) + : (cxType)false; + + case tPresentDuration: + return mEvent != NULL + ? (cxType)TimeType(mEvent->Duration(), Token.Attrib) + : (cxType)false; + + case tPresentTitle: + return mEvent != NULL + ? (cxType)mEvent->Title() + : (cxType)false; + + case tPresentShortText: + return mEvent != NULL + ? (cxType)mEvent->ShortText() + : (cxType)false; + + case tPresentDescription: + return mEvent != NULL + ? (cxType)mEvent->Description() + : (cxType)false; + + case tHasVPS: + return mEvent != NULL && mEvent->Vps() != 0; + + case tHasTimer: + return mEvent != NULL && mEvent->HasTimer(); + + case tIsRunning: + return mEvent != NULL && mEvent->IsRunning(); + + case tMenuText: + return mText; + + default: break; + } + + return cText2SkinRender::GetTokenData(Token); +} |