diff options
author | Tobias Hunger <[email protected]> | 2013-09-13 10:16:25 +0200 |
---|---|---|
committer | hjk <[email protected]> | 2013-09-19 18:14:02 +0200 |
commit | 958dd99b125e54e1ec67e3c1832aafeaa9cbd833 (patch) | |
tree | 569f061bed42633fc89150de545626218c46aa6a /src/plugins | |
parent | 6251ea033140c21f1994cb07db6b8ee2785be64b (diff) |
MiniProjectTargetSelector: Add UI for mutable elements in the kits
Not perfect yet, but mostly working.
Change-Id: Ie7525671b9b3e522197d0d8cbb6096c52e88dea7
Reviewed-by: hjk <[email protected]>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/projectexplorer/miniprojecttargetselector.cpp | 119 | ||||
-rw-r--r-- | src/plugins/projectexplorer/miniprojecttargetselector.h | 22 |
2 files changed, 128 insertions, 13 deletions
diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.cpp b/src/plugins/projectexplorer/miniprojecttargetselector.cpp index ae9aa9b1c15..25270eb3535 100644 --- a/src/plugins/projectexplorer/miniprojecttargetselector.cpp +++ b/src/plugins/projectexplorer/miniprojecttargetselector.cpp @@ -28,6 +28,9 @@ ****************************************************************************/ #include "miniprojecttargetselector.h" +#include "kit.h" +#include "kitconfigwidget.h" +#include "kitmanager.h" #include "target.h" #include <utils/styledbar.h> @@ -520,6 +523,81 @@ QListWidgetItem *GenericListWidget::itemForProjectConfiguration(ProjectConfigura return 0; } +///////// +// KitAreaWidget +///////// + +KitAreaWidget::KitAreaWidget(QWidget *parent) : QWidget(parent), + m_layout(new QGridLayout(this)), m_kit(0) +{ + m_layout->setMargin(3); + setKit(0); +} + +void KitAreaWidget::setKit(Kit *k) +{ + foreach (KitConfigWidget *w, m_widgets) + w->deleteLater(); + m_widgets.clear(); + foreach (QLabel *l, m_labels) + l->deleteLater(); + m_labels.clear(); + + if (m_kit) { + disconnect(KitManager::instance(), SIGNAL(kitUpdated(ProjectExplorer::Kit*)), + this, SLOT(updateKit(ProjectExplorer::Kit*))); + } + + int row = 0; + foreach (KitInformation *ki, KitManager::kitInformation()) { + if (k && k->isMutable(ki->id())) { + KitConfigWidget *widget = ki->createConfigWidget(k); + m_widgets << widget; + QLabel *label = new QLabel(widget->displayName()); + m_labels << label; + + m_layout->addWidget(label, row, 0); + m_layout->addWidget(widget->mainWidget(), row, 1); + ++row; + } + } + m_kit = k; + + if (m_kit) { + connect(KitManager::instance(), SIGNAL(kitUpdated(ProjectExplorer::Kit*)), + this, SLOT(updateKit(ProjectExplorer::Kit*))); + } + + setHidden(m_widgets.isEmpty()); +} + +void KitAreaWidget::updateKit(Kit *k) +{ + if (!m_kit || m_kit != k) + return; + + // Check whether our widgets changed + bool mustRegenerate = false; + QList<Core::Id> knownIdList; + foreach (KitConfigWidget *w, m_widgets) + knownIdList << w->kitInformationId(); + + foreach (KitInformation *ki, KitManager::kitInformation()) { + Core::Id currentId = ki->id(); + if (m_kit->isMutable(currentId) && !knownIdList.removeOne(currentId)) { + mustRegenerate = true; + break; + } + } + + if (mustRegenerate || !knownIdList.isEmpty()) + setKit(m_kit); +} + +///////// +// MiniProjectTargetSelector +///////// + QWidget *MiniProjectTargetSelector::createTitleLabel(const QString &text) { Utils::StyledBar *bar = new Utils::StyledBar(this); @@ -559,6 +637,8 @@ MiniProjectTargetSelector::MiniProjectTargetSelector(QAction *targetSelectorActi targetSelectorAction->setIcon(style()->standardIcon(QStyle::SP_ComputerIcon)); targetSelectorAction->setProperty("titledAction", true); + m_kitAreaWidget = new KitAreaWidget(this); + m_summaryLabel = new QLabel(this); m_summaryLabel->setMargin(3); m_summaryLabel->setAlignment(Qt::AlignLeft | Qt::AlignTop); @@ -747,8 +827,15 @@ void MiniProjectTargetSelector::doLayout(bool keepSize) static QWidget *actionBar = Core::ICore::mainWindow()->findChild<QWidget*>(QLatin1String("actionbar")); Q_ASSERT(actionBar); + m_kitAreaWidget->move(0, 0); + + int oldSummaryLabelY = m_summaryLabel->y(); + + int kitAreaHeight = m_kitAreaWidget->isVisible() ? m_kitAreaWidget->sizeHint().height() : 0; + // 1. Calculate the summary label height - int summaryLabelY = 1; + int summaryLabelY = 1 + kitAreaHeight; + int summaryLabelHeight = 0; int oldSummaryLabelHeight = m_summaryLabel->height(); bool onlySummary = false; @@ -785,7 +872,7 @@ void MiniProjectTargetSelector::doLayout(bool keepSize) if (actionBar->isVisible()) alignedWithActionHeight = actionBar->height() - statusBar->height(); int bottomMargin = 9; - int totalHeight = 0; + int heightWithoutKitArea = 0; if (!onlySummary) { // list widget heigth @@ -795,22 +882,24 @@ void MiniProjectTargetSelector::doLayout(bool keepSize) int titleWidgetsHeight = m_titleWidgets.first()->height(); if (keepSize) { - totalHeight = height(); + heightWithoutKitArea = height() - oldSummaryLabelY + 1; } else { // Clamp the size of the listwidgets to be // at least as high as the the sidebar button // and at most twice as high - totalHeight = summaryLabelHeight + qBound(alignedWithActionHeight, - maxItemCount * 30 + bottomMargin + titleWidgetsHeight, - alignedWithActionHeight * 2); + heightWithoutKitArea = summaryLabelHeight + + qBound(alignedWithActionHeight, + maxItemCount * 30 + bottomMargin + titleWidgetsHeight, + alignedWithActionHeight * 2); } int titleY = summaryLabelY + summaryLabelHeight; int listY = titleY + titleWidgetsHeight; - int listHeight = totalHeight - bottomMargin - listY + 1; + int listHeight = heightWithoutKitArea + kitAreaHeight - bottomMargin - listY + 1; // list widget widths int minWidth = qMax(m_summaryLabel->sizeHint().width(), 250); + minWidth = qMax(minWidth, m_kitAreaWidget->sizeHint().width()); if (keepSize) { // Do not make the widget smaller then it was before int oldTotalListWidgetWidth = m_projectListWidget->isVisibleTo(this) ? @@ -837,19 +926,21 @@ void MiniProjectTargetSelector::doLayout(bool keepSize) } m_summaryLabel->resize(x - 1, summaryLabelHeight); - setFixedSize(x, totalHeight); + m_kitAreaWidget->resize(x - 1, kitAreaHeight); + setFixedSize(x, heightWithoutKitArea + kitAreaHeight); } else { if (keepSize) - totalHeight = height(); + heightWithoutKitArea = height() - oldSummaryLabelY + 1; else - totalHeight = qMax(summaryLabelHeight + bottomMargin, alignedWithActionHeight); - m_summaryLabel->resize(m_summaryLabel->sizeHint().width(), totalHeight - bottomMargin); - setFixedSize(m_summaryLabel->width() + 1, totalHeight); //1 extra pixel for the border + heightWithoutKitArea = qMax(summaryLabelHeight + bottomMargin, alignedWithActionHeight); + m_summaryLabel->resize(m_summaryLabel->sizeHint().width(), heightWithoutKitArea - bottomMargin); + m_kitAreaWidget->resize(m_kitAreaWidget->sizeHint()); + setFixedSize(m_summaryLabel->width() + 1, heightWithoutKitArea + kitAreaHeight); //1 extra pixel for the border } if (isVisibleTo(parentWidget())) { QPoint moveTo = statusBar->mapToGlobal(QPoint(0,0)); - moveTo -= QPoint(0, totalHeight); + moveTo -= QPoint(0, height()); move(moveTo); } } @@ -1177,6 +1268,8 @@ void MiniProjectTargetSelector::activeTargetChanged(ProjectExplorer::Target *tar m_target = target; + m_kitAreaWidget->setKit(m_target ? m_target->kit() : 0); + m_listWidgets[TARGET]->setActiveProjectConfiguration(m_target); if (m_buildConfiguration) diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.h b/src/plugins/projectexplorer/miniprojecttargetselector.h index 80342a3c26d..062e4ca7fe9 100644 --- a/src/plugins/projectexplorer/miniprojecttargetselector.h +++ b/src/plugins/projectexplorer/miniprojecttargetselector.h @@ -35,12 +35,14 @@ QT_BEGIN_NAMESPACE class QComboBox; +class QGridLayout; class QLabel; class QStackedWidget; QT_END_NAMESPACE namespace ProjectExplorer { class Kit; +class KitConfigWidget; class Project; class Target; class BuildConfiguration; @@ -87,6 +89,25 @@ private: bool m_ignoreIndexChange; }; +class KitAreaWidget : public QWidget +{ + Q_OBJECT +public: + explicit KitAreaWidget(QWidget *parent = 0); + +public slots: + void setKit(ProjectExplorer::Kit *k); + +private slots: + void updateKit(ProjectExplorer::Kit *k); + +private: + QGridLayout *m_layout; + Kit *m_kit; + QList<KitConfigWidget *> m_widgets; + QList<QLabel *> m_labels; +}; + class GenericListWidget : public ListWidget { Q_OBJECT @@ -176,6 +197,7 @@ private: enum TYPES { PROJECT = 0, TARGET = 1, BUILD = 2, DEPLOY = 3, RUN = 4, LAST = 5 }; ProjectListWidget *m_projectListWidget; + KitAreaWidget *m_kitAreaWidget; QVector<GenericListWidget *> m_listWidgets; QVector<QWidget *> m_titleWidgets; QLabel *m_summaryLabel; |