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)
137
d->zoomCombo->addItem(QString("%1%").arg((int)zoom), QVariant(zoom));
139
layout()->setMargin(0);
140
layout()->setSpacing(0);
142
// -------------------------------------------------------------
144
connect(d->zoomSlider, SIGNAL(valueChanged(int)),
145
this, SIGNAL(signalZoomSliderChanged(int)));
147
connect(d->zoomSlider, SIGNAL(valueChanged(int)),
148
this, SLOT(slotZoomSliderChanged(int)));
150
connect(d->zoomSlider, SIGNAL(sliderReleased()),
151
this, SLOT(slotZoomSliderReleased()));
153
connect(d->zoomCombo, SIGNAL(activated(int)),
154
this, SLOT(slotZoomSelected(int)));
156
connect(d->zoomCombo, SIGNAL(returnPressed(const QString&)),
157
this, SLOT(slotZoomTextChanged(const QString&)));
160
DZoomBar::~DZoomBar()
168
void DZoomBar::setZoomToFitAction(QAction* action)
170
d->zoomToFitButton->setDefaultAction(action);
173
void DZoomBar::setZoomTo100Action(QAction* action)
175
d->zoomTo100Button->setDefaultAction(action);
178
void DZoomBar::setZoomPlusAction(QAction* action)
180
d->zoomPlusButton->setDefaultAction(action);
183
void DZoomBar::setZoomMinusAction(QAction* action)
185
d->zoomMinusButton->setDefaultAction(action);
188
void DZoomBar::slotZoomSliderChanged(int)
192
d->zoomTimer->stop();
196
d->zoomTimer = new QTimer( this );
197
connect(d->zoomTimer, SIGNAL(timeout()),
198
this, SLOT(slotDelayedZoomSliderChanged()) );
199
d->zoomTimer->setSingleShot(true);
200
d->zoomTimer->start(300);
203
void DZoomBar::slotDelayedZoomSliderChanged()
205
emit signalDelayedZoomSliderChanged(d->zoomSlider->value());
208
void DZoomBar::slotZoomSliderReleased()
210
emit signalZoomSliderReleased(d->zoomSlider->value());
213
void DZoomBar::setZoom(double zoom, double zmin, double zmax)
215
double h = (double)ThumbnailSize::Huge;
216
double s = (double)ThumbnailSize::Small;
217
double b = (zmin-(zmax*s/h))/(1-s/h);
218
double a = (zmax-b)/h;
219
int size = (int)((zoom - b) /a);
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);
231
d->zoomTracker->setText(ztxt);
232
triggerZoomTrackerToolTip();
235
void DZoomBar::triggerZoomTrackerToolTip()
237
d->zoomTracker->triggerAutoShow();
240
void DZoomBar::slotUpdateTrackerPos()
242
d->zoomTracker->refresh();
245
void DZoomBar::slotZoomSelected(int index)
248
double zoom = d->zoomCombo->itemData(index).toDouble(&ok) / 100.0;
249
if (ok && zoom > 0.0)
250
emit signalZoomValueEdited(zoom);
253
void DZoomBar::slotZoomTextChanged(const QString& txt)
256
double zoom = KGlobal::locale()->readNumber(txt, &ok) / 100.0;
257
if (ok && zoom > 0.0)
258
emit signalZoomValueEdited(zoom);
261
} // namespace Digikam