forked from qt-creator/qt-creator
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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user