#include <kvbox.h>
#include "settings/dolphinsettings.h"
-#include "statusbarmessagelabel.h"
#include "statusbarspaceinfo.h"
#include <QApplication>
this, SLOT(updateSpaceInfoContent(const KUrl&)));
// Initialize message label
- m_messageLabel = new StatusBarMessageLabel(this);
+ m_messageLabel = new KonqStatusBarMessageLabel(this);
// Initialize zoom slider
m_zoomWidget = new QWidget(this);
const int zoomWidgetHeight = m_zoomWidget->minimumSizeHint().height();
const int contentHeight = qMax(fontHeight, zoomWidgetHeight);
- m_messageLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
m_messageLabel->setMinimumTextHeight(contentHeight);
- m_messageLabel->setMinimumWidth(100);
m_spaceInfo->setMaximumSize(200, contentHeight - 5);
m_spaceInfo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
timeout = 0;
}
- if ((message == m_messageLabel->text()) && (type == m_messageLabel->type())) {
+ KonqStatusBarMessageLabel::Type konqType = static_cast<KonqStatusBarMessageLabel::Type>(type);
+ if ((message == m_messageLabel->text()) && (konqType == m_messageLabel->type())) {
// the message is already shown
return;
}
return;
}
- m_messageLabel->setMessage(message, type);
+ m_messageLabel->setMessage(message, konqType);
if (type != Default) {
m_messageTimeStamp = currentTime;
}
DolphinStatusBar::Type DolphinStatusBar::type() const
{
- return m_messageLabel->type();
+ return static_cast<Type>(m_messageLabel->type());
}
QString DolphinStatusBar::message() const
}
m_progress = percent;
- if (m_messageLabel->type() == Error) {
+ if (m_messageLabel->type() == KonqStatusBarMessageLabel::Error) {
// Don't update any widget or status bar text if an
// error message is shown
return;
void DolphinStatusBar::updateProgressInfo()
{
- const bool isErrorShown = (m_messageLabel->type() == Error);
+ const bool isErrorShown = (m_messageLabel->type() == KonqStatusBarMessageLabel::Error);
if (m_progress < 100) {
// Show the progress information and hide the extensions
setExtensionsVisible(false);
+++ /dev/null
-/***************************************************************************
- * Copyright (C) 2006 by Peter Penz *
- * peter.penz@gmx.at *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
- ***************************************************************************/
-
-#include "statusbarmessagelabel.h"
-
-#include <kcolorscheme.h>
-#include <kiconloader.h>
-#include <kicon.h>
-#include <klocale.h>
-
-#include <QFontMetrics>
-#include <QPainter>
-#include <QKeyEvent>
-#include <QPixmap>
-#include <QToolButton>
-#include <QTimer>
-
-StatusBarMessageLabel::StatusBarMessageLabel(QWidget* parent) :
- QWidget(parent),
- m_type(DolphinStatusBar::Default),
- m_state(Default),
- m_illumination(0),
- m_minTextHeight(-1),
- m_timer(0),
- m_closeButton(0)
-{
- setMinimumHeight(KIconLoader::SizeSmall);
-
- m_timer = new QTimer(this);
- connect(m_timer, SIGNAL(timeout()),
- this, SLOT(timerDone()));
-
- m_closeButton = new QToolButton(this);
- m_closeButton->setAutoRaise(true);
- m_closeButton->setIcon(KIcon("dialog-close"));
- m_closeButton->setToolTip(i18nc("@info", "Close"));
- m_closeButton->hide();
- connect(m_closeButton, SIGNAL(clicked()),
- this, SLOT(closeErrorMessage()));
-}
-
-StatusBarMessageLabel::~StatusBarMessageLabel()
-{
-}
-
-void StatusBarMessageLabel::setMessage(const QString& text,
- DolphinStatusBar::Type type)
-{
- if ((text == m_text) && (type == m_type)) {
- return;
- }
-
- if (m_type == DolphinStatusBar::Error) {
- if (type == DolphinStatusBar::Error) {
- m_pendingMessages.insert(0, m_text);
- } else if ((m_state != Default) || !m_pendingMessages.isEmpty()) {
- // a non-error message should not be shown, as there
- // are other pending error messages in the queue
- return;
- }
- }
-
- m_text = text;
- m_type = type;
-
- m_timer->stop();
- m_illumination = 0;
- m_state = Default;
-
- const char* iconName = 0;
- QPixmap pixmap;
- switch (type) {
- case DolphinStatusBar::OperationCompleted:
- iconName = "dialog-ok";
- // "ok" icon should probably be "dialog-success", but we don't have that icon in KDE 4.0
- m_closeButton->hide();
- break;
-
- case DolphinStatusBar::Information:
- iconName = "dialog-information";
- m_closeButton->hide();
- break;
-
- case DolphinStatusBar::Error:
- m_timer->start(100);
- m_state = Illuminate;
-
- updateCloseButtonPosition();
- m_closeButton->show();
- break;
-
- case DolphinStatusBar::Default:
- default:
- m_closeButton->hide();
- break;
- }
-
- m_pixmap = (iconName == 0) ? QPixmap() : SmallIcon(iconName);
- QTimer::singleShot(GeometryTimeout, this, SLOT(assureVisibleText()));
- update();
-}
-
-DolphinStatusBar::Type StatusBarMessageLabel::type() const
-{
- return m_type;
-}
-
-QString StatusBarMessageLabel::text() const
-{
- return m_text;
-}
-
-void StatusBarMessageLabel::setDefaultText(const QString& text)
-{
- m_defaultText = text;
-}
-
-QString StatusBarMessageLabel::defaultText() const
-{
- return m_defaultText;
-}
-
-void StatusBarMessageLabel::setMinimumTextHeight(int min)
-{
- if (min != m_minTextHeight) {
- m_minTextHeight = min;
- setMinimumHeight(min);
- if (m_closeButton->height() > min) {
- m_closeButton->setFixedHeight(min);
- }
- }
-}
-
-int StatusBarMessageLabel::minimumTextHeight() const
-{
- return m_minTextHeight;
-}
-
-int StatusBarMessageLabel::widthGap() const
-{
- QFontMetrics fontMetrics(font());
- const int defaultGap = 10;
- return fontMetrics.width(m_text) - availableTextWidth() + defaultGap;
-}
-
-void StatusBarMessageLabel::paintEvent(QPaintEvent* /* event */)
-{
- QPainter painter(this);
-
- if (m_illumination > 0) {
- // at this point, a: we are a second label being drawn over the already
- // painted status area, so we can be translucent, and b: our palette's
- // window color (bg only) seems to be wrong (always black)
- KColorScheme scheme(palette().currentColorGroup(), KColorScheme::Window);
- QColor backgroundColor = scheme.background(KColorScheme::NegativeBackground).color();
- backgroundColor.setAlpha(qMin(255, m_illumination * 2));
- painter.setBrush(backgroundColor);
- painter.setPen(Qt::NoPen);
- painter.drawRect(QRect(0, 0, width(), height()));
- }
-
- // draw pixmap
- int x = BorderGap;
- const int y = (m_minTextHeight - m_pixmap.height()) / 2;
-
- if (!m_pixmap.isNull()) {
- painter.drawPixmap(x, y, m_pixmap);
- x += m_pixmap.width() + BorderGap;
- }
-
- // draw text
- painter.setPen(palette().windowText().color());
- int flags = Qt::AlignVCenter;
- if (height() > m_minTextHeight) {
- flags = flags | Qt::TextWordWrap;
- }
- painter.drawText(QRect(x, 0, availableTextWidth(), height()), flags, m_text);
- painter.end();
-}
-
-void StatusBarMessageLabel::resizeEvent(QResizeEvent* event)
-{
- QWidget::resizeEvent(event);
- updateCloseButtonPosition();
- QTimer::singleShot(GeometryTimeout, this, SLOT(assureVisibleText()));
-}
-
-void StatusBarMessageLabel::timerDone()
-{
- switch (m_state) {
- case Illuminate: {
- // increase the illumination
- const int illumination_max = 128;
- if (m_illumination < illumination_max) {
- m_illumination += 32;
- if (m_illumination > illumination_max) {
- m_illumination = illumination_max;
- }
- update();
- } else {
- m_state = Illuminated;
- m_timer->start(5000);
- }
- break;
- }
-
- case Illuminated: {
- // start desaturation
- m_state = Desaturate;
- m_timer->start(100);
- break;
- }
-
- case Desaturate: {
- // desaturate
- if (m_illumination > 0) {
- m_illumination -= 5;
- update();
- } else {
- m_state = Default;
- m_timer->stop();
- }
- break;
- }
-
- default:
- break;
- }
-}
-
-void StatusBarMessageLabel::assureVisibleText()
-{
- if (m_text.isEmpty()) {
- return;
- }
-
- int requiredHeight = m_minTextHeight;
- if (m_type != DolphinStatusBar::Default) {
- // Calculate the required height of the widget thats
- // needed for having a fully visible text. Note that for the default
- // statusbar type (e. g. hover information) increasing the text height
- // is not wanted, as this might rearrange the layout of items.
-
- QFontMetrics fontMetrics(font());
- const QRect bounds(fontMetrics.boundingRect(0, 0, availableTextWidth(), height(),
- Qt::AlignVCenter | Qt::TextWordWrap, m_text));
- requiredHeight = bounds.height();
- if (requiredHeight < m_minTextHeight) {
- requiredHeight = m_minTextHeight;
- }
- }
-
- // Increase/decrease the current height of the widget to the
- // required height. The increasing/decreasing is done in several
- // steps to have an animation if the height is modified
- // (see StatusBarMessageLabel::resizeEvent())
- const int gap = m_minTextHeight / 2;
- int minHeight = minimumHeight();
- if (minHeight < requiredHeight) {
- minHeight += gap;
- if (minHeight > requiredHeight) {
- minHeight = requiredHeight;
- }
- setMinimumHeight(minHeight);
- updateGeometry();
- } else if (minHeight > requiredHeight) {
- minHeight -= gap;
- if (minHeight < requiredHeight) {
- minHeight = requiredHeight;
- }
- setMinimumHeight(minHeight);
- updateGeometry();
- }
-
- updateCloseButtonPosition();
-}
-
-int StatusBarMessageLabel::availableTextWidth() const
-{
- const int buttonWidth = (m_type == DolphinStatusBar::Error) ?
- m_closeButton->width() + BorderGap : 0;
- return width() - m_pixmap.width() - (BorderGap * 4) - buttonWidth;
-}
-
-void StatusBarMessageLabel::updateCloseButtonPosition()
-{
- const int x = width() - m_closeButton->width() - BorderGap;
- m_closeButton->move(x, 0);
-}
-
-void StatusBarMessageLabel::closeErrorMessage()
-{
- if (!showPendingMessage()) {
- reset();
- setMessage(m_defaultText, DolphinStatusBar::Default);
- }
-}
-
-bool StatusBarMessageLabel::showPendingMessage()
-{
- if (!m_pendingMessages.isEmpty()) {
- reset();
- setMessage(m_pendingMessages.takeFirst(), DolphinStatusBar::Error);
- return true;
- }
- return false;
-}
-
-void StatusBarMessageLabel::reset()
-{
- m_text.clear();
- m_type = DolphinStatusBar::Default;
-}
-
-#include "statusbarmessagelabel.moc"
+++ /dev/null
-/***************************************************************************
- * Copyright (C) 2006 by Peter Penz *
- * peter.penz@gmx.at *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
- ***************************************************************************/
-
-#ifndef STATUSBARMESSAGELABEL_H
-#define STATUSBARMESSAGELABEL_H
-
-#include <statusbar/dolphinstatusbar.h>
-
-#include <QtCore/QList>
-#include <QtGui/QPixmap>
-
-#include <QtGui/QWidget>
-
-class QPaintEvent;
-class QResizeEvent;
-class QToolButton;
-class QTimer;
-
-/**
- * @brief Represents a message text label as part of the status bar.
- *
- * Dependent from the given type automatically a corresponding icon
- * is shown in front of the text. For message texts having the type
- * DolphinStatusBar::Error a dynamic color blending is done to get the
- * attention from the user.
- */
-class StatusBarMessageLabel : public QWidget
-{
- Q_OBJECT
-
-public:
- explicit StatusBarMessageLabel(QWidget* parent);
- virtual ~StatusBarMessageLabel();
-
- void setMessage(const QString& text, DolphinStatusBar::Type type);
-
- DolphinStatusBar::Type type() const;
-
- QString text() const;
-
- void setDefaultText(const QString& text);
- QString defaultText() const;
-
- // TODO: maybe a better approach is possible with the size hint
- void setMinimumTextHeight(int min);
- int minimumTextHeight() const;
-
- /**
- * Returns the gap of the width of the current set text to the
- * width of the message label. A gap <= 0 means that the text
- * fits into the available width.
- */
- int widthGap() const;
-
-protected:
- /** @see QWidget::paintEvent() */
- virtual void paintEvent(QPaintEvent* event);
-
- /** @see QWidget::resizeEvent() */
- virtual void resizeEvent(QResizeEvent* event);
-
-private slots:
- void timerDone();
-
- /**
- * Increases the height of the message label so that
- * the given text fits into given area.
- */
- void assureVisibleText();
-
- /**
- * Returns the available width in pixels for the text.
- */
- int availableTextWidth() const;
-
- /**
- * Moves the close button to the upper right corner
- * of the message label.
- */
- void updateCloseButtonPosition();
-
- /**
- * Closes the currently shown error message and replaces it
- * by the next pending message.
- */
- void closeErrorMessage();
-
-private:
- /**
- * Shows the next pending error message. If no pending message
- * was in the queue, false is returned.
- */
- bool showPendingMessage();
-
- /**
- * Resets the message label properties. This is useful when the
- * result of invoking StatusBarMessageLabel::setMessage() should
- * not rely on previous states.
- */
- void reset();
-
-private:
- enum State
- {
- Default,
- Illuminate,
- Illuminated,
- Desaturate
- };
-
- enum { GeometryTimeout = 100 };
- enum { BorderGap = 2 };
-
- DolphinStatusBar::Type m_type;
- State m_state;
- int m_illumination;
- int m_minTextHeight;
- QTimer* m_timer;
- QString m_text;
- QString m_defaultText;
- QList<QString> m_pendingMessages;
- QPixmap m_pixmap;
- QToolButton* m_closeButton;
-};
-
-#endif