summaryrefslogtreecommitdiffstats
path: root/utils/themeeditor/graphics/rbviewport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/themeeditor/graphics/rbviewport.cpp')
-rw-r--r--utils/themeeditor/graphics/rbviewport.cpp90
1 files changed, 89 insertions, 1 deletions
diff --git a/utils/themeeditor/graphics/rbviewport.cpp b/utils/themeeditor/graphics/rbviewport.cpp
index 18029a57f6..3a239c7f35 100644
--- a/utils/themeeditor/graphics/rbviewport.cpp
+++ b/utils/themeeditor/graphics/rbviewport.cpp
@@ -21,6 +21,7 @@
#include <QPainter>
#include <QPainterPath>
+#include <cmath>
#include "rbviewport.h"
#include "rbscreen.h"
@@ -29,12 +30,17 @@
#include "tag_table.h"
#include "skin_parser.h"
+/* Pause at beginning/end of scroll */
+const double RBViewport::scrollPause = 0.5;
+/* Pixels/second of text scrolling */
+const double RBViewport::scrollRate = 30;
+
RBViewport::RBViewport(skin_element* node, const RBRenderInfo& info)
: QGraphicsItem(info.screen()), foreground(info.screen()->foreground()),
background(info.screen()->background()), textOffset(0,0),
screen(info.screen()), textAlign(Left), showStatusBar(false),
statusBarTexture(":/render/statusbar.png"),
- leftGraphic(0), centerGraphic(0), rightGraphic(0)
+ leftGraphic(0), centerGraphic(0), rightGraphic(0), scrollTime(0)
{
if(!node->tag)
{
@@ -191,6 +197,8 @@ void RBViewport::newLine()
leftGraphic = 0;
centerGraphic = 0;
rightGraphic = 0;
+
+ scrollTime = 0;
}
void RBViewport::write(QString text)
@@ -287,6 +295,32 @@ void RBViewport::alignLeft()
leftGraphic = font->renderText(leftText, foreground, size.width(), this);
leftGraphic->setPos(0, y);
+
+ /* Setting scroll position if necessary */
+ int difference = leftGraphic->realWidth()
+ - leftGraphic->boundingRect().width();
+ if(difference > 0)
+ {
+ /* Subtracting out complete cycles */
+ double totalTime = 2 * scrollPause + difference / scrollRate;
+ scrollTime -= totalTime * std::floor(scrollTime / totalTime);
+
+ /* Calculating the offset */
+ if(scrollTime < scrollPause)
+ {
+ return;
+ }
+ else if(scrollTime < scrollPause + difference / scrollRate)
+ {
+ scrollTime -= scrollPause;
+ int offset = scrollRate * scrollTime;
+ leftGraphic->setOffset(offset);
+ }
+ else
+ {
+ leftGraphic->setOffset(difference);
+ }
+ }
}
void RBViewport::alignCenter()
@@ -311,6 +345,33 @@ void RBViewport::alignCenter()
}
centerGraphic->setPos(x, y);
+
+ /* Setting scroll position if necessary */
+ int difference = centerGraphic->realWidth()
+ - centerGraphic->boundingRect().width();
+ if(difference > 0)
+ {
+ /* Subtracting out complete cycles */
+ double totalTime = 2 * scrollPause + difference / scrollRate;
+ scrollTime -= totalTime * std::floor(scrollTime / totalTime);
+
+ /* Calculating the offset */
+ if(scrollTime < scrollPause)
+ {
+ return;
+ }
+ else if(scrollTime < scrollPause + difference / scrollRate)
+ {
+ scrollTime -= scrollPause;
+ int offset = scrollRate * scrollTime;
+ centerGraphic->setOffset(offset);
+ }
+ else
+ {
+ centerGraphic->setOffset(difference);
+ }
+ }
+
}
void RBViewport::alignRight()
@@ -329,5 +390,32 @@ void RBViewport::alignRight()
x = 0;
rightGraphic->setPos(x, y);
+
+ /* Setting scroll position if necessary */
+ int difference = rightGraphic->realWidth()
+ - rightGraphic->boundingRect().width();
+ if(difference > 0)
+ {
+ /* Subtracting out complete cycles */
+ double totalTime = 2 * scrollPause + difference / scrollRate;
+ scrollTime -= totalTime * std::floor(scrollTime / totalTime);
+
+ /* Calculating the offset */
+ if(scrollTime < scrollPause)
+ {
+ return;
+ }
+ else if(scrollTime < scrollPause + difference / scrollRate)
+ {
+ scrollTime -= scrollPause;
+ int offset = scrollRate * scrollTime;
+ rightGraphic->setOffset(offset);
+ }
+ else
+ {
+ rightGraphic->setOffset(difference);
+ }
+ }
+
}