You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeadmin/ksysv/kscroller.cpp

192 lines
3.7 KiB

// (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"