Update build steps related panels

* Merge BuildSettingsWidget and BuildSettingsSubWidgets. I don't
   see much need for this separation and it makes the indention harder
   to do.
 * Override contentsmargins set by the ProjectsWindow.
   This enables the toolwidget to be displayed properly.
 * Add a remove button to the toolwidget of the buildsteps. Remove the
   global one.
 * Simplify code a bit by using QSignalMapper instead of mapping signals
   manually.

Reviewed-by: dt
This commit is contained in:
Tobias Hunger
2009-11-30 16:44:22 +01:00
parent 7ebf60dce2
commit c4d1274273
4 changed files with 226 additions and 245 deletions

View File

@@ -37,18 +37,21 @@
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QtCore/QPair> #include <QtCore/QMargins>
#include <QtCore/QTimer>
#include <QtGui/QApplication> #include <QtGui/QApplication>
#include <QtGui/QComboBox>
#include <QtGui/QInputDialog> #include <QtGui/QInputDialog>
#include <QtGui/QLabel> #include <QtGui/QLabel>
#include <QtGui/QVBoxLayout>
#include <QtGui/QMenu> #include <QtGui/QMenu>
#include <QtGui/QPushButton>
#include <QtGui/QVBoxLayout>
using namespace ProjectExplorer; using namespace ProjectExplorer;
using namespace ProjectExplorer::Internal; using namespace ProjectExplorer::Internal;
/// ///
/// BuildSettingsPanelFactory // BuildSettingsPanelFactory
/// ///
bool BuildSettingsPanelFactory::supports(Project *project) bool BuildSettingsPanelFactory::supports(Project *project)
@@ -62,7 +65,7 @@ IPropertiesPanel *BuildSettingsPanelFactory::createPanel(Project *project)
} }
/// ///
/// BuildSettingsPanel // BuildSettingsPanel
/// ///
BuildSettingsPanel::BuildSettingsPanel(Project *project) : BuildSettingsPanel::BuildSettingsPanel(Project *project) :
@@ -92,74 +95,36 @@ QIcon BuildSettingsPanel::icon() const
} }
/// ///
// BuildSettingsSubWidgets // BuildSettingsWidget
///
BuildSettingsSubWidgets::~BuildSettingsSubWidgets()
{
clear();
}
void BuildSettingsSubWidgets::addWidget(const QString &name, QWidget *widget)
{
QSpacerItem *item = new QSpacerItem(1, 10, QSizePolicy::Fixed, QSizePolicy::Fixed);
QLabel *label = new QLabel(this);
label->setText(name);
QFont f = label->font();
f.setBold(true);
f.setPointSizeF(f.pointSizeF() *1.2);
label->setFont(f);
layout()->addItem(item);
layout()->addWidget(label);
layout()->addWidget(widget);
m_spacerItems.append(item);
m_labels.append(label);
m_widgets.append(widget);
}
void BuildSettingsSubWidgets::clear()
{
foreach(QSpacerItem *item, m_spacerItems)
layout()->removeItem(item);
qDeleteAll(m_spacerItems);
qDeleteAll(m_widgets);
qDeleteAll(m_labels);
m_widgets.clear();
m_labels.clear();
m_spacerItems.clear();
}
QList<QWidget *> BuildSettingsSubWidgets::widgets() const
{
return m_widgets;
}
BuildSettingsSubWidgets::BuildSettingsSubWidgets(QWidget *parent)
: QWidget(parent)
{
new QVBoxLayout(this);
layout()->setMargin(0);
}
///
/// BuildSettingsWidget
/// ///
BuildSettingsWidget::~BuildSettingsWidget() BuildSettingsWidget::~BuildSettingsWidget()
{ {
clear();
} }
BuildSettingsWidget::BuildSettingsWidget(Project *project) BuildSettingsWidget::BuildSettingsWidget(Project *project) :
: m_project(project), m_buildConfiguration(0) m_project(project),
m_buildConfiguration(0),
m_leftMargin(0)
{ {
// Provide some time for our contentsmargins to get updated:
QTimer::singleShot(0, this, SLOT(init()));
}
void BuildSettingsWidget::init()
{
QMargins margins(contentsMargins());
m_leftMargin = margins.left();
margins.setLeft(0);
setContentsMargins(margins);
QVBoxLayout *vbox = new QVBoxLayout(this); QVBoxLayout *vbox = new QVBoxLayout(this);
vbox->setContentsMargins(0, -1, 0, -1); vbox->setContentsMargins(0, 0, 0, 0);
{ // Edit Build Configuration row { // Edit Build Configuration row
QHBoxLayout *hbox = new QHBoxLayout(); QHBoxLayout *hbox = new QHBoxLayout();
hbox->setContentsMargins(m_leftMargin, 0, 0, 0);
hbox->addWidget(new QLabel(tr("Edit Build Configuration:"), this)); hbox->addWidget(new QLabel(tr("Edit Build Configuration:"), this));
m_buildConfigurationComboBox = new QComboBox(this); m_buildConfigurationComboBox = new QComboBox(this);
m_buildConfigurationComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); m_buildConfigurationComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
@@ -169,6 +134,8 @@ BuildSettingsWidget::BuildSettingsWidget(Project *project)
m_addButton->setText(tr("Add")); m_addButton->setText(tr("Add"));
m_addButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); m_addButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
hbox->addWidget(m_addButton); hbox->addWidget(m_addButton);
m_addButtonMenu = new QMenu(this);
m_addButton->setMenu(m_addButtonMenu);
m_removeButton = new QPushButton(this); m_removeButton = new QPushButton(this);
m_removeButton->setText(tr("Remove")); m_removeButton->setText(tr("Remove"));
@@ -182,13 +149,6 @@ BuildSettingsWidget::BuildSettingsWidget(Project *project)
m_makeActiveLabel->setVisible(false); m_makeActiveLabel->setVisible(false);
vbox->addWidget(m_makeActiveLabel); vbox->addWidget(m_makeActiveLabel);
m_subWidgets = new BuildSettingsSubWidgets(this);
vbox->addWidget(m_subWidgets);
m_addButtonMenu = new QMenu(this);
m_addButton->setMenu(m_addButtonMenu);
updateAddButtonMenu();
m_buildConfiguration = m_project->activeBuildConfiguration(); m_buildConfiguration = m_project->activeBuildConfiguration();
connect(m_makeActiveLabel, SIGNAL(linkActivated(QString)), connect(m_makeActiveLabel, SIGNAL(linkActivated(QString)),
@@ -201,6 +161,8 @@ BuildSettingsWidget::BuildSettingsWidget(Project *project)
this, SLOT(deleteConfiguration())); this, SLOT(deleteConfiguration()));
// TODO update on displayNameChange // TODO update on displayNameChange
// connect(m_project, SIGNAL(buildConfigurationDisplayNameChanged(const QString &)),
// this, SLOT(buildConfigurationDisplayNameChanged(const QString &)));
connect(m_project, SIGNAL(activeBuildConfigurationChanged()), connect(m_project, SIGNAL(activeBuildConfigurationChanged()),
this, SLOT(checkMakeActiveLabel())); this, SLOT(checkMakeActiveLabel()));
@@ -208,9 +170,44 @@ BuildSettingsWidget::BuildSettingsWidget(Project *project)
if (m_project->buildConfigurationFactory()) if (m_project->buildConfigurationFactory())
connect(m_project->buildConfigurationFactory(), SIGNAL(availableCreationTypesChanged()), SLOT(updateAddButtonMenu())); connect(m_project->buildConfigurationFactory(), SIGNAL(availableCreationTypesChanged()), SLOT(updateAddButtonMenu()));
updateAddButtonMenu();
updateBuildSettings(); updateBuildSettings();
} }
void BuildSettingsWidget::addSubWidget(const QString &name, QWidget *widget)
{
widget->setContentsMargins(m_leftMargin, 10, 0, 0);
QLabel *label = new QLabel(this);
label->setText(name);
QFont f = label->font();
f.setBold(true);
f.setPointSizeF(f.pointSizeF() * 1.2);
label->setFont(f);
label->setContentsMargins(m_leftMargin, 10, 0, 0);
layout()->addWidget(label);
layout()->addWidget(widget);
m_labels.append(label);
m_subWidgets.append(widget);
}
void BuildSettingsWidget::clear()
{
qDeleteAll(m_subWidgets);
m_subWidgets.clear();
qDeleteAll(m_labels);
m_labels.clear();
}
QList<QWidget *> BuildSettingsWidget::subWidgets() const
{
return m_subWidgets;
}
void BuildSettingsWidget::makeActive() void BuildSettingsWidget::makeActive()
{ {
m_project->setActiveBuildConfiguration(m_buildConfiguration); m_project->setActiveBuildConfiguration(m_buildConfiguration);
@@ -237,25 +234,25 @@ void BuildSettingsWidget::updateBuildSettings()
// Delete old tree items // Delete old tree items
bool blocked = m_buildConfigurationComboBox->blockSignals(true); bool blocked = m_buildConfigurationComboBox->blockSignals(true);
m_buildConfigurationComboBox->clear(); m_buildConfigurationComboBox->clear();
m_subWidgets->clear(); clear();
// update buttons // update buttons
m_removeButton->setEnabled(m_project->buildConfigurations().size() > 1); m_removeButton->setEnabled(m_project->buildConfigurations().size() > 1);
// Add pages // Add pages
BuildConfigWidget *generalConfigWidget = m_project->createConfigWidget(); BuildConfigWidget *generalConfigWidget = m_project->createConfigWidget();
m_subWidgets->addWidget(generalConfigWidget->displayName(), generalConfigWidget); addSubWidget(generalConfigWidget->displayName(), generalConfigWidget);
m_subWidgets->addWidget(tr("Build Steps"), new BuildStepsPage(m_project)); addSubWidget(tr("Build Steps"), new BuildStepsPage(m_project, false));
m_subWidgets->addWidget(tr("Clean Steps"), new BuildStepsPage(m_project, true)); addSubWidget(tr("Clean Steps"), new BuildStepsPage(m_project, true));
QList<BuildConfigWidget *> subConfigWidgets = m_project->subConfigWidgets(); QList<BuildConfigWidget *> subConfigWidgets = m_project->subConfigWidgets();
foreach (BuildConfigWidget *subConfigWidget, subConfigWidgets) foreach (BuildConfigWidget *subConfigWidget, subConfigWidgets)
m_subWidgets->addWidget(subConfigWidget->displayName(), subConfigWidget); addSubWidget(subConfigWidget->displayName(), subConfigWidget);
// Add tree items // Add tree items
foreach (BuildConfiguration *bc, m_project->buildConfigurations()) { foreach (BuildConfiguration *bc, m_project->buildConfigurations()) {
m_buildConfigurationComboBox->addItem(bc->displayName(), QVariant::fromValue(bc)); m_buildConfigurationComboBox->addItem(bc->displayName(), QVariant::fromValue<BuildConfiguration *>(bc));
if (bc == m_buildConfiguration) if (bc == m_buildConfiguration)
m_buildConfigurationComboBox->setCurrentIndex(m_buildConfigurationComboBox->count() - 1); m_buildConfigurationComboBox->setCurrentIndex(m_buildConfigurationComboBox->count() - 1);
} }
@@ -264,12 +261,13 @@ void BuildSettingsWidget::updateBuildSettings()
// TODO Restore position, entry from combbox // TODO Restore position, entry from combbox
// TODO? select entry from combobox ? // TODO? select entry from combobox ?
activeBuildConfigurationChanged(); activeBuildConfigurationChanged();
} }
void BuildSettingsWidget::currentIndexChanged(int index) void BuildSettingsWidget::currentIndexChanged(int index)
{ {
m_buildConfiguration = (BuildConfiguration *) m_buildConfigurationComboBox->itemData(index).value<BuildConfiguration *>(); m_buildConfiguration = m_buildConfigurationComboBox->itemData(index).value<BuildConfiguration *>();
activeBuildConfigurationChanged(); activeBuildConfigurationChanged();
} }
@@ -281,7 +279,7 @@ void BuildSettingsWidget::activeBuildConfigurationChanged()
break; break;
} }
} }
foreach (QWidget *widget, m_subWidgets->widgets()) { foreach (QWidget *widget, subWidgets()) {
if (BuildConfigWidget *buildStepWidget = qobject_cast<BuildConfigWidget*>(widget)) { if (BuildConfigWidget *buildStepWidget = qobject_cast<BuildConfigWidget*>(widget)) {
buildStepWidget->init(m_buildConfiguration); buildStepWidget->init(m_buildConfiguration);
} }
@@ -311,14 +309,14 @@ void BuildSettingsWidget::createConfiguration()
void BuildSettingsWidget::cloneConfiguration() void BuildSettingsWidget::cloneConfiguration()
{ {
int index = m_buildConfigurationComboBox->currentIndex(); const int index = m_buildConfigurationComboBox->currentIndex();
BuildConfiguration *bc = m_buildConfigurationComboBox->itemData(index).value<BuildConfiguration *>(); BuildConfiguration *bc = m_buildConfigurationComboBox->itemData(index).value<BuildConfiguration *>();
cloneConfiguration(bc); cloneConfiguration(bc);
} }
void BuildSettingsWidget::deleteConfiguration() void BuildSettingsWidget::deleteConfiguration()
{ {
int index = m_buildConfigurationComboBox->currentIndex(); const int index = m_buildConfigurationComboBox->currentIndex();
BuildConfiguration *bc = m_buildConfigurationComboBox->itemData(index).value<BuildConfiguration *>(); BuildConfiguration *bc = m_buildConfigurationComboBox->itemData(index).value<BuildConfiguration *>();
deleteConfiguration(bc); deleteConfiguration(bc);
} }
@@ -328,7 +326,7 @@ void BuildSettingsWidget::cloneConfiguration(BuildConfiguration *sourceConfigura
if (!sourceConfiguration) if (!sourceConfiguration)
return; return;
QString newDisplayName = QInputDialog::getText(this, tr("Clone configuration"), tr("New Configuration Name:")); QString newDisplayName(QInputDialog::getText(this, tr("Clone configuration"), tr("New Configuration Name:")));
if (newDisplayName.isEmpty()) if (newDisplayName.isEmpty())
return; return;

View File

@@ -32,35 +32,22 @@
#include "iprojectproperties.h" #include "iprojectproperties.h"
#include <QtCore/QHash> #include <QtGui/QWidget>
#include <QtGui/QComboBox>
#include <QtGui/QPushButton> QT_BEGIN_NAMESPACE
#include <QtGui/QLabel> class QComboBox;
#include <QtGui/QGroupBox> class QLabel;
#include <QtGui/QSpacerItem> class QMenu;
class QPushButton;
QT_END_NAMESPACE
namespace ProjectExplorer { namespace ProjectExplorer {
class IBuildStepFactory;
class BuildConfiguration; class BuildConfiguration;
class IBuildStepFactory;
namespace Internal { namespace Internal {
class BuildSettingsSubWidgets : public QWidget
{
Q_OBJECT
public:
BuildSettingsSubWidgets(QWidget *parent);
~BuildSettingsSubWidgets();
void clear();
void addWidget(const QString &name, QWidget *widget);
QList<QWidget *> widgets() const;
private:
QList<QWidget *> m_widgets;
QList<QLabel *> m_labels;
QList<QSpacerItem *> m_spacerItems;
};
class BuildSettingsPanelFactory : public IPanelFactory class BuildSettingsPanelFactory : public IPanelFactory
{ {
public: public:
@@ -93,6 +80,10 @@ public:
BuildSettingsWidget(Project *project); BuildSettingsWidget(Project *project);
~BuildSettingsWidget(); ~BuildSettingsWidget();
void clear();
void addSubWidget(const QString &name, QWidget *widget);
QList<QWidget *> subWidgets() const;
private slots: private slots:
void updateBuildSettings(); void updateBuildSettings();
void currentIndexChanged(int index); void currentIndexChanged(int index);
@@ -105,18 +96,25 @@ private slots:
void checkMakeActiveLabel(); void checkMakeActiveLabel();
void makeActive(); void makeActive();
void init();
private: private:
void cloneConfiguration(ProjectExplorer::BuildConfiguration *toClone); void cloneConfiguration(BuildConfiguration *toClone);
void deleteConfiguration(ProjectExplorer::BuildConfiguration *toDelete); void deleteConfiguration(BuildConfiguration *toDelete);
Project *m_project; Project *m_project;
BuildConfiguration *m_buildConfiguration;
QPushButton *m_addButton; QPushButton *m_addButton;
QPushButton *m_removeButton; QPushButton *m_removeButton;
QComboBox *m_buildConfigurationComboBox; QComboBox *m_buildConfigurationComboBox;
BuildSettingsSubWidgets *m_subWidgets;
BuildConfiguration *m_buildConfiguration;
QMenu *m_addButtonMenu; QMenu *m_addButtonMenu;
QLabel *m_makeActiveLabel; QLabel *m_makeActiveLabel;
QList<QWidget *> m_subWidgets;
QList<QLabel *> m_labels;
int m_leftMargin;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -28,13 +28,14 @@
**************************************************************************/ **************************************************************************/
#include "buildstepspage.h" #include "buildstepspage.h"
#include "project.h"
#include "buildconfiguration.h" #include "buildconfiguration.h"
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QtCore/QSignalMapper>
#include <QtGui/QLabel> #include <QtGui/QLabel>
#include <QtGui/QPushButton> #include <QtGui/QPushButton>
#include <QtGui/QMenu> #include <QtGui/QMenu>
@@ -47,40 +48,11 @@ using namespace ProjectExplorer::Internal;
BuildStepsPage::BuildStepsPage(Project *project, bool clean) : BuildStepsPage::BuildStepsPage(Project *project, bool clean) :
BuildConfigWidget(), BuildConfigWidget(),
m_clean(clean) m_clean(clean),
m_addButton(0),
m_leftMargin(-1)
{ {
Q_UNUSED(project) Q_UNUSED(project);
m_vbox = new QVBoxLayout(this);
m_vbox->setContentsMargins(0, 0, 0, 0);
m_vbox->setSpacing(0);
m_noStepsLabel = new QLabel(tr("No Build Steps"), this);
m_vbox->addWidget(m_noStepsLabel);
QHBoxLayout *hboxLayout = new QHBoxLayout();
m_addButton = new QPushButton(this);
m_addButton->setText(clean ? tr("Add clean step") : tr("Add build step"));
m_addButton->setMenu(new QMenu(this));
hboxLayout->addWidget(m_addButton);
m_removeButton = new QPushButton(this);
m_removeButton->setText(clean ? tr("Remove clean step") : tr("Remove build step"));
m_removeButton->setMenu(new QMenu(this));
hboxLayout->addWidget(m_removeButton);
hboxLayout->addStretch(10);
#ifdef Q_OS_MAC
m_addButton->setAttribute(Qt::WA_MacSmallSize);
m_removeButton->setAttribute(Qt::WA_MacSmallSize);
#endif
m_vbox->addLayout(hboxLayout);
connect(m_addButton->menu(), SIGNAL(aboutToShow()),
this, SLOT(updateAddBuildStepMenu()));
connect(m_removeButton->menu(), SIGNAL(aboutToShow()),
this, SLOT(updateRemoveBuildStepMenu()));
} }
BuildStepsPage::~BuildStepsPage() BuildStepsPage::~BuildStepsPage()
@@ -112,6 +84,10 @@ QString BuildStepsPage::displayName() const
void BuildStepsPage::init(BuildConfiguration *bc) void BuildStepsPage::init(BuildConfiguration *bc)
{ {
QTC_ASSERT(bc, return);
setupUi();
foreach(BuildStepsWidgetStruct s, m_buildSteps) { foreach(BuildStepsWidgetStruct s, m_buildSteps) {
delete s.widget; delete s.widget;
delete s.detailsWidget; delete s.detailsWidget;
@@ -120,7 +96,7 @@ void BuildStepsPage::init(BuildConfiguration *bc)
m_configuration = bc; m_configuration = bc;
const QList<BuildStep *> &steps = m_clean ? bc->cleanSteps() : bc->buildSteps(); const QList<BuildStep *> &steps = m_clean ? m_configuration->cleanSteps() : m_configuration->buildSteps();
int i = 0; int i = 0;
foreach (BuildStep *bs, steps) { foreach (BuildStep *bs, steps) {
addBuildStepWidget(i, bs); addBuildStepWidget(i, bs);
@@ -128,7 +104,6 @@ void BuildStepsPage::init(BuildConfiguration *bc)
} }
m_noStepsLabel->setVisible(steps.isEmpty()); m_noStepsLabel->setVisible(steps.isEmpty());
m_removeButton->setEnabled(!steps.isEmpty());
// make sure widget is updated // make sure widget is updated
foreach(BuildStepsWidgetStruct s, m_buildSteps) { foreach(BuildStepsWidgetStruct s, m_buildSteps) {
@@ -143,7 +118,7 @@ void BuildStepsPage::updateAddBuildStepMenu()
QMap<QString, QPair<QString, IBuildStepFactory *> > map; QMap<QString, QPair<QString, IBuildStepFactory *> > map;
//Build up a list of possible steps and save map the display names to the (internal) name and factories. //Build up a list of possible steps and save map the display names to the (internal) name and factories.
QList<IBuildStepFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IBuildStepFactory>(); QList<IBuildStepFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IBuildStepFactory>();
foreach (IBuildStepFactory * factory, factories) { foreach (IBuildStepFactory *factory, factories) {
QStringList names = factory->canCreateForBuildConfiguration(m_configuration); QStringList names = factory->canCreateForBuildConfiguration(m_configuration);
foreach (const QString &name, names) { foreach (const QString &name, names) {
map.insert(factory->displayNameForName(name), QPair<QString, IBuildStepFactory *>(name, factory)); map.insert(factory->displayNameForName(name), QPair<QString, IBuildStepFactory *>(name, factory));
@@ -188,114 +163,57 @@ void BuildStepsPage::addBuildStepWidget(int pos, BuildStep *step)
s.upButton->setIconSize(QSize(10, 10)); s.upButton->setIconSize(QSize(10, 10));
s.downButton->setIconSize(QSize(10, 10)); s.downButton->setIconSize(QSize(10, 10));
#endif #endif
s.removeButton = new QPushButton(this);
s.removeButton->setText(QChar('X'));
s.removeButton->setMaximumHeight(22);
s.removeButton->setMaximumWidth(22);
// layout // layout
QWidget *toolWidget = new QWidget(s.detailsWidget); QWidget *toolWidget = new QWidget(s.detailsWidget);
toolWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); toolWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
s.hbox = new QHBoxLayout(toolWidget); QHBoxLayout *hbox = new QHBoxLayout();
s.hbox->setMargin(0); toolWidget->setLayout(hbox);
s.hbox->setSpacing(0); hbox->setMargin(0);
s.hbox->addWidget(s.upButton); hbox->setSpacing(0);
s.hbox->addWidget(s.downButton); hbox->addWidget(s.upButton);
hbox->addWidget(s.downButton);
hbox->addWidget(s.removeButton);
s.detailsWidget->setToolWidget(toolWidget); s.detailsWidget->setToolWidget(toolWidget);
const int leftMargin(qMax(m_leftMargin - toolWidget->width(), 0));
s.detailsWidget->setContentsMargins(leftMargin, 0, 0, 1);
m_buildSteps.insert(pos, s); m_buildSteps.insert(pos, s);
m_vbox->insertWidget(pos, s.detailsWidget); m_vbox->insertWidget(pos, s.detailsWidget);
connect(s.widget, SIGNAL(updateSummary()), connect(s.widget, SIGNAL(updateSummary()),
this, SLOT(updateSummary())); this, SLOT(updateSummary()));
connect(s.upButton, SIGNAL(clicked()), connect(s.upButton, SIGNAL(clicked()),
this, SLOT(upBuildStep())); m_upMapper, SLOT(map()));
connect(s.downButton, SIGNAL(clicked()), connect(s.downButton, SIGNAL(clicked()),
this, SLOT(downBuildStep())); m_downMapper, SLOT(map()));
connect(s.removeButton, SIGNAL(clicked()),
m_removeMapper, SLOT(map()));
} }
void BuildStepsPage::addBuildStep() void BuildStepsPage::addBuildStep()
{ {
if (QAction *action = qobject_cast<QAction *>(sender())) { if (QAction *action = qobject_cast<QAction *>(sender())) {
BuildConfiguration *bc = m_configuration;
QPair<QString, IBuildStepFactory *> pair = m_addBuildStepHash.value(action); QPair<QString, IBuildStepFactory *> pair = m_addBuildStepHash.value(action);
BuildStep *newStep = pair.second->create(bc, pair.first); BuildStep *newStep = pair.second->create(m_configuration, pair.first);
int pos = m_clean ? bc->cleanSteps().count() : bc->buildSteps().count(); int pos = m_clean ? m_configuration->cleanSteps().count() : m_configuration->buildSteps().count();
m_clean ? bc->insertCleanStep(pos, newStep) : bc->insertBuildStep(pos, newStep); m_clean ? m_configuration->insertCleanStep(pos, newStep) : m_configuration->insertBuildStep(pos, newStep);
addBuildStepWidget(pos, newStep); addBuildStepWidget(pos, newStep);
const BuildStepsWidgetStruct s = m_buildSteps.at(pos); const BuildStepsWidgetStruct s = m_buildSteps.at(pos);
s.widget->init(); s.widget->init();
s.detailsWidget->setSummaryText(s.widget->summaryText()); s.detailsWidget->setSummaryText(s.widget->summaryText());
s.detailsWidget->setExpanded(true);
} }
updateBuildStepButtonsState();
}
void BuildStepsPage::updateRemoveBuildStepMenu()
{
QMenu *menu = m_removeButton->menu();
menu->clear();
const QList<BuildStep *> &steps = m_clean ? m_configuration->cleanSteps() : m_configuration->buildSteps();
foreach(BuildStep *step, steps) {
QAction *action = menu->addAction(step->displayName());
if (step->immutable())
action->setEnabled(false);
connect(action, SIGNAL(triggered()),
this, SLOT(removeBuildStep()));
}
}
void BuildStepsPage::removeBuildStep()
{
QAction *action = qobject_cast<QAction *>(sender());
if (action) {
int pos = m_removeButton->menu()->actions().indexOf(action);
const QList<BuildStep *> &steps = m_clean ? m_configuration->cleanSteps() : m_configuration->buildSteps();
if (steps.at(pos)->immutable())
return;
BuildStepsWidgetStruct s = m_buildSteps.at(pos);
delete s.widget;
delete s.detailsWidget;
m_buildSteps.removeAt(pos);
m_clean ? m_configuration->removeCleanStep(pos) : m_configuration->removeBuildStep(pos);
}
updateBuildStepButtonsState();
}
void BuildStepsPage::upBuildStep()
{
int pos = -1;
QToolButton *tb = qobject_cast<QToolButton *>(sender());
if (!tb)
return;
for (int i=0; i<m_buildSteps.count(); ++i) {
if (m_buildSteps.at(i).upButton == tb) {
pos = i;
break;
}
}
if (pos == -1)
return;
stepMoveUp(pos);
updateBuildStepButtonsState();
}
void BuildStepsPage::downBuildStep()
{
int pos = -1;
QToolButton *tb = qobject_cast<QToolButton *>(sender());
if (!tb)
return;
for (int i=0; i<m_buildSteps.count(); ++i) {
if (m_buildSteps.at(i).downButton == tb) {
pos = i;
break;
}
}
if (pos == -1)
return;
stepMoveUp(pos + 1);
updateBuildStepButtonsState(); updateBuildStepButtonsState();
} }
@@ -305,19 +223,84 @@ void BuildStepsPage::stepMoveUp(int pos)
m_vbox->insertWidget(pos - 1, m_buildSteps.at(pos).detailsWidget); m_vbox->insertWidget(pos - 1, m_buildSteps.at(pos).detailsWidget);
BuildStepsWidgetStruct tmp = m_buildSteps.at(pos -1); m_buildSteps.swap(pos - 1, pos);
m_buildSteps[pos -1] = m_buildSteps.at(pos);
m_buildSteps[pos] = tmp; updateBuildStepButtonsState();
}
void BuildStepsPage::stepMoveDown(int pos)
{
stepMoveUp(pos + 1);
}
void BuildStepsPage::stepRemove(int pos)
{
BuildStepsWidgetStruct s = m_buildSteps.at(pos);
delete s.widget;
delete s.detailsWidget;
m_buildSteps.removeAt(pos);
m_clean ? m_configuration->removeCleanStep(pos) : m_configuration->removeBuildStep(pos);
updateBuildStepButtonsState();
}
void BuildStepsPage::setupUi()
{
if (0 != m_addButton)
return;
QMargins margins(contentsMargins());
m_leftMargin = margins.left();
margins.setLeft(0);
setContentsMargins(margins);
m_upMapper = new QSignalMapper(this);
connect(m_upMapper, SIGNAL(mapped(int)),
this, SLOT(stepMoveUp(int)));
m_downMapper = new QSignalMapper(this);
connect(m_downMapper, SIGNAL(mapped(int)),
this, SLOT(stepMoveDown(int)));
m_removeMapper = new QSignalMapper(this);
connect(m_removeMapper, SIGNAL(mapped(int)),
this, SLOT(stepRemove(int)));
m_vbox = new QVBoxLayout(this);
m_vbox->setContentsMargins(0, 0, 0, 0);
m_vbox->setSpacing(0);
m_noStepsLabel = new QLabel(tr("No Build Steps"), this);
m_noStepsLabel->setContentsMargins(m_leftMargin, 0, 0, 0);
m_vbox->addWidget(m_noStepsLabel);
QHBoxLayout *hboxLayout = new QHBoxLayout();
hboxLayout->setContentsMargins(m_leftMargin, 4, 0, 0);
m_addButton = new QPushButton(this);
m_addButton->setText(m_clean ? tr("Add clean step") : tr("Add build step"));
m_addButton->setMenu(new QMenu(this));
hboxLayout->addWidget(m_addButton);
hboxLayout->addStretch(10);
#ifdef Q_OS_MAC
m_addButton->setAttribute(Qt::WA_MacSmallSize);
#endif
m_vbox->addLayout(hboxLayout);
connect(m_addButton->menu(), SIGNAL(aboutToShow()),
this, SLOT(updateAddBuildStepMenu()));
} }
void BuildStepsPage::updateBuildStepButtonsState() void BuildStepsPage::updateBuildStepButtonsState()
{ {
const QList<BuildStep *> &steps = m_clean ? m_configuration->cleanSteps() : m_configuration->buildSteps(); const QList<BuildStep *> &steps = m_clean ? m_configuration->cleanSteps() : m_configuration->buildSteps();
for(int i=0; i<m_buildSteps.count(); ++i) { for(int i = 0; i < m_buildSteps.count(); ++i) {
BuildStepsWidgetStruct s = m_buildSteps.at(i); BuildStepsWidgetStruct s = m_buildSteps.at(i);
s.upButton->setEnabled((i>0) && !(steps.at(i)->immutable() && steps.at(i - 1))); s.removeButton->setEnabled(!steps.at(i)->immutable());
s.downButton->setEnabled((i + 1< steps.count()) && !(steps.at(i)->immutable() && steps.at(i + 1)->immutable())); m_removeMapper->setMapping(s.removeButton, i);
s.upButton->setEnabled((i > 0) && !(steps.at(i)->immutable() && steps.at(i - 1)));
m_upMapper->setMapping(s.upButton, i);
s.downButton->setEnabled((i + 1 < steps.count()) && !(steps.at(i)->immutable() && steps.at(i + 1)->immutable()));
m_downMapper->setMapping(s.downButton, i);
} }
m_noStepsLabel->setVisible(steps.isEmpty());
m_removeButton->setEnabled(!steps.isEmpty());
} }

View File

@@ -34,18 +34,17 @@
#include <utils/detailswidget.h> #include <utils/detailswidget.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QTreeWidgetItem;
class QHBoxLayout;
class QPushButton; class QPushButton;
class QAbstractButton;
class QToolButton; class QToolButton;
class QLabel; class QLabel;
class QVBoxLayout; class QVBoxLayout;
class QSignalMapper;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace ProjectExplorer { namespace ProjectExplorer {
class Project; class Project;
class BuildConfiguration;
namespace Internal { namespace Internal {
@@ -59,7 +58,7 @@ struct BuildStepsWidgetStruct
Utils::DetailsWidget *detailsWidget; Utils::DetailsWidget *detailsWidget;
QToolButton *upButton; QToolButton *upButton;
QToolButton *downButton; QToolButton *downButton;
QHBoxLayout *hbox; QPushButton *removeButton;
}; };
class BuildStepsPage : public BuildConfigWidget class BuildStepsPage : public BuildConfigWidget
@@ -76,29 +75,32 @@ public:
private slots: private slots:
void updateAddBuildStepMenu(); void updateAddBuildStepMenu();
void addBuildStep(); void addBuildStep();
void updateRemoveBuildStepMenu();
void removeBuildStep();
void upBuildStep();
void downBuildStep();
void updateSummary(); void updateSummary();
void stepMoveUp(int pos);
void stepMoveDown(int pos);
void stepRemove(int pos);
private: private:
void stepMoveUp(int pos); void setupUi();
void updateBuildStepButtonsState(); void updateBuildStepButtonsState();
void addBuildStepWidget(int pos, BuildStep *step); void addBuildStepWidget(int pos, BuildStep *step);
BuildConfiguration *m_configuration; BuildConfiguration * m_configuration;
QHash<QAction *, QPair<QString, ProjectExplorer::IBuildStepFactory *> > m_addBuildStepHash; QHash<QAction *, QPair<QString, ProjectExplorer::IBuildStepFactory *> > m_addBuildStepHash;
bool m_clean; bool m_clean;
QList<QHBoxLayout *> m_titleLayouts;
QList<BuildStepsWidgetStruct> m_buildSteps; QList<BuildStepsWidgetStruct> m_buildSteps;
QVBoxLayout *m_vbox; QVBoxLayout *m_vbox;
QLabel *m_noStepsLabel; QLabel *m_noStepsLabel;
QPushButton *m_addButton; QPushButton *m_addButton;
QPushButton *m_removeButton;
QSignalMapper *m_upMapper;
QSignalMapper *m_downMapper;
QSignalMapper *m_removeMapper;
int m_leftMargin;
}; };
} // Internal } // Internal