From 491527ab0605d15be389712df9ebcd650bdb6186 Mon Sep 17 00:00:00 2001 From: Tobias Hunger <tobias.hunger@nokia.com> Date: Tue, 1 Dec 2009 17:44:16 +0100 Subject: [PATCH] Use a custom details button * Use a custom details button rendering. This should work better on the mac ans looks nicer, too:-) Reviewed-by: Roberto Raggi --- src/libs/utils/detailsbutton.cpp | 81 ++++++++++++++++++++++++-------- src/libs/utils/detailsbutton.h | 26 +++++----- src/libs/utils/detailswidget.cpp | 6 +-- 3 files changed, 78 insertions(+), 35 deletions(-) diff --git a/src/libs/utils/detailsbutton.cpp b/src/libs/utils/detailsbutton.cpp index b9d09822129..0429d6511e9 100644 --- a/src/libs/utils/detailsbutton.cpp +++ b/src/libs/utils/detailsbutton.cpp @@ -1,32 +1,75 @@ #include "detailsbutton.h" +#include <QtGui/QPaintEvent> +#include <QtGui/QPainter> + using namespace Utils; -DetailsButton::DetailsButton(QWidget *parent) -#ifdef Q_OS_MAC - : QPushButton(parent), -#else - : QToolButton(parent), -#endif - m_checked(false) +DetailsButton::DetailsButton(QWidget *parent) : QAbstractButton(parent) { -#ifdef Q_OS_MAC - setAttribute(Qt::WA_MacSmallSize); - setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); -#else setCheckable(true); -#endif - setText(tr("Show Details")); - connect(this, SIGNAL(clicked()), - this, SLOT(onClicked())); + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); } -void DetailsButton::onClicked() +QSize DetailsButton::sizeHint() const { - m_checked = !m_checked; + // TODO: Adjust this when icons become available! + return QSize(40, 22); } -bool DetailsButton::isToggled() + +void DetailsButton::paintEvent(QPaintEvent *e) { - return m_checked; + QWidget::paintEvent(e); + + QPainter p(this); + if (isChecked()) { + if (m_checkedPixmap.isNull() || m_checkedPixmap.size() != contentsRect().size()) + m_checkedPixmap = cacheRendering(contentsRect().size(), true); + p.drawPixmap(contentsRect(), m_checkedPixmap); + } else { + if (m_uncheckedPixmap.isNull() || m_uncheckedPixmap.size() != contentsRect().size()) + m_uncheckedPixmap = cacheRendering(contentsRect().size(), false); + p.drawPixmap(contentsRect(), m_uncheckedPixmap); + } +} + +QPixmap DetailsButton::cacheRendering(const QSize &size, bool checked) +{ + QLinearGradient lg; + lg.setCoordinateMode(QGradient::ObjectBoundingMode); + lg.setFinalStop(0, 1); + + if (checked) { + lg.setColorAt(0, palette().color(QPalette::Midlight)); + lg.setColorAt(1, palette().color(QPalette::Button)); + } else { + lg.setColorAt(0, palette().color(QPalette::Button)); + lg.setColorAt(1, palette().color(QPalette::Midlight)); + } + + QPixmap pixmap(size); + QPainter p(&pixmap); + p.setBrush(lg); + p.setPen(Qt::NoPen); + + p.drawRect(0, 0, size.width() - 1, size.height() - 1); + + p.setPen(QPen(palette().color(QPalette::Mid))); + p.drawLine(0, size.height() - 1, 0, 0); + p.drawLine(0, 0, size.width() - 1, 0); + p.drawLine(size.width() - 1, 0, size.width() - 1, size.height() - 1); + if (!checked) + p.drawLine(size.width() - 1, size.height() - 1, 0, size.height() - 1); + + p.setPen(palette().color(QPalette::Text)); + + // TODO: This should actually use some icons instead... + if (checked) { + p.drawText(0, 0, size.width(), size.height(), Qt::AlignCenter, tr("Less")); + } else { + p.drawText(0, 0, size.width(), size.height(), Qt::AlignCenter, tr("More")); + } + + return pixmap; } diff --git a/src/libs/utils/detailsbutton.h b/src/libs/utils/detailsbutton.h index ce38cea4f33..54c354dd5c6 100644 --- a/src/libs/utils/detailsbutton.h +++ b/src/libs/utils/detailsbutton.h @@ -1,28 +1,28 @@ #ifndef DETAILSBUTTON_H #define DETAILSBUTTON_H -#include <QtGui/QPushButton> -#include <QtGui/QToolButton> +#include <QtGui/QAbstractButton> +#include <QtGui/QPixmap> #include "utils_global.h" namespace Utils { -class QTCREATOR_UTILS_EXPORT DetailsButton -#ifdef Q_OS_MAC - : public QPushButton -#else - : public QToolButton -#endif +class QTCREATOR_UTILS_EXPORT DetailsButton : public QAbstractButton { Q_OBJECT public: - DetailsButton(QWidget *parent=0); - bool isToggled(); -public slots: - void onClicked(); + DetailsButton(QWidget *parent = 0); + + QSize sizeHint() const; + +protected: + void paintEvent(QPaintEvent *e); + private: - bool m_checked; + QPixmap cacheRendering(const QSize &size, bool checked); + QPixmap m_checkedPixmap; + QPixmap m_uncheckedPixmap; }; } #endif // DETAILSBUTTON_H diff --git a/src/libs/utils/detailswidget.cpp b/src/libs/utils/detailswidget.cpp index 982fbb2f822..134b394df18 100644 --- a/src/libs/utils/detailswidget.cpp +++ b/src/libs/utils/detailswidget.cpp @@ -38,7 +38,7 @@ DetailsWidget::DetailsWidget(QWidget *parent) : m_grid->setContentsMargins(0, 0, 0, 0); m_grid->setSpacing(0); m_grid->addWidget(m_summaryLabel, 0, 1); - m_grid->addWidget(m_detailsButton, 0, 2, 1, 1, Qt::AlignCenter); + m_grid->addWidget(m_detailsButton, 0, 2); m_detailsButton->setEnabled(false); @@ -179,8 +179,8 @@ QPixmap DetailsWidget::cacheBackground(const QSize &size, bool expanded) p.drawRect(0, 0, size.width() - 1, size.height() - 1); if (expanded) { - p.drawLine(0, m_summaryLabel->height(), - size.width(), m_summaryLabel->height()); + p.drawLine(0, m_summaryLabel->height() - 1, + m_summaryLabel->width(), m_summaryLabel->height() - 1); } return pixmap; -- GitLab