From 344b4b38879b6373ab7ca8394c7273fa0f36096f Mon Sep 17 00:00:00 2001
From: Jens Bache-Wiig <jbache@trolltech.com>
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 <QtGui/QAbstractButton>
+#include <QtGui/QToolButton>
 #include <QtGui/QPixmap>
+#include <QtGui/QPainter>
+#include <QtGui/QGraphicsOpacityEffect>
+#include <QtCore/QPropertyAnimation>
 
 #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 <QtCore/QStack>
+#include <QtCore/QPropertyAnimation>
 
 #include <QtGui/QGridLayout>
 #include <QtGui/QLabel>
@@ -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 @@
         <file>images/progressbar.png</file>
         <file>images/help.png</file>
         <file>images/editclear.png</file>
+        <file>images/darkarrowdown.png</file>
+        <file>images/darkarrowup.png</file>
+        <file>images/darkclose.png</file>
     </qresource>
 </RCC>
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!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@
z;DWu&Cj&(|3p^r=f!eQwFr$;k><XYDdx@v7EBh^0b}n}1Q{Nq&fkJ0JT^vI!PQRUK
zm~}XTr`4XF<y%7k!eIT+%U{|b&3GZiC29SH&C+4H+`@8$ZQ|x{>z60+b7q_r62E+_
zSmBAU)1}MRlOFWFR({3&{0{pE4W-%3GW(Lx-ur#zj9sHMM<Ta@^p)oax@TU!_dBI2
zhB^De!t?+61SXm*Fq}K1725lI)~aJ^VT^nnN}qn^w>EmQ>NM0&OSN>ky-jrkOPx!K
zX^i2l4N*+~2d=CB<*DiR`1jrJ;*E_VrgAGT?bhsiWb(6hqhjp!z06B8cS$SX=Quaz
Xjt}3V#rxuc9%Jxy^>bP0l+XkKp7(;w

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!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@
z;DWu&Cj&(|3p^r=f!eQwFr$;k><XYDdx@v7EBh^0b}n|a<yuQt08L@?ba4!^IDK`p
zt=|y?f!6&CWHm)jF8wjNJ7ucEQv;a>>kG<V3aU}tHZ<J*t#E3|4Uga%$KqycT*zsx
zn3}r(`?Iq*{N@zTX)^XZa$kDQp+&2-7+hMm<%*y5y}V!*!<X9qa~wi5XFUu5n8YM#
zDHJkw*SgDvGVd8T>Fh2(=WA%L(7E0)#B-90Y+E98%<sk9ZO&gmw=?rzl2JYTu^Gjo
zcNxMDtiHdG@t$i+?poU;fAZPl{xHR~tzrnAHMe8R#*-HhbZ<Yvy5aQaJq%9wUmEa4
z=kF1ps5E2EqL=m+ALCq3t$V#p<7G;ZrZZz`Elb|>>pwVcj=wWpvz1*?vqAmA<Kv3|
d_V53|dZE4fib>ubK41Vbc)I$ztaD0e0stuop%nlC

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!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<Z~8yL>2?p
zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4<ivthz5Jr|+3#$m7#JA2JzX3_
zEPB^Y+U<APK%{NILf@6Vc@mW~3uaEz;<+cVspZIl)gPFAB3JRHb<FZ{_-rQ{ye-Vi
zIU*@*X^F!_pK0fhKL1~*UVGnI^_*HM^Ye!RB1gFk6qWq%{l1%j^xCbRtMnRkLqpF$
z=GAMg4$WP&^|SC<-U9X+%A87{7`8a9TD7$}Pps(N&Y7#OIdE-J`Xo{0$x~Rdlx<xD
zfASfo1+RCR7BJ_ysPwC<C5yKyW<QXskYAVI=r0)A^HYYGL%TfoI?rr|oF2o-$Z5X|
z-=;|a4?m>RG4Z^n@>ylIwH+ymC-|8|Yo9(SmSfgFU8JvM*<QbiXQ#v?@egAD{fDdf
n3s2;UV7xt9;J?)5+&^skMhlo*+f(g<VaMR<>gTe~DWM4fRV<ck

literal 0
HcmV?d00001

diff --git a/src/plugins/projectexplorer/buildstepspage.cpp b/src/plugins/projectexplorer/buildstepspage.cpp
index 21d00e303c6..744b8549009 100644
--- a/src/plugins/projectexplorer/buildstepspage.cpp
+++ b/src/plugins/projectexplorer/buildstepspage.cpp
@@ -29,6 +29,7 @@
 
 #include "buildstepspage.h"
 #include "buildconfiguration.h"
+#include "detailsbutton.h"
 
 #include <coreplugin/coreconstants.h>
 #include <coreplugin/icore.h>
@@ -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);
     }
 }
-- 
GitLab