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