From 344b4b38879b6373ab7ca8394c7273fa0f36096f Mon Sep 17 00:00:00 2001 From: Jens Bache-Wiig Date: Fri, 7 May 2010 12:26:01 +0200 Subject: [PATCH] Make the toolboxes in Projects Mode nicer I did a couple of changes to make these more subtle. - Moved inside the details widget - Made them fade in and out - Hide up/down buttons when not required Note, there are some pending changes to Qt to disable the graphicsevent cache that can cause issues when scrolling items. Reviewed-by: thorbjorn --- src/libs/utils/detailsbutton.cpp | 30 ++++++++-- src/libs/utils/detailsbutton.h | 14 +++++ src/libs/utils/detailswidget.cpp | 13 ++-- src/libs/utils/detailswidget.h | 3 +- src/plugins/coreplugin/core.qrc | 3 + .../coreplugin/images/darkarrowdown.png | Bin 0 -> 333 bytes src/plugins/coreplugin/images/darkarrowup.png | Bin 0 -> 386 bytes src/plugins/coreplugin/images/darkclose.png | Bin 0 -> 398 bytes .../projectexplorer/buildstepspage.cpp | 56 +++++++++++------- 9 files changed, 88 insertions(+), 31 deletions(-) create mode 100644 src/plugins/coreplugin/images/darkarrowdown.png create mode 100644 src/plugins/coreplugin/images/darkarrowup.png create mode 100644 src/plugins/coreplugin/images/darkclose.png diff --git a/src/libs/utils/detailsbutton.cpp b/src/libs/utils/detailsbutton.cpp index cd038d09f93..d255f9245c0 100644 --- a/src/libs/utils/detailsbutton.cpp +++ b/src/libs/utils/detailsbutton.cpp @@ -38,10 +38,34 @@ using namespace Utils; +FadingPanel::FadingPanel(QWidget *parent) : QWidget(parent), m_opacityEffect(0) + +{ + m_opacityEffect = new QGraphicsOpacityEffect; + m_opacityEffect->setOpacity(0); + setGraphicsEffect(m_opacityEffect); + + // Workaround for issue with QGraphicsEffect. GraphicsEffect + // currently clears with Window color. Remove if flickering + // no longer occurs on fade-in + QPalette pal; + pal.setBrush(QPalette::All, QPalette::Window, Qt::transparent); + setPalette(pal); +} + +void FadingPanel::fadeTo(float value) +{ + QPropertyAnimation *animation = new QPropertyAnimation(m_opacityEffect, "opacity"); + animation->setDuration(200); + animation->setEndValue(value); + animation->start(QAbstractAnimation::DeleteWhenStopped); +} + DetailsButton::DetailsButton(QWidget *parent) : QAbstractButton(parent), m_fader(0) { setCheckable(true); setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); + setText(tr("Details")); } QSize DetailsButton::sizeHint() const @@ -114,7 +138,6 @@ QPixmap DetailsButton::cacheRendering(const QSize &size, bool checked) p.setRenderHint(QPainter::Antialiasing, true); p.translate(0.5, 0.5); p.setPen(Qt::NoPen); - QColor color = palette().highlight().color(); if(!checked) { lg.setColorAt(0, QColor(0, 0, 0, 10)); lg.setColorAt(1, QColor(0, 0, 0, 16)); @@ -133,12 +156,11 @@ QPixmap DetailsButton::cacheRendering(const QSize &size, bool checked) p.setPen(palette().color(QPalette::Text)); - QString text = tr("Details"); - QRect textRect = p.fontMetrics().boundingRect(text); + QRect textRect = p.fontMetrics().boundingRect(text()); textRect.setWidth(textRect.width() + 15); textRect.moveCenter(rect().center()); - p.drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, text); + p.drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, text()); int arrowsize = 15; QStyleOption arrowOpt; diff --git a/src/libs/utils/detailsbutton.h b/src/libs/utils/detailsbutton.h index f72f9840534..90f4b93e182 100644 --- a/src/libs/utils/detailsbutton.h +++ b/src/libs/utils/detailsbutton.h @@ -31,12 +31,26 @@ #define DETAILSBUTTON_H #include +#include #include +#include +#include +#include #include "utils_global.h" namespace Utils { +class QTCREATOR_UTILS_EXPORT FadingPanel : public QWidget +{ +public: + FadingPanel(QWidget *parent = 0); + void fadeTo(float value); +protected: + QGraphicsOpacityEffect *m_opacityEffect; +}; + + class QTCREATOR_UTILS_EXPORT DetailsButton : public QAbstractButton { Q_OBJECT diff --git a/src/libs/utils/detailswidget.cpp b/src/libs/utils/detailswidget.cpp index 5ab766bff5a..7b8053ce129 100644 --- a/src/libs/utils/detailswidget.cpp +++ b/src/libs/utils/detailswidget.cpp @@ -31,6 +31,7 @@ #include "detailsbutton.h" #include +#include #include #include @@ -57,7 +58,7 @@ namespace Utils { DetailsButton *m_detailsButton; QGridLayout *m_grid; QLabel *m_summaryLabel; - QWidget *m_toolWidget; + Utils::FadingPanel *m_toolWidget; QWidget *m_widget; QPixmap m_collapsedPixmap; @@ -210,7 +211,7 @@ namespace Utils { updateControls(); } - void DetailsWidget::setToolWidget(QWidget *widget) + void DetailsWidget::setToolWidget(Utils::FadingPanel *widget) { if (d->m_toolWidget == widget) return; @@ -221,7 +222,7 @@ namespace Utils { return; d->m_toolWidget->adjustSize(); - d->m_grid->addWidget(d->m_toolWidget, 0, 0, 1, 1, Qt::AlignCenter); + d->m_grid->addWidget(d->m_toolWidget, 0, 1, 1, 1, Qt::AlignRight); d->m_grid->setColumnMinimumWidth(0, d->m_toolWidget->width()); d->m_grid->setRowMinimumHeight(0, d->m_toolWidget->height()); @@ -271,9 +272,11 @@ namespace Utils { { if (!d->m_toolWidget) return; - +#ifdef Q_OS_MAC d->m_toolWidget->setVisible(hovered); - +#else + d->m_toolWidget->fadeTo(hovered ? 1.0 : 0); +#endif d->m_hovered = hovered; } diff --git a/src/libs/utils/detailswidget.h b/src/libs/utils/detailswidget.h index eb5c1b24031..a697015f5d7 100644 --- a/src/libs/utils/detailswidget.h +++ b/src/libs/utils/detailswidget.h @@ -41,6 +41,7 @@ QT_END_NAMESPACE namespace Utils { struct DetailsWidgetPrivate; +class FadingPanel; class QTCREATOR_UTILS_EXPORT DetailsWidget : public QWidget { @@ -68,7 +69,7 @@ public: void setWidget(QWidget *widget); QWidget *widget() const; - void setToolWidget(QWidget *widget); + void setToolWidget(Utils::FadingPanel *widget); QWidget *toolWidget() const; private slots: diff --git a/src/plugins/coreplugin/core.qrc b/src/plugins/coreplugin/core.qrc index 84d8955c2f0..3767f039259 100644 --- a/src/plugins/coreplugin/core.qrc +++ b/src/plugins/coreplugin/core.qrc @@ -54,5 +54,8 @@ images/progressbar.png images/help.png images/editclear.png + images/darkarrowdown.png + images/darkarrowup.png + images/darkclose.png diff --git a/src/plugins/coreplugin/images/darkarrowdown.png b/src/plugins/coreplugin/images/darkarrowdown.png new file mode 100644 index 0000000000000000000000000000000000000000..3b07da15ffbdb11622ae8d109d2e8a058d477393 GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z`&N| z?e4-zrvk;_Gzja`mJKeXo^YF+ab<{y{@&_Oi^r_V~DBTic7mSyB?YRY~83BdwnnS hlFVJw%J(_WO}XR4cWCjxcm@Ur22WQ%mvv4FO#q(vg3AB^ literal 0 HcmV?d00001 diff --git a/src/plugins/coreplugin/images/darkarrowup.png b/src/plugins/coreplugin/images/darkarrowup.png new file mode 100644 index 0000000000000000000000000000000000000000..3d751f9a1a03919d59b1e1ab71715905f12f2bda GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z`&N| z?e4aHj z?@%QRl5^k_OWhSsv=J-_~g)8_a)!!=vk n1vMMgA3Q#;_;3II53Cp3o3EJU-QibP0l+XkKDF>ky literal 0 HcmV?d00001 diff --git a/src/plugins/coreplugin/images/darkclose.png b/src/plugins/coreplugin/images/darkclose.png new file mode 100644 index 0000000000000000000000000000000000000000..365fdb8ed7c11d118960cc56e3b2b16c91079cca GIT binary patch literal 398 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7Sc;uILpV4%IBGajIv5xj zI14-?iy0VruY)k7lg8`{1_lPn64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xh zq!<_&xjkJRLo9mNPTK8v*g&Lhze3-Yym=CpGYe);(&D)%u&L$9fz=6Kn8OoeWpBT0{tXj3TI8UtT+|HS+t~qdRQTilN zzG+4EC|mqWWe_BzjO zhMXS5$jE8G3*V+l{|`T;(lPP8rt(>3wY427i6{7(Lu;QtD3)W^K3$}*WZ7Q7iD#$8 xBk>Pn{{4rm_X|(tiD0}vS>V6a #include @@ -117,6 +118,12 @@ void BuildStepsPage::init(BuildConfiguration *bc) s.detailsWidget->setSummaryText(s.widget->summaryText()); } updateBuildStepButtonsState(); + + static QLatin1String buttonStyle( + "QToolButton{ border-width: 2;}" + "QToolButton:hover{border-image: url(:/welcome/images/btn_26_hover.png) 4;}" + "QToolButton:pressed{ border-image: url(:/welcome/images/btn_26_pressed.png) 4;}"); + setStyleSheet(buttonStyle); } void BuildStepsPage::updateAddBuildStepMenu() @@ -160,30 +167,32 @@ void BuildStepsPage::addBuildStepWidget(int pos, BuildStep *step) s.detailsWidget->setSummaryText(s.widget->summaryText()); s.detailsWidget->setWidget(s.widget); - s.upButton = new QToolButton(this); - s.upButton->setArrowType(Qt::UpArrow); - s.upButton->setMaximumHeight(22); - s.upButton->setMaximumWidth(22); - - s.downButton = new QToolButton(this); - s.downButton->setArrowType(Qt::DownArrow); - s.downButton->setMaximumHeight(22); - s.downButton->setMaximumWidth(22); -#ifdef Q_OS_MAC - s.upButton->setIconSize(QSize(10, 10)); - s.downButton->setIconSize(QSize(10, 10)); -#endif - s.removeButton = new QToolButton(this); - s.removeButton->setText(QChar('X')); - s.removeButton->setMaximumHeight(22); - s.removeButton->setMaximumWidth(22); - // layout - QWidget *toolWidget = new QWidget(s.detailsWidget); - toolWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + Utils::FadingPanel *toolWidget = new Utils::FadingPanel(s.detailsWidget); + QSize buttonSize(20, 26); + + s.upButton = new QToolButton(toolWidget); + s.upButton->setAutoRaise(true); + s.upButton->setToolTip(tr("Move Up")); + s.upButton->setFixedSize(buttonSize); + s.upButton->setIcon(QIcon(":/core/images/darkarrowup.png")); + + s.downButton = new QToolButton(toolWidget); + s.downButton->setAutoRaise(true); + s.downButton->setToolTip(tr("Move Down")); + s.downButton->setFixedSize(buttonSize); + s.downButton->setIcon(QIcon(":/core/images/darkarrowdown.png")); + + s.removeButton = new QToolButton(toolWidget); + s.removeButton->setAutoRaise(true); + s.removeButton->setToolTip(tr("Remove Item")); + s.removeButton->setFixedSize(buttonSize); + s.removeButton->setIcon(QIcon(":/core/images/darkclose.png")); + + toolWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); QHBoxLayout *hbox = new QHBoxLayout(); toolWidget->setLayout(hbox); - hbox->setMargin(0); + hbox->setMargin(4); hbox->setSpacing(0); hbox->addWidget(s.upButton); hbox->addWidget(s.downButton); @@ -316,9 +325,14 @@ void BuildStepsPage::updateBuildStepButtonsState() BuildStepsWidgetStruct s = m_buildSteps.at(i); s.removeButton->setEnabled(!steps.at(i)->immutable()); m_removeMapper->setMapping(s.removeButton, i); + s.upButton->setEnabled((i > 0) && !(steps.at(i)->immutable() && steps.at(i - 1))); m_upMapper->setMapping(s.upButton, i); s.downButton->setEnabled((i + 1 < steps.count()) && !(steps.at(i)->immutable() && steps.at(i + 1)->immutable())); m_downMapper->setMapping(s.downButton, i); + + // Only show buttons when needed + s.downButton->setVisible(steps.count() != 1); + s.upButton->setVisible(steps.count() != 1); } }