diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp index 70f84584fd0921c828139d50d3a4129f5bf9d801..7010413349d502e975a77f66246d7b39b0cecb49 100644 --- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp @@ -54,6 +54,11 @@ using namespace ProjectExplorer::Internal; // BuildSettingsPanelFactory /// +QString BuildSettingsPanelFactory::displayName() const +{ + return QApplication::tr("Build Settings"); +} + bool BuildSettingsPanelFactory::supports(Project *project) { return project->hasBuildSettings(); @@ -94,6 +99,11 @@ QIcon BuildSettingsPanel::icon() const return m_icon; } +void BuildSettingsPanel::widgetWasAddedToLayout() +{ + m_widget->setupUi(); +} + /// // BuildSettingsWidget /// @@ -108,12 +118,14 @@ BuildSettingsWidget::BuildSettingsWidget(Project *project) : m_buildConfiguration(0), m_leftMargin(0) { - // Provide some time for our contentsmargins to get updated: - QTimer::singleShot(0, this, SLOT(setupUi())); + // setup is done after panel has been added to layout. + // setupUi will be called by the IPropertiesPanel implementation then. + // this is necessary to handle the margin by hand for the up/down/delete hover } void BuildSettingsWidget::setupUi() { + // called by IPropertiesPanel implementation once the panel has been added QMargins margins(contentsMargins()); m_leftMargin = margins.left(); margins.setLeft(0); diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.h b/src/plugins/projectexplorer/buildsettingspropertiespage.h index 9b1321edccf27f50c719f4f3d0793516253fb446..9749ca6fa66c2c752aa0ac170befc8f792c64cf5 100644 --- a/src/plugins/projectexplorer/buildsettingspropertiespage.h +++ b/src/plugins/projectexplorer/buildsettingspropertiespage.h @@ -51,6 +51,7 @@ namespace Internal { class BuildSettingsPanelFactory : public IPanelFactory { public: + QString displayName() const; bool supports(Project *project); IPropertiesPanel *createPanel(Project *project); }; @@ -65,6 +66,7 @@ public: QString displayName() const; QWidget *widget() const; QIcon icon() const; + void widgetWasAddedToLayout(); private: BuildSettingsWidget *m_widget; @@ -84,6 +86,8 @@ public: void addSubWidget(const QString &name, QWidget *widget); QList<QWidget *> subWidgets() const; + void setupUi(); + private slots: void updateBuildSettings(); void currentIndexChanged(int index); @@ -96,8 +100,6 @@ private slots: void checkMakeActiveLabel(); void makeActive(); - void setupUi(); - void addedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); void removedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); void buildConfigurationDisplayNameChanged(); diff --git a/src/plugins/projectexplorer/dependenciespanel.cpp b/src/plugins/projectexplorer/dependenciespanel.cpp index b36f87ed700129f9fef9713621b457627580bbca..ef9f4ce7ad680ddc1e2e6bbd3e0266214cbdbc95 100644 --- a/src/plugins/projectexplorer/dependenciespanel.cpp +++ b/src/plugins/projectexplorer/dependenciespanel.cpp @@ -319,6 +319,11 @@ DependenciesPanelFactory::DependenciesPanelFactory(SessionManager *session) { } +QString DependenciesPanelFactory::displayName() const +{ + return QApplication::tr("Dependencies"); +} + bool DependenciesPanelFactory::supports(Project * /* project */) { return true; diff --git a/src/plugins/projectexplorer/dependenciespanel.h b/src/plugins/projectexplorer/dependenciespanel.h index fef72b97cabc60abdc82a4c2abda7fbd86de244b..2b452e4ae34963c8f5a61eec00a7ae125c044c6d 100644 --- a/src/plugins/projectexplorer/dependenciespanel.h +++ b/src/plugins/projectexplorer/dependenciespanel.h @@ -52,6 +52,7 @@ class DependenciesPanelFactory : public IPanelFactory public: DependenciesPanelFactory(SessionManager *session); + QString displayName() const; bool supports(Project *project); IPropertiesPanel *createPanel(Project *project); diff --git a/src/plugins/projectexplorer/doubletabwidget.cpp b/src/plugins/projectexplorer/doubletabwidget.cpp index 05e5fbaa07e96b139bda23b3f573c100485bf2e7..c6db9901be9072286f05393dac71069dc81ea852 100644 --- a/src/plugins/projectexplorer/doubletabwidget.cpp +++ b/src/plugins/projectexplorer/doubletabwidget.cpp @@ -7,6 +7,9 @@ #include <QtGui/QPainter> #include <QtGui/QFont> #include <QtGui/QMouseEvent> +#include <QtGui/QMenu> + +#include <QtDebug> using namespace ProjectExplorer::Internal; @@ -15,6 +18,7 @@ static const int MARGIN = 12; static const int OTHER_HEIGHT = 38; static const int SELECTION_IMAGE_WIDTH = 10; static const int SELECTION_IMAGE_HEIGHT = 20; +static const int OVERFLOW_DROPDOWN_WIDTH = Utils::StyleHelper::navigationWidgetHeight(); static void drawFirstLevelSeparator(QPainter *painter, QPoint top, QPoint bottom) { @@ -53,7 +57,8 @@ static void drawSecondLevelSeparator(QPainter *painter, QPoint top, QPoint botto DoubleTabWidget::DoubleTabWidget(QWidget *parent) : QWidget(parent), ui(new Ui::DoubleTabWidget), - m_currentIndex(-1) + m_currentIndex(-1), + m_lastVisibleIndex(-1) { ui->setupUi(this); } @@ -88,6 +93,44 @@ void DoubleTabWidget::addTab(const QString &name, const QStringList &subTabs) update(); } +void DoubleTabWidget::insertTab(int index, const QString &name, const QStringList &subTabs) +{ + Tab tab; + tab.name = name; + tab.subTabs = subTabs; + tab.currentSubTab = tab.subTabs.isEmpty() ? -1 : 0; + m_tabs.insert(index, tab); + if (m_currentIndex == -1) { + m_currentIndex = m_tabs.size()-1; + emit currentIndexChanged(m_currentIndex, m_tabs.at(m_currentIndex).currentSubTab); + } else if (m_currentIndex >= index) { + ++m_currentIndex; + emit currentIndexChanged(m_currentIndex, m_tabs.at(m_currentIndex).currentSubTab); + } + update(); +} + +void DoubleTabWidget::removeTab(int index) +{ + m_tabs.removeAt(index); + if (index <= m_currentIndex) { + --m_currentIndex; + if (m_currentIndex < 0 && m_tabs.size() > 0) + m_currentIndex = 0; + if (m_currentIndex < 0) { + emit currentIndexChanged(-1, -1); + } else { + emit currentIndexChanged(m_currentIndex, m_tabs.at(m_currentIndex).currentSubTab); + } + } + update(); +} + +int DoubleTabWidget::tabCount() const +{ + return m_tabs.size(); +} + void DoubleTabWidget::mousePressEvent(QMouseEvent *event) { if (event->y() < Utils::StyleHelper::navigationWidgetHeight()) { @@ -98,21 +141,39 @@ void DoubleTabWidget::mousePressEvent(QMouseEvent *event) if (eventX <= x) return; int i; - for (i = 0; i < m_tabs.size(); ++i) { - int otherX = x + 2 * MARGIN + fm.width(m_tabs.at(i).name); + for (i = 0; i <= m_lastVisibleIndex; ++i) { + int otherX = x + 2 * MARGIN + fm.width(m_tabs.at( + m_currentTabIndices.at(i)).name); if (eventX > x && eventX < otherX) { break; } x = otherX; } - if (i < m_tabs.size()) { - if (m_currentIndex != i) { - m_currentIndex = i; + if (i <= m_lastVisibleIndex) { + if (m_currentIndex != m_currentTabIndices.at(i)) { + m_currentIndex = m_currentTabIndices.at(i); update(); emit currentIndexChanged(m_currentIndex, m_tabs.at(m_currentIndex).currentSubTab); } event->accept(); return; + } else if (m_lastVisibleIndex < m_tabs.size() - 1) { + // handle overflow menu + if (eventX > x && eventX < x + OVERFLOW_DROPDOWN_WIDTH) { + QMenu overflowMenu; + QList<QAction *> actions; + for (int i = m_lastVisibleIndex + 1; i < m_tabs.size(); ++i) { + actions << overflowMenu.addAction(m_tabs.at(m_currentTabIndices.at(i)).name); + } + if (QAction *action = overflowMenu.exec(mapToGlobal(QPoint(x+1, 1)))) { + int index = m_currentTabIndices.at(actions.indexOf(action) + m_lastVisibleIndex + 1); + if (m_currentIndex != index) { + m_currentIndex = index; + update(); + emit currentIndexChanged(m_currentIndex, m_tabs.at(m_currentIndex).currentSubTab); + } + } + } } } else if (event->y() < Utils::StyleHelper::navigationWidgetHeight() + OTHER_HEIGHT) { int diff = (OTHER_HEIGHT - SELECTION_IMAGE_HEIGHT) / 2; @@ -146,7 +207,6 @@ void DoubleTabWidget::mousePressEvent(QMouseEvent *event) emit currentIndexChanged(m_currentIndex, m_tabs.at(m_currentIndex).currentSubTab); return; } - } event->ignore(); } @@ -193,18 +253,85 @@ void DoubleTabWidget::paintEvent(QPaintEvent *event) // top level tabs int x = 2 * MARGIN + qMax(fm.width(m_title), MIN_LEFT_MARGIN); + + // calculate sizes + QList<int> nameWidth; + int width = x; + int indexSmallerThanOverflow = -1; + int indexSmallerThanWidth = -1; for (int i = 0; i < m_tabs.size(); ++i) { - if (i == m_currentIndex) { + const Tab &tab = m_tabs.at(i); + int w = fm.width(tab.name); + nameWidth << w; + width += 2 * MARGIN + w; + if (width < r.width()) + indexSmallerThanWidth = i; + if (width < r.width() - OVERFLOW_DROPDOWN_WIDTH) + indexSmallerThanOverflow = i; + } + m_lastVisibleIndex = -1; + m_currentTabIndices.resize(m_tabs.size()); + if (indexSmallerThanWidth == m_tabs.size() - 1) { + // => everything fits + for (int i = 0; i < m_tabs.size(); ++i) + m_currentTabIndices[i] = i; + m_lastVisibleIndex = m_tabs.size()-1; + } else { + // => we need the overflow thingy + if (m_currentIndex <= indexSmallerThanOverflow) { + // easy going, simply draw everything that fits + for (int i = 0; i < m_tabs.size(); ++i) + m_currentTabIndices[i] = i; + m_lastVisibleIndex = indexSmallerThanOverflow; + } else { + // now we need to put the current tab into + // visible range. for that we need to find the place + // to put it, so it fits + width = x; + int index = 0; + bool handledCurrentIndex = false; + for (int i = 0; i < m_tabs.size(); ++i) { + if (index != m_currentIndex) { + if (!handledCurrentIndex) { + // check if enough room for current tab after this one + if (width + 2 * MARGIN + nameWidth.at(index) + + 2 * MARGIN + nameWidth.at(m_currentIndex) + < r.width() - OVERFLOW_DROPDOWN_WIDTH) { + m_currentTabIndices[i] = index; + ++index; + width += 2 * MARGIN + nameWidth.at(index); + } else { + m_currentTabIndices[i] = m_currentIndex; + handledCurrentIndex = true; + m_lastVisibleIndex = i; + } + } else { + m_currentTabIndices[i] = index; + ++index; + } + } else { + ++index; + --i; + } + } + } + } + + // actually draw top level tabs + for (int i = 0; i <= m_lastVisibleIndex; ++i) { + int actualIndex = m_currentTabIndices.at(i); + Tab tab = m_tabs.at(actualIndex); + if (actualIndex == m_currentIndex) { painter.setPen(Utils::StyleHelper::borderColor()); painter.drawLine(x - 1, 0, x - 1, r.height() - 1); painter.fillRect(QRect(x, 0, - 2 * MARGIN + fm.width(m_tabs.at(i).name), + 2 * MARGIN + fm.width(tab.name), r.height() + 1), grad); x += MARGIN; painter.setPen(Qt::black); - painter.drawText(x, baseline, m_tabs.at(i).name); - x += fm.width(m_tabs.at(i).name); + painter.drawText(x, baseline, tab.name); + x += nameWidth.at(actualIndex); x += MARGIN; painter.setPen(Utils::StyleHelper::borderColor()); painter.drawLine(x, 0, x, r.height() - 1); @@ -213,19 +340,27 @@ void DoubleTabWidget::paintEvent(QPaintEvent *event) drawFirstLevelSeparator(&painter, QPoint(x, 0), QPoint(x, r.height()-1)); x += MARGIN; painter.setPen(Utils::StyleHelper::panelTextColor()); - painter.drawText(x + 1, baseline, m_tabs.at(i).name); - x += fm.width(m_tabs.at(i).name); + painter.drawText(x + 1, baseline, tab.name); + x += nameWidth.at(actualIndex); x += MARGIN; drawFirstLevelSeparator(&painter, QPoint(x, 0), QPoint(x, r.height()-1)); } - if (x >= r.width()) // TODO: do something useful... - break; + } + + // draw overflow button + if (m_lastVisibleIndex < m_tabs.size() - 1) { + QStyleOption opt; + opt.rect = QRect(x, 0, OVERFLOW_DROPDOWN_WIDTH - 1, r.height() - 1); + style()->drawPrimitive(QStyle::PE_IndicatorArrowDown, + &opt, &painter, this); + drawFirstLevelSeparator(&painter, QPoint(x + OVERFLOW_DROPDOWN_WIDTH, 0), + QPoint(x + OVERFLOW_DROPDOWN_WIDTH, r.height()-1)); } // second level tabs - static QPixmap left(":/projectexplorer/leftselection.png"); - static QPixmap mid(":/projectexplorer/midselection.png"); - static QPixmap right(":/projectexplorer/rightselection.png"); + static QPixmap left(":/projectexplorer/images/leftselection.png"); + static QPixmap mid(":/projectexplorer/images/midselection.png"); + static QPixmap right(":/projectexplorer/images/rightselection.png"); if (m_currentIndex != -1) { int y = r.height() + (OTHER_HEIGHT - left.height()) / 2.; int imageHeight = left.height(); diff --git a/src/plugins/projectexplorer/doubletabwidget.h b/src/plugins/projectexplorer/doubletabwidget.h index a77366aa32d506c18e1849f3bb959a347f5feb0f..15d2f4bb6c271d9192b403653c13d4cc29fabbc4 100644 --- a/src/plugins/projectexplorer/doubletabwidget.h +++ b/src/plugins/projectexplorer/doubletabwidget.h @@ -1,6 +1,7 @@ #ifndef DOUBLETABWIDGET_H #define DOUBLETABWIDGET_H +#include <QtCore/QVector> #include <QtGui/QWidget> namespace ProjectExplorer { @@ -20,6 +21,9 @@ public: QString title() const { return m_title; } void addTab(const QString &name, const QStringList &subTabs); + void insertTab(int index, const QString &name, const QStringList &subTabs); + void removeTab(int index); + int tabCount() const; signals: void currentIndexChanged(int index, int subIndex); @@ -42,6 +46,8 @@ private: QString m_title; QList<Tab> m_tabs; int m_currentIndex; + QVector<int> m_currentTabIndices; + int m_lastVisibleIndex; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/editorsettingspropertiespage.cpp b/src/plugins/projectexplorer/editorsettingspropertiespage.cpp index de8539510cbea219ef1b1a8b3aed851944219b23..6810920b5561254dc40d115fadbabec62dea0ea6 100644 --- a/src/plugins/projectexplorer/editorsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/editorsettingspropertiespage.cpp @@ -38,6 +38,11 @@ using namespace ProjectExplorer; using namespace ProjectExplorer::Internal; +QString EditorSettingsPanelFactory::displayName() const +{ + return QApplication::tr("Editor Settings"); +} + bool EditorSettingsPanelFactory::supports(Project * /*project*/) { return true; diff --git a/src/plugins/projectexplorer/editorsettingspropertiespage.h b/src/plugins/projectexplorer/editorsettingspropertiespage.h index 2104c8dcc8bc147e9dd8e26a865f0bd6c8ebf58a..0df493512ba69983da1042df50b1ff181350a721 100644 --- a/src/plugins/projectexplorer/editorsettingspropertiespage.h +++ b/src/plugins/projectexplorer/editorsettingspropertiespage.h @@ -40,6 +40,7 @@ namespace Internal { class EditorSettingsPanelFactory : public IPanelFactory { public: + QString displayName() const; bool supports(Project *project); IPropertiesPanel *createPanel(Project *project); }; diff --git a/src/plugins/projectexplorer/iprojectproperties.h b/src/plugins/projectexplorer/iprojectproperties.h index fe2d7f875995c213d06600d5999a5fce0ebdea4d..b0c4a186ee2f256b4b9863fa915de88e91294641 100644 --- a/src/plugins/projectexplorer/iprojectproperties.h +++ b/src/plugins/projectexplorer/iprojectproperties.h @@ -48,12 +48,14 @@ public: virtual QString displayName() const = 0; virtual QIcon icon() const = 0; virtual QWidget *widget() const = 0; + virtual void widgetWasAddedToLayout() { } }; class PROJECTEXPLORER_EXPORT IPanelFactory : public QObject { Q_OBJECT public: + virtual QString displayName() const = 0; virtual bool supports(Project *project) = 0; virtual IPropertiesPanel *createPanel(Project *project) = 0; }; diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index b08fda8cbcbcf49d328876a866536bf118211fc3..47bead26b44fde5c13341056421046f60c2eb426 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -903,6 +903,7 @@ void ProjectExplorerPlugin::extensionsInitialized() void ProjectExplorerPlugin::shutdown() { + d->m_proWindow->shutdown(); // disconnect from session d->m_session->clear(); // d->m_proWindow->saveConfigChanges(); } @@ -2240,7 +2241,7 @@ BuildConfigDialog::BuildConfigDialog(Project *project, QWidget *parent) } QFormLayout *formlayout = new QFormLayout; - formlayout->addRow(ActiveConfigurationWidget::tr("Active run configuration"), + formlayout->addRow(tr("Active run configuration"), // ^ avoiding a new translatable string for active run configuration new QLabel(activeRun->displayName())); formlayout->addRow(tr("Choose build configuration:"), m_configCombo); diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index 1e81b17bc1ba8601f9ed618a8cfab5e28939a1d0..76c08d4d4ad7fcb8babeb0e04ab368f42c80e07a 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -29,6 +29,8 @@ #include "projectwindow.h" +#include "doubletabwidget.h" + #include "project.h" #include "environment.h" #include "projectexplorer.h" @@ -90,22 +92,6 @@ public: } }; -/// -// PanelsWidget::Panel -/// - -PanelsWidget::Panel::Panel(QWidget * w) : - iconLabel(0), lineWidget(0), nameLabel(0), panelWidget(w) -{ } - -PanelsWidget::Panel::~Panel() -{ - delete iconLabel; - delete lineWidget; - delete nameLabel; - // do not delete panelWidget, we do not own it! -} - /// // PanelsWidget /// @@ -129,24 +115,7 @@ PanelsWidget::PanelsWidget(QWidget *parent) : PanelsWidget::~PanelsWidget() { - clear(); -} - -/* - * Add a widget into the grid layout of the PanelsWidget. - * - * ... - * +--------+-------------------------------------------+ ABOVE_CONTENTS_MARGIN - * | widget (with contentsmargins adjusted!) | - * +--------+-------------------------------------------+ BELOW_CONTENTS_MARGIN - */ -void PanelsWidget::addWidget(QWidget *widget) -{ - QTC_ASSERT(widget, return); - - const int row(m_layout->rowCount() - 1); - m_layout->setRowStretch(row, 0); - addPanelWidget(new Panel(widget), row); + qDeleteAll(m_panels); } /* @@ -162,70 +131,48 @@ void PanelsWidget::addWidget(QWidget *widget) * | widget (with contentsmargins adjusted!) | * +--------+-------------------------------------------+ BELOW_CONTENTS_MARGIN */ -void PanelsWidget::addWidget(const QString &name, QWidget *widget, const QIcon & icon) +void PanelsWidget::addPropertiesPanel(IPropertiesPanel *panel) { - QTC_ASSERT(widget, return); - - Panel *p = new Panel(widget); + QTC_ASSERT(panel, return); // icon: const int headerRow(m_layout->rowCount() - 1); m_layout->setRowStretch(headerRow, 0); - if (!icon.isNull()) { - p->iconLabel = new QLabel(m_root); - p->iconLabel->setPixmap(icon.pixmap(ICON_SIZE, ICON_SIZE)); - p->iconLabel->setContentsMargins(0, ABOVE_HEADING_MARGIN, 0, 0); - m_layout->addWidget(p->iconLabel, headerRow, 0, 2, 1, Qt::AlignTop | Qt::AlignHCenter); + if (!panel->icon().isNull()) { + QLabel *iconLabel = new QLabel(m_root); + iconLabel->setPixmap(panel->icon().pixmap(ICON_SIZE, ICON_SIZE)); + iconLabel->setContentsMargins(0, ABOVE_HEADING_MARGIN, 0, 0); + m_layout->addWidget(iconLabel, headerRow, 0, 2, 1, Qt::AlignTop | Qt::AlignHCenter); } // name: - p->nameLabel = new QLabel(m_root); - p->nameLabel->setText(name); - p->nameLabel->setContentsMargins(0, ABOVE_HEADING_MARGIN, 0, 0); - QFont f = p->nameLabel->font(); + QLabel *nameLabel = new QLabel(m_root); + nameLabel->setText(panel->displayName()); + nameLabel->setContentsMargins(0, ABOVE_HEADING_MARGIN, 0, 0); + QFont f = nameLabel->font(); f.setBold(true); f.setPointSizeF(f.pointSizeF() * 1.4); - p->nameLabel->setFont(f); - m_layout->addWidget(p->nameLabel, headerRow, 1, 1, 1, Qt::AlignBottom | Qt::AlignLeft); + nameLabel->setFont(f); + m_layout->addWidget(nameLabel, headerRow, 1, 1, 1, Qt::AlignBottom | Qt::AlignLeft); // line: const int lineRow(headerRow + 1); - p->lineWidget = new OnePixelBlackLine(m_root); - m_layout->addWidget(p->lineWidget, lineRow, 1); + m_layout->addWidget(new OnePixelBlackLine(m_root), lineRow, 1); // add the widget: const int widgetRow(lineRow + 1); - addPanelWidget(p, widgetRow); -} - -QWidget *PanelsWidget::rootWidget() const -{ - return m_root; -} - -void PanelsWidget::clear() -{ - foreach (Panel *p, m_panels) { - if (p->iconLabel) - m_layout->removeWidget(p->iconLabel); - if (p->lineWidget) - m_layout->removeWidget(p->lineWidget); - if (p->nameLabel) - m_layout->removeWidget(p->nameLabel); - if (p->panelWidget) - m_layout->removeWidget(p->panelWidget); - delete p; - } - m_panels.clear(); + addPanelWidget(panel, widgetRow); } -void PanelsWidget::addPanelWidget(Panel *panel, int row) +void PanelsWidget::addPanelWidget(IPropertiesPanel *panel, int row) { - panel->panelWidget->setContentsMargins(m_layout->columnMinimumWidth(0), + QWidget *widget = panel->widget(); + widget->setContentsMargins(m_layout->columnMinimumWidth(0), ABOVE_CONTENTS_MARGIN, 0, BELOW_CONTENTS_MARGIN); - m_layout->addWidget(panel->panelWidget, row, 0, 1, 2); + widget->setParent(m_root); + m_layout->addWidget(widget, row, 0, 1, 2); const int stretchRow(row + 1); m_layout->setRowStretch(stretchRow, 10); @@ -233,470 +180,13 @@ void PanelsWidget::addPanelWidget(Panel *panel, int row) m_panels.append(panel); } -//// -// ActiveConfigurationWidget -//// - -ActiveConfigurationWidget::ActiveConfigurationWidget(QWidget *parent) - : QWidget(parent) -{ - QGridLayout *grid = new QGridLayout(this); - grid->setMargin(0); - RunConfigurationComboBox *runConfigurationComboBox = new RunConfigurationComboBox(this); - grid->addWidget(new QLabel(tr("Active run configuration")), 0, 0); - grid->addWidget(runConfigurationComboBox, 0, 1); - - SessionManager *session = ProjectExplorerPlugin::instance()->session(); - - int i = 0; - foreach(Project *p, session->projects()) { - ++i; - BuildConfigurationComboBox *buildConfigurationComboBox = new BuildConfigurationComboBox(p, this); - QLabel *label = new QLabel("Build configuration for <b>" + p->displayName() + "</b>", this); - grid->addWidget(label, i, 0); - grid->addWidget(buildConfigurationComboBox, i, 1); - m_buildComboBoxMap.insert(p, qMakePair(buildConfigurationComboBox, label)); - } - - connect(session, SIGNAL(projectAdded(ProjectExplorer::Project*)), - this, SLOT(projectAdded(ProjectExplorer::Project*))); - - connect(session, SIGNAL(projectRemoved(ProjectExplorer::Project*)), - this, SLOT(projectRemoved(ProjectExplorer::Project*))); - -}; - -void ActiveConfigurationWidget::projectAdded(Project *p) -{ - QGridLayout *grid = static_cast<QGridLayout *>(layout()); - BuildConfigurationComboBox *buildConfigurationComboBox = new BuildConfigurationComboBox(p, this); - QLabel *label = new QLabel("Build configuration for <b>" + p->displayName() + "</b>"); - grid->addWidget(label); - grid->addWidget(buildConfigurationComboBox); - m_buildComboBoxMap.insert(p, qMakePair(buildConfigurationComboBox, label)); -} - -void ActiveConfigurationWidget::projectRemoved(Project *p) -{ - // Find row - - // TODO also remove the label... - QPair<BuildConfigurationComboBox *, QLabel *> pair = m_buildComboBoxMap.value(p);; - delete pair.first; - delete pair.second; - m_buildComboBoxMap.remove(p); -} - - -ActiveConfigurationWidget::~ActiveConfigurationWidget() -{ - -} - -//// -// RunConfigurationComboBox -//// - -RunConfigurationComboBox::RunConfigurationComboBox(QWidget *parent) - : QComboBox(parent), m_ignoreChange(false) -{ - setSizeAdjustPolicy(QComboBox::AdjustToContents); - - SessionManager *session = ProjectExplorer::ProjectExplorerPlugin::instance()->session(); - - // Setup the treewidget - rebuildTree(); - - // Connect - foreach(Project *p, session->projects()) { - foreach(RunConfiguration *rc, p->runConfigurations()) { - connect(rc, SIGNAL(displayNameChanged()), this, SLOT(rebuildTree())); - } - connectToProject(p); - } - - connect(session, SIGNAL(startupProjectChanged(ProjectExplorer::Project*)), - this, SLOT(activeRunConfigurationChanged())); - - connect(session, SIGNAL(projectAdded(ProjectExplorer::Project*)), - this, SLOT(projectAdded(ProjectExplorer::Project*))); - connect(session, SIGNAL(projectRemoved(ProjectExplorer::Project*)), - this, SLOT(projectRemoved(ProjectExplorer::Project*))); - connect(this, SIGNAL(activated(int)), - this, SLOT(activeItemChanged(int))); -} - -RunConfigurationComboBox::~RunConfigurationComboBox() -{ - -} - -int RunConfigurationComboBox::convertTreeIndexToInt(int project, int runconfigurationIndex) -{ - ++runconfigurationIndex; - ++project; - for(int i=0; i<count(); ++i) { - if (itemData(i, Qt::UserRole).toInt() == 0) { - --project; - } else if (itemData(i, Qt::UserRole).toInt() == 1 && project == 0) { - --runconfigurationIndex; - } - if (runconfigurationIndex == 0) { - return i; - } - } - return -1; -} - -QPair<int, int> RunConfigurationComboBox::convertIntToTreeIndex(int index) -{ - int projectIndex = -1; - int runConfigIndex = -1; - for(int i = 0; i <= index; ++i) { - if (itemData(i, Qt::UserRole).toInt() == 0) { - ++projectIndex; - runConfigIndex = -1; - } else if (itemData(i, Qt::UserRole).toInt() == 1) { - ++runConfigIndex; - } - } - return qMakePair(projectIndex, runConfigIndex); -} - -void RunConfigurationComboBox::activeItemChanged(int index) -{ - if (m_ignoreChange) - return; - m_ignoreChange = true; - SessionManager *session = ProjectExplorer::ProjectExplorerPlugin::instance()->session(); - QPair<int, int> pair = convertIntToTreeIndex(index); - if (pair.first == -1) { - setCurrentIndex(-1); - } else { - if (pair.second == -1) - pair.second = 0; - QList<Project *> projects = session->projects(); - if (pair.first < projects.count()) { - Project *p = projects.at(pair.first); - QList<RunConfiguration *> runconfigurations = p->runConfigurations(); - if (pair.second < runconfigurations.count()) { - session->setStartupProject(p); - p->setActiveRunConfiguration(runconfigurations.at(pair.second)); - if (currentIndex() != convertTreeIndexToInt(pair.first, pair.second)) - setCurrentIndex(convertTreeIndexToInt(pair.first, pair.second)); - } - } - } - m_ignoreChange = false; -} - -void RunConfigurationComboBox::activeRunConfigurationChanged() -{ - if (m_ignoreChange) - return; - m_ignoreChange = true; - SessionManager *session = ProjectExplorer::ProjectExplorerPlugin::instance()->session(); - Project *startupProject = session->startupProject(); - if (startupProject) { - int projectIndex = session->projects().indexOf(startupProject); - int runConfigurationIndex = startupProject->runConfigurations().indexOf(startupProject->activeRunConfiguration()); - setCurrentIndex(convertTreeIndexToInt(projectIndex, runConfigurationIndex)); - } else { - setCurrentIndex(-1); - } - m_ignoreChange = false; -} - -void RunConfigurationComboBox::addedRunConfiguration(RunConfiguration *runConfiguration) -{ - if (runConfiguration) { - connect(runConfiguration, SIGNAL(displayNameChanged()), - this, SLOT(rebuildTree())); - } - rebuildTree(); -} - -void RunConfigurationComboBox::removedRunConfiguration(RunConfiguration *rc) -{ - Q_UNUSED(rc) - rebuildTree(); -} - -void RunConfigurationComboBox::projectAdded(ProjectExplorer::Project *p) -{ - rebuildTree(); - foreach(RunConfiguration *rc, p->runConfigurations()) - connect(rc, SIGNAL(displayNameChanged()), this, SLOT(rebuildTree())); - connectToProject(p); -} - -void RunConfigurationComboBox::projectRemoved(ProjectExplorer::Project *p) -{ - rebuildTree(); - disconnectFromProject(p); -} - -void RunConfigurationComboBox::connectToProject(ProjectExplorer::Project *p) -{ - connect(p, SIGNAL(activeRunConfigurationChanged()), - this, SLOT(activeRunConfigurationChanged())); - connect(p, SIGNAL(addedRunConfiguration(ProjectExplorer::RunConfiguration *)), - this, SLOT(addedRunConfiguration(ProjectExplorer::RunConfiguration *))); - connect(p, SIGNAL(removedRunConfiguration(ProjectExplorer::RunConfiguration *)), - this, SLOT(removedRunConfiguration(ProjectExplorer::RunConfiguration *))); -} - -void RunConfigurationComboBox::disconnectFromProject(ProjectExplorer::Project *p) -{ - disconnect(p, SIGNAL(activeRunConfigurationChanged()), - this, SLOT(activeRunConfigurationChanged())); - disconnect(p, SIGNAL(addedRunConfiguration(ProjectExplorer::RunConfiguration *)), - this, SLOT(addedRunConfiguration(ProjectExplorer::RunConfiguration *))); - disconnect(p, SIGNAL(removedRunConfiguration(ProjectExplorer::RunConfiguration *)), - this, SLOT(removedRunConfiguration(ProjectExplorer::RunConfiguration *))); -} - -void RunConfigurationComboBox::rebuildTree() -{ - m_ignoreChange = true; - clear(); - - SessionManager *session = ProjectExplorer::ProjectExplorerPlugin::instance()->session(); - Project *startupProject = session->startupProject(); - foreach(Project *p, session->projects()) { - addItem(p->displayName(), QVariant(0)); - foreach(RunConfiguration *rc, p->runConfigurations()) { - addItem(" " + rc->displayName(), QVariant(1)); - if ((startupProject == p) && (p->activeRunConfiguration() == rc)){ - setCurrentIndex(count() - 1); - } - } - } - // Select the right index - m_ignoreChange = false; -} - -//// -// BuildConfigurationComboBox -//// - - -BuildConfigurationComboBox::BuildConfigurationComboBox(Project *p, QWidget *parent) - : QStackedWidget(parent), ignoreIndexChange(false), m_project(p) -{ - setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - m_comboBox = new QComboBox(this); - m_comboBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - addWidget(m_comboBox); - - m_label = new QLabel(this); - m_label->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - addWidget(m_label); - - //m_comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); - foreach(BuildConfiguration *buildConfiguration, p->buildConfigurations()) { - m_comboBox->addItem(buildConfiguration->displayName(), QVariant::fromValue(buildConfiguration)); - connect(buildConfiguration, SIGNAL(displayNameChanged()), - this, SLOT(displayNameChanged())); - } - if (p->buildConfigurations().count() == 1) { - m_label->setText(m_comboBox->itemText(0)); - setCurrentWidget(m_label); - } - - int index = p->buildConfigurations().indexOf(p->activeBuildConfiguration()); - if (index != -1) - m_comboBox->setCurrentIndex(index); - - // TODO -// connect(p, SIGNAL(buildConfigurationDisplayNameChanged(QString)), - // this, SLOT(nameChanged(ProjectExplorer::BuildConfiguration *))); - connect(p, SIGNAL(activeBuildConfigurationChanged()), - this, SLOT(activeConfigurationChanged())); - connect(p, SIGNAL(addedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), - this, SLOT(addedBuildConfiguration(ProjectExplorer::BuildConfiguration*))); - connect(p, SIGNAL(removedBuildConfiguration(ProjectExplorer::BuildConfiguration*)), - this, SLOT(removedBuildConfiguration(ProjectExplorer::BuildConfiguration*))); - connect(m_comboBox, SIGNAL(activated(int)), - this, SLOT(changedIndex(int))); -} - -BuildConfigurationComboBox::~BuildConfigurationComboBox() -{ - -} - -void BuildConfigurationComboBox::displayNameChanged() -{ - for (int i=0; i < m_comboBox->count(); ++i) { - BuildConfiguration *bc = m_comboBox->itemData(i).value<BuildConfiguration *>(); - const QString &displayName = bc->displayName(); - m_comboBox->setItemText(i, displayName); - } - - if (m_comboBox->count() == 1) - m_label->setText(m_comboBox->itemText(0)); -} - -int BuildConfigurationComboBox::buildConfigurationToIndex(BuildConfiguration *bc) -{ - for (int i=0; i < m_comboBox->count(); ++i) - if (m_comboBox->itemData(i).value<BuildConfiguration *>() == bc) - return i; - return -1; -} - -void BuildConfigurationComboBox::activeConfigurationChanged() -{ - const int index(buildConfigurationToIndex(m_project->activeBuildConfiguration())); - if (index == -1) - return; - ignoreIndexChange = true; - m_comboBox->setCurrentIndex(index); - ignoreIndexChange = false; -} - -void BuildConfigurationComboBox::addedBuildConfiguration(BuildConfiguration *bc) -{ - ignoreIndexChange = true; - m_comboBox->addItem(bc->displayName(), QVariant::fromValue(bc)); - - if (m_comboBox->count() == 2) - setCurrentWidget(m_comboBox); - ignoreIndexChange = false; - connect(bc, SIGNAL(displayNameChanged()), - this, SLOT(displayNameChanged())); -} - -void BuildConfigurationComboBox::removedBuildConfiguration(BuildConfiguration * bc) -{ - ignoreIndexChange = true; - const int index(buildConfigurationToIndex(bc)); - if (index == -1) - return; - m_comboBox->removeItem(index); - if (m_comboBox->count() == 1) { - m_label->setText(m_comboBox->itemText(0)); - setCurrentWidget(m_label); - } - ignoreIndexChange = false; - connect(bc, SIGNAL(displayNameChanged()), - this, SLOT(displayNameChanged())); -} - -void BuildConfigurationComboBox::changedIndex(int newIndex) -{ - if (newIndex == -1) - return; - m_project->setActiveBuildConfiguration(m_comboBox->itemData(newIndex).value<BuildConfiguration *>()); -} - -/// -// ProjectLabel -/// - -ProjectLabel::ProjectLabel(QWidget *parent) - : QLabel(parent) -{ - -} - -ProjectLabel::~ProjectLabel() -{ - -} - -void ProjectLabel::setProject(ProjectExplorer::Project *p) -{ - if (p) - setText(tr("Edit Project Settings for Project <b>%1</b>").arg(p->displayName())); - else - setText(tr("No Project loaded")); -} - -/// -// ProjectPushButton -/// - -ProjectPushButton::ProjectPushButton(QWidget *parent) - : QPushButton(parent) -{ - setText(tr("Select Project")); - m_menu = new QMenu(this); - setMenu(m_menu); - - setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - - SessionManager *session = ProjectExplorerPlugin::instance()->session(); - - foreach(Project *p, session->projects()) { - QAction *act = m_menu->addAction(p->displayName()); - act->setData(QVariant::fromValue((void *) p)); - connect(act, SIGNAL(triggered()), - this, SLOT(actionTriggered())); - } - - setEnabled(session->projects().count() > 1); - - connect(session, SIGNAL(projectRemoved(ProjectExplorer::Project*)), - this, SLOT(projectRemoved(ProjectExplorer::Project*))); - connect(session, SIGNAL(projectAdded(ProjectExplorer::Project*)), - this, SLOT(projectAdded(ProjectExplorer::Project*))); -} - -ProjectPushButton::~ProjectPushButton() -{ - -} - -void ProjectPushButton::projectAdded(ProjectExplorer::Project *p) -{ - QAction *act = m_menu->addAction(p->displayName()); - act->setData(QVariant::fromValue((void *) p)); - connect(act, SIGNAL(triggered()), - this, SLOT(actionTriggered())); - - // Activate it - if (m_menu->actions().count() == 1) - emit projectChanged(p); - else if (m_menu->actions().count() > 1) - setEnabled(true); -} - -void ProjectPushButton::projectRemoved(ProjectExplorer::Project *p) -{ - QList<Project *> projects = ProjectExplorerPlugin::instance()->session()->projects(); - - bool needToChange = false; - foreach(QAction *act, m_menu->actions()) { - if (act->data().value<void *>() == (void *) p) { - delete act; - needToChange = true; - break; - } - } - - // Comboboxes don't emit a signal if the index did't actually change - if (m_menu->actions().isEmpty()) { - emit projectChanged(0); - setEnabled(false); - } else if (needToChange) { - emit projectChanged((ProjectExplorer::Project *) m_menu->actions().first()->data().value<void *>()); - } -} - -void ProjectPushButton::actionTriggered() -{ - QAction *action = qobject_cast<QAction *>(sender()); - emit projectChanged((ProjectExplorer::Project *) action->data().value<void *>()); -} - /// // ProjectWindow /// ProjectWindow::ProjectWindow(QWidget *parent) - : QWidget(parent) + : QWidget(parent), + m_panelsWidget(0) { ProjectExplorer::SessionManager *session = ProjectExplorerPlugin::instance()->session(); @@ -705,88 +195,77 @@ ProjectWindow::ProjectWindow(QWidget *parent) viewLayout->setMargin(0); viewLayout->setSpacing(0); - // Add toolbar used everywhere - viewLayout->addWidget(new Utils::StyledBar(this)); + m_tabWidget = new DoubleTabWidget(this); + m_tabWidget->setTitle(tr("Select a Project:")); + viewLayout->addWidget(m_tabWidget); // Setup our container for the contents: - m_panelsWidget = new PanelsWidget(this); - viewLayout->addWidget(m_panelsWidget); + m_centralWidget = new QStackedWidget(this); + viewLayout->addWidget(m_centralWidget); - // Run and build configuration selection panel: - m_activeConfigurationWidget = new ActiveConfigurationWidget(m_panelsWidget->rootWidget()); - - // Spacer and line panel: - m_spacerBetween = new OnePixelBlackLine(m_panelsWidget->rootWidget()); - - // Project chooser panel: - m_projectChooser = new QWidget(m_panelsWidget->rootWidget()); - QHBoxLayout *hbox = new QHBoxLayout(m_projectChooser); - hbox->setMargin(0); - ProjectLabel *label = new ProjectLabel(m_projectChooser); + // no projects label: + m_noprojectLabel = new QWidget; + QVBoxLayout *noprojectLayout = new QVBoxLayout; + noprojectLayout->setMargin(0); + QLabel *label = new QLabel(m_noprojectLabel); + label->setText(tr("No project loaded.")); { QFont f = label->font(); f.setPointSizeF(f.pointSizeF() * 1.4); f.setBold(true); label->setFont(f); } - hbox->addWidget(label); - ProjectPushButton *changeProject = new ProjectPushButton(m_projectChooser); - connect(changeProject, SIGNAL(projectChanged(ProjectExplorer::Project*)), - label, SLOT(setProject(ProjectExplorer::Project*))); - hbox->addWidget(changeProject); - - // no projects label: - m_noprojectLabel = new QLabel(this); - m_noprojectLabel->setText(tr("No project loaded.")); - { - QFont f = m_noprojectLabel->font(); - f.setPointSizeF(f.pointSizeF() * 1.4); - f.setBold(true); - m_noprojectLabel->setFont(f); - } - m_noprojectLabel->setMargin(10); - m_noprojectLabel->setAlignment(Qt::AlignTop); - viewLayout->addWidget(m_noprojectLabel); - - // show either panels or no projects label: - bool noProjects = session->projects().isEmpty(); - m_panelsWidget->setVisible(!noProjects); - m_noprojectLabel->setVisible(noProjects); + label->setMargin(10); + label->setAlignment(Qt::AlignTop); + noprojectLayout->addWidget(label); + noprojectLayout->addStretch(10); + m_centralWidget->addWidget(m_noprojectLabel); // connects: - connect(changeProject, SIGNAL(projectChanged(ProjectExplorer::Project*)), - this, SLOT(showProperties(ProjectExplorer::Project*))); + connect(m_tabWidget, SIGNAL(currentIndexChanged(int,int)), + this, SLOT(showProperties(int,int))); connect(session, SIGNAL(sessionLoaded()), this, SLOT(restoreStatus())); connect(session, SIGNAL(aboutToSaveSession()), this, SLOT(saveStatus())); connect(session, SIGNAL(projectAdded(ProjectExplorer::Project*)), - this, SLOT(projectAdded())); - connect(session, SIGNAL(projectRemoved(ProjectExplorer::Project*)), - this, SLOT(projectRemoved())); + this, SLOT(projectAdded(ProjectExplorer::Project*))); + connect(session, SIGNAL(aboutToRemoveProject(ProjectExplorer::Project*)), + this, SLOT(aboutToRemoveProject(ProjectExplorer::Project*))); // Update properties to empty project for now: - showProperties(0); + showProperties(-1, -1); } ProjectWindow::~ProjectWindow() { - qDeleteAll(m_panels); - m_panels.clear(); } -void ProjectWindow::projectAdded() +void ProjectWindow::shutdown() { - m_panelsWidget->setVisible(true); - m_noprojectLabel->setVisible(false); + showProperties(-1, -1); // TODO that's a bit stupid, but otherwise stuff is still + // connected to the session + disconnect(ProjectExplorerPlugin::instance()->session(), 0, this, 0); } -void ProjectWindow::projectRemoved() +void ProjectWindow::projectAdded(ProjectExplorer::Project *project) { - if (ProjectExplorerPlugin::instance()->session()->projects().isEmpty()) { - m_panelsWidget->setVisible(false); - m_noprojectLabel->setVisible(true); + QList<Project *> projects = ProjectExplorerPlugin::instance()->session()->projects(); + int index = projects.indexOf(project); + QStringList subtabs; + foreach (IPanelFactory *panelFactory, ExtensionSystem::PluginManager::instance()->getObjects<IPanelFactory>()) { + if (panelFactory->supports(project)) + subtabs << panelFactory->displayName(); } + m_tabIndexToProject.insert(index, project); + m_tabWidget->insertTab(index, project->displayName(), subtabs); +} + +void ProjectWindow::aboutToRemoveProject(ProjectExplorer::Project *project) +{ + int index = m_tabIndexToProject.indexOf(project); + m_tabIndexToProject.removeAt(index); + m_tabWidget->removeTab(index); } void ProjectWindow::restoreStatus() @@ -799,30 +278,45 @@ void ProjectWindow::saveStatus() // TODO } -void ProjectWindow::showProperties(Project *project) +void ProjectWindow::showProperties(int index, int subIndex) { - // Remove all existing panels: - m_panelsWidget->clear(); - - // delete custom panels: - qDeleteAll(m_panels); - m_panels.clear(); + if (index < 0) { + m_centralWidget->setCurrentWidget(m_noprojectLabel); + if (m_panelsWidget) { + m_centralWidget->removeWidget(m_panelsWidget); + delete m_panelsWidget; + m_panelsWidget = 0; + } + return; + } + Project *project = m_tabIndexToProject.at(index); - // Set up our default panels: - m_panelsWidget->addWidget(tr("Active Build and Run Configurations"), m_activeConfigurationWidget, QIcon()); - m_panelsWidget->addWidget(m_spacerBetween); - m_panelsWidget->addWidget(m_projectChooser); + PanelsWidget *panelsWidget = 0; // Set up custom panels again: - if (project) { - QList<IPanelFactory *> pages = - ExtensionSystem::PluginManager::instance()->getObjects<IPanelFactory>(); - foreach (IPanelFactory *panelFactory, pages) { - if (panelFactory->supports(project)) { + QList<IPanelFactory *> pages = + ExtensionSystem::PluginManager::instance()->getObjects<IPanelFactory>(); + int indexOfPanel = 0; + foreach (IPanelFactory *panelFactory, pages) { + if (panelFactory->supports(project)) { + if (indexOfPanel == subIndex) { + panelsWidget = new PanelsWidget(m_centralWidget); IPropertiesPanel *panel = panelFactory->createPanel(project); - m_panelsWidget->addWidget(panel->displayName(), panel->widget(), panel->icon()); - m_panels.push_back(panel); + panelsWidget->addPropertiesPanel(panel); + panel->widgetWasAddedToLayout(); + break; } + ++indexOfPanel; + } + } + if (panelsWidget) { + // add the new stuff to the stack widget + m_centralWidget->addWidget(panelsWidget); + m_centralWidget->setCurrentWidget(panelsWidget); + if (m_panelsWidget) { + m_centralWidget->removeWidget(m_panelsWidget); + delete m_panelsWidget; } + m_panelsWidget = panelsWidget; } } diff --git a/src/plugins/projectexplorer/projectwindow.h b/src/plugins/projectexplorer/projectwindow.h index cd930339510da63e9ea43cbb135376f201b55c12..f1c40be0341b8c0a7ca06f65b375506dc2af846d 100644 --- a/src/plugins/projectexplorer/projectwindow.h +++ b/src/plugins/projectexplorer/projectwindow.h @@ -30,8 +30,11 @@ #ifndef PROJECTWINDOW_H #define PROJECTWINDOW_H +#include "iprojectproperties.h" + #include <QtCore/QPair> #include <QtCore/QMap> +#include <QtGui/QApplication> #include <QtGui/QComboBox> #include <QtGui/QLabel> #include <QtGui/QPushButton> @@ -54,6 +57,8 @@ class RunConfiguration; namespace Internal { +class DoubleTabWidget; + class PanelsWidget : public QScrollArea { Q_OBJECT @@ -61,117 +66,16 @@ public: PanelsWidget(QWidget *parent); ~PanelsWidget(); // Adds a widget - void addWidget(QWidget *widget); - void addWidget(const QString &name, QWidget *widget, const QIcon &icon); - - QWidget *rootWidget() const; - - // Removes all widgets and deletes them - void clear(); + void addPropertiesPanel(IPropertiesPanel *panel); private: - struct Panel - { - // This does not take ownership of widget! - explicit Panel(QWidget *widget); - ~Panel(); - - QLabel *iconLabel; - QWidget *lineWidget; - QLabel *nameLabel; - QWidget *panelWidget; - }; - QList<Panel *> m_panels; - - void addPanelWidget(Panel *panel, int row); + void addPanelWidget(IPropertiesPanel *panel, int row); + QList<IPropertiesPanel *> m_panels; QGridLayout *m_layout; QWidget *m_root; }; -class BuildConfigurationComboBox : public QStackedWidget -{ - Q_OBJECT -public: - BuildConfigurationComboBox(ProjectExplorer::Project *p, QWidget *parent = 0); - ~BuildConfigurationComboBox(); -private slots: - void displayNameChanged(); - void activeConfigurationChanged(); - void addedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); - void removedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); - void changedIndex(int newIndex); -private: - int buildConfigurationToIndex(BuildConfiguration *bc); - bool ignoreIndexChange; - ProjectExplorer::Project *m_project; - QComboBox *m_comboBox; - QLabel *m_label; -}; - -class ActiveConfigurationWidget : public QWidget -{ - Q_OBJECT -public: - ActiveConfigurationWidget(QWidget *parent = 0); - ~ActiveConfigurationWidget(); -private slots: - void projectAdded(ProjectExplorer::Project*); - void projectRemoved(ProjectExplorer::Project*); -private: - QMap<ProjectExplorer::Project *, QPair<BuildConfigurationComboBox *, QLabel *> > m_buildComboBoxMap; -}; - -class RunConfigurationComboBox : public QComboBox -{ - Q_OBJECT -public: - RunConfigurationComboBox(QWidget *parent = 0); - ~RunConfigurationComboBox(); -private slots: - void activeRunConfigurationChanged(); - void activeItemChanged(int); - void addedRunConfiguration(ProjectExplorer::RunConfiguration *); - void removedRunConfiguration(ProjectExplorer::RunConfiguration *); - void projectAdded(ProjectExplorer::Project*); - void projectRemoved(ProjectExplorer::Project*); - void rebuildTree(); -private: - int convertTreeIndexToInt(int project, int runconfigurationIndex); - QPair<int, int> convertIntToTreeIndex(int index); - void connectToProject(ProjectExplorer::Project *p); - void disconnectFromProject(ProjectExplorer::Project *p); - - bool m_ignoreChange; -}; - -class ProjectLabel : public QLabel -{ - Q_OBJECT -public: - ProjectLabel(QWidget *parent); - ~ProjectLabel(); -public slots: - void setProject(ProjectExplorer::Project *); -}; - -class ProjectPushButton : public QPushButton -{ - Q_OBJECT -public: - ProjectPushButton(QWidget *parent); - ~ProjectPushButton(); -signals: - void projectChanged(ProjectExplorer::Project *); - -private slots: - void projectAdded(ProjectExplorer::Project*); - void projectRemoved(ProjectExplorer::Project*); - void actionTriggered(); -private: - QMenu *m_menu; -}; - class ProjectWindow : public QWidget { Q_OBJECT @@ -180,22 +84,20 @@ public: explicit ProjectWindow(QWidget *parent = 0); ~ProjectWindow(); + void shutdown(); private slots: - void showProperties(ProjectExplorer::Project *project); + void showProperties(int index, int subIndex); void restoreStatus(); void saveStatus(); - void projectAdded(); - void projectRemoved(); + void projectAdded(ProjectExplorer::Project*); + void aboutToRemoveProject(ProjectExplorer::Project*); private: - void updateRunConfigurationsComboBox(); - - ActiveConfigurationWidget *m_activeConfigurationWidget; - QWidget *m_spacerBetween; - QWidget *m_projectChooser; - QLabel *m_noprojectLabel; + DoubleTabWidget *m_tabWidget; + QWidget *m_noprojectLabel; + QStackedWidget *m_centralWidget; PanelsWidget *m_panelsWidget; - QList<IPropertiesPanel *> m_panels; + QList<ProjectExplorer::Project *> m_tabIndexToProject; }; diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp index fe4cb60edb5eb4846b8192e6fccf73d63b81dbd9..a5a28aad54e129bc13c8111f65461cb80f09b5df 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp @@ -89,6 +89,11 @@ using ExtensionSystem::PluginManager; /// RunSettingsPanelFactory /// +QString RunSettingsPanelFactory::displayName() const +{ + return QApplication::tr("Run Settings"); +} + bool RunSettingsPanelFactory::supports(Project * /* project */) { return true; diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.h b/src/plugins/projectexplorer/runsettingspropertiespage.h index 93281c7038a91a77732384ab26a949bd95b50d64..8d070d1fa620e1542326bdd7a6e00c6efa210682 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.h +++ b/src/plugins/projectexplorer/runsettingspropertiespage.h @@ -52,7 +52,8 @@ class RunSettingsWidget; class RunSettingsPanelFactory : public IPanelFactory { public: - virtual bool supports(Project *project); + QString displayName() const; + bool supports(Project *project); IPropertiesPanel *createPanel(Project *project); };