From 42ebc6b0f272ab23dd19fc8be30ca6816953db02 Mon Sep 17 00:00:00 2001 From: Jens Bache-Wiig <jbache@trolltech.com> Date: Wed, 10 Mar 2010 19:19:46 +0100 Subject: [PATCH] Redesigned the project settings page I redesigned the gradient boxes for a more subtle an professional look. --- src/libs/utils/detailsbutton.cpp | 62 +-- src/libs/utils/detailswidget.cpp | 407 +++++++++--------- src/plugins/projectexplorer/projectwindow.cpp | 24 +- 3 files changed, 264 insertions(+), 229 deletions(-) diff --git a/src/libs/utils/detailsbutton.cpp b/src/libs/utils/detailsbutton.cpp index a77d94b7973..de6752acb04 100644 --- a/src/libs/utils/detailsbutton.cpp +++ b/src/libs/utils/detailsbutton.cpp @@ -31,6 +31,9 @@ #include <QtGui/QPaintEvent> #include <QtGui/QPainter> +#include <QtGui/QStyleOption> + +#include <utils/stylehelper.h> using namespace Utils; @@ -43,7 +46,7 @@ DetailsButton::DetailsButton(QWidget *parent) : QAbstractButton(parent) QSize DetailsButton::sizeHint() const { // TODO: Adjust this when icons become available! - return QSize(40, 22); + return QSize(80, 22); } @@ -69,36 +72,45 @@ QPixmap DetailsButton::cacheRendering(const QSize &size, bool checked) 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); + pixmap.fill(Qt::transparent); QPainter p(&pixmap); - p.setBrush(lg); + 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)); + } else { + lg.setColorAt(0, QColor(255, 255, 255, 0)); + lg.setColorAt(1, QColor(255, 255, 255, 50)); + } - p.drawRect(0, 0, size.width(), size.height()); - - 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.setBrush(lg); + p.setPen(QColor(255,255,255,140)); + p.drawRoundedRect(1, 1, size.width()-3, size.height()-3, 1, 1); + p.setPen(QPen(QColor(0, 0, 0, 40))); + p.drawLine(0, 1, 0, size.height() - 2); + if(checked) + p.drawLine(1, size.height() - 1, size.width() - 1, 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")); - } - + QString text = tr("Details"); + QRect textRect = p.fontMetrics().boundingRect(text); + textRect.setWidth(textRect.width() + 15); + textRect.moveCenter(rect().center()); + + p.drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, text); + + int arrowsize = 15; + QStyleOption arrowOpt; + arrowOpt.initFrom(this); + QPalette pal = arrowOpt.palette; + pal.setBrush(QPalette::All, QPalette::Text, QColor(0, 0, 0)); + arrowOpt.rect = QRect(size.width() - arrowsize - 6, height()/2-arrowsize/2, arrowsize, arrowsize); + arrowOpt.palette = pal; + style()->drawPrimitive(checked ? QStyle::PE_IndicatorArrowUp : QStyle::PE_IndicatorArrowDown, &arrowOpt, &p, this); return pixmap; } diff --git a/src/libs/utils/detailswidget.cpp b/src/libs/utils/detailswidget.cpp index af1208f70c5..5ab766bff5a 100644 --- a/src/libs/utils/detailswidget.cpp +++ b/src/libs/utils/detailswidget.cpp @@ -40,232 +40,241 @@ namespace Utils { -static const int MARGIN=8; - -// This widget is using a grid layout and places the items -// in the following way: -// -// +------------+-------------------------+---------------+ -// + toolWidget | summaryLabel | detailsButton | -// +------------+-------------------------+---------------+ -// | | widget | -// +------------+-------------------------+---------------+ - -struct DetailsWidgetPrivate { - DetailsWidgetPrivate(); - - DetailsButton *m_detailsButton; - QGridLayout *m_grid; - QLabel *m_summaryLabel; - QWidget *m_toolWidget; - QWidget *m_widget; - - QPixmap m_collapsedPixmap; - QPixmap m_expandedPixmap; - - DetailsWidget::State m_state; - bool m_hovered; -}; - -DetailsWidgetPrivate::DetailsWidgetPrivate() : - m_detailsButton(new DetailsButton), - m_grid(new QGridLayout), - m_summaryLabel(new QLabel), - m_toolWidget(0), - m_widget(0), - m_state(DetailsWidget::Collapsed), - m_hovered(false) -{ -} - -DetailsWidget::DetailsWidget(QWidget *parent) : - QWidget(parent), - d(new DetailsWidgetPrivate) -{ - d->m_summaryLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); - d->m_summaryLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - d->m_summaryLabel->setContentsMargins(MARGIN, MARGIN, MARGIN, MARGIN); - - d->m_grid->setContentsMargins(0, 0, 0, 0); - d->m_grid->setSpacing(0); - d->m_grid->addWidget(d->m_summaryLabel, 0, 1); - d->m_grid->addWidget(d->m_detailsButton, 0, 2); - setLayout(d->m_grid); - - connect(d->m_detailsButton, SIGNAL(toggled(bool)), - this, SLOT(setExpanded(bool))); - updateControls(); -} - -DetailsWidget::~DetailsWidget() -{ - delete d; -} - -void DetailsWidget::paintEvent(QPaintEvent *paintEvent) -{ - QWidget::paintEvent(paintEvent); - - QPainter p(this); - - QPoint topLeft(d->m_summaryLabel->geometry().left(), contentsRect().top()); - const QRect paintArea(topLeft, contentsRect().bottomRight()); - - if (d->m_state != Expanded) { - if (d->m_collapsedPixmap.isNull() || - d->m_collapsedPixmap.size() != size()) - d->m_collapsedPixmap = cacheBackground(paintArea.size(), false); - p.drawPixmap(paintArea, d->m_collapsedPixmap); - } else { - if (d->m_expandedPixmap.isNull() || - d->m_expandedPixmap.size() != size()) - d->m_expandedPixmap = cacheBackground(paintArea.size(), true); - p.drawPixmap(paintArea, d->m_expandedPixmap); + static const int MARGIN=8; + + // This widget is using a grid layout and places the items + // in the following way: + // + // +------------+-------------------------+---------------+ + // + toolWidget | summaryLabel | detailsButton | + // +------------+-------------------------+---------------+ + // | | widget | + // +------------+-------------------------+---------------+ + + struct DetailsWidgetPrivate { + DetailsWidgetPrivate(); + + DetailsButton *m_detailsButton; + QGridLayout *m_grid; + QLabel *m_summaryLabel; + QWidget *m_toolWidget; + QWidget *m_widget; + + QPixmap m_collapsedPixmap; + QPixmap m_expandedPixmap; + + DetailsWidget::State m_state; + bool m_hovered; + }; + + DetailsWidgetPrivate::DetailsWidgetPrivate() : + m_detailsButton(new DetailsButton), + m_grid(new QGridLayout), + m_summaryLabel(new QLabel), + m_toolWidget(0), + m_widget(0), + m_state(DetailsWidget::Collapsed), + m_hovered(false) + { } -} - -void DetailsWidget::enterEvent(QEvent * event) -{ - QWidget::enterEvent(event); - changeHoverState(true); -} - -void DetailsWidget::leaveEvent(QEvent * event) -{ - QWidget::leaveEvent(event); - changeHoverState(false); -} - -void DetailsWidget::setSummaryText(const QString &text) -{ - d->m_summaryLabel->setText(text); -} - -QString DetailsWidget::summaryText() const -{ - return d->m_summaryLabel->text(); -} - -DetailsWidget::State DetailsWidget::state() const -{ - return d->m_state; -} - -void DetailsWidget::setState(State state) -{ - if (state == d->m_state) - return; - d->m_state = state; - updateControls(); -} - -void DetailsWidget::setExpanded(bool expanded) -{ - setState(expanded ? Expanded : Collapsed); -} - -void DetailsWidget::updateControls() -{ - if (d->m_widget) - d->m_widget->setVisible(d->m_state == Expanded || d->m_state == NoSummary); - d->m_detailsButton->setChecked(d->m_state == Expanded && d->m_widget); - d->m_summaryLabel->setEnabled(d->m_state == Collapsed && d->m_widget); - d->m_detailsButton->setVisible(d->m_state != NoSummary); - d->m_summaryLabel->setVisible(d->m_state != NoSummary); + + DetailsWidget::DetailsWidget(QWidget *parent) : + QWidget(parent), + d(new DetailsWidgetPrivate) { - QWidget *w = this; - while (w) { - if (w->layout()) - w->layout()->activate(); - if (QScrollArea *area = qobject_cast<QScrollArea*>(w)) { - QEvent e(QEvent::LayoutRequest); - QCoreApplication::sendEvent(area, &e); - } - w = w->parentWidget(); + d->m_summaryLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); + d->m_summaryLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + d->m_summaryLabel->setContentsMargins(MARGIN, MARGIN, MARGIN, MARGIN); + + d->m_grid->setContentsMargins(0, 0, 0, 0); + d->m_grid->setSpacing(0); + d->m_grid->addWidget(d->m_summaryLabel, 0, 1); + d->m_grid->addWidget(d->m_detailsButton, 0, 2); + setLayout(d->m_grid); + + connect(d->m_detailsButton, SIGNAL(toggled(bool)), + this, SLOT(setExpanded(bool))); + updateControls(); + } + + DetailsWidget::~DetailsWidget() + { + delete d; + } + + void DetailsWidget::paintEvent(QPaintEvent *paintEvent) + { + QWidget::paintEvent(paintEvent); + + QPainter p(this); + + QPoint topLeft(d->m_summaryLabel->geometry().left(), contentsRect().top()); + const QRect paintArea(topLeft, contentsRect().bottomRight()); + + if (d->m_state != Expanded) { + if (d->m_collapsedPixmap.isNull() || + d->m_collapsedPixmap.size() != size()) + d->m_collapsedPixmap = cacheBackground(paintArea.size(), false); + p.drawPixmap(paintArea, d->m_collapsedPixmap); + } else { + if (d->m_expandedPixmap.isNull() || + d->m_expandedPixmap.size() != size()) + d->m_expandedPixmap = cacheBackground(paintArea.size(), true); + p.drawPixmap(paintArea, d->m_expandedPixmap); } } -} -QWidget *DetailsWidget::widget() const -{ - return d->m_widget; -} + void DetailsWidget::enterEvent(QEvent * event) + { + QWidget::enterEvent(event); + changeHoverState(true); + } -void DetailsWidget::setWidget(QWidget *widget) -{ - if (d->m_widget == widget) - return; + void DetailsWidget::leaveEvent(QEvent * event) + { + QWidget::leaveEvent(event); + changeHoverState(false); + } - if (d->m_widget) { - d->m_grid->removeWidget(d->m_widget); - delete d->m_widget; + void DetailsWidget::setSummaryText(const QString &text) + { + d->m_summaryLabel->setText(text); } - d->m_widget = widget; + QString DetailsWidget::summaryText() const + { + return d->m_summaryLabel->text(); + } - if (d->m_widget) { - d->m_widget->setContentsMargins(MARGIN, MARGIN, MARGIN, MARGIN); - d->m_grid->addWidget(d->m_widget, 1, 1, 1, 2); + DetailsWidget::State DetailsWidget::state() const + { + return d->m_state; } - updateControls(); -} -void DetailsWidget::setToolWidget(QWidget *widget) -{ - if (d->m_toolWidget == widget) - return; + void DetailsWidget::setState(State state) + { + if (state == d->m_state) + return; + d->m_state = state; + updateControls(); + } - d->m_toolWidget = widget; + void DetailsWidget::setExpanded(bool expanded) + { + setState(expanded ? Expanded : Collapsed); + } - if (!d->m_toolWidget) - return; + void DetailsWidget::updateControls() + { + if (d->m_widget) + d->m_widget->setVisible(d->m_state == Expanded || d->m_state == NoSummary); + d->m_detailsButton->setChecked(d->m_state == Expanded && d->m_widget); + //d->m_summaryLabel->setEnabled(d->m_state == Collapsed && d->m_widget); + d->m_detailsButton->setVisible(d->m_state != NoSummary); + d->m_summaryLabel->setVisible(d->m_state != NoSummary); + { + QWidget *w = this; + while (w) { + if (w->layout()) + w->layout()->activate(); + if (QScrollArea *area = qobject_cast<QScrollArea*>(w)) { + QEvent e(QEvent::LayoutRequest); + QCoreApplication::sendEvent(area, &e); + } + w = w->parentWidget(); + } + } + } - d->m_toolWidget->adjustSize(); - d->m_grid->addWidget(d->m_toolWidget, 0, 0, 1, 1, Qt::AlignCenter); + QWidget *DetailsWidget::widget() const + { + return d->m_widget; + } - d->m_grid->setColumnMinimumWidth(0, d->m_toolWidget->width()); - d->m_grid->setRowMinimumHeight(0, d->m_toolWidget->height()); + void DetailsWidget::setWidget(QWidget *widget) + { + if (d->m_widget == widget) + return; - changeHoverState(d->m_hovered); -} + if (d->m_widget) { + d->m_grid->removeWidget(d->m_widget); + delete d->m_widget; + } -QWidget *DetailsWidget::toolWidget() const -{ - return d->m_toolWidget; -} + d->m_widget = widget; -QPixmap DetailsWidget::cacheBackground(const QSize &size, bool expanded) -{ - QLinearGradient lg; - lg.setCoordinateMode(QGradient::ObjectBoundingMode); - lg.setFinalStop(0, 1); + if (d->m_widget) { + d->m_widget->setContentsMargins(MARGIN, MARGIN, MARGIN, MARGIN); + d->m_grid->addWidget(d->m_widget, 1, 1, 1, 2); + } + updateControls(); + } + + void DetailsWidget::setToolWidget(QWidget *widget) + { + if (d->m_toolWidget == widget) + return; - lg.setColorAt(0, palette().color(QPalette::Midlight)); - lg.setColorAt(1, palette().color(QPalette::Button)); + d->m_toolWidget = widget; - QPixmap pixmap(size); - QPainter p(&pixmap); - p.setBrush(lg); - p.setPen(QPen(palette().color(QPalette::Mid))); + if (!d->m_toolWidget) + return; - p.drawRect(0, 0, size.width() - 1, size.height() - 1); + d->m_toolWidget->adjustSize(); + d->m_grid->addWidget(d->m_toolWidget, 0, 0, 1, 1, Qt::AlignCenter); - if (expanded) { - p.drawLine(0, d->m_widget->geometry().top() - 1, - d->m_summaryLabel->width(), d->m_widget->geometry().top() - 1); + d->m_grid->setColumnMinimumWidth(0, d->m_toolWidget->width()); + d->m_grid->setRowMinimumHeight(0, d->m_toolWidget->height()); + + changeHoverState(d->m_hovered); } - return pixmap; -} + QWidget *DetailsWidget::toolWidget() const + { + return d->m_toolWidget; + } + + QPixmap DetailsWidget::cacheBackground(const QSize &size, bool expanded) + { + QPixmap pixmap(size); + pixmap.fill(Qt::transparent); + QPainter p(&pixmap); + + QRect topRect(0, 0, size.width(), d->m_summaryLabel->height()); + QRect fullRect(0, 0, size.width(), size.height()); + p.fillRect(fullRect, QColor(255, 255, 255, 40)); + + QColor highlight = palette().highlight().color(); + highlight.setAlpha(0.5); + if (expanded) { + p.fillRect(topRect, highlight); + } + + QLinearGradient lg(topRect.topLeft(), topRect.bottomLeft()); + lg.setColorAt(0, QColor(255, 255, 255, 130)); + lg.setColorAt(1, QColor(255, 255, 255, 0)); + p.fillRect(topRect, lg); + p.setRenderHint(QPainter::Antialiasing, true); + p.translate(0.5, 0.5); + p.setPen(QColor(0, 0, 0, 40)); + p.setBrush(Qt::NoBrush); + p.drawRoundedRect(fullRect.adjusted(0, 0, -1, -1), 2, 2); + p.setBrush(Qt::NoBrush); + p.setPen(QColor(255,255,255,140)); + p.drawRoundedRect(fullRect.adjusted(1, 1, -2, -2), 2, 2); + p.setPen(QPen(palette().color(QPalette::Mid))); + + return pixmap; + } -void DetailsWidget::changeHoverState(bool hovered) -{ - if (!d->m_toolWidget) - return; + void DetailsWidget::changeHoverState(bool hovered) + { + if (!d->m_toolWidget) + return; - d->m_toolWidget->setVisible(hovered); + d->m_toolWidget->setVisible(hovered); - d->m_hovered = hovered; -} + d->m_hovered = hovered; + } } // namespace Utils diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index 7950a612a28..296e18141d0 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -114,7 +114,9 @@ public: { Q_UNUSED(e); QPainter p(this); - p.fillRect(contentsRect(), QBrush(Utils::StyleHelper::borderColor())); + QColor fillColor = Utils::StyleHelper::mergedColors( + palette().button().color(), Qt::black, 80); + p.fillRect(contentsRect(), fillColor); } }; @@ -130,9 +132,14 @@ void RootWidget::paintEvent(QPaintEvent *e) QWidget::paintEvent(e); QPainter painter(this); - painter.setPen(QColor(255, 255, 255, 90)); + QColor light = Utils::StyleHelper::mergedColors( + palette().button().color(), Qt::white, 30); + QColor dark = Utils::StyleHelper::mergedColors( + palette().button().color(), Qt::black, 85); + + painter.setPen(light); painter.drawLine(rect().topRight(), rect().bottomRight()); - painter.setPen(QColor(0, 0, 0, 30)); + painter.setPen(dark); painter.drawLine(rect().topRight() - QPoint(1,0), rect().bottomRight() - QPoint(1,0)); } @@ -147,11 +154,15 @@ PanelsWidget::PanelsWidget(QWidget *parent) : // We want a 900px wide widget with and the scrollbar at the // side of the screen. m_root->setFixedWidth(900); - m_root->setContentsMargins(0, 0, 20, 0); + m_root->setContentsMargins(0, 0, 40, 0); QPalette pal = m_root->palette(); - pal.setColor(QPalette::All, QPalette::Window, QColor(255, 255, 255, 40)); + QColor background = Utils::StyleHelper::mergedColors( + palette().window().color(), Qt::white, 85); + pal.setColor(QPalette::All, QPalette::Window, background.darker(102)); setPalette(pal); + pal.setColor(QPalette::All, QPalette::Window, background); + m_root->setPalette(pal); // The layout holding the individual panels: m_layout = new QGridLayout(m_root); m_layout->setColumnMinimumWidth(0, ICON_SIZE + 4); @@ -198,6 +209,9 @@ void PanelsWidget::addPropertiesPanel(IPropertiesPanel *panel) // name: QLabel *nameLabel = new QLabel(m_root); nameLabel->setText(panel->displayName()); + QPalette palette = nameLabel->palette(); + palette.setBrush(QPalette::All, QPalette::Foreground, QColor(0, 0, 0, 110)); + nameLabel->setPalette(palette); nameLabel->setContentsMargins(0, ABOVE_HEADING_MARGIN, 0, 0); QFont f = nameLabel->font(); f.setBold(true); -- GitLab