diff options
author | Tobias Hunger <tobias.hunger@nokia.com> | 2009-12-01 17:44:16 +0100 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@nokia.com> | 2009-12-01 17:59:00 +0100 |
commit | 491527ab0605d15be389712df9ebcd650bdb6186 (patch) | |
tree | 55a33924751144406d2c2346b48c8fb37b265f56 /src/libs/utils/detailsbutton.cpp | |
parent | e9a20d33c7b7d43aac2aa7d37d2f47a03f47f0be (diff) |
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
Diffstat (limited to 'src/libs/utils/detailsbutton.cpp')
-rw-r--r-- | src/libs/utils/detailsbutton.cpp | 81 |
1 files changed, 62 insertions, 19 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; } |