summaryrefslogtreecommitdiffstats
path: root/ksysv/kscroller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ksysv/kscroller.cpp')
-rw-r--r--ksysv/kscroller.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/ksysv/kscroller.cpp b/ksysv/kscroller.cpp
new file mode 100644
index 0000000..1f69b74
--- /dev/null
+++ b/ksysv/kscroller.cpp
@@ -0,0 +1,191 @@
+// (c) 2000 Peter Putzer
+
+#include <qscrollbar.h>
+#include <qlayout.h>
+#include <qstyle.h>
+
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kapplication.h>
+
+#include "kscroller.h"
+
+class KScroller::KScrollerPrivate
+{
+public:
+ KScrollerPrivate ()
+ : setCornerWidget (0L)
+ {
+ }
+
+ ~KScrollerPrivate () {}
+
+ QWidget* setCornerWidget;
+};
+
+KScroller::KScroller (QWidget* parent, const char* name)
+ : QFrame (parent, name),
+ d (new KScrollerPrivate()),
+ mVertical (new QScrollBar (QScrollBar::Vertical, this)),
+ mHorizontal (new QScrollBar (QScrollBar::Horizontal, this)),
+ mCornerWidget (new QWidget (this)),
+ mContent (0L),
+ mVerticalOld (0),
+ mHorizontalOld (0)
+{
+ mCornerWidget->hide();
+ mVertical->hide();
+ mHorizontal->hide();
+
+ connect (mVertical, SIGNAL (valueChanged (int)),
+ this, SLOT (scrollVertical (int)));
+ connect (mHorizontal, SIGNAL (valueChanged (int)),
+ this, SLOT (scrollHorizontal (int)));
+}
+
+KScroller::~KScroller ()
+{
+ delete d;
+}
+
+void KScroller::setContent (QWidget* content)
+{
+ delete mContent;
+
+ mContent = content;
+ updateScrollBars();
+}
+
+void KScroller::setCornerWidget (QWidget* corner)
+{
+ delete mCornerWidget;
+
+ mCornerWidget = d->setCornerWidget = corner;
+
+ updateScrollBars();
+}
+
+QWidget* KScroller::cornerWidget ()
+{
+ return d->setCornerWidget;
+}
+
+void KScroller::resizeEvent (QResizeEvent* e)
+{
+ QFrame::resizeEvent (e);
+
+ updateScrollBars();
+}
+
+QSize KScroller::minimumSizeHint() const
+{
+ QSize size = sizeHint();
+ if (size.width() > 300)
+ size.setWidth(300);
+ return size;
+}
+
+QSize KScroller::sizeHint() const
+{
+ QSize size = mContent->minimumSize();
+ int extra = kapp->style().pixelMetric( QStyle::PM_ScrollBarExtent, 0 );
+ size += QSize( extra, extra );
+ return size;
+}
+
+void KScroller::updateScrollBars ()
+{
+ int w = width();
+ int h = height();
+ QSize cs = mContent->minimumSize();
+
+ setupVertical ( cs.width(), cs.height(), w, h);
+ setupHorizontal ( cs.width(), cs.height(), w, h);
+ mContent->resize (cs);
+
+ setupCornerWidget (w, h);
+}
+
+void KScroller::setupHorizontal (int cw, int, int w, int h)
+{
+ mHorizontal->setValue (0);
+ mHorizontalOld = 0;
+
+ if (cw > w)
+ {
+ int extra = kapp->style().pixelMetric( QStyle::PM_ScrollBarExtent, 0 );
+
+ if (!mVertical->isHidden())
+ w -= extra;
+
+ mHorizontal->setRange (0, cw - w);
+ mHorizontal->setPageStep (w);
+ mHorizontal->setLineStep (25);
+ mHorizontal->setGeometry (0, h - extra, w, extra);
+
+ mHorizontal->raise();
+ mHorizontal->show();
+ }
+ else
+ {
+ mHorizontal->hide();
+ }
+}
+
+void KScroller::setupVertical (int, int ch, int w, int h)
+{
+ mVertical->setValue (0);
+ mVerticalOld = 0;
+
+ if (ch > h)
+ {
+ int extra = kapp->style().pixelMetric( QStyle::PM_ScrollBarExtent, 0 );
+ mVertical->setRange (0, ch - h);
+ mVertical->setPageStep (h);
+ mVertical->setLineStep (25);
+
+ mVertical->setGeometry (w - extra, 0, extra, h);
+
+ mVertical->raise();
+ mVertical->show();
+ }
+ else
+ {
+ mVertical->hide();
+ }
+}
+
+void KScroller::scrollVertical (int value)
+{
+ int amount = value - mVerticalOld;
+ mVerticalOld = value;
+
+ mContent->move (mContent->x(), mContent->y() - amount);
+}
+
+void KScroller::scrollHorizontal (int value)
+{
+ int amount = value - mHorizontalOld;
+ mHorizontalOld = value;
+
+ mContent->move (mContent->x() - amount, mContent->y());
+}
+
+void KScroller::setupCornerWidget (int w, int h)
+{
+ if (!mVertical->isHidden() && !mHorizontal->isHidden())
+ {
+ int extra = kapp->style().pixelMetric( QStyle::PM_ScrollBarExtent, 0 );
+
+ mCornerWidget->raise();
+ mCornerWidget->setGeometry (w - extra, h - extra, extra, extra);
+
+ mCornerWidget->show();
+ }
+ else
+ {
+ mCornerWidget->hide();
+ }
+}
+
+#include "kscroller.moc"