From: Peter Penz Date: Sat, 3 Apr 2010 08:48:35 +0000 (+0000) Subject: Cleanup of statusbar widgets: X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/7ae94915f72857ed4825ef6b78e4753896be28f9 Cleanup of statusbar widgets: - Provide proper size hints instead of hiding extensions on small widths - Provide context menu, which allows to enable/disable the zoom level extension and the space info extension. Also copying the status bar text is possible (useful e. g. for error messages). BUG: 188980 svn path=/trunk/KDE/kdebase/apps/; revision=1110498 --- diff --git a/src/statusbar/dolphinstatusbar.cpp b/src/statusbar/dolphinstatusbar.cpp index 79f2de2c4..48fd876ab 100644 --- a/src/statusbar/dolphinstatusbar.cpp +++ b/src/statusbar/dolphinstatusbar.cpp @@ -19,27 +19,32 @@ ***************************************************************************/ #include "dolphinstatusbar.h" -#include "settings/dolphinsettings.h" + #include "dolphinview.h" #include "dolphin_generalsettings.h" + +#include +#include +#include +#include +#include + +#include "settings/dolphinsettings.h" #include "statusbarmessagelabel.h" #include "statusbarspaceinfo.h" -#include "zoomlevelinfo.h" #include +#include #include #include #include #include #include -#include -#include -#include -#include +#include "zoomlevelinfo.h" DolphinStatusBar::DolphinStatusBar(QWidget* parent, DolphinView* view) : - KHBox(parent), + QWidget(parent), m_view(view), m_messageLabel(0), m_spaceInfo(0), @@ -51,17 +56,13 @@ DolphinStatusBar::DolphinStatusBar(QWidget* parent, DolphinView* view) : m_progress(100), m_messageTimeStamp() { - setMargin(0); - setSpacing(4); - connect(m_view, SIGNAL(urlChanged(const KUrl&)), this, SLOT(updateSpaceInfoContent(const KUrl&))); - // initialize message label + // Initialize message label m_messageLabel = new StatusBarMessageLabel(this); - m_messageLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - // initialize zoom slider + // Initialize zoom slider m_zoomWidget = new QWidget(this); m_zoomOut = new QToolButton(m_zoomWidget); @@ -81,6 +82,7 @@ DolphinStatusBar::DolphinStatusBar(QWidget* parent, DolphinView* view) : m_zoomIn->setIcon(KIcon("zoom-in")); m_zoomIn->setAutoRaise(true); + // Initialize zoom widget layout QHBoxLayout* zoomWidgetLayout = new QHBoxLayout(m_zoomWidget); zoomWidgetLayout->setSpacing(0); zoomWidgetLayout->setMargin(0); @@ -94,26 +96,40 @@ DolphinStatusBar::DolphinStatusBar(QWidget* parent, DolphinView* view) : connect(m_zoomOut, SIGNAL(clicked()), this, SLOT(zoomOut())); connect(m_zoomIn, SIGNAL(clicked()), this, SLOT(zoomIn())); - // initialize space information + // Initialize space information m_spaceInfo = new StatusBarSpaceInfo(this); m_spaceInfo->setUrl(m_view->url()); - // initialize progress information + // Initialize progress information m_progressText = new QLabel(this); m_progressText->hide(); m_progressBar = new QProgressBar(this); m_progressBar->hide(); - // initialize sizes + // Initialize top layout and size policies const int fontHeight = QFontMetrics(m_messageLabel->font()).height(); 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_spaceInfo->setFixedHeight(contentHeight - 5); - m_progressBar->setFixedSize(200, contentHeight); - m_zoomWidget->setFixedSize(150, contentHeight); + m_messageLabel->setMinimumWidth(100); + + m_spaceInfo->setMaximumSize(200, contentHeight - 5); + m_spaceInfo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + + m_progressBar->setMaximumSize(200, contentHeight); + m_zoomWidget->setMaximumSize(150, contentHeight); + m_zoomSlider->setMinimumWidth(30); + + QHBoxLayout* topLayout = new QHBoxLayout(this); + topLayout->setMargin(0); + topLayout->setSpacing(4); + topLayout->addWidget(m_messageLabel); + topLayout->addWidget(m_zoomWidget); + topLayout->addWidget(m_spaceInfo); + topLayout->addWidget(m_progressBar); setExtensionsVisible(true); } @@ -160,13 +176,6 @@ void DolphinStatusBar::setMessage(const QString& msg, if (type != Default) { m_messageTimeStamp = currentTime; } - - const int widthGap = m_messageLabel->widthGap(); - if (widthGap > 0) { - m_progressBar->hide(); - m_progressText->hide(); - } - assureVisibleText(); } DolphinStatusBar::Type DolphinStatusBar::type() const @@ -184,6 +193,11 @@ void DolphinStatusBar::setProgressText(const QString& text) m_progressText->setText(text); } +int DolphinStatusBar::progress() const +{ + return m_progress; +} + QString DolphinStatusBar::progressText() const { return m_progressText->text(); @@ -191,7 +205,7 @@ QString DolphinStatusBar::progressText() const void DolphinStatusBar::setProgress(int percent) { - // show a busy indicator if a value < 0 is provided: + // Show a busy indicator if a value < 0 is provided: m_progressBar->setMaximum((percent < 0) ? 0 : 100); if (percent < 0) { @@ -202,7 +216,7 @@ void DolphinStatusBar::setProgress(int percent) m_progress = percent; if (m_messageLabel->type() == Error) { - // don't update any widget or status bar text if an + // Don't update any widget or status bar text if an // error message is shown return; } @@ -212,7 +226,7 @@ void DolphinStatusBar::setProgress(int percent) updateProgressInfo(); } - const QString& defaultText = m_messageLabel->defaultText(); + const QString defaultText = m_messageLabel->defaultText(); const QString msg(m_messageLabel->text()); if ((percent == 0) && !msg.isEmpty()) { setMessage(QString(), Default); @@ -231,7 +245,7 @@ void DolphinStatusBar::setDefaultText(const QString& text) m_messageLabel->setDefaultText(text); } -const QString& DolphinStatusBar::defaultText() const +QString DolphinStatusBar::defaultText() const { return m_messageLabel->defaultText(); } @@ -239,26 +253,56 @@ const QString& DolphinStatusBar::defaultText() const void DolphinStatusBar::refresh() { setExtensionsVisible(true); - assureVisibleText(); } -void DolphinStatusBar::resizeEvent(QResizeEvent* event) +void DolphinStatusBar::contextMenuEvent(QContextMenuEvent* event) { - // It is important to hide the widgets before invoking - // QWidget::resizeEvent(), otherwise it is possible that - // the dock widgets are shrinked when having a small - // statusbar width (bug #202147). - m_zoomWidget->hide(); - m_spaceInfo->hide(); - - QWidget::resizeEvent(event); - QMetaObject::invokeMethod(this, "assureVisibleText", Qt::QueuedConnection); + Q_UNUSED(event); + + KMenu menu(this); + + QAction* copyAction = 0; + switch (type()) { + case Default: + case OperationCompleted: + case Information: + copyAction = menu.addAction(i18nc("@action:inmenu", "Copy Information Message")); + break; + case Error: + copyAction = menu.addAction(i18nc("@action:inmenu", "Copy Error Message")); + break; + default: break; + } + + GeneralSettings* settings = DolphinSettings::instance().generalSettings(); + + QAction* showZoomSliderAction = menu.addAction(i18nc("@action:inmenu", "Show Zoom Slider")); + showZoomSliderAction->setCheckable(true); + showZoomSliderAction->setChecked(settings->showZoomSlider()); + + QAction* showSpaceInfoAction = menu.addAction(i18nc("@action:inmenu", "Show Space Information")); + showSpaceInfoAction->setCheckable(true); + showSpaceInfoAction->setChecked(settings->showSpaceInfo()); + + const QAction* action = menu.exec(QCursor::pos()); + if (action == copyAction) { + QMimeData* mimeData = new QMimeData(); + mimeData->setText(message()); + QApplication::clipboard()->setMimeData(mimeData); + } else if (action == showZoomSliderAction) { + const bool visible = showZoomSliderAction->isChecked(); + settings->setShowZoomSlider(visible); + m_zoomWidget->setVisible(visible); + } else if (action == showSpaceInfoAction) { + const bool visible = showSpaceInfoAction->isChecked(); + settings->setShowSpaceInfo(visible); + m_spaceInfo->setVisible(visible); + } } void DolphinStatusBar::updateSpaceInfoContent(const KUrl& url) { m_spaceInfo->setUrl(url); - assureVisibleText(); } void DolphinStatusBar::setZoomLevel(int zoomLevel) @@ -269,22 +313,6 @@ void DolphinStatusBar::setZoomLevel(int zoomLevel) updateZoomSliderToolTip(zoomLevel); } -void DolphinStatusBar::assureVisibleText() -{ - const int widthGap = m_messageLabel->widthGap(); - if (m_spaceInfo->isVisible() || m_zoomWidget->isVisible()) { - // At least the space information or the zoom slider is shown. - // Hide them if the status bar text does not fit into the available width. - setExtensionsVisible(widthGap <= 0); - } else if (!m_progressBar->isVisible()) { - const GeneralSettings* settings = DolphinSettings::instance().generalSettings(); - const int spaceInfoWidth = settings->showSpaceInfo() ? m_spaceInfo->minimumWidth() : 0; - const int zoomWidgetWidth = settings->showZoomSlider() ? m_zoomWidget->minimumWidth() : 0; - const int widgetsWidth = spaceInfoWidth + zoomWidgetWidth; - setExtensionsVisible(widthGap + widgetsWidth <= 0); - } -} - void DolphinStatusBar::zoomOut() { const int value = m_zoomSlider->value(); @@ -311,32 +339,31 @@ void DolphinStatusBar::updateProgressInfo() { const bool isErrorShown = (m_messageLabel->type() == Error); if (m_progress < 100) { - // show the progress information and hide the extensions + // Show the progress information and hide the extensions setExtensionsVisible(false); if (!isErrorShown) { m_progressText->show(); m_progressBar->show(); } } else { - // hide the progress information and show the extensions + // Hide the progress information and show the extensions m_progressText->hide(); m_progressBar->hide(); - assureVisibleText(); + setExtensionsVisible(true); } } void DolphinStatusBar::setExtensionsVisible(bool visible) { - bool spaceInfoVisible = visible; - bool zoomSliderVisible = visible; + bool showSpaceInfo = visible; + bool showZoomWidget = visible; if (visible) { const GeneralSettings* settings = DolphinSettings::instance().generalSettings(); - spaceInfoVisible = settings->showSpaceInfo(); - zoomSliderVisible = settings->showZoomSlider(); + showSpaceInfo = settings->showSpaceInfo(); + showZoomWidget = settings->showZoomSlider(); } - - m_spaceInfo->setVisible(spaceInfoVisible); - m_zoomWidget->setVisible(zoomSliderVisible); + m_spaceInfo->setVisible(showSpaceInfo); + m_zoomWidget->setVisible(showZoomWidget); } void DolphinStatusBar::updateZoomSliderToolTip(int zoomLevel) diff --git a/src/statusbar/dolphinstatusbar.h b/src/statusbar/dolphinstatusbar.h index 2fed4788d..6f5844270 100644 --- a/src/statusbar/dolphinstatusbar.h +++ b/src/statusbar/dolphinstatusbar.h @@ -21,8 +21,8 @@ #ifndef DOLPHINSTATUSBAR_H #define DOLPHINSTATUSBAR_H -#include #include +#include class DolphinView; class KUrl; @@ -39,7 +39,7 @@ class QSlider; * The statusbar allows to show messages and progress * information. */ -class DolphinStatusBar : public KHBox +class DolphinStatusBar : public QWidget { Q_OBJECT @@ -56,7 +56,7 @@ public: Error }; - DolphinStatusBar(QWidget* parent, DolphinView* view); + explicit DolphinStatusBar(QWidget* parent, DolphinView* view); virtual ~DolphinStatusBar(); @@ -97,10 +97,7 @@ public: * operations. */ void setProgress(int percent); - int progress() const - { - return m_progress; - } + int progress() const; /** * Clears the message text of the status bar by replacing @@ -115,7 +112,7 @@ public: * is cleared by DolphinStatusBar::clear(). */ void setDefaultText(const QString& text); - const QString& defaultText() const; + QString defaultText() const; /** * Refreshes the status bar to get synchronized with the (updated) Dolphin settings. @@ -123,8 +120,8 @@ public: void refresh(); protected: - /** @see QWidget::resizeEvent() */ - virtual void resizeEvent(QResizeEvent* event); + /** @see QWidget::contextMenuEvent() */ + virtual void contextMenuEvent(QContextMenuEvent* event); private slots: /** @@ -139,13 +136,6 @@ private slots: */ void setZoomLevel(int zoomLevel); - /** - * Assures that the text of the statusbar stays visible by hiding - * the space information widget or the zoom slider widget if not - * enough width is available. - */ - void assureVisibleText(); - void zoomOut(); void zoomIn(); void showZoomSliderToolTip(int zoomLevel); diff --git a/src/statusbar/statusbarmessagelabel.cpp b/src/statusbar/statusbarmessagelabel.cpp index bb7c59d6a..5ebe38bf4 100644 --- a/src/statusbar/statusbarmessagelabel.cpp +++ b/src/statusbar/statusbarmessagelabel.cpp @@ -28,8 +28,8 @@ #include #include #include -#include #include +#include #include StatusBarMessageLabel::StatusBarMessageLabel(QWidget* parent) : @@ -47,7 +47,10 @@ StatusBarMessageLabel::StatusBarMessageLabel(QWidget* parent) : connect(m_timer, SIGNAL(timeout()), this, SLOT(timerDone())); - m_closeButton = new QPushButton(i18nc("@action:button", "Close"), this); + 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())); @@ -114,6 +117,26 @@ void StatusBarMessageLabel::setMessage(const QString& text, 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) { @@ -125,6 +148,11 @@ void StatusBarMessageLabel::setMinimumTextHeight(int min) } } +int StatusBarMessageLabel::minimumTextHeight() const +{ + return m_minTextHeight; +} + int StatusBarMessageLabel::widthGap() const { QFontMetrics fontMetrics(font()); @@ -274,8 +302,7 @@ int StatusBarMessageLabel::availableTextWidth() const void StatusBarMessageLabel::updateCloseButtonPosition() { const int x = width() - m_closeButton->width() - BorderGap; - const int y = (height() - m_closeButton->height()) / 2; - m_closeButton->move(x, y); + m_closeButton->move(x, 0); } void StatusBarMessageLabel::closeErrorMessage() diff --git a/src/statusbar/statusbarmessagelabel.h b/src/statusbar/statusbarmessagelabel.h index a5c72b403..88b620eb7 100644 --- a/src/statusbar/statusbarmessagelabel.h +++ b/src/statusbar/statusbarmessagelabel.h @@ -30,7 +30,7 @@ class QPaintEvent; class QResizeEvent; -class QPushButton; +class QToolButton; class QTimer; /** @@ -53,10 +53,10 @@ public: DolphinStatusBar::Type type() const; - const QString& text() const; + QString text() const; void setDefaultText(const QString& text); - const QString& defaultText() const; + QString defaultText() const; // TODO: maybe a better approach is possible with the size hint void setMinimumTextHeight(int min); @@ -137,32 +137,7 @@ private: QString m_defaultText; QList m_pendingMessages; QPixmap m_pixmap; - QPushButton* m_closeButton; + QToolButton* m_closeButton; }; -inline DolphinStatusBar::Type StatusBarMessageLabel::type() const -{ - return m_type; -} - -inline const QString& StatusBarMessageLabel::text() const -{ - return m_text; -} - -inline void StatusBarMessageLabel::setDefaultText(const QString& text) -{ - m_defaultText = text; -} - -inline const QString& StatusBarMessageLabel::defaultText() const -{ - return m_defaultText; -} - -inline int StatusBarMessageLabel::minimumTextHeight() const -{ - return m_minTextHeight; -} - #endif diff --git a/src/statusbar/statusbarspaceinfo.cpp b/src/statusbar/statusbarspaceinfo.cpp index c9173b8f9..a601d4367 100644 --- a/src/statusbar/statusbarspaceinfo.cpp +++ b/src/statusbar/statusbarspaceinfo.cpp @@ -33,9 +33,6 @@ StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget* parent) : m_kBSize(0), m_timer(0) { - setMaximumWidth(200); - setMinimumWidth(200); // something to fix on kcapacitybar (ereslibre) - // Use a timer to update the space information. Polling is useful // here, as files can be deleted/added outside the scope of Dolphin. m_timer = new QTimer(this); @@ -52,6 +49,11 @@ void StatusBarSpaceInfo::setUrl(const KUrl& url) refresh(); } +KUrl StatusBarSpaceInfo::url() const +{ + return m_url; +} + void StatusBarSpaceInfo::showEvent(QShowEvent* event) { KCapacityBar::showEvent(event); diff --git a/src/statusbar/statusbarspaceinfo.h b/src/statusbar/statusbarspaceinfo.h index 9744548ca..d1858f8bb 100644 --- a/src/statusbar/statusbarspaceinfo.h +++ b/src/statusbar/statusbarspaceinfo.h @@ -44,7 +44,7 @@ public: virtual ~StatusBarSpaceInfo(); void setUrl(const KUrl& url); - const KUrl& url() const; + KUrl url() const; protected: void showEvent(QShowEvent* event); @@ -60,9 +60,4 @@ private: QTimer* m_timer; }; -inline const KUrl& StatusBarSpaceInfo::url() const -{ - return m_url; -} - #endif