~ubuntu-branches/ubuntu/trusty/digikam/trusty

« back to all changes in this revision

Viewing changes to libs/widgets/common/dzoombar.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Luka Renko
  • Date: 2010-02-04 07:46:57 UTC
  • mfrom: (3.2.10 sid)
  • Revision ID: james.westby@ubuntu.com-20100204074657-hqzwjn4timlfw265
Tags: 2:1.1.0-1ubuntu1
* New upstream release:
  - Rename in BQM fails with multi dot names (LP: #501135)
  - Add collection with similar name fails (LP: #500581)
  - Add SMB folder error message (LP: #350280)
  - Zoom indicators indicate wrong magnification (LP: #510346)
* Merge with Debian, remaining changes:
  - Export .pot name and copy to plugins in debian/rules
  - Build-depend on libkipi7-dev, libkexiv2-8-dev and 
    libkdcraw8-dev (KDE 4.3 -> 4.4)
  - Build-depend on libmarble-dev (was disabled temporarily 
    in Debian due to 4.3.4 regression)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* ============================================================
 
2
 *
 
3
 * This file is a part of digiKam project
 
4
 * http://www.digikam.org
 
5
 *
 
6
 * Date        : 2007-04-15
 
7
 * Description : a zoom bar used in status bar.
 
8
 *
 
9
 * Copyright (C) 2007-2010 by Gilles Caulier <caulier dot gilles at gmail dot com>
 
10
 *
 
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)
 
15
 * any later version.
 
16
 *
 
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.
 
21
 *
 
22
 * ============================================================ */
 
23
 
 
24
#include "dzoombar.moc"
 
25
 
 
26
// C++ includes
 
27
 
 
28
#include <cmath>
 
29
 
 
30
// Qt includes
 
31
 
 
32
#include <QAction>
 
33
#include <QLayout>
 
34
#include <QSlider>
 
35
#include <QTimer>
 
36
#include <QToolButton>
 
37
#include <QList>
 
38
 
 
39
// KDE includes
 
40
 
 
41
#include <klocale.h>
 
42
#include <kvbox.h>
 
43
#include <kcombobox.h>
 
44
#include <kglobal.h>
 
45
#include <kdebug.h>
 
46
 
 
47
// Local includes
 
48
 
 
49
#include "dcursortracker.h"
 
50
#include "thumbnailsize.h"
 
51
 
 
52
namespace Digikam
 
53
{
 
54
 
 
55
class DZoomBarPriv
 
56
{
 
57
 
 
58
public:
 
59
 
 
60
    DZoomBarPriv()
 
61
    {
 
62
        zoomToFitButton = 0;
 
63
        zoomTo100Button = 0;
 
64
        zoomTracker     = 0;
 
65
        zoomMinusButton = 0;
 
66
        zoomPlusButton  = 0;
 
67
        zoomSlider      = 0;
 
68
        zoomTimer       = 0;
 
69
        zoomCombo       = 0;
 
70
    }
 
71
 
 
72
    QToolButton* zoomToFitButton;
 
73
    QToolButton* zoomTo100Button;
 
74
    QToolButton* zoomPlusButton;
 
75
    QToolButton* zoomMinusButton;
 
76
 
 
77
    QTimer*      zoomTimer;
 
78
 
 
79
    QSlider*     zoomSlider;
 
80
 
 
81
    KComboBox*   zoomCombo;
 
82
 
 
83
    DTipTracker* zoomTracker;
 
84
};
 
85
 
 
86
DZoomBar::DZoomBar(QWidget *parent)
 
87
        : KHBox(parent), d(new DZoomBarPriv)
 
88
{
 
89
    setAttribute(Qt::WA_DeleteOnClose);
 
90
    setFocusPolicy(Qt::NoFocus);
 
91
 
 
92
    d->zoomToFitButton = new QToolButton(this);
 
93
    d->zoomToFitButton->setAutoRaise(true);
 
94
    d->zoomToFitButton->setFocusPolicy(Qt::NoFocus);
 
95
 
 
96
    d->zoomTo100Button = new QToolButton(this);
 
97
    d->zoomTo100Button->setAutoRaise(true);
 
98
    d->zoomTo100Button->setFocusPolicy(Qt::NoFocus);
 
99
 
 
100
    d->zoomMinusButton = new QToolButton(this);
 
101
    d->zoomMinusButton->setAutoRaise(true);
 
102
    d->zoomMinusButton->setFocusPolicy(Qt::NoFocus);
 
103
 
 
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
 
112
 
 
113
    d->zoomPlusButton = new QToolButton(this);
 
114
    d->zoomPlusButton->setAutoRaise(true);
 
115
    d->zoomPlusButton->setFocusPolicy(Qt::NoFocus);
 
116
 
 
117
    d->zoomCombo = new KComboBox(true, this);
 
118
    d->zoomCombo->setDuplicatesEnabled(false);
 
119
    d->zoomCombo->setFocusPolicy(Qt::ClickFocus);
 
120
    d->zoomCombo->setInsertPolicy(QComboBox::NoInsert);
 
121
 
 
122
    QList<double> zoomLevels;
 
123
    zoomLevels << 10.0;
 
124
    zoomLevels << 25.0;
 
125
    zoomLevels << 50.0;
 
126
    zoomLevels << 75.0;
 
127
    zoomLevels << 100.0;
 
128
    zoomLevels << 150.0;
 
129
    zoomLevels << 200.0;
 
130
    zoomLevels << 300.0;
 
131
    zoomLevels << 450.0;
 
132
    zoomLevels << 600.0;
 
133
    zoomLevels << 800.0;
 
134
    zoomLevels << 1200.0;
 
135
 
 
136
    foreach (const double zoom, zoomLevels)
 
137
        d->zoomCombo->addItem(QString("%1%").arg((int)zoom), QVariant(zoom));
 
138
 
 
139
    layout()->setMargin(0);
 
140
    layout()->setSpacing(0);
 
141
 
 
142
    // -------------------------------------------------------------
 
143
 
 
144
    connect(d->zoomSlider, SIGNAL(valueChanged(int)),
 
145
            this, SIGNAL(signalZoomSliderChanged(int)));
 
146
 
 
147
    connect(d->zoomSlider, SIGNAL(valueChanged(int)),
 
148
            this, SLOT(slotZoomSliderChanged(int)));
 
149
 
 
150
    connect(d->zoomSlider, SIGNAL(sliderReleased()),
 
151
            this, SLOT(slotZoomSliderReleased()));
 
152
 
 
153
    connect(d->zoomCombo, SIGNAL(activated(int)),
 
154
            this, SLOT(slotZoomSelected(int)));
 
155
 
 
156
    connect(d->zoomCombo, SIGNAL(returnPressed(const QString&)),
 
157
            this, SLOT(slotZoomTextChanged(const QString&)));
 
158
}
 
159
 
 
160
DZoomBar::~DZoomBar()
 
161
{
 
162
    if (d->zoomTimer)
 
163
        delete d->zoomTimer;
 
164
 
 
165
    delete d;
 
166
}
 
167
 
 
168
void DZoomBar::setZoomToFitAction(QAction* action)
 
169
{
 
170
    d->zoomToFitButton->setDefaultAction(action);
 
171
}
 
172
 
 
173
void DZoomBar::setZoomTo100Action(QAction* action)
 
174
{
 
175
    d->zoomTo100Button->setDefaultAction(action);
 
176
}
 
177
 
 
178
void DZoomBar::setZoomPlusAction(QAction* action)
 
179
{
 
180
    d->zoomPlusButton->setDefaultAction(action);
 
181
}
 
182
 
 
183
void DZoomBar::setZoomMinusAction(QAction* action)
 
184
{
 
185
    d->zoomMinusButton->setDefaultAction(action);
 
186
}
 
187
 
 
188
void DZoomBar::slotZoomSliderChanged(int)
 
189
{
 
190
    if (d->zoomTimer)
 
191
    {
 
192
        d->zoomTimer->stop();
 
193
        delete d->zoomTimer;
 
194
    }
 
195
 
 
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);
 
201
}
 
202
 
 
203
void DZoomBar::slotDelayedZoomSliderChanged()
 
204
{
 
205
    emit signalDelayedZoomSliderChanged(d->zoomSlider->value());
 
206
}
 
207
 
 
208
void DZoomBar::slotZoomSliderReleased()
 
209
{
 
210
    emit signalZoomSliderReleased(d->zoomSlider->value());
 
211
}
 
212
 
 
213
void DZoomBar::setZoom(double zoom, double zmin, double zmax)
 
214
{
 
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);
 
220
 
 
221
    d->zoomSlider->blockSignals(true);
 
222
    d->zoomSlider->setValue(size);
 
223
    d->zoomSlider->blockSignals(false);
 
224
 
 
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);
 
230
 
 
231
    d->zoomTracker->setText(ztxt);
 
232
    triggerZoomTrackerToolTip();
 
233
}
 
234
 
 
235
void DZoomBar::triggerZoomTrackerToolTip()
 
236
{
 
237
    d->zoomTracker->triggerAutoShow();
 
238
}
 
239
 
 
240
void DZoomBar::slotUpdateTrackerPos()
 
241
{
 
242
    d->zoomTracker->refresh();
 
243
}
 
244
 
 
245
void DZoomBar::slotZoomSelected(int index)
 
246
{
 
247
    bool ok     = false;
 
248
    double zoom = d->zoomCombo->itemData(index).toDouble(&ok) / 100.0;
 
249
    if (ok && zoom > 0.0)
 
250
        emit signalZoomValueEdited(zoom);
 
251
}
 
252
 
 
253
void DZoomBar::slotZoomTextChanged(const QString& txt)
 
254
{
 
255
    bool ok     = false;
 
256
    double zoom = KGlobal::locale()->readNumber(txt, &ok) / 100.0;
 
257
    if (ok && zoom > 0.0)
 
258
        emit signalZoomValueEdited(zoom);
 
259
}
 
260
 
 
261
}  // namespace Digikam