summaryrefslogtreecommitdiffstats
path: root/noatun/library/scrollinglabel.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commite2de64d6f1beb9e492daf5b886e19933c1fa41dd (patch)
tree9047cf9e6b5c43878d5bf82660adae77ceee097a /noatun/library/scrollinglabel.cpp
downloadtdemultimedia-e2de64d6f1beb9e492daf5b886e19933c1fa41dd.tar.gz
tdemultimedia-e2de64d6f1beb9e492daf5b886e19933c1fa41dd.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdemultimedia@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'noatun/library/scrollinglabel.cpp')
-rw-r--r--noatun/library/scrollinglabel.cpp196
1 files changed, 196 insertions, 0 deletions
diff --git a/noatun/library/scrollinglabel.cpp b/noatun/library/scrollinglabel.cpp
new file mode 100644
index 00000000..d7bdd643
--- /dev/null
+++ b/noatun/library/scrollinglabel.cpp
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2000 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include <noatun/scrollinglabel.h>
+
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qtimer.h>
+#include <qtooltip.h>
+
+class ScrollingLabel::Private
+{
+ public:
+
+ Private()
+ : scrollSize (0),
+ pos (0),
+ add (false),
+ scroll (true)
+ {
+ }
+
+ // Order dependency.
+ QString text;
+ QString originalText;
+ QPixmap buf;
+ QTimer scrollTimer;
+ QTimer resetTimer;
+ int scrollSize;
+ int pos;
+ bool add;
+ bool scroll;
+ // End order dependency.
+};
+
+ScrollingLabel::ScrollingLabel
+(
+ const QString & initialText,
+ QWidget * parent,
+ const char * name
+)
+ : QWidget(parent, name)
+{
+ d = new Private;
+
+ connect(&d->scrollTimer, SIGNAL(timeout()), this, SLOT(scroll()));
+ connect(&d->resetTimer, SIGNAL(timeout()), this, SLOT(restoreText()));
+
+ setText(initialText);
+}
+
+ScrollingLabel::~ScrollingLabel()
+{
+ delete d;
+}
+
+ void
+ScrollingLabel::setText(const QString & t, int time)
+{
+ d->resetTimer.stop();
+
+ if (-1 != time)
+ {
+ restoreText();
+ d->originalText = d->text;
+ d->text = t;
+ d->resetTimer.start(time, true);
+ _update();
+ }
+ else
+ {
+ d->text = d->originalText = t;
+ _update();
+ }
+
+ QToolTip::remove(this);
+ QToolTip::add(this, d->text);
+}
+
+ void
+ScrollingLabel::restoreText()
+{
+ d->text = d->originalText;
+ _update();
+}
+
+ void
+ScrollingLabel::_update()
+{
+ d->scrollTimer.stop();
+
+ d->pos = 0;
+ d->add = false;
+
+ int w = fontMetrics().width(d->text);
+ int h = fontMetrics().height();
+
+ setFixedHeight(h);
+
+ d->scrollSize = QMAX(0, w - width());
+
+ d->buf.resize(w, h);
+ d->buf.fill(colorGroup().background());
+
+ QPainter p(&d->buf);
+ p.setFont(font());
+ p.drawText(0, fontMetrics().ascent(), d->text);
+
+ if (d->scroll && (d->scrollSize > 0))
+ d->scrollTimer.start(100, true);
+
+ repaint(false);
+}
+
+ void
+ScrollingLabel::paintEvent(QPaintEvent *)
+{
+ bitBlt
+ (this, 0, 0, &d->buf, d->pos, 0, d->pos + width(), height(), Qt::CopyROP);
+}
+
+ void
+ScrollingLabel::resizeEvent(QResizeEvent *)
+{
+ _update();
+}
+
+ void
+ScrollingLabel::scroll()
+{
+ d->scrollTimer.stop();
+
+ repaint(false);
+
+ int scrollTime = 100;
+
+ if (d->pos == d->scrollSize || d->pos == 0)
+ {
+ d->add = !d->add;
+ scrollTime = 800;
+ }
+
+ d->pos += (d->add ? 1 : -1);
+
+ if (d->scroll)
+ d->scrollTimer.start(scrollTime, true);
+}
+
+ QSize
+ScrollingLabel::sizeHint() const
+{
+ return fontMetrics().boundingRect(d->text).size();
+}
+
+ QSize
+ScrollingLabel::minimumSizeHint() const
+{
+ return QSize(0, fontMetrics().height());
+}
+
+ QString
+ScrollingLabel::text() const
+{
+ return d->text;
+}
+
+ void
+ScrollingLabel::setScroll(bool b)
+{
+ d->scroll = b;
+ _update();
+}
+
+#include "scrollinglabel.moc"
+
+// vim:ts=2:sw=2:tw=78:noet
+