1
/* ============================================================
3
* This file is a part of digiKam project
4
* http://www.digikam.org
7
* Description : a zoom bar used in status bar.
9
* Copyright (C) 2007-2010 by Gilles Caulier <caulier dot gilles at gmail dot com>
11
* This program is free software; you can redistribute it
12
* and/or modify it under the terms of the GNU General
13
* Public License as published by the Free Software Foundation;
14
* either version 2, or (at your option)
17
* This program is distributed in the hope that it will be useful,
18
* but WITHOUT ANY WARRANTY; without even the implied warranty of
19
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
* GNU General Public License for more details.
22
* ============================================================ */
24
#include "dzoombar.moc"
36
#include <QToolButton>
43
#include <kcombobox.h>
49
#include "dcursortracker.h"
50
#include "thumbnailsize.h"
72
QToolButton* zoomToFitButton;
73
QToolButton* zoomTo100Button;
74
QToolButton* zoomPlusButton;
75
QToolButton* zoomMinusButton;
83
DTipTracker* zoomTracker;
86
DZoomBar::DZoomBar(QWidget* parent)
87
: KHBox(parent), d(new DZoomBarPriv)
89
setAttribute(Qt::WA_DeleteOnClose);
90
setFocusPolicy(Qt::NoFocus);
92
d->zoomToFitButton = new QToolButton(this);
93
d->zoomToFitButton->setAutoRaise(true);
94
d->zoomToFitButton->setFocusPolicy(Qt::NoFocus);
96
d->zoomTo100Button = new QToolButton(this);
97
d->zoomTo100Button->setAutoRaise(true);
98
d->zoomTo100Button->setFocusPolicy(Qt::NoFocus);
100
d->zoomMinusButton = new QToolButton(this);
101
d->zoomMinusButton->setAutoRaise(true);
102
d->zoomMinusButton->setFocusPolicy(Qt::NoFocus);
104
d->zoomSlider = new QSlider(Qt::Horizontal, this);
105
d->zoomTracker = new DTipTracker(QString(""), d->zoomSlider);
106
d->zoomSlider->setRange(ThumbnailSize::Small, ThumbnailSize::Huge);
107
d->zoomSlider->setSingleStep(ThumbnailSize::Step);
108
d->zoomSlider->setValue(ThumbnailSize::Medium);
109
d->zoomSlider->setFixedWidth(120);
110
d->zoomSlider->setFocusPolicy(Qt::NoFocus);
111
d->zoomSlider->setInvertedControls(true); // See B.K.O #161087
113
d->zoomPlusButton = new QToolButton(this);
114
d->zoomPlusButton->setAutoRaise(true);
115
d->zoomPlusButton->setFocusPolicy(Qt::NoFocus);
117
d->zoomCombo = new KComboBox(true, this);
118
d->zoomCombo->setDuplicatesEnabled(false);
119
d->zoomCombo->setFocusPolicy(Qt::ClickFocus);
120
d->zoomCombo->setInsertPolicy(QComboBox::NoInsert);
122
QList<double> zoomLevels;
134
zoomLevels << 1200.0;
136
foreach (const double zoom, zoomLevels)
138
d->zoomCombo->addItem(QString("%1%").arg((int)zoom), QVariant(zoom));
141
layout()->setMargin(0);
142
layout()->setSpacing(0);
144
// -------------------------------------------------------------
146
connect(d->zoomSlider, SIGNAL(valueChanged(int)),
147
this, SIGNAL(signalZoomSliderChanged(int)));
149
connect(d->zoomSlider, SIGNAL(valueChanged(int)),
150
this, SLOT(slotZoomSliderChanged(int)));
152
connect(d->zoomSlider, SIGNAL(sliderReleased()),
153
this, SLOT(slotZoomSliderReleased()));
155
connect(d->zoomCombo, SIGNAL(activated(int)),
156
this, SLOT(slotZoomSelected(int)));
158
connect(d->zoomCombo, SIGNAL(returnPressed(const QString&)),
159
this, SLOT(slotZoomTextChanged(const QString&)));
161
// -------------------------------------------------------------
163
setBarMode(PreviewZoomCtrl);
166
DZoomBar::~DZoomBar()
172
void DZoomBar::setZoomToFitAction(QAction* action)
174
d->zoomToFitButton->setDefaultAction(action);
177
void DZoomBar::setZoomTo100Action(QAction* action)
179
d->zoomTo100Button->setDefaultAction(action);
182
void DZoomBar::setZoomPlusAction(QAction* action)
184
d->zoomPlusButton->setDefaultAction(action);
187
void DZoomBar::setZoomMinusAction(QAction* action)
189
d->zoomMinusButton->setDefaultAction(action);
192
void DZoomBar::slotZoomSliderChanged(int)
196
d->zoomTimer->stop();
200
d->zoomTimer = new QTimer( this );
201
connect(d->zoomTimer, SIGNAL(timeout()),
202
this, SLOT(slotDelayedZoomSliderChanged()) );
203
d->zoomTimer->setSingleShot(true);
204
d->zoomTimer->start(300);
207
void DZoomBar::slotDelayedZoomSliderChanged()
209
emit signalDelayedZoomSliderChanged(d->zoomSlider->value());
212
void DZoomBar::slotZoomSliderReleased()
214
emit signalZoomSliderReleased(d->zoomSlider->value());
217
void DZoomBar::setZoom(double zoom, double zmin, double zmax)
219
int size = sizeFromZoom(zoom, zmin, zmax);
221
d->zoomSlider->blockSignals(true);
222
d->zoomSlider->setValue(size);
223
d->zoomSlider->blockSignals(false);
225
QString ztxt = QString::number(lround(zoom*100.0)) + QString("%");
226
d->zoomCombo->blockSignals(true);
227
d->zoomCombo->setCurrentIndex(-1);
228
d->zoomCombo->setEditText(ztxt);
229
d->zoomCombo->blockSignals(false);
232
void DZoomBar::setThumbsSize(int size)
234
d->zoomSlider->blockSignals(true);
235
d->zoomSlider->setValue(size);
236
d->zoomSlider->blockSignals(false);
238
d->zoomTracker->setText(i18n("Size: %1", size));
239
triggerZoomTrackerToolTip();
242
int DZoomBar::sizeFromZoom(double zoom, double zmin, double zmax)
244
double h = (double)ThumbnailSize::Huge;
245
double s = (double)ThumbnailSize::Small;
246
double zoomN = log(zoom)/log(2);
247
double zminN = log(zmin)/log(2);
248
double zmaxN = log(zmax)/log(2);
249
double zval = (zoomN-zminN)/(zmaxN-zminN);
250
return (int)(zval*(h - s) + s);
253
double DZoomBar::zoomFromSize(int size, double zmin, double zmax)
255
double h = (double)ThumbnailSize::Huge;
256
double s = (double)ThumbnailSize::Small;
257
double zminN = log(zmin)/log(2);
258
double zmaxN = log(zmax)/log(2);
259
double zval = (size - s)/(h - s);
260
return pow(2, zval*(zmaxN-zminN) + zminN);
263
void DZoomBar::triggerZoomTrackerToolTip()
265
d->zoomTracker->triggerAutoShow();
268
void DZoomBar::slotUpdateTrackerPos()
270
d->zoomTracker->refresh();
273
void DZoomBar::slotZoomSelected(int index)
276
double zoom = d->zoomCombo->itemData(index).toDouble(&ok) / 100.0;
278
if (ok && zoom > 0.0)
280
emit signalZoomValueEdited(zoom);
284
void DZoomBar::slotZoomTextChanged(const QString& txt)
287
double zoom = KGlobal::locale()->readNumber(txt, &ok) / 100.0;
289
if (ok && zoom > 0.0)
291
emit signalZoomValueEdited(zoom);
295
void DZoomBar::setBarMode(BarMode mode)
297
QAction* zfitAction = d->zoomToFitButton->defaultAction();
298
QAction* z100Action = d->zoomTo100Button->defaultAction();
302
case PreviewZoomCtrl:
304
d->zoomToFitButton->show();
308
zfitAction->setEnabled(true);
311
d->zoomTo100Button->show();
315
z100Action->setEnabled(true);
318
d->zoomCombo->show();
319
d->zoomCombo->setEnabled(true);
320
d->zoomTracker->setEnable(false);
325
d->zoomToFitButton->show();
329
zfitAction->setEnabled(false);
332
d->zoomTo100Button->show();
336
z100Action->setEnabled(false);
339
d->zoomCombo->show();
340
d->zoomCombo->setEnabled(false);
341
d->zoomTracker->setEnable(true);
344
default: // NoPreviewZoomCtrl
346
d->zoomToFitButton->hide();
347
d->zoomTo100Button->hide();
348
d->zoomCombo->hide();
349
d->zoomTracker->setEnable(true);
355
} // namespace Digikam