diff options
-rw-r--r-- | glcdskin/object.c | 34 | ||||
-rw-r--r-- | glcdskin/object.h | 3 | ||||
-rw-r--r-- | glcdskin/parser.c | 1 |
3 files changed, 34 insertions, 4 deletions
diff --git a/glcdskin/object.c b/glcdskin/object.c index ddf25be..4fda5bb 100644 --- a/glcdskin/object.c +++ b/glcdskin/object.c @@ -73,6 +73,8 @@ cSkinObject::cSkinObject(cSkinDisplay * Parent) mAltText(""), // alternative text source for text-objects mAltCondition(NULL), // condition when alternative sources are used mAction(""), // action (e.g. touchscreen action) + mMultilineScrollPosition(0), + mMultilineRelScroll(this, false), mObjects(NULL) { mColor.SetColor(Parent->Skin()->Config().GetDriver()->GetForegroundColor()); @@ -124,6 +126,8 @@ cSkinObject::cSkinObject(const cSkinObject & Src) mAltText(Src.mAltText), mAltCondition(Src.mAltCondition), mAction(Src.mAction), + mMultilineScrollPosition(Src.mMultilineScrollPosition), + mMultilineRelScroll(Src.mMultilineRelScroll), mObjects(NULL) { if (Src.mObjects) @@ -632,6 +636,7 @@ void cSkinObject::Render(GLCD::cBitmap * screen) mCurrText = text; mScrollLoopReached = false; mLastChange = timestamp; + mMultilineScrollPosition = 0; } if (mMultiline) @@ -640,7 +645,24 @@ void cSkinObject::Render(GLCD::cBitmap * screen) mScrollLoopReached = true; // avoid check in NeedsUpdate() std::vector <std::string> lines; - font->WrapText(Size().w, Size().h, text, lines); + font->WrapText(Size().w, 0/*Size().h*/, text, lines); + + int amount_lines = Size().h / font->LineHeight(); + + if (amount_lines < lines.size()) { + int multilineRelScroll = mMultilineRelScroll.Evaluate(); + if (multilineRelScroll != 0) { + if (multilineRelScroll < 0) { + mMultilineScrollPosition += multilineRelScroll; + if (mMultilineScrollPosition < 0) + mMultilineScrollPosition = 0; + } else if (multilineRelScroll > 0) { + mMultilineScrollPosition += multilineRelScroll; + if (mMultilineScrollPosition > (lines.size() - amount_lines) ) + mMultilineScrollPosition = lines.size() - amount_lines; + } + } + } // vertical alignment, calculate y offset int yoff = 0; @@ -655,9 +677,13 @@ void cSkinObject::Render(GLCD::cBitmap * screen) default: yoff = 0; } - for (size_t i = 0; i < lines.size(); i++) + int end_line = amount_lines; + if (amount_lines > lines.size() ) + end_line = lines.size(); + + for (size_t i = 0; i < (size_t)end_line; i++) { - int w = font->Width(lines[i]); + int w = font->Width(lines[i + mMultilineScrollPosition]); int x = 0; if (w < Size().w) { @@ -673,7 +699,7 @@ void cSkinObject::Render(GLCD::cBitmap * screen) for (loop = 0; loop < loops; loop++) { pane->DrawText( varx[loop] + x, vary[loop] + yoff + i * font->LineHeight(), - x + Size().w - 1, lines[i], font, varcol[loop], mBackgroundColor + x + Size().w - 1, lines[i + mMultilineScrollPosition], font, varcol[loop], mBackgroundColor ); } } diff --git a/glcdskin/object.h b/glcdskin/object.h index cbb6966..ec8027b 100644 --- a/glcdskin/object.h +++ b/glcdskin/object.h @@ -169,6 +169,9 @@ private: cSkinFunction * mAltCondition; // condition when alternative sources are used std::string mAction; // action attached to this object + int mMultilineScrollPosition; // current scolling position of mMultiline + cSkinString mMultilineRelScroll;// relative scrolling amount of mMultiline (default: 0) + cSkinObjects * mObjects; // used for block objects such as <list> public: diff --git a/glcdskin/parser.c b/glcdskin/parser.c index 411c832..8ae0e43 100644 --- a/glcdskin/parser.c +++ b/glcdskin/parser.c @@ -339,6 +339,7 @@ bool StartElem(const std::string & name, std::map<std::string,std::string> & att ATTRIB_OPT_FUNC("valign", object->ParseVerticalAlignment); ATTRIB_MAN_FUNC("font", object->ParseFontFace); ATTRIB_OPT_BOOL("multiline", object->mMultiline); + ATTRIB_OPT_FUNC("mlrelscroll", object->mMultilineRelScroll.Parse); ATTRIB_OPT_FUNC("scrollmode", object->ParseScrollLoopMode); ATTRIB_OPT_FUNC("scrollspeed", object->ParseScrollSpeed); ATTRIB_OPT_FUNC("scrolltime", object->ParseScrollTime); |