Improve memory management in project window.

* Panel struct does no longer take ownership of its widget.
 * Panels consitently delete their widget in their destructor.

Reviewed-By: dt
This commit is contained in:
Tobias Hunger
2009-11-25 15:18:51 +01:00
parent 97ad692684
commit fbcd670854
6 changed files with 55 additions and 68 deletions

View File

@@ -73,7 +73,7 @@ BuildSettingsPanel::BuildSettingsPanel(Project *project)
BuildSettingsPanel::~BuildSettingsPanel() BuildSettingsPanel::~BuildSettingsPanel()
{ {
delete m_widget;
} }
QString BuildSettingsPanel::name() const QString BuildSettingsPanel::name() const

View File

@@ -283,7 +283,7 @@ DependenciesPanel::DependenciesPanel(SessionManager *session, Project *project)
DependenciesPanel::~DependenciesPanel() DependenciesPanel::~DependenciesPanel()
{ {
delete m_widget;
} }
QString DependenciesPanel::name() const QString DependenciesPanel::name() const

View File

@@ -55,7 +55,7 @@ EditorSettingsPanel::EditorSettingsPanel(Project *project)
EditorSettingsPanel::~EditorSettingsPanel() EditorSettingsPanel::~EditorSettingsPanel()
{ {
delete m_widget;
} }
QString EditorSettingsPanel::name() const QString EditorSettingsPanel::name() const

View File

@@ -89,6 +89,21 @@ public:
} }
}; };
///
// PanelsWidget::Panel
///
PanelsWidget::Panel::Panel(QWidget * w) :
spacer(0), nameLabel(0), panelWidget(w), marginLayout(0)
{ }
PanelsWidget::Panel::~Panel()
{
delete spacer;
delete nameLabel;
delete marginLayout;
}
/// ///
// PanelsWidget // PanelsWidget
/// ///
@@ -123,76 +138,44 @@ PanelsWidget::~PanelsWidget()
void PanelsWidget::addWidget(QWidget *widget) void PanelsWidget::addWidget(QWidget *widget)
{ {
Panel p; Panel *p = new Panel(widget);
p.spacer = 0;
p.nameLabel = 0;
p.panelWidget = widget;
p.marginLayout = 0;
m_layout->insertWidget(m_layout->count() - 1, widget); m_layout->insertWidget(m_layout->count() - 1, widget);
m_panels.append(p); m_panels.append(p);
} }
void PanelsWidget::addWidget(const QString &name, QWidget *widget) void PanelsWidget::addWidget(const QString &name, QWidget *widget)
{ {
Panel *p = new Panel(widget);
p->spacer = new QSpacerItem(1, 10, QSizePolicy::Fixed, QSizePolicy::Fixed);
Panel p; p->nameLabel = new QLabel(this);
p.spacer = new QSpacerItem(1, 10, QSizePolicy::Fixed, QSizePolicy::Fixed); p->nameLabel->setText(name);
p.nameLabel = new QLabel(this); QFont f = p->nameLabel->font();
p.nameLabel->setText(name);
QFont f = p.nameLabel->font();
f.setBold(true); f.setBold(true);
f.setPointSizeF(f.pointSizeF() * 1.2); f.setPointSizeF(f.pointSizeF() * 1.2);
p.nameLabel->setFont(f); p->nameLabel->setFont(f);
p.panelWidget = widget; m_layout->insertSpacerItem(m_layout->count() - 1, p->spacer);
m_layout->insertWidget(m_layout->count() - 1, p->nameLabel);
m_layout->insertSpacerItem(m_layout->count() - 1, p.spacer);
m_layout->insertWidget(m_layout->count() - 1, p.nameLabel);
QHBoxLayout *hboxLayout = new QHBoxLayout(); QHBoxLayout *hboxLayout = new QHBoxLayout();
hboxLayout->setContentsMargins(20, 0, 0, 0); hboxLayout->setContentsMargins(20, 0, 0, 0);
hboxLayout->addWidget(p.panelWidget); hboxLayout->addWidget(p->panelWidget);
p.marginLayout = hboxLayout; p->marginLayout = hboxLayout;
m_layout->insertLayout(m_layout->count() -1, hboxLayout); m_layout->insertLayout(m_layout->count() -1, hboxLayout);
m_panels.append(p); m_panels.append(p);
} }
void PanelsWidget::clear() void PanelsWidget::clear()
{ {
foreach(Panel p, m_panels) { foreach(Panel * p, m_panels) {
if (p.spacer) { if (p->spacer)
m_layout->removeItem(p.spacer); m_layout->removeItem(p->spacer);
delete p.spacer; if (p->nameLabel)
} m_layout->removeWidget(p->nameLabel);
delete p.nameLabel; delete p;
delete p.panelWidget;
delete p.marginLayout;
} }
m_panels.clear(); m_panels.clear();
} }
void PanelsWidget::removeWidget(QWidget *widget)
{
for(int i=0; i<m_panels.count(); ++i) {
const Panel & p = m_panels.at(i);
if (p.panelWidget == widget) {
if (p.spacer) {
m_layout->removeItem(p.spacer);
delete p.spacer;
}
if (p.marginLayout)
p.marginLayout->removeWidget(p.panelWidget);
else
m_layout->removeWidget(p.panelWidget);
delete p.nameLabel;
delete p.marginLayout;
m_panels.removeAt(i);
break;
}
}
}
//// ////
// ActiveConfigurationWidget // ActiveConfigurationWidget
//// ////
@@ -662,11 +645,11 @@ ProjectWindow::ProjectWindow(QWidget *parent)
m_panelsWidget = new PanelsWidget(this); m_panelsWidget = new PanelsWidget(this);
// active configuration widget:
m_activeConfigurationWidget = new ActiveConfigurationWidget(m_panelsWidget); m_activeConfigurationWidget = new ActiveConfigurationWidget(m_panelsWidget);
m_panelsWidget->addWidget(tr("Active Build and Run Configurations"), m_activeConfigurationWidget); // spacer with line:
m_spacerBetween = new QWidget(m_panelsWidget);
m_spacerBetween = new QWidget(this);
QVBoxLayout *vbox = new QVBoxLayout(m_spacerBetween); QVBoxLayout *vbox = new QVBoxLayout(m_spacerBetween);
vbox->setMargin(0); vbox->setMargin(0);
m_spacerBetween->setLayout(vbox); m_spacerBetween->setLayout(vbox);
@@ -674,8 +657,7 @@ ProjectWindow::ProjectWindow(QWidget *parent)
vbox->addWidget(new OnePixelBlackLine(m_spacerBetween)); vbox->addWidget(new OnePixelBlackLine(m_spacerBetween));
vbox->addSpacerItem(new QSpacerItem(10, 15, QSizePolicy::Fixed, QSizePolicy::Fixed)); vbox->addSpacerItem(new QSpacerItem(10, 15, QSizePolicy::Fixed, QSizePolicy::Fixed));
m_panelsWidget->addWidget(m_spacerBetween); // project chooser:
m_projectChooser = new QWidget(m_panelsWidget); m_projectChooser = new QWidget(m_panelsWidget);
QHBoxLayout *hbox = new QHBoxLayout(m_projectChooser); QHBoxLayout *hbox = new QHBoxLayout(m_projectChooser);
hbox->setMargin(0); hbox->setMargin(0);
@@ -692,8 +674,7 @@ ProjectWindow::ProjectWindow(QWidget *parent)
label, SLOT(setProject(ProjectExplorer::Project*))); label, SLOT(setProject(ProjectExplorer::Project*)));
hbox->addWidget(changeProject); hbox->addWidget(changeProject);
m_panelsWidget->addWidget(m_projectChooser); // Overall layout:
QVBoxLayout *topLevelLayout = new QVBoxLayout(this); QVBoxLayout *topLevelLayout = new QVBoxLayout(this);
topLevelLayout->setMargin(0); topLevelLayout->setMargin(0);
topLevelLayout->setSpacing(0); topLevelLayout->setSpacing(0);
@@ -727,6 +708,9 @@ ProjectWindow::ProjectWindow(QWidget *parent)
this, SLOT(projectAdded())); this, SLOT(projectAdded()));
connect(session, SIGNAL(projectRemoved(ProjectExplorer::Project*)), connect(session, SIGNAL(projectRemoved(ProjectExplorer::Project*)),
this, SLOT(projectRemoved())); this, SLOT(projectRemoved()));
// Update properties to empty project for now:
showProperties(0);
} }
ProjectWindow::~ProjectWindow() ProjectWindow::~ProjectWindow()
@@ -764,20 +748,19 @@ void ProjectWindow::showProperties(Project *project)
if (debug) if (debug)
qDebug() << "ProjectWindow - showProperties called"; qDebug() << "ProjectWindow - showProperties called";
m_panelsWidget->removeWidget(m_activeConfigurationWidget); // Remove all existing panels:
m_panelsWidget->removeWidget(m_spacerBetween);
m_panelsWidget->removeWidget(m_projectChooser);
// Remove the tabs from the tab widget first
m_panelsWidget->clear(); m_panelsWidget->clear();
// delete custom panels:
qDeleteAll(m_panels); qDeleteAll(m_panels);
m_panels.clear(); m_panels.clear();
// Set up our default panels again:
m_panelsWidget->addWidget(tr("Active Build and Run Configurations"), m_activeConfigurationWidget); m_panelsWidget->addWidget(tr("Active Build and Run Configurations"), m_activeConfigurationWidget);
m_panelsWidget->addWidget(m_spacerBetween); m_panelsWidget->addWidget(m_spacerBetween);
m_panelsWidget->addWidget(m_projectChooser); m_panelsWidget->addWidget(m_projectChooser);
// Set up custom panels again:
if (project) { if (project) {
QList<IPanelFactory *> pages = QList<IPanelFactory *> pages =
ExtensionSystem::PluginManager::instance()->getObjects<IPanelFactory>(); ExtensionSystem::PluginManager::instance()->getObjects<IPanelFactory>();

View File

@@ -68,21 +68,25 @@ public:
// Adds a widget // Adds a widget
void addWidget(QWidget *widget); void addWidget(QWidget *widget);
void addWidget(const QString &name, QWidget *widget); void addWidget(const QString &name, QWidget *widget);
void removeWidget(QWidget *widget);
// Removes all widgets and deletes them // Removes all widgets and deletes them
void clear(); void clear();
private:
private:
struct Panel struct Panel
{ {
// This does not take ownership of widget!
explicit Panel(QWidget * widget);
~Panel();
QSpacerItem *spacer; QSpacerItem *spacer;
QLabel *nameLabel; QLabel *nameLabel;
QWidget *panelWidget; QWidget *panelWidget;
QHBoxLayout *marginLayout; QHBoxLayout *marginLayout;
}; };
QList<Panel *> m_panels;
QVBoxLayout *m_layout; QVBoxLayout *m_layout;
QList<Panel> m_panels;
}; };
class BuildConfigurationComboBox : public QStackedWidget class BuildConfigurationComboBox : public QStackedWidget

View File

@@ -111,7 +111,7 @@ RunSettingsPanel::RunSettingsPanel(Project *project)
RunSettingsPanel::~RunSettingsPanel() RunSettingsPanel::~RunSettingsPanel()
{ {
delete m_widget;
} }
QString RunSettingsPanel::name() const QString RunSettingsPanel::name() const