Files
qt-creator/src/plugins/projectexplorer/projectwindow.cpp

362 lines
11 KiB
C++
Raw Normal View History

/**************************************************************************
2008-12-02 12:01:29 +01:00
**
** This file is part of Qt Creator
**
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2008-12-02 12:01:29 +01:00
**
** Contact: Nokia Corporation (qt-info@nokia.com)
2008-12-02 12:01:29 +01:00
**
** Commercial Usage
**
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you are unsure which license is appropriate for your use, please
2009-08-14 09:30:56 +02:00
** contact the sales department at http://qt.nokia.com/contact.
2008-12-02 12:01:29 +01:00
**
**************************************************************************/
2008-12-02 16:19:05 +01:00
2008-12-02 12:01:29 +01:00
#include "projectwindow.h"
2008-12-02 16:19:05 +01:00
2010-01-21 13:46:19 +01:00
#include "doubletabwidget.h"
2008-12-02 16:19:05 +01:00
#include "project.h"
#include "environment.h"
2008-12-02 12:01:29 +01:00
#include "projectexplorer.h"
#include "projectexplorerconstants.h"
#include "iprojectproperties.h"
#include "session.h"
#include "target.h"
2008-12-02 12:01:29 +01:00
#include "projecttreewidget.h"
#include "runconfiguration.h"
#include "buildconfiguration.h"
#include "buildsettingspropertiespage.h"
#include "runsettingspropertiespage.h"
#include "targetsettingspanel.h"
2008-12-02 12:01:29 +01:00
#include <coreplugin/minisplitter.h>
#include <coreplugin/fileiconprovider.h>
#include <coreplugin/icore.h>
#include <coreplugin/ifile.h>
#include <extensionsystem/pluginmanager.h>
#include <utils/qtcassert.h>
2009-07-16 17:34:04 +02:00
#include <utils/styledbar.h>
#include <utils/stylehelper.h>
2008-12-02 12:01:29 +01:00
#include <QtGui/QApplication>
2008-12-02 12:01:29 +01:00
#include <QtGui/QBoxLayout>
#include <QtGui/QComboBox>
#include <QtGui/QScrollArea>
#include <QtGui/QLabel>
#include <QtGui/QPainter>
#include <QtGui/QPaintEvent>
#include <QtGui/QMenu>
2008-12-02 12:01:29 +01:00
using namespace ProjectExplorer;
using namespace ProjectExplorer::Internal;
namespace {
const int ICON_SIZE(64);
const int ABOVE_HEADING_MARGIN(10);
const int ABOVE_CONTENTS_MARGIN(4);
const int BELOW_CONTENTS_MARGIN(16);
bool skipPanelFactory(Project *project, IPanelFactory *factory)
{
bool simplifyTargets(project->supportedTargetIds().count() <= 1);
if (simplifyTargets) {
// Do not show the targets list:
if (factory->id() == QLatin1String(TARGETSETTINGS_PANEL_ID))
return true;
// Skip build settigns if none are available anyway:
if (project->activeTarget() &&
!project->activeTarget()->buildConfigurationFactory() &&
factory->id() == QLatin1String(BUILDSETTINGS_PANEL_ID))
return true;
} else {
// Skip panels embedded into the targets panel:
if (factory->id() == QLatin1String(BUILDSETTINGS_PANEL_ID) ||
factory->id() == QLatin1String(RUNSETTINGS_PANEL_ID))
return true;
}
return false;
2008-12-02 12:01:29 +01:00
}
} // namespace
///
// OnePixelBlackLine
///
class OnePixelBlackLine : public QWidget
{
public:
OnePixelBlackLine(QWidget *parent)
: QWidget(parent)
{
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
setMinimumHeight(1);
setMaximumHeight(1);
}
void paintEvent(QPaintEvent *e)
{
Q_UNUSED(e);
QPainter p(this);
p.fillRect(contentsRect(), QBrush(Utils::StyleHelper::borderColor()));
}
};
///
// PanelsWidget
///
PanelsWidget::PanelsWidget(QWidget *parent) :
QScrollArea(parent),
m_root(new QWidget(this))
{
// We want a 900px wide widget with and the scrollbar at the
// side of the screen.
m_root->setFixedWidth(900);
// The layout holding the individual panels:
m_layout = new QGridLayout(m_root);
m_layout->setColumnMinimumWidth(0, ICON_SIZE + 4);
m_layout->setSpacing(0);
setWidget(m_root);
setFrameStyle(QFrame::NoFrame);
setWidgetResizable(true);
}
PanelsWidget::~PanelsWidget()
{
2010-01-21 13:46:19 +01:00
qDeleteAll(m_panels);
}
/*
* Add a widget with heading information into the grid
* layout of the PanelsWidget.
*
* ...
* +--------+-------------------------------------------+ ABOVE_HEADING_MARGIN
* | icon | name |
* + +-------------------------------------------+
* | | line |
* +--------+-------------------------------------------+ ABOVE_CONTENTS_MARGIN
* | widget (with contentsmargins adjusted!) |
* +--------+-------------------------------------------+ BELOW_CONTENTS_MARGIN
*/
2010-01-21 13:46:19 +01:00
void PanelsWidget::addPropertiesPanel(IPropertiesPanel *panel)
{
2010-01-21 13:46:19 +01:00
QTC_ASSERT(panel, return);
const int headerRow(m_layout->rowCount() - 1);
m_layout->setRowStretch(headerRow, 0);
// icon:
2010-01-21 13:46:19 +01:00
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:
2010-01-21 13:46:19 +01:00
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);
2010-01-21 13:46:19 +01:00
nameLabel->setFont(f);
m_layout->addWidget(nameLabel, headerRow, 1, 1, 1, Qt::AlignBottom | Qt::AlignLeft);
// line:
const int lineRow(headerRow + 1);
2010-01-21 13:46:19 +01:00
m_layout->addWidget(new OnePixelBlackLine(m_root), lineRow, 1);
// add the widget:
const int widgetRow(lineRow + 1);
2010-01-21 13:46:19 +01:00
addPanelWidget(panel, widgetRow);
}
2010-01-21 13:46:19 +01:00
void PanelsWidget::addPanelWidget(IPropertiesPanel *panel, int row)
{
2010-01-21 13:46:19 +01:00
QWidget *widget = panel->widget();
int leftMargin = (panel->flags() & IPropertiesPanel::NoLeftMargin)
? 0 : Constants::PANEL_LEFT_MARGIN;
widget->setContentsMargins(leftMargin,
ABOVE_CONTENTS_MARGIN, 0,
BELOW_CONTENTS_MARGIN);
2010-01-21 13:46:19 +01:00
widget->setParent(m_root);
m_layout->addWidget(widget, row, 0, 1, 2);
const int stretchRow(row + 1);
m_layout->setRowStretch(stretchRow, 10);
m_panels.append(panel);
}
///
// ProjectWindow
///
ProjectWindow::ProjectWindow(QWidget *parent)
2010-01-21 13:46:19 +01:00
: QWidget(parent),
m_currentWidget(0),
m_currentPanel(0)
2008-12-02 12:01:29 +01:00
{
ProjectExplorer::SessionManager *session = ProjectExplorerPlugin::instance()->session();
2008-12-02 12:01:29 +01:00
// Setup overall layout:
QVBoxLayout *viewLayout = new QVBoxLayout(this);
viewLayout->setMargin(0);
viewLayout->setSpacing(0);
2010-01-21 13:46:19 +01:00
m_tabWidget = new DoubleTabWidget(this);
m_tabWidget->setTitle(tr("Select a Project:"));
viewLayout->addWidget(m_tabWidget);
// Setup our container for the contents:
2010-01-21 13:46:19 +01:00
m_centralWidget = new QStackedWidget(this);
viewLayout->addWidget(m_centralWidget);
2010-01-21 13:46:19 +01:00
// 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);
}
2010-01-21 13:46:19 +01:00
label->setMargin(10);
label->setAlignment(Qt::AlignTop);
noprojectLayout->addWidget(label);
noprojectLayout->addStretch(10);
m_centralWidget->addWidget(m_noprojectLabel);
// connects:
2010-01-21 13:46:19 +01:00
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*)),
2010-01-21 13:46:19 +01:00
this, SLOT(projectAdded(ProjectExplorer::Project*)));
connect(session, SIGNAL(aboutToRemoveProject(ProjectExplorer::Project*)),
this, SLOT(aboutToRemoveProject(ProjectExplorer::Project*)));
// Update properties to empty project for now:
2010-01-21 13:46:19 +01:00
showProperties(-1, -1);
2008-12-02 12:01:29 +01:00
}
ProjectWindow::~ProjectWindow()
{
}
2010-01-21 13:46:19 +01:00
void ProjectWindow::shutdown()
{
2010-01-21 13:46:19 +01:00
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);
}
2010-01-21 13:46:19 +01:00
void ProjectWindow::projectAdded(ProjectExplorer::Project *project)
{
2010-01-21 13:46:19 +01:00
QList<Project *> projects = ProjectExplorerPlugin::instance()->session()->projects();
int index = projects.indexOf(project);
if (index < 0)
return;
2010-01-21 13:46:19 +01:00
QStringList subtabs;
foreach (IPanelFactory *panelFactory, ExtensionSystem::PluginManager::instance()->getObjects<IPanelFactory>()) {
if (skipPanelFactory(project, panelFactory))
continue;
subtabs << panelFactory->displayName();
}
2010-01-21 13:46:19 +01:00
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);
}
2008-12-02 12:01:29 +01:00
void ProjectWindow::restoreStatus()
{
// TODO
2008-12-02 12:01:29 +01:00
}
void ProjectWindow::saveStatus()
{
// TODO
2008-12-02 12:01:29 +01:00
}
2010-01-21 13:46:19 +01:00
void ProjectWindow::showProperties(int index, int subIndex)
2008-12-02 12:01:29 +01:00
{
2010-01-21 13:46:19 +01:00
if (index < 0) {
m_centralWidget->setCurrentWidget(m_noprojectLabel);
removeCurrentWidget();
2010-01-21 13:46:19 +01:00
return;
}
Project *project = m_tabIndexToProject.at(index);
2009-11-04 18:50:37 +01:00
// Set up custom panels again:
int pos = 0;
foreach (IPanelFactory *panelFactory, ExtensionSystem::PluginManager::instance()->getObjects<IPanelFactory>()) {
if (skipPanelFactory(project, panelFactory))
continue;
if (pos == subIndex) {
removeCurrentWidget();
IPropertiesPanel *panel(panelFactory->createPanel(project));
if (panel->flags() & IPropertiesPanel::NoAutomaticStyle) {
m_currentWidget = panel->widget();
m_currentPanel = panel;
} else {
PanelsWidget *panelsWidget = new PanelsWidget(m_centralWidget);
2010-01-21 13:46:19 +01:00
panelsWidget->addPropertiesPanel(panel);
m_currentWidget = panelsWidget;
2008-12-02 12:01:29 +01:00
}
m_centralWidget->addWidget(m_currentWidget);
m_centralWidget->setCurrentWidget(m_currentWidget);
break;
2010-01-21 13:46:19 +01:00
}
++pos;
2010-01-21 13:46:19 +01:00
}
}
void ProjectWindow::removeCurrentWidget()
{
if (m_currentWidget) {
m_centralWidget->removeWidget(m_currentWidget);
if (m_currentPanel) {
delete m_currentPanel;
m_currentPanel = 0;
m_currentWidget = 0; // is deleted by the panel
} else if (m_currentWidget) {
delete m_currentWidget;
m_currentWidget = 0;
2008-12-02 12:01:29 +01:00
}
}
}