1
//=========================================================
4
// $Id: scrollscale.cpp,v 1.1 2002/01/30 14:54:04 muse Exp $
5
// (C) Copyright 1999 Werner Schweer (ws@seh.de)
6
//=========================================================
11
#include <qscrollbar.h>
13
#include <qtoolbutton.h>
17
// #include "globals.h"
18
#include "scrollscale.h"
21
//---------------------------------------------------------
23
// "val" - slider value in range 0-1024
24
//---------------------------------------------------------
26
void ScrollScale::setScale(int val)
32
min = 1.0/(-scaleMin);
34
min = double(scaleMin);
37
max = 1.0/(-scaleMax);
39
max = double(scaleMax);
41
double diff = max-min;
42
double fkt = double(val)/1024.0;
43
double v = (pow(logbase, fkt)-1)/(logbase-1);
46
scale = max - v * diff;
48
scale = min + v * diff;
51
scaleVal = -(int(1.0 / scale));
53
scaleVal = int(scale);
54
if (scaleVal == -1) // nur so
58
if (scaleMax > scaleMin) {
61
else if (scale > scaleMax)
67
else if (scale > scaleMin)
72
int sval = scroll->value();
73
emit scaleChanged(scaleVal);
75
setRange(minVal, maxVal);
79
//---------------------------------------------------------
81
//---------------------------------------------------------
83
void ScrollScale::setMag(int cs)
89
//---------------------------------------------------------
92
//---------------------------------------------------------
94
void ScrollScale::setRange(int min, int max)
96
// if ((min != minVal) && (max != maxVal))
100
int i = (scroll->orientation() == Horizontal) ? width() : height();
104
min = minVal / (-scaleVal);
105
max = (maxVal-scaleVal-1) / (-scaleVal) - i;
108
min = minVal * scaleVal;
109
max = maxVal * scaleVal - i;
120
scroll->setRange(min, max);
122
// qt doesn't check this...
123
if (scroll->value() < min)
124
scroll->setValue(min);
125
if (scroll->value() > max)
126
scroll->setValue(max);
127
scroll->setSteps(20, i);
130
//---------------------------------------------------------
133
//---------------------------------------------------------
135
void ScrollScale::setPos(int pos)
137
scroll->setValue(pos);
140
//---------------------------------------------------------
142
//---------------------------------------------------------
144
void ScrollScale::resizeEvent(QResizeEvent*)
146
setScale(scale->value());
149
//---------------------------------------------------------
151
//---------------------------------------------------------
153
ScrollScale::ScrollScale(int s1, int s2, int cs, int max, Orientation o,
154
QWidget* parent, int min=0, bool inv=false, double bas=10.0)
173
min = 1.0/(-scaleMin);
175
min = double(scaleMin);
178
max = 1.0/(-scaleMax);
180
max = double(scaleMax);
182
double cmag = (cs < 0) ? (1.0/(-cs)) : double(cs);
183
double diff = max-min;
186
// search initial value for slider
190
for (int i = 0; i < 8; ++i) {
191
int tryVal = invers ? 1025 - cur : cur;
192
double fkt = double(tryVal)/1024.0;
193
double v = (pow(logbase, fkt)-1)/(logbase-1);
194
double scale = invers ? (max - v * diff) : (min + v * diff);
195
if (scale == cmag) // not very likely
197
// printf("iteration %d invers:%d soll %f(cur:%d) - ist %f\n", i, invers, scale, cur, cmag);
198
int dd = invers ? -delta : delta;
199
cur += (scale < cmag) ? dd : -dd;
203
scale = new QSlider(0, 1024, 1, cur, o, this);
204
scroll = new QScrollBar(o, this);
207
if (o == Horizontal) {
208
box = new QBoxLayout(this, QBoxLayout::LeftToRight);
209
scale->setFixedHeight(18);
210
scroll->setFixedHeight(18);
211
scale->setMaximumWidth(70);
212
scroll->setMinimumWidth(50);
215
box = new QBoxLayout(this, QBoxLayout::Down);
216
scale->setFixedWidth(18);
217
scroll->setFixedWidth(18);
218
scroll->setMinimumHeight(50);
219
scale->setMaximumHeight(70);
221
box->addWidget(scroll, 10);
222
box->addWidget(scale, 5);
223
connect(scale, SIGNAL(valueChanged(int)), SLOT(setScale(int)));
224
connect(scale, SIGNAL(valueChanged(int)), SIGNAL(lscaleChanged(int)));
225
connect(scroll, SIGNAL(valueChanged(int)), SIGNAL(scrollChanged(int)));
228
//---------------------------------------------------------
230
//---------------------------------------------------------
232
void ScrollScale::setPageButtons(bool flag)
234
if (flag == pageButtons)
239
up = new QToolButton(this);
240
up->setPixmap(*(upIcon));
241
down = new QToolButton(this);
242
down->setPixmap(*(downIcon));
243
pageNo = new QLabel(this);
247
QToolTip::add(down, tr("next page"));
248
QToolTip::add(up, tr("previous page"));
249
QToolTip::add(pageNo, tr("current page number"));
250
box->insertWidget(1, up);
251
box->insertWidget(2, down);
252
box->insertSpacing(3, 5);
253
box->insertWidget(4, pageNo);
254
box->insertSpacing(5, 5);
255
connect(up, SIGNAL(clicked()), SLOT(pageUp()));
256
connect(down, SIGNAL(clicked()), SLOT(pageDown()));
261
if (_page == (_pages-1))
262
down->setEnabled(false);
264
up->setEnabled(false);
273
//---------------------------------------------------------
275
//---------------------------------------------------------
277
void ScrollScale::showMag(bool flag)
287
//---------------------------------------------------------
290
//---------------------------------------------------------
292
void ScrollScale::setOffset(int val)
294
int i = (scroll->orientation() == Horizontal) ? width() : height();
298
pos = (val-scaleVal/2) / (-scaleVal);
299
max = (maxVal-scaleVal-1) / (-scaleVal) - i;
302
pos = val * scaleVal;
303
max = maxVal * scaleVal - i;
308
maxVal = (pos + width()) * (-scaleVal);
309
min = (minVal-scaleVal/2) / (-scaleVal);
310
max = (maxVal-scaleVal/2) / (-scaleVal) - i;
313
maxVal = (pos + width() + scaleVal/2)/scaleVal;
314
min = minVal * scaleVal;
315
max = maxVal * scaleVal - i;
324
scroll->setRange(min, max);
329
//---------------------------------------------------------
331
// goto previous page
332
//---------------------------------------------------------
334
void ScrollScale::pageUp()
343
up->setEnabled(false);
344
if (_page == (_pages-2))
345
down->setEnabled(true);
349
//---------------------------------------------------------
352
//---------------------------------------------------------
354
void ScrollScale::pageDown()
356
if (_page + 1 < _pages) {
362
if (_page == (_pages-1))
363
down->setEnabled(false);
365
up->setEnabled(true);
369
//---------------------------------------------------------
371
//---------------------------------------------------------
373
void ScrollScale::setPages(int n)
376
if (_page >= _pages) {
383
up->setEnabled(_page);
384
down->setEnabled(_page < (_pages-1));
387
int ScrollScale::pos() const
389
return scroll->value();
392
int ScrollScale::mag() const
394
return scale->value();