kdeui
kscrollview.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "config.h"
00020
00021 #include <qtimer.h>
00022 #include <qevent.h>
00023 #include <qapplication.h>
00024
00025 #include "kscrollview.h"
00026 #include <kdebug.h>
00027 #include <kconfig.h>
00028 #include <kglobal.h>
00029
00030 struct KScrollView::KScrollViewPrivate {
00031 KScrollViewPrivate() : dx(0), dy(0), ddx(0), ddy(0), rdx(0), rdy(0), scrolling(false) {}
00032 QTimer timer;
00033 int dx;
00034 int dy;
00035
00036 int ddx;
00037 int ddy;
00038 int rdx;
00039 int rdy;
00040 bool scrolling;
00041 };
00042
00043 KScrollView::KScrollView( QWidget *parent, const char *name, Qt::WFlags f )
00044 : QScrollView( parent, name, f )
00045 {
00046 d = new KScrollViewPrivate;
00047 connect(&d->timer, SIGNAL(timeout()), this, SLOT(scrollTick()));
00048 }
00049
00050 KScrollView::~KScrollView()
00051 {
00052 delete d;
00053 }
00054
00055 void KScrollView::scrollBy(int dx, int dy)
00056 {
00057 KConfigGroup cfg( KGlobal::config(), "KDE" );
00058 if( !cfg.readBoolEntry( "SmoothScrolling", true )) {
00059 QScrollView::scrollBy( dx, dy );
00060 return;
00061 }
00062
00063 int full_dx = d->dx + dx;
00064 int full_dy = d->dy + dy;
00065
00066
00067 int ddx = 0;
00068 int ddy = 0;
00069
00070 int steps = SCROLL_TIME/SCROLL_TICK;
00071
00072 ddx = (full_dx*16)/steps;
00073 ddy = (full_dy*16)/steps;
00074
00075
00076 if (ddx > 0 && ddx < 16) ddx = 16;
00077 if (ddy > 0 && ddy < 16) ddy = 16;
00078 if (ddx < 0 && ddx > -16) ddx = -16;
00079 if (ddy < 0 && ddy > -16) ddy = -16;
00080
00081 d->dx = full_dx;
00082 d->dy = full_dy;
00083 d->ddx = ddx;
00084 d->ddy = ddy;
00085
00086 if (!d->scrolling) {
00087 scrollTick();
00088 startScrolling();
00089 }
00090 }
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 void KScrollView::scrollTick() {
00134 if (d->dx == 0 && d->dy == 0) {
00135 stopScrolling();
00136 return;
00137 }
00138
00139 int tddx = d->ddx + d->rdx;
00140 int tddy = d->ddy + d->rdy;
00141
00142 int ddx = tddx / 16;
00143 int ddy = tddy / 16;
00144 d->rdx = tddx % 16;
00145 d->rdy = tddy % 16;
00146
00147 if (d->dx > 0 && ddx > d->dx) ddx = d->dx;
00148 else
00149 if (d->dx < 0 && ddx < d->dx) ddx = d->dx;
00150
00151 if (d->dy > 0 && ddy > d->dy) ddy = d->dy;
00152 else
00153 if (d->dy < 0 && ddy < d->dy) ddy = d->dy;
00154
00155 d->dx -= ddx;
00156 d->dy -= ddy;
00157
00158
00159 QScrollView::scrollBy(ddx, ddy);
00160 }
00161
00162 void KScrollView::startScrolling()
00163 {
00164 d->scrolling = true;
00165 d->timer.start(SCROLL_TICK, false);
00166 }
00167
00168 void KScrollView::stopScrolling()
00169 {
00170 d->timer.stop();
00171 d->dx = d->dy = 0;
00172 d->scrolling = false;
00173 }
00174
00175
00176 void KScrollView::wheelEvent( QWheelEvent *e )
00177 {
00178 int pageStep = verticalScrollBar()->pageStep();
00179 int lineStep = verticalScrollBar()->lineStep();
00180 int step = QMIN( QApplication::wheelScrollLines()*lineStep, pageStep );
00181 if ( ( e->state() & ControlButton ) || ( e->state() & ShiftButton ) )
00182 step = pageStep;
00183
00184 int dy = (e->delta()*step)/120;
00185 scrollBy(0,-dy);
00186 e->accept();
00187 }
00188
00189 #include "kscrollview.moc"