]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Improvements for error messages:
authorPeter Penz <peter.penz19@gmail.com>
Tue, 30 Jan 2007 19:38:44 +0000 (19:38 +0000)
committerPeter Penz <peter.penz19@gmail.com>
Tue, 30 Jan 2007 19:38:44 +0000 (19:38 +0000)
- increase/decrease size on demand and hide progress bar or space information if required
- provide close button

TODO: the code is far from being finished (e. g. no queueing of pending error messages, close button looks fugly, ...), but I decided to commit the changes to prevent getting an inconsistent state in combination with other commits...

svn path=/trunk/playground/utils/dolphin/; revision=628642

src/dolphinstatusbar.cpp
src/dolphinview.cpp
src/statusbarmessagelabel.cpp
src/statusbarmessagelabel.h

index c81a01c70d76586efb8824db4fcaa6dcbd3955eb..4cdffec944e0baa511d914ef3c540c8267938bfd 100644 (file)
@@ -52,9 +52,12 @@ DolphinStatusBar::DolphinStatusBar(DolphinView* parent) :
     m_progressBar->hide();
 
     const QSize size(m_progressBar->sizeHint());
+    const int barHeight = size.height();
+
     m_progressBar->setMaximumWidth(200);
-    setMinimumHeight(size.height());
-    m_messageLabel->setMinimumTextHeight(size.height());
+    setMinimumHeight(barHeight);
+    m_messageLabel->setMinimumTextHeight(barHeight);
+    m_spaceInfo->setFixedHeight(barHeight);
 
     connect(parent, SIGNAL(urlChanged(const KUrl&)),
             this, SLOT(updateSpaceInfoContent(const KUrl&)));
index 90383348dc60d05977c4d43e65ac857e16de70a7..93cda320b6532b9e921fa8ab0151006b2e54ecc7 100644 (file)
@@ -604,6 +604,8 @@ void DolphinView::loadDirectory(const KUrl& url)
 
     startDirLister(url);
     emit urlChanged(url);
+
+    m_statusBar->clear();
 }
 
 void DolphinView::triggerItem(const QModelIndex& index)
@@ -870,7 +872,7 @@ void DolphinView::createView()
     // delete current view
     QAbstractItemView* view = itemView();
     if (view != 0) {
-        m_topLayout->remove(view);
+        m_topLayout->removeWidget(view);
         view->close();
         view->deleteLater();
         m_iconsView = 0;
index 1178a16886588af6ddc4e4ae08c87a3cde4b9074..f355189fc0578c13b7d2e832e00acee9d1334622 100644 (file)
  ***************************************************************************/
 
 #include "statusbarmessagelabel.h"
-#include <qpainter.h>
-#include <qtimer.h>
-#include <qfontmetrics.h>
-//Added by qt3to4:
+
+#include <kglobalsettings.h>
+#include <kiconloader.h>
+#include <kicon.h>
+#include <klocale.h>
+
+#include <QFontMetrics>
+#include <QPainter>
+#include <QPaintEvent>
+#include <QPushButton>
 #include <QPixmap>
 #include <QResizeEvent>
-#include <QPaintEvent>
-#include <kiconloader.h>
-#include <kglobalsettings.h>
+#include <QTimer>
 
 StatusBarMessageLabel::StatusBarMessageLabel(QWidget* parent) :
     QWidget(parent),
@@ -35,13 +39,17 @@ StatusBarMessageLabel::StatusBarMessageLabel(QWidget* parent) :
     m_state(Default),
     m_illumination(0),
     m_minTextHeight(-1),
-    m_timer(0)
+    m_timer(0),
+    m_closeButton(0)
 {
     setMinimumHeight(K3Icon::SizeSmall);
 
     m_timer = new QTimer(this);
     connect(m_timer, SIGNAL(timeout()),
             this, SLOT(timerDone()));
+
+    m_closeButton = new QPushButton(KIcon("close"), QString::null, this);
+    m_closeButton->hide();
 }
 
 StatusBarMessageLabel::~StatusBarMessageLabel()
@@ -50,7 +58,7 @@ StatusBarMessageLabel::~StatusBarMessageLabel()
 
 void StatusBarMessageLabel::setType(DolphinStatusBar::Type type)
 {
-    if (type != m_type) {
+    if ((type != m_type) || (type == DolphinStatusBar::Error)) {
         m_type = type;
 
         m_timer->stop();
@@ -62,20 +70,27 @@ void StatusBarMessageLabel::setType(DolphinStatusBar::Type type)
         switch (type) {
             case DolphinStatusBar::OperationCompleted:
                 iconName = "ok";
+                m_closeButton->hide();
                 break;
 
             case DolphinStatusBar::Information:
                 iconName = "info";
+                m_closeButton->hide();
                 break;
 
             case DolphinStatusBar::Error:
                 iconName = "error";
                 m_timer->start(100);
                 m_state = Illuminate;
+
+                updateCloseButtonPosition();
+                m_closeButton->show();
                 break;
 
             case DolphinStatusBar::Default:
-            default: break;
+            default:
+                m_closeButton->hide();
+                break;
         }
 
         m_pixmap = (iconName == 0) ? QPixmap() : SmallIcon(iconName);
@@ -121,7 +136,7 @@ void StatusBarMessageLabel::paintEvent(QPaintEvent* /* event */)
     QColor backgroundColor(palette().brush(QPalette::Background).color());
     QColor foregroundColor(KGlobalSettings::textColor());
     if (m_illumination > 0) {
-        backgroundColor = mixColors(backgroundColor, QColor(255, 255, 64), m_illumination);
+        backgroundColor = mixColors(backgroundColor, QColor(255, 255, 128), m_illumination);
         foregroundColor = mixColors(foregroundColor, QColor(0, 0, 0), m_illumination);
     }
     painter.setBrush(backgroundColor);
@@ -129,12 +144,12 @@ void StatusBarMessageLabel::paintEvent(QPaintEvent* /* event */)
     painter.drawRect(QRect(0, 0, width(), height()));
 
     // draw pixmap
-    int x = pixmapGap();
-    int y = (height() - m_pixmap.height()) / 2;
+    int x = borderGap();
+    int y = (m_minTextHeight - m_pixmap.height()) / 2;
 
     if (!m_pixmap.isNull()) {
         painter.drawPixmap(x, y, m_pixmap);
-        x += m_pixmap.width() + pixmapGap();
+        x += m_pixmap.width() + borderGap();
     }
 
     // draw text
@@ -143,7 +158,7 @@ void StatusBarMessageLabel::paintEvent(QPaintEvent* /* event */)
     if (height() > m_minTextHeight) {
         flags = flags | Qt::TextWordWrap;
     }
-    painter.drawText(QRect(x, 0, width() - x, height()), flags, m_text);
+    painter.drawText(QRect(x, 0, availableTextWidth(), height()), flags, m_text);
     painter.end();
 }
 
@@ -164,7 +179,7 @@ void StatusBarMessageLabel::timerDone()
             }
             else {
                 m_state = Illuminated;
-                m_timer->start(1000);
+                m_timer->start(5000);
             }
             break;
         }
@@ -200,6 +215,8 @@ void StatusBarMessageLabel::assureVisibleText()
         return;
     }
 
+    // calculate the required height of the widget thats
+    // needed for having a fully visible text
     QFontMetrics fontMetrics(font());
     const QRect bounds(fontMetrics.boundingRect(0, 0, availableTextWidth(), height(),
                                                 Qt::AlignVCenter | Qt::TextWordWrap,
@@ -208,13 +225,38 @@ void StatusBarMessageLabel::assureVisibleText()
     if (requiredHeight < m_minTextHeight) {
         requiredHeight = m_minTextHeight;
     }
-    setMinimumHeight(requiredHeight);
-    updateGeometry();
+
+    // 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
 {
-    return width() - m_pixmap.width() - pixmapGap() * 2;
+    const int buttonWidth = (m_type == DolphinStatusBar::Error) ?
+                            m_closeButton->width() + borderGap() : 0;
+    return width() - m_pixmap.width() - (borderGap() * 3) - buttonWidth;
 }
 
 QColor StatusBarMessageLabel::mixColors(const QColor& c1,
@@ -228,4 +270,11 @@ QColor StatusBarMessageLabel::mixColors(const QColor& c1,
     return QColor(red, green, blue);
 }
 
+void StatusBarMessageLabel::updateCloseButtonPosition()
+{
+    const int x = width() - m_closeButton->width();
+    const int y = 2;
+    m_closeButton->move(x, y);
+}
+
 #include "statusbarmessagelabel.moc"
index 03683c107290cf732b0274f621599f532e4d91b6..b75e499fbf9cb878b79a86ff5b4a7a4f10b28848 100644 (file)
 #ifndef STATUSBARMESSAGELABEL_H
 #define STATUSBARMESSAGELABEL_H
 
-#include <qwidget.h>
-#include <qpixmap.h>
-#include <qstring.h>
-//Added by qt3to4:
-#include <QPaintEvent>
-#include <QResizeEvent>
 #include <dolphinstatusbar.h>
+
+#include <QPixmap>
+#include <QString>
+#include <QWidget>
+
+class QPaintEvent;
+class QResizeEvent;
+class QPushButton;
 class QTimer;
 
 /**
@@ -84,6 +86,12 @@ private slots:
      */
     int availableTextWidth() const;
 
+    /**
+     * Moves the close button to the upper right corner
+     * of the message label.
+     */
+    void updateCloseButtonPosition();
+
 private:
     enum State {
         Default,
@@ -101,12 +109,13 @@ private:
     QTimer* m_timer;
     QString m_text;
     QPixmap m_pixmap;
+    QPushButton* m_closeButton;
 
     QColor mixColors(const QColor& c1,
                      const QColor& c2,
                      int percent) const;
 
-    int pixmapGap() const { return 3; }
+    int borderGap() const { return 3; }
 };
 
 #endif