From: David Faure Date: Mon, 30 Aug 2010 08:56:19 +0000 (+0000) Subject: Move dolphin's statusbar message-label (the one with support for errors and a close... X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/12f15322b3fe6e6c5045d8b3e4f319c0eea7e3aa Move dolphin's statusbar message-label (the one with support for errors and a close button) to libkonq so that it can be used in konqueror as well. Fix its sizeHint. Reviewed by Peter Penz. svn path=/trunk/KDE/kdebase/apps/; revision=1169901 --- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 06e93174f..0f51f29a1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -133,8 +133,6 @@ set(dolphin_SRCS settings/viewmodes/viewsettingspagebase.cpp statusbar/dolphinstatusbar.cpp statusbar/statusbarspaceinfo.cpp - statusbar/statusbarmessagelabel.cpp - views/dolphindirlister.cpp views/zoomlevelinfo.cpp ) diff --git a/src/dolphinpart.cpp b/src/dolphinpart.cpp index 3309f4b38..f44ada304 100644 --- a/src/dolphinpart.cpp +++ b/src/dolphinpart.cpp @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -47,6 +46,7 @@ #include "views/dolphinmodel.h" #include "views/dolphinnewfilemenuobserver.h" #include "views/dolphinremoteencoding.h" +#include "views/dolphindirlister.h" #include #include @@ -65,7 +65,7 @@ DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QVariantL // make sure that other apps using this part find Dolphin's view-file-columns icons KIconLoader::global()->addAppDir("dolphin"); - m_dirLister = new KDirLister; + m_dirLister = new DolphinDirLister; m_dirLister->setAutoUpdate(true); if (parentWidget) { m_dirLister->setMainWindow(parentWidget->window()); @@ -75,6 +75,7 @@ DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QVariantL connect(m_dirLister, SIGNAL(completed(KUrl)), this, SLOT(slotCompleted(KUrl))); connect(m_dirLister, SIGNAL(canceled(KUrl)), this, SLOT(slotCanceled(KUrl))); connect(m_dirLister, SIGNAL(percent(int)), this, SLOT(updateProgress(int))); + connect(m_dirLister, SIGNAL(errorMessage(QString)), this, SLOT(slotErrorMessage(QString))); m_dolphinModel = new DolphinModel(this); m_dolphinModel->setDirLister(m_dirLister); @@ -331,7 +332,9 @@ void DolphinPart::slotMessage(const QString& msg) void DolphinPart::slotErrorMessage(const QString& msg) { - KMessageBox::error(m_view, msg); + kDebug() << msg; + emit canceled(msg); + //KMessageBox::error(m_view, msg); } void DolphinPart::slotRequestItemInfo(const KFileItem& item) diff --git a/src/statusbar/dolphinstatusbar.cpp b/src/statusbar/dolphinstatusbar.cpp index e08d94948..687c00935 100644 --- a/src/statusbar/dolphinstatusbar.cpp +++ b/src/statusbar/dolphinstatusbar.cpp @@ -29,7 +29,6 @@ #include #include "settings/dolphinsettings.h" -#include "statusbarmessagelabel.h" #include "statusbarspaceinfo.h" #include @@ -60,7 +59,7 @@ DolphinStatusBar::DolphinStatusBar(QWidget* parent, DolphinView* view) : 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); @@ -112,9 +111,7 @@ DolphinStatusBar::DolphinStatusBar(QWidget* parent, DolphinView* view) : 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); @@ -157,7 +154,8 @@ void DolphinStatusBar::setMessage(const QString& msg, timeout = 0; } - if ((message == m_messageLabel->text()) && (type == m_messageLabel->type())) { + KonqStatusBarMessageLabel::Type konqType = static_cast(type); + if ((message == m_messageLabel->text()) && (konqType == m_messageLabel->type())) { // the message is already shown return; } @@ -173,7 +171,7 @@ void DolphinStatusBar::setMessage(const QString& msg, return; } - m_messageLabel->setMessage(message, type); + m_messageLabel->setMessage(message, konqType); if (type != Default) { m_messageTimeStamp = currentTime; } @@ -181,7 +179,7 @@ void DolphinStatusBar::setMessage(const QString& msg, DolphinStatusBar::Type DolphinStatusBar::type() const { - return m_messageLabel->type(); + return static_cast(m_messageLabel->type()); } QString DolphinStatusBar::message() const @@ -216,7 +214,7 @@ void DolphinStatusBar::setProgress(int percent) } 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; @@ -338,7 +336,7 @@ void DolphinStatusBar::showZoomSliderToolTip(int zoomLevel) 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); diff --git a/src/statusbar/dolphinstatusbar.h b/src/statusbar/dolphinstatusbar.h index 5c626cf4b..35c207fcd 100644 --- a/src/statusbar/dolphinstatusbar.h +++ b/src/statusbar/dolphinstatusbar.h @@ -21,12 +21,12 @@ #ifndef DOLPHINSTATUSBAR_H #define DOLPHINSTATUSBAR_H +#include "konq_statusbarmessagelabel.h" #include #include class DolphinView; class KUrl; -class StatusBarMessageLabel; class StatusBarSpaceInfo; class QLabel; class QProgressBar; @@ -50,10 +50,10 @@ public: * used for the message text. */ enum Type { - Default, - OperationCompleted, - Information, - Error + Default = KonqStatusBarMessageLabel::Default, + OperationCompleted = KonqStatusBarMessageLabel::OperationCompleted, + Information = KonqStatusBarMessageLabel::Information, + Error = KonqStatusBarMessageLabel::Error }; explicit DolphinStatusBar(QWidget* parent, DolphinView* view); @@ -133,7 +133,7 @@ private slots: void setZoomLevel(int zoomLevel); void zoomOut(); - void zoomIn(); + void zoomIn(); void showZoomSliderToolTip(int zoomLevel); private: @@ -155,7 +155,7 @@ private: private: DolphinView* m_view; - StatusBarMessageLabel* m_messageLabel; + KonqStatusBarMessageLabel* m_messageLabel; StatusBarSpaceInfo* m_spaceInfo; QWidget* m_zoomWidget; diff --git a/src/statusbar/statusbarmessagelabel.cpp b/src/statusbar/statusbarmessagelabel.cpp deleted file mode 100644 index 5ebe38bf4..000000000 --- a/src/statusbar/statusbarmessagelabel.cpp +++ /dev/null @@ -1,332 +0,0 @@ -/*************************************************************************** - * 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 -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -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" diff --git a/src/statusbar/statusbarmessagelabel.h b/src/statusbar/statusbarmessagelabel.h deleted file mode 100644 index 88b620eb7..000000000 --- a/src/statusbar/statusbarmessagelabel.h +++ /dev/null @@ -1,143 +0,0 @@ -/*************************************************************************** - * 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 - -#include -#include - -#include - -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 m_pendingMessages; - QPixmap m_pixmap; - QToolButton* m_closeButton; -}; - -#endif diff --git a/src/views/dolphindirlister.h b/src/views/dolphindirlister.h index 629c335d3..0549c3c8f 100644 --- a/src/views/dolphindirlister.h +++ b/src/views/dolphindirlister.h @@ -20,13 +20,14 @@ #ifndef DOLPHINDIRLISTER_H #define DOLPHINDIRLISTER_H +#include #include /** * @brief Extends the class KDirLister by emitting a signal when an * error occurred instead of showing an error dialog. */ -class DolphinDirLister : public KDirLister +class LIBDOLPHINPRIVATE_EXPORT DolphinDirLister : public KDirLister { Q_OBJECT