]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Move dolphin's statusbar message-label (the one with support for errors and a close...
authorDavid Faure <faure@kde.org>
Mon, 30 Aug 2010 08:56:19 +0000 (08:56 +0000)
committerDavid Faure <faure@kde.org>
Mon, 30 Aug 2010 08:56:19 +0000 (08:56 +0000)
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

src/CMakeLists.txt
src/dolphinpart.cpp
src/statusbar/dolphinstatusbar.cpp
src/statusbar/dolphinstatusbar.h
src/statusbar/statusbarmessagelabel.cpp [deleted file]
src/statusbar/statusbarmessagelabel.h [deleted file]
src/views/dolphindirlister.h

index 06e93174f0af6259892625fb4b20d581aefe63c9..0f51f29a1b3da1fe61c8086b91889b788bde589f 100644 (file)
@@ -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
 )
 
index 3309f4b38dc339b7d3ac567358576fb29b71e26e..f44ada30462fb170bff3cba600f2d00d8cd9e6e0 100644 (file)
@@ -26,7 +26,6 @@
 #include <kactioncollection.h>
 #include <kconfiggroup.h>
 #include <kdebug.h>
-#include <kdirlister.h>
 #include <kglobalsettings.h>
 #include <kiconloader.h>
 #include <klocale.h>
@@ -47,6 +46,7 @@
 #include "views/dolphinmodel.h"
 #include "views/dolphinnewfilemenuobserver.h"
 #include "views/dolphinremoteencoding.h"
+#include "views/dolphindirlister.h"
 
 #include <QActionGroup>
 #include <QApplication>
@@ -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)
index e08d94948d0da29d85bff8ad72477228a3f48aad..687c009358f311beace0b0853c3d74d04f8f2672 100644 (file)
@@ -29,7 +29,6 @@
 #include <kvbox.h>
 
 #include "settings/dolphinsettings.h"
-#include "statusbarmessagelabel.h"
 #include "statusbarspaceinfo.h"
 
 #include <QApplication>
@@ -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<KonqStatusBarMessageLabel::Type>(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<Type>(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);
index 5c626cf4b5d2c41a9f6df655a2865864cac69a17..35c207fcdde9db1921cf20416f66adbea142503f 100644 (file)
 #ifndef DOLPHINSTATUSBAR_H
 #define DOLPHINSTATUSBAR_H
 
+#include "konq_statusbarmessagelabel.h"
 #include <QTime>
 #include <QWidget>
 
 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 (file)
index 5ebe38b..0000000
+++ /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 <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"
diff --git a/src/statusbar/statusbarmessagelabel.h b/src/statusbar/statusbarmessagelabel.h
deleted file mode 100644 (file)
index 88b620e..0000000
+++ /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 <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
index 629c335d3af81b50b2bdac3bac52e2d767f13d48..0549c3c8f6677dc66ff560b99cb277ecc8cdf1df 100644 (file)
 #ifndef DOLPHINDIRLISTER_H
 #define DOLPHINDIRLISTER_H
 
+#include <libdolphin_export.h>
 #include <kdirlister.h>
 
 /**
  * @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