aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/coreplugin/fancyactionbar.cpp
diff options
context:
space:
mode:
authorDaniel Molkentin <daniel.molkentin@nokia.com>2010-01-21 21:12:40 +0100
committerDaniel Molkentin <daniel.molkentin@nokia.com>2010-01-21 21:13:10 +0100
commitc4d1553da4553da65ea7877af6ae7441528f1134 (patch)
tree7de35d5b4b0865e19238753269a5c92761af916b /src/plugins/coreplugin/fancyactionbar.cpp
parente3675e9a1e2e9cba0b5b52ba43b4f44da19170ae (diff)
Add first version of a new sidebar, including project selector.
The project selector also allows to select targets. However, this is not yet used, since the necessary changes are still being stabilized. Done-with: con
Diffstat (limited to 'src/plugins/coreplugin/fancyactionbar.cpp')
-rw-r--r--src/plugins/coreplugin/fancyactionbar.cpp194
1 files changed, 126 insertions, 68 deletions
diff --git a/src/plugins/coreplugin/fancyactionbar.cpp b/src/plugins/coreplugin/fancyactionbar.cpp
index bcb75b6dc7..18bca72f99 100644
--- a/src/plugins/coreplugin/fancyactionbar.cpp
+++ b/src/plugins/coreplugin/fancyactionbar.cpp
@@ -1,4 +1,4 @@
-/**************************************************************************
+/********************Q******************************************************
**
** This file is part of Qt Creator
**
@@ -29,53 +29,25 @@
#include "fancyactionbar.h"
+#include <utils/stylehelper.h>
+
+#include <coreplugin/icore.h>
+#include <coreplugin/mainwindow.h>
+
#include <QtGui/QHBoxLayout>
#include <QtGui/QPainter>
#include <QtGui/QPicture>
#include <QtGui/QVBoxLayout>
-#include <QtSvg/QSvgRenderer>
#include <QtGui/QAction>
+#include <QtGui/QStatusBar>
+#include <QtGui/QStyle>
+#include <QtGui/QStyleOption>
using namespace Core;
using namespace Internal;
-static const char* const svgIdButtonBase = "ButtonBase";
-static const char* const svgIdButtonNormalBase = "ButtonNormalBase";
-static const char* const svgIdButtonNormalOverlay = "ButtonNormalOverlay";
-static const char* const svgIdButtonPressedBase = "ButtonPressedBase";
-static const char* const svgIdButtonPressedOverlay = "ButtonPressedOverlay";
-static const char* const svgIdButtonDisabledOverlay = "ButtonDisabledOverlay";
-static const char* const svgIdButtonHoverOverlay = "ButtonHoverOverlay";
-
-static const char* const elementsSvgIds[] = {
- svgIdButtonBase,
- svgIdButtonNormalBase,
- svgIdButtonNormalOverlay,
- svgIdButtonPressedBase,
- svgIdButtonPressedOverlay,
- svgIdButtonDisabledOverlay,
- svgIdButtonHoverOverlay
-};
-
-const QMap<QString, QPicture> &buttonElementsMap()
-{
- static QMap<QString, QPicture> result;
- if (result.isEmpty()) {
- QSvgRenderer renderer(QLatin1String(":/fancyactionbar/images/fancytoolbutton.svg"));
- for (size_t i = 0; i < sizeof(elementsSvgIds)/sizeof(elementsSvgIds[0]); i++) {
- QString elementId(elementsSvgIds[i]);
- QPicture elementPicture;
- QPainter elementPainter(&elementPicture);
- renderer.render(&elementPainter, elementId);
- result.insert(elementId, elementPicture);
- }
- }
- return result;
-}
-
FancyToolButton::FancyToolButton(QWidget *parent)
: QToolButton(parent)
- , m_buttonElements(buttonElementsMap())
{
setAttribute(Qt::WA_Hover, true);
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
@@ -85,40 +57,99 @@ void FancyToolButton::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
QPainter p(this);
- QSize sh(sizeHint());
- double scale = (double)height() / sh.height();
- if (scale < 1) {
- p.save();
- p.scale(1, scale);
- }
- p.drawPicture(0, 0, m_buttonElements.value(svgIdButtonBase));
- p.drawPicture(0, 0, m_buttonElements.value(isDown() ? svgIdButtonPressedBase : svgIdButtonNormalBase));
+
+ QLayout *parentLayout = qobject_cast<FancyActionBar*>(parentWidget())->actionsLayout();
+ int lineHeight = fontMetrics().height();
+ bool isTitledAction = defaultAction()->property("titledAction").toBool();
+
#ifndef Q_WS_MAC // Mac UIs usually don't hover
- if (underMouse() && isEnabled())
- p.drawPicture(0, 0, m_buttonElements.value(svgIdButtonHoverOverlay));
+ if (underMouse() && isEnabled() && !isDown()) {
+ QColor whiteOverlay(Qt::white);
+ whiteOverlay.setAlpha(20);
+ p.fillRect(rect().adjusted(1, 1, -1, -1), whiteOverlay);
+ }
#endif
- if (scale < 1)
- p.restore();
+ if (isDown()) {
+ QColor whiteOverlay(Qt::black);
+ whiteOverlay.setAlpha(20);
+ p.fillRect(rect().adjusted(1, 1, -1, -1), whiteOverlay);
+ }
- if (!icon().isNull()) {
- icon().paint(&p, rect());
- } else {
- const int margin = 4;
- p.drawText(rect().adjusted(margin, margin, -margin, -margin), Qt::AlignCenter | Qt::TextWordWrap, text());
+ QPixmap borderPixmap;
+ QMargins margins;
+ if (parentLayout && parentLayout->count() > 0 &&
+ parentLayout->itemAt(parentLayout->count()-1)->widget() == this) {
+ margins = QMargins(3, 3, 2, 0);
+ borderPixmap = QPixmap(
+ QLatin1String(":/fancyactionbar/images/fancytoolbutton_bottom_outline.png"));
+ } else if (parentLayout && parentLayout->count() > 0 &&
+ parentLayout->itemAt(0)->widget() == this) {
+ margins = QMargins(3, 3, 2, 3);
+ borderPixmap = QPixmap(
+ QLatin1String(":/fancyactionbar/images/fancytoolbutton_top_outline.png"));
+ } else {
+ margins = QMargins(3, 3, 2, 0);
+ borderPixmap = QPixmap(
+ QLatin1String(":/fancyactionbar/images/fancytoolbutton_normal_outline.png"));
+ }
+ QRect drawRect = rect();
+ qDrawBorderPixmap(&p, drawRect, margins, borderPixmap);
+
+ QPixmap pix = icon().pixmap(size() - QSize(15, 15), isEnabled() ? QIcon::Normal : QIcon::Disabled);
+ QPoint center = rect().center();
+ QSize halfPixSize = pix.size()/2;
+
+ p.drawPixmap(center-QPoint(halfPixSize.width()-1, halfPixSize.height()-1), pix);
+
+ if (popupMode() == QToolButton::DelayedPopup && !isTitledAction) {
+ QPoint arrowOffset = center + QPoint(pix.rect().width()/2, pix.rect().height()/2);
+ QStyleOption opt;
+ if (isEnabled())
+ opt.state &= QStyle::State_Enabled;
+ else
+ opt.state |= QStyle::State_Enabled;
+ opt.rect = QRect(arrowOffset.x(), arrowOffset.y(), 6, 6);
+ style()->drawPrimitive(QStyle::PE_IndicatorArrowDown,
+ &opt, &p, this);
}
- if (scale < 1) {
- p.scale(1, scale);
+ if (isTitledAction) {
+ QRect r(0, lineHeight/2, rect().width(), lineHeight);
+ QColor penColor;
+ if (isEnabled())
+ penColor = Qt::white;
+ else
+ penColor = Qt::gray;
+ p.setPen(penColor);
+ const QString projectName = defaultAction()->property("heading").toString();
+ QFont f = font();
+ f.setPointSize(f.pointSize()-1);
+ p.setFont(f);
+ QFontMetrics fm(f);
+ QString ellidedProjectName = fm.elidedText(projectName, Qt::ElideMiddle, r.width());
+ if (isEnabled()) {
+ const QRect shadowR = r.translated(0, 1);
+ p.setPen(Qt::black);
+ p.drawText(shadowR, Qt::AlignVCenter|Qt::AlignHCenter, ellidedProjectName);
+ p.setPen(penColor);
+ }
+ p.drawText(r, Qt::AlignVCenter|Qt::AlignHCenter, ellidedProjectName);
+ r = QRect(0, rect().bottom()-lineHeight*1.5, rect().width(), lineHeight);
+ const QString buildConfiguration = defaultAction()->property("subtitle").toString();
+ f.setBold(true);
+ p.setFont(f);
+ QString ellidedBuildConfiguration = fm.elidedText(buildConfiguration, Qt::ElideMiddle, r.width());
+ if (isEnabled()) {
+ const QRect shadowR = r.translated(0, 1);
+ p.setPen(Qt::black);
+ p.drawText(shadowR, Qt::AlignVCenter|Qt::AlignHCenter, ellidedBuildConfiguration);
+ p.setPen(penColor);
+ }
+ p.drawText(r, Qt::AlignVCenter|Qt::AlignHCenter, ellidedBuildConfiguration);
}
- if (isEnabled()) {
- p.drawPicture(0, 0, m_buttonElements.value(isDown() ?
- svgIdButtonPressedOverlay : svgIdButtonNormalOverlay));
- } else {
- p.drawPicture(0, 0, m_buttonElements.value(svgIdButtonDisabledOverlay));
- }
}
void FancyActionBar::paintEvent(QPaintEvent *event)
@@ -128,7 +159,12 @@ void FancyActionBar::paintEvent(QPaintEvent *event)
QSize FancyToolButton::sizeHint() const
{
- return m_buttonElements.value(svgIdButtonBase).boundingRect().size();
+ QSize buttonSize = iconSize().expandedTo(QSize(64, 40));
+ if (defaultAction()->property("titledAction").toBool()) {
+ int lineHeight = fontMetrics().height();
+ buttonSize += QSize(0, lineHeight*4);
+ }
+ return buttonSize;
}
QSize FancyToolButton::minimumSizeHint() const
@@ -149,13 +185,30 @@ FancyActionBar::FancyActionBar(QWidget *parent)
{
m_actionsLayout = new QVBoxLayout;
- QHBoxLayout *centeringLayout = new QHBoxLayout;
- centeringLayout->addStretch();
- centeringLayout->addLayout(m_actionsLayout);
- centeringLayout->addStretch();
- setLayout(centeringLayout);
+ QVBoxLayout *spacerLayout = new QVBoxLayout;
+ spacerLayout->addLayout(m_actionsLayout);
+ int sbh = ICore::instance()->statusBar()->height();
+ spacerLayout->addSpacing(sbh);
+ spacerLayout->setMargin(0);
+ spacerLayout->setSpacing(0);
+
+ QHBoxLayout *orientRightLayout = new QHBoxLayout;
+ orientRightLayout->addStretch();
+ orientRightLayout->setMargin(0);
+ orientRightLayout->setSpacing(0);
+ orientRightLayout->setContentsMargins(0, 0, 1, 0);
+ orientRightLayout->addLayout(spacerLayout);
+ setLayout(orientRightLayout);
}
+void FancyActionBar::addProjectSelector(QAction *action)
+{
+ FancyToolButton* toolButton = new FancyToolButton(this);
+ toolButton->setDefaultAction(action);
+ connect(action, SIGNAL(changed()), toolButton, SLOT(actionChanged()));
+ m_actionsLayout->insertWidget(0, toolButton);
+
+}
void FancyActionBar::insertAction(int index, QAction *action, QMenu *menu)
{
FancyToolButton *toolButton = new FancyToolButton(this);
@@ -187,3 +240,8 @@ void FancyActionBar::toolButtonContextMenuActionTriggered(QAction* action)
button->defaultAction()->trigger();
}
}
+
+QLayout *FancyActionBar::actionsLayout() const
+{
+ return m_actionsLayout;
+}