analyzer: fix control/dockwidget construction order

Change-Id: Id39c55617c6441b221fc321d71e73168f2b3e4bd
Reviewed-on: http://codereview.qt.nokia.com/1245
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
This commit is contained in:
hjk
2011-07-06 16:28:02 +02:00
committed by hjk
parent 38c7f981cc
commit 4823487b59

View File

@@ -170,7 +170,8 @@ public:
bool showPromptDialog(const QString &title, const QString &text, bool showPromptDialog(const QString &title, const QString &text,
const QString &stopButtonText, const QString &cancelButtonText) const; const QString &stopButtonText, const QString &cancelButtonText) const;
void addDock(Qt::DockWidgetArea area, QDockWidget *dockWidget); void activateDock(Qt::DockWidgetArea area, QDockWidget *dockWidget);
void deactivateDock(QDockWidget *dockWidget);
void addTool(IAnalyzerTool *tool, const StartModes &modes); void addTool(IAnalyzerTool *tool, const StartModes &modes);
void selectSavedTool(); void selectSavedTool();
void selectTool(IAnalyzerTool *tool, StartMode mode); void selectTool(IAnalyzerTool *tool, StartMode mode);
@@ -206,10 +207,11 @@ public:
QAction *m_stopAction; QAction *m_stopAction;
ActionContainer *m_menu; ActionContainer *m_menu;
QComboBox *m_toolBox; QComboBox *m_toolBox;
QStackedWidget *m_controlsWidget; QStackedWidget *m_controlsStackWidget;
Utils::StatusLabel *m_statusLabel; Utils::StatusLabel *m_statusLabel;
typedef QMap<IAnalyzerTool *, FancyMainWindowSettings> MainWindowSettingsMap; typedef QMap<IAnalyzerTool *, FancyMainWindowSettings> MainWindowSettingsMap;
QHash<IAnalyzerTool *, QList<QDockWidget *> > m_toolWidgets; QHash<IAnalyzerTool *, QList<QDockWidget *> > m_toolWidgets;
QHash<IAnalyzerTool *, QWidget *> m_controlsWidgetFromTool;
MainWindowSettingsMap m_defaultSettings; MainWindowSettingsMap m_defaultSettings;
// list of dock widgets to prevent memory leak // list of dock widgets to prevent memory leak
@@ -217,7 +219,6 @@ public:
QList<DockPtr> m_dockWidgets; QList<DockPtr> m_dockWidgets;
bool m_restartOnStop; bool m_restartOnStop;
bool m_handlingManualAction;
}; };
AnalyzerManagerPrivate::AnalyzerManagerPrivate(AnalyzerManager *qq): AnalyzerManagerPrivate::AnalyzerManagerPrivate(AnalyzerManager *qq):
@@ -231,13 +232,12 @@ AnalyzerManagerPrivate::AnalyzerManagerPrivate(AnalyzerManager *qq):
m_stopAction(0), m_stopAction(0),
m_menu(0), m_menu(0),
m_toolBox(new QComboBox), m_toolBox(new QComboBox),
m_controlsWidget(new QStackedWidget), m_controlsStackWidget(new QStackedWidget),
m_statusLabel(new Utils::StatusLabel), m_statusLabel(new Utils::StatusLabel),
m_restartOnStop(false), m_restartOnStop(false)
m_handlingManualAction(false)
{ {
m_toolBox->setObjectName(QLatin1String("AnalyzerManagerToolBox")); m_toolBox->setObjectName(QLatin1String("AnalyzerManagerToolBox"));
connect(m_toolBox, SIGNAL(currentIndexChanged(int)), SLOT(selectToolboxAction(int))); connect(m_toolBox, SIGNAL(activated(int)), SLOT(selectToolboxAction(int)));
setupActions(); setupActions();
@@ -344,7 +344,6 @@ void AnalyzerManagerPrivate::createModeMainWindow()
m_mainWindow->setDocumentMode(true); m_mainWindow->setDocumentMode(true);
m_mainWindow->setDockNestingEnabled(true); m_mainWindow->setDockNestingEnabled(true);
m_mainWindow->setDockActionsVisible(false); m_mainWindow->setDockActionsVisible(false);
//ModeManager::instance()->currentMode() cannot be us yet.
connect(m_mainWindow, SIGNAL(resetLayout()), SLOT(resetLayout())); connect(m_mainWindow, SIGNAL(resetLayout()), SLOT(resetLayout()));
QBoxLayout *editorHolderLayout = new QVBoxLayout; QBoxLayout *editorHolderLayout = new QVBoxLayout;
@@ -371,7 +370,7 @@ void AnalyzerManagerPrivate::createModeMainWindow()
analyzeToolBarLayout->addWidget(toolButton(m_stopAction)); analyzeToolBarLayout->addWidget(toolButton(m_stopAction));
analyzeToolBarLayout->addWidget(new Utils::StyledSeparator); analyzeToolBarLayout->addWidget(new Utils::StyledSeparator);
analyzeToolBarLayout->addWidget(m_toolBox); analyzeToolBarLayout->addWidget(m_toolBox);
analyzeToolBarLayout->addWidget(m_controlsWidget); analyzeToolBarLayout->addWidget(m_controlsStackWidget);
analyzeToolBarLayout->addWidget(m_statusLabel); analyzeToolBarLayout->addWidget(m_statusLabel);
analyzeToolBarLayout->addStretch(); analyzeToolBarLayout->addStretch();
@@ -398,7 +397,7 @@ void AnalyzerManagerPrivate::createModeMainWindow()
centralLayout->setStretch(1, 0); centralLayout->setStretch(1, 0);
} }
void AnalyzerManagerPrivate::addDock(Qt::DockWidgetArea area, QDockWidget *dockWidget) void AnalyzerManagerPrivate::activateDock(Qt::DockWidgetArea area, QDockWidget *dockWidget)
{ {
dockWidget->setParent(m_mainWindow); dockWidget->setParent(m_mainWindow);
m_mainWindow->addDockWidget(area, dockWidget); m_mainWindow->addDockWidget(area, dockWidget);
@@ -417,6 +416,17 @@ void AnalyzerManagerPrivate::addDock(Qt::DockWidgetArea area, QDockWidget *dockW
viewsMenu->addAction(cmd); viewsMenu->addAction(cmd);
} }
void AnalyzerManagerPrivate::deactivateDock(QDockWidget *dockWidget)
{
ActionManager *am = ICore::instance()->actionManager();
QAction *toggleViewAction = dockWidget->toggleViewAction();
am->unregisterAction(toggleViewAction, QString("Analyzer." + dockWidget->objectName()));
m_mainWindow->removeDockWidget(dockWidget);
dockWidget->hide();
// Prevent saveState storing the data of the wrong children.
dockWidget->setParent(0);
}
bool buildTypeAccepted(IAnalyzerTool::ToolMode toolMode, bool buildTypeAccepted(IAnalyzerTool::ToolMode toolMode,
BuildConfiguration::BuildType buildType) BuildConfiguration::BuildType buildType)
{ {
@@ -591,26 +601,18 @@ void AnalyzerManagerPrivate::selectSavedTool()
void AnalyzerManagerPrivate::selectMenuAction() void AnalyzerManagerPrivate::selectMenuAction()
{ {
if (m_handlingManualAction)
return;
m_handlingManualAction = true;
QAction *action = qobject_cast<QAction *>(sender()); QAction *action = qobject_cast<QAction *>(sender());
QTC_ASSERT(action, return); QTC_ASSERT(action, return);
IAnalyzerTool *tool = m_toolFromAction.value(action); IAnalyzerTool *tool = m_toolFromAction.value(action);
StartMode mode = m_modeFromAction.value(action); StartMode mode = m_modeFromAction.value(action);
selectTool(tool, mode); selectTool(tool, mode);
tool->startTool(mode); tool->startTool(mode);
m_handlingManualAction = false;
} }
void AnalyzerManagerPrivate::selectToolboxAction(int index) void AnalyzerManagerPrivate::selectToolboxAction(int index)
{ {
if (m_handlingManualAction)
return;
m_handlingManualAction = true;
QAction *action = m_actions[index]; QAction *action = m_actions[index];
selectTool(m_toolFromAction.value(action), m_modeFromAction.value(action)); selectTool(m_toolFromAction.value(action), m_modeFromAction.value(action));
m_handlingManualAction = false;
} }
void AnalyzerManagerPrivate::selectTool(IAnalyzerTool *tool, StartMode mode) void AnalyzerManagerPrivate::selectTool(IAnalyzerTool *tool, StartMode mode)
@@ -622,25 +624,11 @@ void AnalyzerManagerPrivate::selectTool(IAnalyzerTool *tool, StartMode mode)
const int actionIndex = m_actions.indexOf(action); const int actionIndex = m_actions.indexOf(action);
QTC_ASSERT(actionIndex >= 0, return); QTC_ASSERT(actionIndex >= 0, return);
saveToolSettings(m_currentTool, m_currentMode);
// Clean up old tool. // Clean up old tool.
if (m_currentTool) { if (m_currentTool) {
ActionManager *am = ICore::instance()->actionManager(); saveToolSettings(m_currentTool, m_currentMode);
foreach (QDockWidget *widget, m_toolWidgets.value(m_currentTool))
foreach (QDockWidget *widget, m_toolWidgets.value(m_currentTool)) { deactivateDock(widget);
QAction *toggleViewAction = widget->toggleViewAction();
am->unregisterAction(toggleViewAction,
QString("Analyzer." + widget->objectName()));
m_mainWindow->removeDockWidget(widget);
///NOTE: QMainWindow (and FancyMainWindow) just look at
/// @c findChildren<QDockWidget*>()
///if we don't do this, all kind of havoc might happen, including:
///- improper saveState/restoreState
///- improper list of qdockwidgets in popup menu
///- ...
widget->setParent(0);
}
m_currentTool->toolDeselected(); m_currentTool->toolDeselected();
} }
@@ -648,19 +636,24 @@ void AnalyzerManagerPrivate::selectTool(IAnalyzerTool *tool, StartMode mode)
m_currentTool = tool; m_currentTool = tool;
m_currentMode = mode; m_currentMode = mode;
const bool firstTime = !m_defaultSettings.contains(tool); if (!m_defaultSettings.contains(tool)) {
if (firstTime) { // First time the tool is used.
tool->initializeDockWidgets(); tool->initializeDockWidgets();
m_defaultSettings.insert(tool, m_mainWindow->saveSettings()); m_defaultSettings.insert(tool, m_mainWindow->saveSettings());
} else {
foreach (QDockWidget *widget, m_toolWidgets.value(tool)) QTC_ASSERT(!m_controlsWidgetFromTool.contains(tool), /**/);
addDock(Qt::DockWidgetArea(widget->property(INITIAL_DOCK_AREA).toInt()), widget); QWidget *widget = tool->createControlWidget();
m_controlsWidgetFromTool[tool] = widget;
m_controlsStackWidget->addWidget(widget);
} }
foreach (QDockWidget *widget, m_toolWidgets.value(tool))
activateDock(Qt::DockWidgetArea(widget->property(INITIAL_DOCK_AREA).toInt()), widget);
loadToolSettings(tool); loadToolSettings(tool);
QTC_ASSERT(m_controlsWidgetFromTool.contains(tool), /**/);
m_controlsStackWidget->setCurrentWidget(m_controlsWidgetFromTool.value(tool));
m_toolBox->setCurrentIndex(actionIndex); m_toolBox->setCurrentIndex(actionIndex);
m_controlsWidget->setCurrentIndex(actionIndex);
updateRunActions(); updateRunActions();
} }
@@ -670,7 +663,6 @@ void AnalyzerManagerPrivate::addTool(IAnalyzerTool *tool, const StartModes &mode
delayedInit(); // Make sure that there is a valid IMode instance. delayedInit(); // Make sure that there is a valid IMode instance.
const bool blocked = m_toolBox->blockSignals(true); // Do not make current. const bool blocked = m_toolBox->blockSignals(true); // Do not make current.
m_controlsWidget->addWidget(tool->createControlWidget());
ActionManager *am = Core::ICore::instance()->actionManager(); ActionManager *am = Core::ICore::instance()->actionManager();
foreach (StartMode mode, modes) { foreach (StartMode mode, modes) {
QString actionName = tool->actionName(mode); QString actionName = tool->actionName(mode);
@@ -812,7 +804,6 @@ QDockWidget *AnalyzerManager::createDockWidget(IAnalyzerTool *tool, const QStrin
d->m_dockWidgets.append(AnalyzerManagerPrivate::DockPtr(dockWidget)); d->m_dockWidgets.append(AnalyzerManagerPrivate::DockPtr(dockWidget));
dockWidget->setWindowTitle(title); dockWidget->setWindowTitle(title);
d->m_toolWidgets[tool].push_back(dockWidget); d->m_toolWidgets[tool].push_back(dockWidget);
d->addDock(area, dockWidget);
return dockWidget; return dockWidget;
} }