diff options
author | lordjaxom <lordjaxom> | 2004-12-19 22:03:02 +0000 |
---|---|---|
committer | lordjaxom <lordjaxom> | 2004-12-19 22:03:02 +0000 |
commit | 9aeb43d010d2452890d2c04832f1dfda8d963c4d (patch) | |
tree | 4907fb636d40fc14a8f4d53ce33540afab3119cb | |
parent | ac920774dee48c0a85b3c6fc8c6785c1a5dd8f6d (diff) | |
download | vdr-plugin-text2skin-9aeb43d010d2452890d2c04832f1dfda8d963c4d.tar.gz vdr-plugin-text2skin-9aeb43d010d2452890d2c04832f1dfda8d963c4d.tar.bz2 |
Initial revision
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | bitmap.c | 2 | ||||
-rw-r--r-- | bitmap.h | 2 | ||||
-rw-r--r-- | cache.c | 2 | ||||
-rw-r--r-- | cache.h | 2 | ||||
-rw-r--r-- | common.c | 77 | ||||
-rw-r--r-- | common.h | 3 | ||||
-rw-r--r-- | display.c | 129 | ||||
-rw-r--r-- | display.h | 2 | ||||
-rw-r--r-- | file.c | 2 | ||||
-rw-r--r-- | file.h | 2 | ||||
-rw-r--r-- | font.c | 2 | ||||
-rw-r--r-- | font.h | 2 | ||||
-rw-r--r-- | graphtft/font.c | 2 | ||||
-rw-r--r-- | graphtft/font.h | 2 | ||||
-rw-r--r-- | i18n.c | 2 | ||||
-rw-r--r-- | i18n.h | 2 | ||||
-rw-r--r-- | loader.c | 2 | ||||
-rw-r--r-- | loader.h | 2 | ||||
-rw-r--r-- | marquee.c | 92 | ||||
-rw-r--r-- | marquee.h | 44 | ||||
-rw-r--r-- | menu.c | 2 | ||||
-rw-r--r-- | menu.h | 2 | ||||
-rw-r--r-- | render.c | 64 | ||||
-rw-r--r-- | render.h | 9 | ||||
-rw-r--r-- | screen.c | 2 | ||||
-rw-r--r-- | screen.h | 2 | ||||
-rw-r--r-- | scroller.c | 17 | ||||
-rw-r--r-- | scroller.h | 47 | ||||
-rw-r--r-- | setup.c | 2 | ||||
-rw-r--r-- | setup.h | 2 | ||||
-rw-r--r-- | status.c | 2 | ||||
-rw-r--r-- | status.h | 2 | ||||
-rw-r--r-- | text2skin.c | 2 | ||||
-rw-r--r-- | text2skin.h | 2 | ||||
-rw-r--r-- | theme.c | 2 | ||||
-rw-r--r-- | theme.h | 2 | ||||
-rw-r--r-- | xml/display.c | 2 | ||||
-rw-r--r-- | xml/display.h | 2 | ||||
-rw-r--r-- | xml/function.c | 2 | ||||
-rw-r--r-- | xml/function.h | 2 | ||||
-rw-r--r-- | xml/object.c | 6 | ||||
-rw-r--r-- | xml/object.h | 5 | ||||
-rw-r--r-- | xml/parser.c | 8 | ||||
-rw-r--r-- | xml/parser.h | 2 | ||||
-rw-r--r-- | xml/skin.c | 2 | ||||
-rw-r--r-- | xml/skin.h | 2 | ||||
-rw-r--r-- | xml/string.c | 31 | ||||
-rw-r--r-- | xml/string.h | 70 | ||||
-rw-r--r-- | xml/type.c | 2 | ||||
-rw-r--r-- | xml/type.h | 2 | ||||
-rw-r--r-- | xml/xml.c | 2 | ||||
-rw-r--r-- | xml/xml.h | 2 |
53 files changed, 486 insertions, 196 deletions
@@ -13,7 +13,7 @@ HAVE_FREETYPE=1 # DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU'RE DOING # ------------------------------------------------------------- # -# $Id: Makefile,v 1.9 2004/12/12 20:26:25 lordjaxom Exp $ +# $Id: Makefile,v 1.1 2004/12/19 22:03:06 lordjaxom Exp $ # # The official name of this plugin. @@ -55,7 +55,7 @@ PACKAGE = vdr-$(ARCHIVE) OBJS = $(PLUGIN).o loader.o display.o render.o common.o bitmap.o \ file.o i18n.o theme.o cache.o setup.o status.o scroller.o screen.o \ - menu.o font.o quantize.o \ + menu.o font.o quantize.o marquee.o \ \ xml/skin.o xml/parser.o xml/string.o xml/object.o xml/function.o \ xml/type.o xml/display.o xml/xml.o @@ -1,5 +1,5 @@ /* - * $Id: bitmap.c,v 1.6 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: bitmap.c,v 1.1 2004/12/19 22:03:08 lordjaxom Exp $ */ #include "bitmap.h" @@ -1,5 +1,5 @@ /* - * $Id: bitmap.h,v 1.4 2004/12/14 13:13:10 lordjaxom Exp $ + * $Id: bitmap.h,v 1.1 2004/12/19 22:03:09 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_BITMAP_H @@ -1,5 +1,5 @@ /* - * $Id: cache.c,v 1.4 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: cache.c,v 1.1 2004/12/19 22:03:09 lordjaxom Exp $ */ #include "cache.h" @@ -1,5 +1,5 @@ /* - * $Id: cache.h,v 1.3 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: cache.h,v 1.1 2004/12/19 22:03:09 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_CACHE_HPP @@ -1,5 +1,5 @@ /* - * $Id: common.c,v 1.5 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: common.c,v 1.1 2004/12/19 22:03:09 lordjaxom Exp $ */ #include "common.h" @@ -89,7 +89,8 @@ const char *ChannelBouquet(const cChannel *Channel, int Number) { #endif } */ -cxType TimeType(time_t Time, const std::string &Format) { +cxType TimeType(time_t Time, const std::string &Format) +{ static char result[1000]; struct tm tm_r, *tm; tm = localtime_r(&Time, &tm_r); @@ -101,10 +102,78 @@ cxType TimeType(time_t Time, const std::string &Format) { } else return Time; } - return false; + return cxType::False; +} + +cxType DurationType(uint Index, const std::string &Format) +{ + static char result[1000]; + if (Index > 0) { + if (Format.length() > 0) { + const char *ptr = Format.c_str(); + char *res = result; + enum { normal, format } state = normal; + while (*ptr && res < result + sizeof(result)) { + int n = 0; + int f = (Index % FRAMESPERSEC) + 1; + int s = (Index / FRAMESPERSEC); + int m = s / 60 % 60; + int h = s / 3600; + s %= 60; + switch (state) { + case normal: + if (*ptr == '%') + state = format; + else + *(res++) = *ptr; + break; + + case format: + switch (*ptr) { + case 'H': + n = snprintf(res, sizeof(result) - (res - result), "%02d", h); + break; + + case 'k': + n = snprintf(res, sizeof(result) - (res - result), "% 2d", h); + break; + + case 'M': + n = snprintf(res, sizeof(result) - (res - result), "%02d", m); + break; + + case 'm': + n = snprintf(res, sizeof(result) - (res - result), "%d", m + (h * 60)); + break; + + case 'S': + n = snprintf(res, sizeof(result) - (res - result), "%02d", s); + break; + + case 'f': + n = snprintf(res, sizeof(result) - (res - result), "%d", f); + break; + + case '%': + n = 1; + *res = '%'; + break; + } + res += n; + state = normal; + break; + } + ++ptr; + } + return result; + } else + return (int)Index; + } + return cxType::False; } -bool ParseVar(const char *Text, const char *Name, std::string &Value) { +bool ParseVar(const char *Text, const char *Name, std::string &Value) +{ const char *ptr1, *ptr2; char *str; bool res = false; @@ -1,5 +1,5 @@ /* - * $Id: common.h,v 1.5 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: common.h,v 1.1 2004/12/19 22:03:09 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_COMMON_H @@ -36,6 +36,7 @@ const char *ChannelShortName(const cChannel *Channel, int Number); //const char *ChannelBouquet(const cChannel *Channel, int Number); cxType TimeType(time_t Time, const std::string &Format); +cxType DurationType(uint Index, const std::string &Format); bool ParseVar(const char *Text, const char *Name, std::string &Value); bool ParseVar(const char *Text, const char *Name, tColor *Value); @@ -1,5 +1,5 @@ /* - * $Id: display.c,v 1.10 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: display.c,v 1.1 2004/12/19 22:03:12 lordjaxom Exp $ */ #include "render.h" @@ -127,33 +127,33 @@ cxType cText2SkinDisplayChannel::GetTokenData(const txToken &Token) case tPresentStartDateTime: return mPresent != NULL - ? (cxType)TimeType(mPresent->StartTime(), Token.Attrib) + ? (cxType)TimeType(mPresent->StartTime(), Token.Attrib.Text) : (cxType)false; case tPresentVPSDateTime: return mPresent != NULL - ? (cxType)TimeType(mPresent->Vps(), Token.Attrib) + ? (cxType)TimeType(mPresent->Vps(), Token.Attrib.Text) : (cxType)false; - case tPresentEndDateTime: - return mPresent != NULL - ? (cxType)TimeType(mPresent->EndTime(), Token.Attrib) + case tPresentEndDateTime: return mPresent != NULL + ? (cxType)TimeType(mPresent->EndTime(), Token.Attrib.Text) : (cxType)false; case tPresentProgress: return mPresent != NULL - ? (cxType)TimeType(time(NULL) - mPresent->StartTime(), Token.Attrib) + ? (cxType)DurationType((time(NULL) - mPresent->StartTime()) * FRAMESPERSEC, + Token.Attrib.Text) : (cxType)false; case tPresentDuration: return mPresent != NULL - ? (cxType)TimeType(mPresent->Duration(), Token.Attrib) + ? (cxType)DurationType(mPresent->Duration() * FRAMESPERSEC, Token.Attrib.Text) : (cxType)false; case tPresentRemaining: return mPresent != NULL - ? (cxType)TimeType(mPresent->Duration() - (time(NULL) - mPresent->StartTime()), - Token.Attrib) + ? (cxType)DurationType((mPresent->Duration() - (time(NULL) - mPresent->StartTime())) + * FRAMESPERSEC, Token.Attrib.Text) : (cxType)false; case tPresentTitle: @@ -173,22 +173,22 @@ cxType cText2SkinDisplayChannel::GetTokenData(const txToken &Token) case tFollowingStartDateTime: return mFollowing != NULL - ? (cxType)TimeType(mFollowing->StartTime(), Token.Attrib) + ? (cxType)TimeType(mFollowing->StartTime(), Token.Attrib.Text) : (cxType)false; case tFollowingVPSDateTime: return mFollowing != NULL - ? (cxType)TimeType(mFollowing->Vps(), Token.Attrib) + ? (cxType)TimeType(mFollowing->Vps(), Token.Attrib.Text) : (cxType)false; case tFollowingEndDateTime: return mFollowing != NULL - ? (cxType)TimeType(mFollowing->EndTime(), Token.Attrib) + ? (cxType)TimeType(mFollowing->EndTime(), Token.Attrib.Text) : (cxType)false; case tFollowingDuration: return mFollowing != NULL - ? (cxType)TimeType(mFollowing->Duration(), Token.Attrib) + ? (cxType)DurationType(mFollowing->Duration() * FRAMESPERSEC, Token.Attrib.Text) : (cxType)false; case tFollowingTitle: @@ -281,10 +281,9 @@ cxType cText2SkinDisplayChannel::GetTokenData(const txToken &Token) case tButtonBlue: return mButtonBlue; - default: break; + default: + return cText2SkinRender::GetTokenData(Token); } - - return cText2SkinRender::GetTokenData(Token); } // --- cText2SkinDisplayVolume ------------------------------------------------ @@ -324,10 +323,9 @@ cxType cText2SkinDisplayVolume::GetTokenData(const txToken &Token) { case tIsMute: return mMute; - default: break; + default: + return cText2SkinRender::GetTokenData(Token); } - - return cText2SkinRender::GetTokenData(Token); } // --- cText2SkinDisplayReplay ------------------------------------------------ @@ -369,6 +367,7 @@ void cText2SkinDisplayReplay::SetTitle(const char *Title) void cText2SkinDisplayReplay::SetMode(bool Play, bool Forward, int Speed) { + Dprintf("SetMode(%d, %d, %d)\n", Play, Forward, Speed); UpdateLock(); if (!mStateInfo || mPlay != Play || mForward != Forward || mSpeed != Speed) { mStateInfo = true; @@ -472,10 +471,10 @@ cxType cText2SkinDisplayReplay::GetTokenData(const txToken &Token) return mTitle; case tReplayPositionIndex: - return TimeType(mCurrent, Token.Attrib); + return DurationType(mCurrent, Token.Attrib.Text); case tReplayDurationIndex: - return TimeType(mTotal, Token.Attrib); + return DurationType(mTotal, Token.Attrib.Text); case tReplayPosition: return mPosition; @@ -484,7 +483,7 @@ cxType cText2SkinDisplayReplay::GetTokenData(const txToken &Token) return mDuration; case tReplayRemaining: - return TimeType(mTotal - mCurrent, Token.Attrib); + return DurationType(mTotal - mCurrent, Token.Attrib.Text); case tReplayPrompt: return mPrompt; @@ -497,32 +496,32 @@ cxType cText2SkinDisplayReplay::GetTokenData(const txToken &Token) case tIsFastForward: if (mStateInfo && mSpeed != -1 && mPlay && mForward) { - return Token.Attrib.length() > 0 - ? (cxType)(mSpeed == atoi(Token.Attrib.c_str())) + return Token.Attrib.Type == aNumber + ? (cxType)(mSpeed == Token.Attrib.Number) : (cxType)true; } return false; case tIsFastRewind: if (mStateInfo && mSpeed != -1 && mPlay && !mForward) { - return Token.Attrib.length() > 0 - ? (cxType)(mSpeed == atoi(Token.Attrib.c_str())) + return Token.Attrib.Type == aNumber + ? (cxType)(mSpeed == Token.Attrib.Number) : (cxType)true; } return false; case tIsSlowForward: if (mStateInfo && mSpeed != -1 && !mPlay && mForward) { - return Token.Attrib.length() > 0 - ? (cxType)(mSpeed == atoi(Token.Attrib.c_str())) + return Token.Attrib.Type == aNumber + ? (cxType)(mSpeed == Token.Attrib.Number) : (cxType)true; } return false; case tIsSlowRewind: if (mStateInfo && mSpeed != -1 && !mPlay && !mForward) { - return Token.Attrib.length() > 0 - ? (cxType)(mSpeed == atoi(Token.Attrib.c_str())) + return Token.Attrib.Type == aNumber + ? (cxType)(mSpeed == Token.Attrib.Number) : (cxType)true; } return false; @@ -565,23 +564,25 @@ cxType cText2SkinDisplayReplay::GetTokenData(const txToken &Token) case tButtonBlue: return mButtonBlue; - default: break; + default: + return cText2SkinRender::GetTokenData(Token); } - - return cText2SkinRender::GetTokenData(Token); } // --- cText2SkinDisplayMessage ----------------------------------------------- cText2SkinDisplayMessage::cText2SkinDisplayMessage(cText2SkinLoader *Loader): cText2SkinRender(Loader, cxDisplay::message), - mText("") { + mText("") +{ } -cText2SkinDisplayMessage::~cText2SkinDisplayMessage() { +cText2SkinDisplayMessage::~cText2SkinDisplayMessage() +{ } -void cText2SkinDisplayMessage::SetMessage(eMessageType Type, const char *Text) { +void cText2SkinDisplayMessage::SetMessage(eMessageType Type, const char *Text) +{ UpdateLock(); if (Text == NULL) Text = ""; if (mType != Type || mText != Text) { @@ -592,7 +593,8 @@ void cText2SkinDisplayMessage::SetMessage(eMessageType Type, const char *Text) { UpdateUnlock(); } -cxType cText2SkinDisplayMessage::GetTokenData(const txToken &Token) { +cxType cText2SkinDisplayMessage::GetTokenData(const txToken &Token) +{ switch (Token.Type) { case tMessage: return mText; @@ -617,10 +619,9 @@ cxType cText2SkinDisplayMessage::GetTokenData(const txToken &Token) { ? (cxType)mText : (cxType)false; - default: break; + default: + return cText2SkinRender::GetTokenData(Token); } - - return cText2SkinRender::GetTokenData(Token); } // --- cText2SkinDisplayMenu -------------------------------------------------- @@ -703,7 +704,8 @@ void cText2SkinDisplayMenu::SetButtons(const char *Red, const char *Green, const UpdateUnlock(); } -void cText2SkinDisplayMenu::SetMessage(eMessageType Type, const char *Text) { +void cText2SkinDisplayMenu::SetMessage(eMessageType Type, const char *Text) +{ UpdateLock(); if (Text == NULL) Text = ""; if (mMessageType != Type || mMessageText != Text) { @@ -714,7 +716,8 @@ void cText2SkinDisplayMenu::SetMessage(eMessageType Type, const char *Text) { UpdateUnlock(); } -void cText2SkinDisplayMenu::SetItem(const char *Text, int Index, bool Current, bool Selectable) { +void cText2SkinDisplayMenu::SetItem(const char *Text, int Index, bool Current, bool Selectable) +{ UpdateLock(); if (Text == NULL) return; @@ -748,7 +751,8 @@ void cText2SkinDisplayMenu::SetItem(const char *Text, int Index, bool Current, b UpdateUnlock(); } -void cText2SkinDisplayMenu::SetEvent(const cEvent *Event) { +void cText2SkinDisplayMenu::SetEvent(const cEvent *Event) +{ UpdateLock(); if (mEvent != Event) { mEvent = Event; @@ -758,7 +762,8 @@ void cText2SkinDisplayMenu::SetEvent(const cEvent *Event) { UpdateUnlock(); } -void cText2SkinDisplayMenu::SetRecording(const cRecording *Recording) { +void cText2SkinDisplayMenu::SetRecording(const cRecording *Recording) +{ UpdateLock(); // yet unused if (mRecording != Recording) { @@ -769,7 +774,8 @@ void cText2SkinDisplayMenu::SetRecording(const cRecording *Recording) { UpdateUnlock(); } -void cText2SkinDisplayMenu::SetText(const char *Text, bool /*FixedFont*/) { +void cText2SkinDisplayMenu::SetText(const char *Text, bool /*FixedFont*/) +{ UpdateLock(); if (Text == NULL) Text = ""; if (mText != Text) { @@ -779,20 +785,23 @@ void cText2SkinDisplayMenu::SetText(const char *Text, bool /*FixedFont*/) { UpdateUnlock(); } -void cText2SkinDisplayMenu::SetTabs(int Tab1, int Tab2, int Tab3, int Tab4, int Tab5) { +void cText2SkinDisplayMenu::SetTabs(int Tab1, int Tab2, int Tab3, int Tab4, int Tab5) +{ UpdateLock(); cSkinDisplayMenu::SetTabs(Tab1, Tab2, Tab3, Tab4, Tab5); UpdateUnlock(); } -void cText2SkinDisplayMenu::Scroll(bool Up, bool Page) { +void cText2SkinDisplayMenu::Scroll(bool Up, bool Page) +{ UpdateLock(); cText2SkinRender::Scroll(Up, Page); SetDirty(); UpdateUnlock(); } -cxType cText2SkinDisplayMenu::GetTokenData(const txToken &Token) { +cxType cText2SkinDisplayMenu::GetTokenData(const txToken &Token) +{ switch (Token.Type) { case tMenuItem: case tMenuGroup: @@ -880,27 +889,34 @@ cxType cText2SkinDisplayMenu::GetTokenData(const txToken &Token) { case tPresentStartDateTime: return mEvent != NULL - ? (cxType)TimeType(mEvent->StartTime(), Token.Attrib) + ? (cxType)TimeType(mEvent->StartTime(), Token.Attrib.Text) : (cxType)false; case tPresentVPSDateTime: return mEvent != NULL - ? (cxType)TimeType(mEvent->Vps(), Token.Attrib) + ? (cxType)TimeType(mEvent->Vps(), Token.Attrib.Text) : (cxType)false; case tPresentEndDateTime: return mEvent != NULL - ? (cxType)TimeType(mEvent->EndTime(), Token.Attrib) + ? (cxType)TimeType(mEvent->EndTime(), Token.Attrib.Text) : (cxType)false; case tPresentProgress: return mEvent != NULL - ? (cxType)TimeType(time(NULL) - mEvent->StartTime(), Token.Attrib) + ? (cxType)DurationType((time(NULL) - mEvent->StartTime()) * FRAMESPERSEC, + Token.Attrib.Text) : (cxType)false; case tPresentDuration: return mEvent != NULL - ? (cxType)TimeType(mEvent->Duration(), Token.Attrib) + ? (cxType)DurationType(mEvent->Duration() * FRAMESPERSEC, Token.Attrib.Text) + : (cxType)false; + + case tPresentRemaining: + return mEvent != NULL + ? (cxType)DurationType((mEvent->Duration() - (time(NULL) - mEvent->StartTime())) + * FRAMESPERSEC, Token.Attrib.Text) : (cxType)false; case tPresentTitle: @@ -930,8 +946,7 @@ cxType cText2SkinDisplayMenu::GetTokenData(const txToken &Token) { case tMenuText: return mText; - default: break; + default: + return cText2SkinRender::GetTokenData(Token); } - - return cText2SkinRender::GetTokenData(Token); } @@ -1,5 +1,5 @@ /* - * $Id: display.h,v 1.8 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: display.h,v 1.1 2004/12/19 22:03:13 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_SKIN_H @@ -1,5 +1,5 @@ /* - * $Id: file.c,v 1.1.1.1 2004/11/19 16:45:31 lordjaxom Exp $ + * $Id: file.c,v 1.1 2004/12/19 22:03:13 lordjaxom Exp $ */ #include "file.h" @@ -1,5 +1,5 @@ /* - * $Id: file.h,v 1.1.1.1 2004/11/19 16:45:31 lordjaxom Exp $ + * $Id: file.h,v 1.1 2004/12/19 22:03:13 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_FILE_H @@ -1,5 +1,5 @@ /* - * $Id: font.c,v 1.6 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: font.c,v 1.1 2004/12/19 22:03:13 lordjaxom Exp $ */ #include "font.h" @@ -1,5 +1,5 @@ /* - * $Id: font.h,v 1.5 2004/12/08 17:23:41 lordjaxom Exp $ + * $Id: font.h,v 1.1 2004/12/19 22:03:13 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_FONT_H diff --git a/graphtft/font.c b/graphtft/font.c index 54b6083..cd21471 100644 --- a/graphtft/font.c +++ b/graphtft/font.c @@ -1,5 +1,5 @@ /* - * $Id: font.c,v 1.6 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: font.c,v 1.1 2004/12/19 22:03:24 lordjaxom Exp $ * * Taken from GraphTFT */ diff --git a/graphtft/font.h b/graphtft/font.h index 8969287..2d2eee1 100644 --- a/graphtft/font.h +++ b/graphtft/font.h @@ -1,5 +1,5 @@ /* - * $Id: font.h,v 1.5 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: font.h,v 1.1 2004/12/19 22:03:24 lordjaxom Exp $ * * Taken from GraphTFT */ @@ -1,5 +1,5 @@ /* - * $Id: i18n.c,v 1.1.1.1 2004/11/19 16:45:31 lordjaxom Exp $ + * $Id: i18n.c,v 1.1 2004/12/19 22:03:14 lordjaxom Exp $ */ #include "i18n.h" @@ -1,5 +1,5 @@ /* - * $Id: i18n.h,v 1.1.1.1 2004/11/19 16:45:31 lordjaxom Exp $ + * $Id: i18n.h,v 1.1 2004/12/19 22:03:14 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_I18N_H @@ -1,5 +1,5 @@ /* - * $Id: loader.c,v 1.6 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: loader.c,v 1.1 2004/12/19 22:03:14 lordjaxom Exp $ */ #include "loader.h" @@ -1,5 +1,5 @@ /* - * $Id: loader.h,v 1.1.1.1 2004/11/19 16:45:31 lordjaxom Exp $ + * $Id: loader.h,v 1.1 2004/12/19 22:03:14 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_LOADER_H diff --git a/marquee.c b/marquee.c new file mode 100644 index 0000000..0397718 --- /dev/null +++ b/marquee.c @@ -0,0 +1,92 @@ +/* + * $Id: marquee.c,v 1.1 2004/12/19 22:03:14 lordjaxom Exp $ + */ + +#include "marquee.h" +#include "screen.h" +#include <vdr/tools.h> + +cText2SkinMarquee::cText2SkinMarquee(const cText2SkinMarquee &Src): + mScreen(Src.mScreen), + mFont(Src.mFont), + mLeft(Src.mLeft), + mTop(Src.mTop), + mWidth(Src.mWidth), + mHeight(Src.mHeight), + mText(Src.mText), + mScrolling(Src.mScrolling), + mOffset(Src.mOffset), + mDirection(Src.mDirection), + mColorFg(Src.mColorFg), + mColorBg(Src.mColorBg), + mNextTime(Src.mNextTime) +{ +} + +cText2SkinMarquee::cText2SkinMarquee(cText2SkinScreen *Screen, int Left, int Top, int Width, + int Height, const std::string &Text, const cFont *Font, + tColor ColorFg, tColor ColorBg, int &UpdateIn) +{ + Set(Screen, Left, Top, Width, Height, Text, Font, ColorFg, ColorBg, UpdateIn); +} + +void cText2SkinMarquee::Set(cText2SkinScreen *Screen, int Left, int Top, int Width, int Height, + const std::string &Text, const cFont *Font, tColor ColorFg, + tColor ColorBg, int &UpdateIn) +{ + mScreen = Screen; + mFont = Font; + mLeft = Left; + mTop = Top; + mWidth = Width; + mHeight = Height; + mText = Text; + mColorFg = ColorFg; + mColorBg = ColorBg; + mOffset = 0; + mDirection = 1; + mNextTime = 0; + mScrolling = mFont->Width(mText.c_str()) > mWidth; + DrawText(UpdateIn); +} + +void cText2SkinMarquee::DrawText(int &mUpdateIn) +{ + uint now = time_ms(); + if (!mScrolling || (mNextTime > 0 && now < mNextTime)) { + mScreen->DrawText(mLeft, mTop, mText.c_str() + mOffset, mColorFg, mColorBg, mFont, mWidth, + mHeight); + if (mScrolling) { + uint updatein = mNextTime - now; + if (mUpdateIn == 0 || (uint)mUpdateIn > updatein) + mUpdateIn = updatein; + } + return; + } + + int nextupdate = 250; + if (mDirection > 0) { + if (mFont->Width(mText.c_str() + mOffset) <= mWidth) { + --mDirection; + nextupdate = 1500; + } + else + ++mOffset; + } + else { + if (mOffset <= 0) { + ++mDirection; + nextupdate = 1500; + } + else + --mOffset; + } + + mNextTime = now + nextupdate; + + mScreen->DrawText(mLeft, mTop, mText.c_str() + mOffset, mColorFg, mColorBg, mFont, mWidth, + mHeight); + + if (mUpdateIn == 0 || mUpdateIn > nextupdate) + mUpdateIn = nextupdate; +} diff --git a/marquee.h b/marquee.h new file mode 100644 index 0000000..c989e47 --- /dev/null +++ b/marquee.h @@ -0,0 +1,44 @@ +/* + * $Id: marquee.h,v 1.1 2004/12/19 22:03:14 lordjaxom Exp $ + */ + +#ifndef VDR_TEXT2SKIN_MARQUEE_H +#define VDR_TEXT2SKIN_MARQUEE_H + +#include <vdr/osd.h> +#include <string> + +class cFont; +class cText2SkinScreen; + +class cText2SkinMarquee { +private: + cText2SkinScreen *mScreen; + const cFont *mFont; + int mLeft; + int mTop; + int mWidth; + int mHeight; + std::string mText; + bool mScrolling; + int mOffset; + int mDirection; + tColor mColorFg; + tColor mColorBg; + uint mNextTime; + + cText2SkinMarquee(void) {} // disallow direct construction + +public: + cText2SkinMarquee(const cText2SkinMarquee &Src); + cText2SkinMarquee(cText2SkinScreen *Screen, int Left, int Top, int Width, int Height, + const std::string &Text, const cFont *Font, tColor ColorFg, tColor ColorBg, + int &UpdateIn); + + void Set(cText2SkinScreen *Screen, int Left, int Top, int Width, int Height, + const std::string &Text, const cFont *Font, tColor ColorFg, tColor ColorBg, + int &UpdateIn); + void DrawText(int &UpdateIn); +}; + +#endif // VDR_TEXT2SKIN_MARQUEE_H @@ -1,5 +1,5 @@ /* - * $Id: menu.c,v 1.1.1.1 2004/11/19 16:45:31 lordjaxom Exp $ + * $Id: menu.c,v 1.1 2004/12/19 22:03:14 lordjaxom Exp $ */ #include "menu.h" @@ -1,5 +1,5 @@ /* - * $Id: menu.h,v 1.1.1.1 2004/11/19 16:45:31 lordjaxom Exp $ + * $Id: menu.h,v 1.1 2004/12/19 22:03:14 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_MENU_H @@ -1,5 +1,5 @@ /* - * $Id: render.c,v 1.11 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: render.c,v 1.1 2004/12/19 22:03:16 lordjaxom Exp $ */ #include "render.h" @@ -10,6 +10,7 @@ #include "status.h" #include "screen.h" #include "scroller.h" +#include "marquee.h" #include "xml/display.h" #include <vdr/channels.h> #include <vdr/epg.h> @@ -105,6 +106,7 @@ cText2SkinRender::~cText2SkinRender() Cancel(3); } delete mScroller; + mMarquees.clear(); delete mScreen; //cText2SkinBitmap::ResetCache(); mRender = NULL; @@ -156,6 +158,11 @@ void cText2SkinRender::DrawObject(const cxObject *Object) Object->Align()); break; + case cxObject::marquee: + DrawMarquee(Object->Pos(), Object->Size(), Object->Fg(), Object->Text(), Object->Font(), + Object->Align(), Object->Index()); + break; + case cxObject::rectangle: DrawRectangle(Object->Pos(), Object->Size(), Object->Fg()); break; @@ -274,6 +281,19 @@ void cText2SkinRender::DrawText(const txPoint &Pos, const txSize &Size, const tC mScreen->DrawText(Pos.x, Pos.y, Text.c_str(), Fg ? *Fg : 0, 0, Font, Size.w, Size.h, Align); } +void cText2SkinRender::DrawMarquee(const txPoint &Pos, const txSize &Size, const tColor *Fg, + const std::string &Text, const cFont *Font, int Align, + uint Index) +{ + Dprintf("DrawMarquee %d -> %s\n", Index, Text.c_str()); + if (Index >= mMarquees.size()) { + cText2SkinMarquee marquee(mScreen, Pos.x, Pos.y, Size.w, Size.h, Text, Font, Fg ? *Fg : 0, + clrTransparent, mUpdateIn); + mMarquees.push_back(marquee); + } else + mMarquees[Index].DrawText(mUpdateIn); +} + void cText2SkinRender::DrawRectangle(const txPoint &Pos, const txSize &Size, const tColor *Fg) { mScreen->DrawRectangle(Pos.x, Pos.y, Pos.x + Size.w - 1, Pos.y + Size.h - 1, Fg ? *Fg : 0); @@ -447,27 +467,25 @@ cxType cText2SkinRender::GetToken(const txToken &Token) return (*it).second; cxType res = mRender->GetTokenData(Token); - if (Token.Attrib.length() > 0) { - if (Token.Attrib == "clean") { - std::string str = res.String(); - int pos = -1; - - if (Token.Type == tMenuCurrent) { - const char *ptr = str.c_str(); - char *end; - strtoul(ptr, &end, 10); - res = skipspace(end); - } - else if (Token.Type == tMenuTitle) { - if ((pos = str.find(" - ")) != -1 - || (pos = str.find(' ')) != -1) { - str.erase(pos); - while (str[str.length() - 1] == ' ') - str.erase(str.length() - 1); - res = str; - } - Dprintf("MenuTitle result: |%s|\n", res.String().c_str()); + if (Token.Attrib.Type == aClean) { + std::string str = res.String(); + int pos = -1; + + if (Token.Type == tMenuCurrent) { + const char *ptr = str.c_str(); + char *end; + strtoul(ptr, &end, 10); + res = skipspace(end); + } + else if (Token.Type == tMenuTitle) { + if ((pos = str.find(" - ")) != -1 + || (pos = str.find(' ')) != -1) { + str.erase(pos); + while (str[str.length() - 1] == ' ') + str.erase(str.length() - 1); + res = str; } + Dprintf("MenuTitle result: |%s|\n", res.String().c_str()); } } return (mRender->mTokenCache[Token] = res); @@ -478,7 +496,7 @@ cxType cText2SkinRender::GetToken(const txToken &Token) cxType cText2SkinRender::GetTokenData(const txToken &Token) { switch (Token.Type) { - case tDateTime: return TimeType(time(NULL), Token.Attrib); + case tDateTime: return TimeType(time(NULL), Token.Attrib.Text); case tCanScrollUp: return mScroller != NULL && mScroller->CanScrollUp(); @@ -488,5 +506,5 @@ cxType cText2SkinRender::GetTokenData(const txToken &Token) default: break; } - return false; + return cxType::False; } @@ -1,5 +1,5 @@ /* - * $Id: render.h,v 1.9 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: render.h,v 1.1 2004/12/19 22:03:17 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_RENDER_H @@ -7,6 +7,7 @@ #include "common.h" #include "scroller.h" +#include "marquee.h" #include "xml/skin.h" #include "xml/type.h" #include <vdr/osd.h> @@ -32,6 +33,7 @@ class cText2SkinRender: public cThread { private: typedef std::map<txToken,cxType> tTokenCache; + typedef std::vector<cText2SkinMarquee> tMarquees; static cText2SkinRender *mRender; @@ -41,6 +43,7 @@ private: cText2SkinTheme *mTheme; cText2SkinScreen *mScreen; cText2SkinScroller *mScroller; + tMarquees mMarquees; tTokenCache mTokenCache; std::string mBasePath; @@ -71,6 +74,8 @@ protected: int Alpha, int Colors, const std::string &Path); void DrawText(const txPoint &Pos, const txSize &Size, const tColor *Fg, const std::string &Text, const cFont *Font, int Align); + void DrawMarquee(const txPoint &Pos, const txSize &Size, const tColor *Fg, + const std::string &Text, const cFont *Font, int Align, uint Index); void DrawRectangle(const txPoint &Pos, const txSize &Size, const tColor *Fg); void DrawEllipse(const txPoint &Pos, const txSize &Size, const tColor *Fg, int Arc); @@ -99,7 +104,7 @@ protected: void Flush(bool Force = false); void SetDirty(void) { mDirty = true; } void Scroll(bool Up, bool Page) { if (mScroller) mScroller->Scroll(Up, Page); } - void Clear(void) { DELETENULL(mScroller); } + void Clear(void) { DELETENULL(mScroller); mMarquees.clear(); } public: cText2SkinRender(cText2SkinLoader *Loader, cxDisplay::eType Section, @@ -1,5 +1,5 @@ /* - * $Id: screen.c,v 1.2 2004/12/06 15:01:02 lordjaxom Exp $ + * $Id: screen.c,v 1.1 2004/12/19 22:03:18 lordjaxom Exp $ */ #include "screen.h" @@ -1,5 +1,5 @@ /* - * $Id: screen.h,v 1.3 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: screen.h,v 1.1 2004/12/19 22:03:18 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_SCREEN_H @@ -1,22 +1,15 @@ /* - * $Id: scroller.c,v 1.3 2004/12/08 17:13:26 lordjaxom Exp $ + * $Id: scroller.c,v 1.1 2004/12/19 22:03:18 lordjaxom Exp $ */ #include "scroller.h" #include "screen.h" #include <vdr/tools.h> -cText2SkinScroller::cText2SkinScroller(void) { - mScreen = NULL; - mLeft = mTop = mWidth = mHeight = 0; - mFont = NULL; - mColorFg = 0; - mColorBg = 0; - mOffset = 0; - mShown = 0; -} - -cText2SkinScroller::cText2SkinScroller(cText2SkinScreen *Screen, int Left, int Top, int Width, int Height, const char *Text, const cFont *Font, tColor ColorFg, tColor ColorBg) { +cText2SkinScroller::cText2SkinScroller(cText2SkinScreen *Screen, int Left, int Top, int Width, + int Height, const char *Text, const cFont *Font, + tColor ColorFg, tColor ColorBg) +{ Set(Screen, Left, Top, Width, Height, Text, Font, ColorFg, ColorBg); } @@ -1,5 +1,5 @@ /* - * $Id: scroller.h,v 1.2 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: scroller.h,v 1.1 2004/12/19 22:03:18 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_SCROLLER_H @@ -12,36 +12,37 @@ class cText2SkinScreen; class cText2SkinScroller { private: - cText2SkinScreen *mScreen; - const cFont *mFont; - int mLeft; + cText2SkinScreen *mScreen; + const cFont *mFont; + int mLeft; int mTop; int mWidth; int mHeight; - int mOffset; + int mOffset; int mShown; - tColor mColorFg; + tColor mColorFg; tColor mColorBg; - cTextWrapper mWrapper; + cTextWrapper mWrapper; public: - cText2SkinScroller(void); - cText2SkinScroller(cText2SkinScreen *Screen, int Left, int Top, int Width, int Height, const char *Text, const cFont *Font, tColor ColorFg, tColor ColorBg); + cText2SkinScroller(cText2SkinScreen *Screen, int Left, int Top, int Width, int Height, + const char *Text, const cFont *Font, tColor ColorFg, tColor ColorBg); - void Set(cText2SkinScreen *Screen, int Left, int Top, int Width, int Height, const char *Text, const cFont *Font, tColor ColorFg, tColor ColorBg); - void DrawText(void); - void Reset(void); - int Left(void) { return mLeft; } - int Top(void) { return mTop; } - int Width(void) { return mWidth; } - int Height(void) { return mHeight; } - int Total(void) { return mWrapper.Lines(); } - int Offset(void) { return mOffset; } - int Shown(void) { return mShown; } - bool CanScrollUp(void) { return mOffset > 0; } - bool CanScrollDown(void) { return mOffset + mShown < Total(); } - bool CanScroll(void) { return CanScrollUp() || CanScrollDown(); } - void Scroll(bool Up, bool Page); + void Set(cText2SkinScreen *Screen, int Left, int Top, int Width, int Height, const char *Text, + const cFont *Font, tColor ColorFg, tColor ColorBg); + void DrawText(void); + void Reset(void); + int Left(void) { return mLeft; } + int Top(void) { return mTop; } + int Width(void) { return mWidth; } + int Height(void) { return mHeight; } + int Total(void) { return mWrapper.Lines(); } + int Offset(void) { return mOffset; } + int Shown(void) { return mShown; } + bool CanScrollUp(void) { return mOffset > 0; } + bool CanScrollDown(void) { return mOffset + mShown < Total(); } + bool CanScroll(void) { return CanScrollUp() || CanScrollDown(); } + void Scroll(bool Up, bool Page); }; #endif // VDR_TEXT2SKIN_SCROLLER_H @@ -1,5 +1,5 @@ /* - * $Id: setup.c,v 1.1.1.1 2004/11/19 16:45:31 lordjaxom Exp $ + * $Id: setup.c,v 1.1 2004/12/19 22:03:19 lordjaxom Exp $ */ #include "setup.h" @@ -1,5 +1,5 @@ /* - * $Id: setup.h,v 1.1.1.1 2004/11/19 16:45:31 lordjaxom Exp $ + * $Id: setup.h,v 1.1 2004/12/19 22:03:19 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_SETUP_H @@ -1,5 +1,5 @@ /* - * $Id: status.c,v 1.3 2004/12/08 18:47:37 lordjaxom Exp $ + * $Id: status.c,v 1.1 2004/12/19 22:03:19 lordjaxom Exp $ */ #include "status.h" @@ -1,5 +1,5 @@ /* - * $Id: status.h,v 1.2 2004/12/08 17:13:26 lordjaxom Exp $ + * $Id: status.h,v 1.1 2004/12/19 22:03:19 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_STATUS_H diff --git a/text2skin.c b/text2skin.c index adee8ea..822ace0 100644 --- a/text2skin.c +++ b/text2skin.c @@ -3,7 +3,7 @@ * * See the README file for copyright information and how to reach the author. * - * $Id: text2skin.c,v 1.5 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: text2skin.c,v 1.1 2004/12/19 22:03:19 lordjaxom Exp $ */ #include "text2skin.h" diff --git a/text2skin.h b/text2skin.h index 9391e5b..b40ea54 100644 --- a/text2skin.h +++ b/text2skin.h @@ -1,5 +1,5 @@ /* - * $Id: text2skin.h,v 1.2 2004/12/08 17:13:26 lordjaxom Exp $ + * $Id: text2skin.h,v 1.1 2004/12/19 22:03:19 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_H @@ -1,5 +1,5 @@ /* - * $Id: theme.c,v 1.1.1.1 2004/11/19 16:45:31 lordjaxom Exp $ + * $Id: theme.c,v 1.1 2004/12/19 22:03:19 lordjaxom Exp $ */ #include "theme.h" #include <vdr/osd.h> @@ -1,5 +1,5 @@ /* - * $Id: theme.h,v 1.2 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: theme.h,v 1.1 2004/12/19 22:03:19 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_THEME_H diff --git a/xml/display.c b/xml/display.c index 4790b2d..058b7df 100644 --- a/xml/display.c +++ b/xml/display.c @@ -1,5 +1,5 @@ /* - * $Id: display.c,v 1.3 2004/12/08 17:13:26 lordjaxom Exp $ + * $Id: display.c,v 1.1 2004/12/19 22:03:25 lordjaxom Exp $ */ #include "xml/display.h" diff --git a/xml/display.h b/xml/display.h index 6c233b2..b57f734 100644 --- a/xml/display.h +++ b/xml/display.h @@ -1,5 +1,5 @@ /* - * $Id: display.h,v 1.3 2004/12/08 17:13:26 lordjaxom Exp $ + * $Id: display.h,v 1.1 2004/12/19 22:03:25 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_DISPLAY_H diff --git a/xml/function.c b/xml/function.c index 66bae48..ca06922 100644 --- a/xml/function.c +++ b/xml/function.c @@ -1,5 +1,5 @@ /* - * $Id: function.c,v 1.8 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: function.c,v 1.1 2004/12/19 22:03:26 lordjaxom Exp $ */ #include "xml/function.h" diff --git a/xml/function.h b/xml/function.h index abd1199..a67163b 100644 --- a/xml/function.h +++ b/xml/function.h @@ -1,5 +1,5 @@ /* - * $Id: function.h,v 1.5 2004/12/12 20:26:25 lordjaxom Exp $ + * $Id: function.h,v 1.1 2004/12/19 22:03:26 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_XML_FUNCTION_H diff --git a/xml/object.c b/xml/object.c index 940e5a9..b1da0b9 100644 --- a/xml/object.c +++ b/xml/object.c @@ -1,5 +1,5 @@ /* - * $Id: object.c,v 1.6 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: object.c,v 1.1 2004/12/19 22:03:27 lordjaxom Exp $ */ #include "xml/object.h" @@ -7,8 +7,8 @@ #include "font.h" static const std::string ObjectNames[] = - { "image", "text", "rectangle", "ellipse", "slope", "progress", "scrolltext", "scrollbar", - "block", "list", "item" }; + { "image", "text", "marquee", "rectangle", "ellipse", "slope", "progress", "scrolltext", + "scrollbar", "block", "list", "item" }; cxObject::cxObject(cxDisplay *parent): mType((eType)__COUNT_OBJECT__), diff --git a/xml/object.h b/xml/object.h index 41a626a..4778b83 100644 --- a/xml/object.h +++ b/xml/object.h @@ -1,5 +1,5 @@ /* - * $Id: object.h,v 1.5 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: object.h,v 1.1 2004/12/19 22:03:27 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_XML_OBJECT_H @@ -48,6 +48,7 @@ public: enum eType { image, text, + marquee, rectangle, ellipse, slope, @@ -80,6 +81,7 @@ private: cxString mTotal; std::string mFontFace; int mFontSize; + uint mIndex; cxObjects *mObjects; // used for block objects such as <list> cxDisplay *mDisplay; cxSkin *mSkin; @@ -106,6 +108,7 @@ public: std::string Text(void) const { return mText.Evaluate(); } int Current(void) const { return mCurrent.Evaluate(); } int Total(void) const { return mTotal.Evaluate(); } + uint Index(void) const { return mIndex; } cxDisplay *Display(void) const { return mDisplay; } cxSkin *Skin(void) const { return mSkin; } diff --git a/xml/parser.c b/xml/parser.c index 62cc69c..71c9453 100644 --- a/xml/parser.c +++ b/xml/parser.c @@ -1,5 +1,5 @@ /* - * $Id: parser.c,v 1.7 2004/12/14 20:02:31 lordjaxom Exp $ + * $Id: parser.c,v 1.1 2004/12/19 22:03:27 lordjaxom Exp $ */ #include "xml/parser.h" @@ -84,6 +84,7 @@ static cxSkin *skin = NULL; static cxDisplay *display = NULL; static cxObject *parent = NULL; static cxObject *object = NULL; +static uint mindex = 0; bool xStartElem(const std::string &name, std::map<std::string,std::string> &attrs) { //Dprintf("start element: %s\n", name.c_str()); @@ -146,10 +147,13 @@ bool xStartElem(const std::string &name, std::map<std::string,std::string> &attr ATTRIB_MAN_FUNC ("path", object->mPath.Parse); } else if (name == "text" + || name == "marquee" || name == "scrolltext") { ATTRIB_OPT_STRING("color", object->mFg); ATTRIB_OPT_FUNC ("align", object->ParseAlignment); ATTRIB_OPT_FUNC ("font", object->ParseFontFace); + + object->mIndex = mindex++; } else if (name == "rectangle") { ATTRIB_OPT_STRING("color", object->mFg); @@ -197,6 +201,7 @@ bool xCharData(const std::string &text) { if (end - start + 1 > 0) { //Dprintf("context: %s\n", context[context.size() - 1].c_str()); if (context[context.size() - 1] == "text" + || context[context.size() - 1] == "marquee" || context[context.size() - 1] == "scrolltext") { if (!object->mText.Parse(text.substr(start, end - start + 1))) return false; @@ -212,6 +217,7 @@ bool xEndElem(const std::string &name) { if (name == "display") { skin->mDisplays[display->Type()] = display; display = NULL; + mindex = 0; } else if (object != NULL || parent != NULL) { if (object == NULL) { diff --git a/xml/parser.h b/xml/parser.h index 60fe30c..5f37118 100644 --- a/xml/parser.h +++ b/xml/parser.h @@ -1,5 +1,5 @@ /* - * $Id: parser.h,v 1.1.1.1 2004/11/19 16:45:31 lordjaxom Exp $ + * $Id: parser.h,v 1.1 2004/12/19 22:03:28 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_PARSER_H @@ -1,5 +1,5 @@ /* - * $Id: skin.c,v 1.2 2004/12/08 17:13:26 lordjaxom Exp $ + * $Id: skin.c,v 1.1 2004/12/19 22:03:28 lordjaxom Exp $ */ #include "xml/skin.h" @@ -1,5 +1,5 @@ /* - * $Id: skin.h,v 1.3 2004/12/08 17:13:26 lordjaxom Exp $ + * $Id: skin.h,v 1.1 2004/12/19 22:03:28 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_XML_SKIN_H diff --git a/xml/string.c b/xml/string.c index 5b573eb..742439e 100644 --- a/xml/string.c +++ b/xml/string.c @@ -1,5 +1,5 @@ /* - * $Id: string.c,v 1.8 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: string.c,v 1.1 2004/12/19 22:03:25 lordjaxom Exp $ */ #include "xml/string.h" @@ -40,8 +40,8 @@ static const char *Tokens[__COUNT_TOKEN__] = { std::string txToken::Token(const txToken &Token) { std::string result = (std::string)"{" + Tokens[Token.Type]; - if (Token.Attrib.length() > 0) - result += ":" + Token.Attrib; + //if (Token.Attrib.length() > 0) + // result += ":" + Token.Attrib; result += "}"; return result; @@ -92,20 +92,31 @@ bool cxString::Parse(const std::string &Text) { } int pos = -1; - txToken &lastToken = mTokens[mTokens.size() - 1]; - Dprintf("assigning attrib: %.*s\n", ptr-last, last); - lastToken.Attrib.assign(last, ptr - last); - while ((pos = lastToken.Attrib.find('\\', pos + 1)) != -1) { - switch (lastToken.Attrib[pos + 1]) { + std::string attr; + attr.assign(last, ptr - last); + while ((pos = attr.find('\\', pos + 1)) != -1) { + switch (attr[pos + 1]) { case 'n': - lastToken.Attrib.replace(pos, 2, "\n"); + attr.replace(pos, 2, "\n"); break; default: - lastToken.Attrib.erase(pos, 1); + attr.erase(pos, 1); } } + txToken &lastToken = mTokens[mTokens.size() - 1]; + if (attr == "clean") + lastToken.Attrib = aClean; + else { + char *end; + int n = strtol(attr.c_str(), &end, 10); + if (end != attr.c_str() && end == '\0') + lastToken.Attrib = n; + else + lastToken.Attrib = attr; + } + inAttrib = false; inToken = false; } else { diff --git a/xml/string.h b/xml/string.h index 8e29db8..00e5fab 100644 --- a/xml/string.h +++ b/xml/string.h @@ -1,5 +1,5 @@ /* - * $Id: string.h,v 1.8 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: string.h,v 1.1 2004/12/19 22:03:28 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_XML_STRING_H @@ -96,15 +96,52 @@ enum exToken { #define __COUNT_TOKEN__ (tCanScrollDown + 1) }; +enum exAttrib { + aNone, + aNumber, + aString, + aClean + +#define __COUNT_ATTRIB__ (aClean + 1) +}; + +struct txAttrib { + exAttrib Type; + std::string Text; + int Number; + + txAttrib(const std::string &a): Type(aString), Text(a) {} + txAttrib(int n): Type(aNumber), Number(0) {} + txAttrib(exAttrib t): Type(t), Text(""), Number(0) {} + txAttrib(void): Type(aNone) {} + + friend bool operator== (const txAttrib &A, const txAttrib &B); + friend bool operator< (const txAttrib &A, const txAttrib &B); +}; + +inline bool operator== (const txAttrib &A, const txAttrib &B) +{ + return A.Type == B.Type + && A.Text == B.Text; +} + +inline bool operator< (const txAttrib &A, const txAttrib &B) +{ + return A.Type == B.Type + ? A.Text < B.Text + : A.Type < B.Type; +} + struct txToken { - exToken Type; - uint Offset; - std::string Attrib; - int Index; - int Tab; + exToken Type; + uint Offset; + txAttrib Attrib; + int Index; + int Tab; txToken(void): Index(-1), Tab(-1) {} - txToken(exToken t, uint o, const std::string &a): Type(t), Offset(o), Attrib(a), Index(-1), Tab(-1) {} + txToken(exToken t, uint o, const std::string &a): + Type(t), Offset(o), Attrib(a), Index(-1), Tab(-1) {} friend bool operator< (const txToken &A, const txToken &B); @@ -113,18 +150,13 @@ struct txToken { inline bool operator< (const txToken &A, const txToken &B) { - if (A.Type == B.Type) { - if (A.Attrib == B.Attrib) { - if (A.Index == B.Index) - return A.Tab < B.Tab; - else - return A.Index < B.Index; - } - else - return A.Attrib < B.Attrib; - } - else - return A.Type < B.Type; + return A.Type == B.Type + ? A.Attrib == B.Attrib + ? A.Index == B.Index + ? A.Tab < B.Tab + : A.Index < B.Index + : A.Attrib < B.Attrib + : A.Type < B.Type; } class cxString { @@ -1,5 +1,5 @@ /* - * $Id: type.c,v 1.4 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: type.c,v 1.1 2004/12/19 22:03:28 lordjaxom Exp $ */ #include "xml/type.h" @@ -1,5 +1,5 @@ /* - * $Id: type.h,v 1.6 2004/12/17 19:56:16 lordjaxom Exp $ + * $Id: type.h,v 1.1 2004/12/19 22:03:28 lordjaxom Exp $ */ #ifndef VDR_TEXT2SKIN_XML_TYPE_H @@ -1,5 +1,5 @@ /* - * $Id: xml.c,v 1.3 2004/12/12 20:26:25 lordjaxom Exp $ + * $Id: xml.c,v 1.1 2004/12/19 22:03:49 lordjaxom Exp $ * This module was kindly provided by Clemens Kirchgatterer */ @@ -1,5 +1,5 @@ /* - * $Id: xml.h,v 1.1.1.1 2004/11/19 16:45:31 lordjaxom Exp $ + * $Id: xml.h,v 1.1 2004/12/19 22:03:49 lordjaxom Exp $ * This module was kindly provided by Clemens Kirchgatterer */ |