diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index f319864d124e11a6ca211aef17ef6e3d47e3fc7a..5fc16bafc32279903254c6db04b36421dc7746c2 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -65,7 +65,7 @@ using namespace ProjectExplorer; using namespace ProjectExplorer::Internal; namespace { -bool debug = false; +const int ICON_SIZE(64); } /// @@ -94,41 +94,56 @@ public: /// PanelsWidget::Panel::Panel(QWidget * w) : - spacer(0), nameLabel(0), panelWidget(w), marginLayout(0) + iconLabel(0), lineWidget(0), nameLabel(0), panelWidget(w), spacer(0) { } PanelsWidget::Panel::~Panel() { - delete spacer; + delete iconLabel; + delete lineWidget; delete nameLabel; - delete marginLayout; + // do not delete panelWidget, we do not own it! + delete spacer; } /// // PanelsWidget /// -PanelsWidget::PanelsWidget(QWidget *parent) - : QScrollArea(parent) +PanelsWidget::PanelsWidget(QWidget *parent) : + QScrollArea(parent), + m_root(new QWidget(this)) { - QWidget *topwidget = new QWidget; - QHBoxLayout *topwidgetLayout = new QHBoxLayout; - topwidgetLayout->setMargin(0); - topwidgetLayout->setSpacing(0); - topwidget->setLayout(topwidgetLayout); + // We want a 800px wide widget with and the scrollbar at the + // side of the screen. + m_root->setMaximumWidth(800); + // The layout holding the individual panels: + m_layout = new QGridLayout; + m_layout->setColumnMinimumWidth(0, ICON_SIZE); + + // A helper layout to glue some stretch to the button of + // the panel layout: + QVBoxLayout * vbox = new QVBoxLayout; + vbox->addLayout(m_layout); + vbox->addStretch(10); + + m_root->setLayout(vbox); + + // Add horizontal space to the left of our widget: + QHBoxLayout *hbox = new QHBoxLayout; + hbox->setMargin(0); + hbox->setSpacing(0); + + hbox->addWidget(m_root); + hbox->addStretch(10); - QWidget *verticalWidget = new QWidget; - verticalWidget->setMaximumWidth(800); - m_layout = new QVBoxLayout; - m_layout->addStretch(10); - verticalWidget->setLayout(m_layout); - topwidgetLayout->addWidget(verticalWidget); - topwidgetLayout->addStretch(10); + // create a widget to hold the scrollarea: + QWidget * scrollArea = new QWidget(); + scrollArea->setLayout(hbox); + setWidget(scrollArea); setFrameStyle(QFrame::NoFrame); setWidgetResizable(true); - - setWidget(topwidget); } PanelsWidget::~PanelsWidget() @@ -136,41 +151,92 @@ PanelsWidget::~PanelsWidget() clear(); } +/* + * Add a widget into the grid layout of the PanelsWidget. + * + * ... + * +--------+-------------------------------------------+ + * | | widget | + * +--------+-------------------------------------------+ + */ void PanelsWidget::addWidget(QWidget *widget) { Panel *p = new Panel(widget); - m_layout->insertWidget(m_layout->count() - 1, widget); + m_layout->addWidget(widget, m_layout->rowCount(), 1); m_panels.append(p); } -void PanelsWidget::addWidget(const QString &name, QWidget *widget) +/* + * Add a widget with heading information into the grid + * layout of the PanelsWidget. + * + * ... + * +--------+-------------------------------------------+ + * | | spacer | + * +--------+-------------------------------------------+ + * | icon | name | + * + +-------------------------------------------+ + * | | Line | + * + +-------------------------------------------+ + * | | widget | + * +--------+-------------------------------------------+ + */ +void PanelsWidget::addWidget(const QString &name, QWidget *widget, const QIcon & icon) { Panel *p = new Panel(widget); + + // spacer: + const int spacerRow(m_layout->rowCount()); p->spacer = new QSpacerItem(1, 10, QSizePolicy::Fixed, QSizePolicy::Fixed); - p->nameLabel = new QLabel(this); + m_layout->addItem(p->spacer, spacerRow, 1); + + // icon: + const int headerRow(spacerRow + 1); + if (!icon.isNull()) { + p->iconLabel = new QLabel(m_root); + p->iconLabel->setPixmap(icon.pixmap(ICON_SIZE, ICON_SIZE)); + m_layout->addWidget(p->iconLabel, headerRow, 0, 3, 1, Qt::AlignTop | Qt::AlignHCenter); + } + + // name: + p->nameLabel = new QLabel(m_root); p->nameLabel->setText(name); QFont f = p->nameLabel->font(); f.setBold(true); - f.setPointSizeF(f.pointSizeF() * 1.2); + f.setPointSizeF(f.pointSizeF() * 1.4); p->nameLabel->setFont(f); + m_layout->addWidget(p->nameLabel, headerRow, 1); + + // line: + const int lineRow(headerRow + 1); + p->lineWidget = new OnePixelBlackLine(m_root); + m_layout->addWidget(p->lineWidget, lineRow, 1); + + // widget: + const int widgetRow(lineRow + 1); + m_layout->addWidget(p->panelWidget, widgetRow, 1); - m_layout->insertSpacerItem(m_layout->count() - 1, p->spacer); - m_layout->insertWidget(m_layout->count() - 1, p->nameLabel); - QHBoxLayout *hboxLayout = new QHBoxLayout(); - hboxLayout->setContentsMargins(20, 0, 0, 0); - hboxLayout->addWidget(p->panelWidget); - p->marginLayout = hboxLayout; - m_layout->insertLayout(m_layout->count() -1, hboxLayout); m_panels.append(p); } +QWidget *PanelsWidget::rootWidget() const +{ + return m_root; +} + void PanelsWidget::clear() { - foreach(Panel * p, m_panels) { - if (p->spacer) - m_layout->removeItem(p->spacer); + 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); + if (p->spacer) + m_layout->removeItem(p->spacer); delete p; } m_panels.clear(); @@ -641,22 +707,32 @@ ProjectWindow::ProjectWindow(QWidget *parent) { ProjectExplorer::SessionManager *session = ProjectExplorerPlugin::instance()->session(); - m_panelsWidget = new PanelsWidget(this); - - // active configuration widget: - m_activeConfigurationWidget = new ActiveConfigurationWidget(m_panelsWidget); + // Setup overall layout: + QVBoxLayout *viewLayout = new QVBoxLayout(this); + viewLayout->setMargin(0); + viewLayout->setSpacing(0); - // spacer with line: - m_spacerBetween = new QWidget(m_panelsWidget); - QVBoxLayout *vbox = new QVBoxLayout(m_spacerBetween); - vbox->setMargin(0); - m_spacerBetween->setLayout(vbox); - vbox->addSpacerItem(new QSpacerItem(10, 15, QSizePolicy::Fixed, QSizePolicy::Fixed)); - vbox->addWidget(new OnePixelBlackLine(m_spacerBetween)); - vbox->addSpacerItem(new QSpacerItem(10, 15, QSizePolicy::Fixed, QSizePolicy::Fixed)); + // Add toolbar used everywhere + viewLayout->addWidget(new Utils::StyledBar(this)); - // project chooser: - m_projectChooser = new QWidget(m_panelsWidget); + // Setup our container for the contents: + m_panelsWidget = new PanelsWidget(this); + viewLayout->addWidget(m_panelsWidget); + + // Run and build configuration selection area: + m_activeConfigurationWidget = new ActiveConfigurationWidget(m_panelsWidget->rootWidget()); + + // Spacer and line: + m_spacerBetween = new QWidget(m_panelsWidget->rootWidget()); + QVBoxLayout *spacerVbox = new QVBoxLayout(m_spacerBetween); + spacerVbox->setMargin(0); + m_spacerBetween->setLayout(spacerVbox); + spacerVbox->addSpacerItem(new QSpacerItem(10, 15, QSizePolicy::Fixed, QSizePolicy::Fixed)); + spacerVbox->addWidget(new OnePixelBlackLine(m_spacerBetween)); + spacerVbox->addSpacerItem(new QSpacerItem(10, 15, QSizePolicy::Fixed, QSizePolicy::Fixed)); + + // Project chooser: + m_projectChooser = new QWidget(m_panelsWidget->rootWidget()); QHBoxLayout *hbox = new QHBoxLayout(m_projectChooser); hbox->setMargin(0); ProjectLabel *label = new ProjectLabel(m_projectChooser); @@ -672,14 +748,7 @@ ProjectWindow::ProjectWindow(QWidget *parent) label, SLOT(setProject(ProjectExplorer::Project*))); hbox->addWidget(changeProject); - // Overall layout: - QVBoxLayout *topLevelLayout = new QVBoxLayout(this); - topLevelLayout->setMargin(0); - topLevelLayout->setSpacing(0); - topLevelLayout->addWidget(new Utils::StyledBar(this)); - - topLevelLayout->addWidget(m_panelsWidget); - + // no projects label: m_noprojectLabel = new QLabel(this); m_noprojectLabel->setText(tr("No project loaded.")); { @@ -690,12 +759,14 @@ ProjectWindow::ProjectWindow(QWidget *parent) } m_noprojectLabel->setMargin(10); m_noprojectLabel->setAlignment(Qt::AlignTop); - topLevelLayout->addWidget(m_noprojectLabel); + viewLayout->addWidget(m_noprojectLabel); + // show either panels or no projects label: bool noProjects = session->projects().isEmpty(); m_panelsWidget->setVisible(!noProjects); m_noprojectLabel->setVisible(noProjects); + // connects: connect(changeProject, SIGNAL(projectChanged(ProjectExplorer::Project*)), this, SLOT(showProperties(ProjectExplorer::Project*))); @@ -751,7 +822,7 @@ void ProjectWindow::showProperties(Project *project) m_panels.clear(); // Set up our default panels: - m_panelsWidget->addWidget(tr("Active Build and Run Configurations"), m_activeConfigurationWidget); + m_panelsWidget->addWidget(tr("Active Build and Run Configurations"), m_activeConfigurationWidget, QIcon()); m_panelsWidget->addWidget(m_spacerBetween); m_panelsWidget->addWidget(m_projectChooser); @@ -762,7 +833,7 @@ void ProjectWindow::showProperties(Project *project) foreach (IPanelFactory *panelFactory, pages) { if (panelFactory->supports(project)) { IPropertiesPanel *panel = panelFactory->createPanel(project); - m_panelsWidget->addWidget(panel->name(), panel->widget()); + m_panelsWidget->addWidget(panel->name(), panel->widget(), panel->icon()); m_panels.push_back(panel); } } diff --git a/src/plugins/projectexplorer/projectwindow.h b/src/plugins/projectexplorer/projectwindow.h index d228f7757f85a2b4f2e643f24fd636da218fa3f6..a99e9fb66c6bb1d5e935bed0614b517fd0017894 100644 --- a/src/plugins/projectexplorer/projectwindow.h +++ b/src/plugins/projectexplorer/projectwindow.h @@ -41,7 +41,7 @@ QT_BEGIN_NAMESPACE class QLabel; -class QVBoxLayout; +class QGridLayout; class QModelIndex; class QTabWidget; class QHBoxLayout; @@ -67,7 +67,9 @@ public: ~PanelsWidget(); // Adds a widget void addWidget(QWidget *widget); - void addWidget(const QString &name, QWidget *widget); + void addWidget(const QString &name, QWidget *widget, const QIcon &icon); + + QWidget *rootWidget() const; // Removes all widgets and deletes them void clear(); @@ -79,14 +81,16 @@ private: explicit Panel(QWidget * widget); ~Panel(); - QSpacerItem *spacer; + QLabel *iconLabel; + QWidget *lineWidget; QLabel *nameLabel; QWidget *panelWidget; - QHBoxLayout *marginLayout; + QSpacerItem *spacer; }; QList<Panel *> m_panels; - - QVBoxLayout *m_layout; + + QGridLayout *m_layout; + QWidget *m_root; }; class BuildConfigurationComboBox : public QStackedWidget