~ubuntu-branches/ubuntu/lucid/kdebase/lucid

« back to all changes in this revision

Viewing changes to apps/dolphin/src/dolphinstatusbar.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Thomas
  • Date: 2009-12-02 13:28:20 UTC
  • mto: This revision was merged to the branch mainline in revision 258.
  • Revision ID: james.westby@ubuntu.com-20091202132820-tpxn348l9frx5zd5
Tags: upstream-4.3.80
ImportĀ upstreamĀ versionĀ 4.3.80

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/***************************************************************************
2
 
 *   Copyright (C) 2006 by Peter Penz                                      *
3
 
 *   peter.penz@gmx.at                                                     *
4
 
 *                                                                         *
5
 
 *   This program is free software; you can redistribute it and/or modify  *
6
 
 *   it under the terms of the GNU General Public License as published by  *
7
 
 *   the Free Software Foundation; either version 2 of the License, or     *
8
 
 *   (at your option) any later version.                                   *
9
 
 *                                                                         *
10
 
 *   This program is distributed in the hope that it will be useful,       *
11
 
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12
 
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13
 
 *   GNU General Public License for more details.                          *
14
 
 *                                                                         *
15
 
 *   You should have received a copy of the GNU General Public License     *
16
 
 *   along with this program; if not, write to the                         *
17
 
 *   Free Software Foundation, Inc.,                                       *
18
 
 *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
19
 
 ***************************************************************************/
20
 
 
21
 
#include "dolphinstatusbar.h"
22
 
#include "settings/dolphinsettings.h"
23
 
#include "dolphinview.h"
24
 
#include "dolphin_generalsettings.h"
25
 
#include "statusbarmessagelabel.h"
26
 
#include "statusbarspaceinfo.h"
27
 
#include "zoomlevelinfo.h"
28
 
 
29
 
#include <QApplication>
30
 
#include <QHBoxLayout>
31
 
#include <QLabel>
32
 
#include <QProgressBar>
33
 
#include <QToolButton>
34
 
#include <QTimer>
35
 
 
36
 
#include <kiconloader.h>
37
 
#include <kicon.h>
38
 
#include <klocale.h>
39
 
#include <kvbox.h>
40
 
 
41
 
DolphinStatusBar::DolphinStatusBar(QWidget* parent, DolphinView* view) :
42
 
    KHBox(parent),
43
 
    m_view(view),
44
 
    m_messageLabel(0),
45
 
    m_spaceInfo(0),
46
 
    m_zoomWidget(0),
47
 
    m_zoomOut(0),
48
 
    m_zoomSlider(0),
49
 
    m_zoomIn(0),
50
 
    m_progressBar(0),
51
 
    m_progress(100)
52
 
{
53
 
    setMargin(0);
54
 
    setSpacing(4);
55
 
 
56
 
    connect(m_view, SIGNAL(urlChanged(const KUrl&)),
57
 
            this, SLOT(updateSpaceInfoContent(const KUrl&)));
58
 
 
59
 
    // initialize message label
60
 
    m_messageLabel = new StatusBarMessageLabel(this);
61
 
    m_messageLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
62
 
 
63
 
    // initialize zoom slider
64
 
    m_zoomWidget = new QWidget(this);
65
 
 
66
 
    m_zoomOut = new QToolButton(m_zoomWidget);
67
 
    m_zoomOut->setIcon(KIcon("zoom-out"));
68
 
    m_zoomOut->setAutoRaise(true);
69
 
 
70
 
    m_zoomSlider = new QSlider(Qt::Horizontal, m_zoomWidget);
71
 
    m_zoomSlider->setPageStep(1);
72
 
 
73
 
    const int min = ZoomLevelInfo::minimumLevel();
74
 
    const int max = ZoomLevelInfo::maximumLevel();
75
 
    m_zoomSlider->setRange(min, max);
76
 
    m_zoomSlider->setValue(view->zoomLevel());
77
 
    updateZoomSliderToolTip(view->zoomLevel());
78
 
 
79
 
    m_zoomIn = new QToolButton(m_zoomWidget);
80
 
    m_zoomIn->setIcon(KIcon("zoom-in"));
81
 
    m_zoomIn->setAutoRaise(true);
82
 
 
83
 
    QHBoxLayout* zoomWidgetLayout = new QHBoxLayout(m_zoomWidget);
84
 
    zoomWidgetLayout->setSpacing(0);
85
 
    zoomWidgetLayout->setMargin(0);
86
 
    zoomWidgetLayout->addWidget(m_zoomOut);
87
 
    zoomWidgetLayout->addWidget(m_zoomSlider);
88
 
    zoomWidgetLayout->addWidget(m_zoomIn);
89
 
 
90
 
    connect(m_zoomSlider, SIGNAL(valueChanged(int)), this, SLOT(setZoomLevel(int)));
91
 
    connect(m_zoomSlider, SIGNAL(sliderMoved(int)), this, SLOT(showZoomSliderToolTip(int)));
92
 
    connect(m_view, SIGNAL(zoomLevelChanged(int)), m_zoomSlider, SLOT(setValue(int)));
93
 
    connect(m_zoomOut, SIGNAL(clicked()), this, SLOT(zoomOut()));
94
 
    connect(m_zoomIn, SIGNAL(clicked()), this, SLOT(zoomIn()));
95
 
 
96
 
    // initialize space information
97
 
    m_spaceInfo = new StatusBarSpaceInfo(this);
98
 
    m_spaceInfo->setUrl(m_view->url());
99
 
 
100
 
    // initialize progress information
101
 
    m_progressText = new QLabel(this);
102
 
    m_progressText->hide();
103
 
 
104
 
    m_progressBar = new QProgressBar(this);
105
 
    m_progressBar->hide();
106
 
 
107
 
    // initialize sizes
108
 
    const int fontHeight = QFontMetrics(m_messageLabel->font()).height();
109
 
    const int zoomWidgetHeight = m_zoomWidget->minimumSizeHint().height();
110
 
    const int contentHeight = qMax(fontHeight, zoomWidgetHeight);
111
 
 
112
 
    m_messageLabel->setMinimumTextHeight(contentHeight);
113
 
    m_spaceInfo->setFixedHeight(contentHeight - 5);
114
 
    m_progressBar->setFixedSize(200, contentHeight);
115
 
    m_zoomWidget->setFixedSize(150, contentHeight);
116
 
 
117
 
    setExtensionsVisible(true);
118
 
}
119
 
 
120
 
DolphinStatusBar::~DolphinStatusBar()
121
 
{
122
 
}
123
 
 
124
 
void DolphinStatusBar::setMessage(const QString& msg,
125
 
                                  Type type)
126
 
{
127
 
    if ((msg == m_messageLabel->text()) && (type == m_messageLabel->type())) {
128
 
        return;
129
 
    }
130
 
 
131
 
    m_messageLabel->setMessage(msg, type);
132
 
 
133
 
    const int widthGap = m_messageLabel->widthGap();
134
 
    if (widthGap > 0) {
135
 
        m_progressBar->hide();
136
 
        m_progressText->hide();
137
 
    }
138
 
    assureVisibleText();
139
 
}
140
 
 
141
 
DolphinStatusBar::Type DolphinStatusBar::type() const
142
 
{
143
 
    return m_messageLabel->type();
144
 
}
145
 
 
146
 
QString DolphinStatusBar::message() const
147
 
{
148
 
    return m_messageLabel->text();
149
 
}
150
 
 
151
 
void DolphinStatusBar::setProgressText(const QString& text)
152
 
{
153
 
    m_progressText->setText(text);
154
 
}
155
 
 
156
 
QString DolphinStatusBar::progressText() const
157
 
{
158
 
    return m_progressText->text();
159
 
}
160
 
 
161
 
void DolphinStatusBar::setProgress(int percent)
162
 
{
163
 
    if (percent < 0) {
164
 
        percent = 0;
165
 
    } else if (percent > 100) {
166
 
        percent = 100;
167
 
    }
168
 
 
169
 
    m_progress = percent;
170
 
    if (m_messageLabel->type() == Error) {
171
 
        // don't update any widget or status bar text if an
172
 
        // error message is shown
173
 
        return;
174
 
    }
175
 
 
176
 
    m_progressBar->setValue(m_progress);
177
 
    if (!m_progressBar->isVisible() || (percent == 100)) {
178
 
        QTimer::singleShot(300, this, SLOT(updateProgressInfo()));
179
 
    }
180
 
 
181
 
    const QString& defaultText = m_messageLabel->defaultText();
182
 
    const QString msg(m_messageLabel->text());
183
 
    if ((percent == 0) && !msg.isEmpty()) {
184
 
        setMessage(QString(), Default);
185
 
    } else if ((percent == 100) && (msg != defaultText)) {
186
 
        setMessage(defaultText, Default);
187
 
    }
188
 
}
189
 
 
190
 
void DolphinStatusBar::clear()
191
 
{
192
 
    setMessage(m_messageLabel->defaultText(), Default);
193
 
}
194
 
 
195
 
void DolphinStatusBar::setDefaultText(const QString& text)
196
 
{
197
 
    m_messageLabel->setDefaultText(text);
198
 
}
199
 
 
200
 
const QString& DolphinStatusBar::defaultText() const
201
 
{
202
 
    return m_messageLabel->defaultText();
203
 
}
204
 
 
205
 
void DolphinStatusBar::refresh()
206
 
{
207
 
    setExtensionsVisible(true);
208
 
    assureVisibleText();
209
 
}
210
 
 
211
 
void DolphinStatusBar::resizeEvent(QResizeEvent* event)
212
 
{
213
 
    // It is important to hide the widgets before invoking
214
 
    // QWidget::resizeEvent(), otherwise it is possible that
215
 
    // the dock widgets are shrinked when having a small
216
 
    // statusbar width (bug #202147).
217
 
    m_zoomWidget->hide();
218
 
    m_spaceInfo->hide();
219
 
 
220
 
    QWidget::resizeEvent(event);
221
 
    QMetaObject::invokeMethod(this, "assureVisibleText", Qt::QueuedConnection);
222
 
}
223
 
 
224
 
void DolphinStatusBar::updateProgressInfo()
225
 
{
226
 
    const bool isErrorShown = (m_messageLabel->type() == Error);
227
 
    if (m_progress < 100) {
228
 
        // show the progress information and hide the extensions
229
 
        setExtensionsVisible(false);
230
 
        if (!isErrorShown) {
231
 
            m_progressText->show();
232
 
            m_progressBar->show();
233
 
        }
234
 
    } else {
235
 
        // hide the progress information and show the extensions
236
 
        m_progressText->hide();
237
 
        m_progressBar->hide();
238
 
        assureVisibleText();
239
 
    }
240
 
}
241
 
 
242
 
void DolphinStatusBar::updateSpaceInfoContent(const KUrl& url)
243
 
{
244
 
    m_spaceInfo->setUrl(url);
245
 
    assureVisibleText();
246
 
}
247
 
 
248
 
void DolphinStatusBar::setZoomLevel(int zoomLevel)
249
 
{
250
 
    m_zoomOut->setEnabled(zoomLevel > m_zoomSlider->minimum());
251
 
    m_zoomIn->setEnabled(zoomLevel < m_zoomSlider->maximum());
252
 
    m_view->setZoomLevel(zoomLevel);
253
 
    updateZoomSliderToolTip(zoomLevel);
254
 
}
255
 
 
256
 
void DolphinStatusBar::assureVisibleText()
257
 
{
258
 
    const int widthGap = m_messageLabel->widthGap();
259
 
    if (m_spaceInfo->isVisible() || m_zoomWidget->isVisible()) {
260
 
        // At least the space information or the zoom slider is shown.
261
 
        // Hide them if the status bar text does not fit into the available width.
262
 
        setExtensionsVisible(widthGap <= 0);
263
 
    } else if (!m_progressBar->isVisible()) {
264
 
        const GeneralSettings* settings = DolphinSettings::instance().generalSettings();
265
 
        const int spaceInfoWidth  = settings->showSpaceInfo()  ? m_spaceInfo->minimumWidth()  : 0;
266
 
        const int zoomWidgetWidth = settings->showZoomSlider() ? m_zoomWidget->minimumWidth() : 0;
267
 
        const int widgetsWidth = spaceInfoWidth + zoomWidgetWidth;
268
 
        setExtensionsVisible(widthGap + widgetsWidth <= 0);
269
 
    }
270
 
}
271
 
 
272
 
void DolphinStatusBar::zoomOut()
273
 
{
274
 
    const int value = m_zoomSlider->value();
275
 
    m_zoomSlider->setValue(value - 1);
276
 
}
277
 
 
278
 
void DolphinStatusBar::zoomIn()
279
 
{
280
 
    const int value = m_zoomSlider->value();
281
 
    m_zoomSlider->setValue(value + 1);
282
 
}
283
 
 
284
 
void DolphinStatusBar::showZoomSliderToolTip(int zoomLevel)
285
 
{
286
 
    updateZoomSliderToolTip(zoomLevel);
287
 
 
288
 
    QPoint global = m_zoomSlider->rect().topLeft();
289
 
    global.ry() += m_zoomSlider->height() / 2;
290
 
    QHelpEvent toolTipEvent(QEvent::ToolTip, QPoint(0, 0), m_zoomSlider->mapToGlobal(global));
291
 
    QApplication::sendEvent(m_zoomSlider, &toolTipEvent);
292
 
}
293
 
 
294
 
void DolphinStatusBar::setExtensionsVisible(bool visible)
295
 
{
296
 
    bool spaceInfoVisible = visible;
297
 
    bool zoomSliderVisible = visible;
298
 
    if (visible) {
299
 
        const GeneralSettings* settings = DolphinSettings::instance().generalSettings();
300
 
        spaceInfoVisible = settings->showSpaceInfo();
301
 
        zoomSliderVisible = settings->showZoomSlider();
302
 
    }
303
 
 
304
 
    m_spaceInfo->setVisible(spaceInfoVisible);
305
 
    m_zoomWidget->setVisible(zoomSliderVisible);
306
 
}
307
 
 
308
 
void DolphinStatusBar::updateZoomSliderToolTip(int zoomLevel)
309
 
{
310
 
    const int size = ZoomLevelInfo::iconSizeForZoomLevel(zoomLevel);
311
 
    m_zoomSlider->setToolTip(i18ncp("@info:tooltip", "Size: 1 pixel", "Size: %1 pixels", size));
312
 
}
313
 
 
314
 
#include "dolphinstatusbar.moc"