Core: Swap ICore/MainWindow "ownership"

Change-Id: Iba387781624d88f814293af0f7b7ed697da1d822
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2023-10-02 17:27:26 +02:00
parent d0f2d8dd35
commit 58efc778f5

View File

@@ -230,8 +230,13 @@ namespace Internal {
class MainWindow : public AppMainWindow
{
public:
MainWindow();
~MainWindow() override;
MainWindow()
{
setWindowTitle(QGuiApplication::applicationDisplayName());
setDockNestingEnabled(true);
setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea);
}
private:
void closeEvent(QCloseEvent *event) override;
@@ -243,7 +248,6 @@ private:
// The Core Singleton
static ICore *m_core = nullptr;
static MainWindow *m_mainwindow = nullptr;
static NewDialog *defaultDialogFactory(QWidget *parent)
{
@@ -255,9 +259,7 @@ namespace Internal {
class ICorePrivate : public QObject
{
public:
explicit ICorePrivate(MainWindow *mainWindow)
: q(mainWindow)
{}
ICorePrivate() {}
~ICorePrivate();
@@ -292,7 +294,7 @@ public:
void updateModeSelectorStyleMenu();
MainWindow *q = nullptr;
MainWindow *m_mainwindow = nullptr;
QTimer m_trimTimer;
QStringList m_aboutInformation;
Context m_highPrioAdditionalContexts;
@@ -392,7 +394,9 @@ QWidget *ICore::newItemDialog()
ICore::ICore()
{
m_core = this;
m_mainwindow = new MainWindow;
d = new ICorePrivate;
d->init(); // Separation needed for now as the call triggers other MainWindow calls.
connect(PluginManager::instance(), &PluginManager::testsFinished,
this, [this](int failedTests) {
@@ -415,9 +419,8 @@ ICore::ICore()
*/
ICore::~ICore()
{
delete m_mainwindow;
delete d;
m_core = nullptr;
m_mainwindow = nullptr;
}
/*!
@@ -525,7 +528,7 @@ bool ICore::showWarningWithOptions(const QString &title, const QString &text,
const QString &details, Id settingsId, QWidget *parent)
{
if (!parent)
parent = m_mainwindow;
parent = d->m_mainwindow;
QMessageBox msgBox(QMessageBox::Warning, title, text,
QMessageBox::Ok, parent);
msgBox.setEscapeButton(QMessageBox::Ok);
@@ -854,7 +857,7 @@ QWidget *ICore::currentContextWidget()
*/
QMainWindow *ICore::mainWindow()
{
return m_mainwindow;
return d->m_mainwindow;
}
/*!
@@ -866,7 +869,7 @@ QWidget *ICore::dialogParent()
if (!active)
active = QApplication::activeWindow();
if (!active || (active && active->windowFlags().testAnyFlags(Qt::SplashScreen | Qt::Popup)))
active = m_mainwindow;
active = d->m_mainwindow;
return active;
}
@@ -899,8 +902,8 @@ void ICore::raiseWindow(QWidget *widget)
QWidget *window = widget->window();
if (!window)
return;
if (window == m_mainwindow) {
m_mainwindow->raiseWindow();
if (window == d->m_mainwindow) {
d->m_mainwindow->raiseWindow();
} else {
window->raise();
window->activateWindow();
@@ -909,7 +912,7 @@ void ICore::raiseWindow(QWidget *widget)
void ICore::raiseMainWindow()
{
m_mainwindow->raiseWindow();
d->m_mainwindow->raiseWindow();
}
/*!
@@ -1174,6 +1177,8 @@ namespace Internal {
void ICorePrivate::init()
{
m_mainwindow = new MainWindow;
m_progressManager = new ProgressManagerPrivate;
m_jsExpander = JsExpander::createGlobalJsExpander();
m_vcsManager = new VcsManager;
@@ -1211,7 +1216,7 @@ void ICorePrivate::init()
QApplication::setStyle(new ManhattanStyle(baseName));
m_modeManager = new ModeManager(q, m_modeStack);
m_modeManager = new ModeManager(m_mainwindow, m_modeStack);
connect(m_modeStack, &FancyTabWidget::topAreaClicked, this, [](Qt::MouseButton, Qt::KeyboardModifiers modifiers) {
if (modifiers & Qt::ShiftModifier) {
QColor color = QColorDialog::getColor(StyleHelper::requestedBaseColor(), ICore::dialogParent());
@@ -1220,6 +1225,8 @@ void ICorePrivate::init()
}
});
m_mainwindow->setCentralWidget(d->m_modeStack);
registerDefaultContainers();
registerDefaultActions();
@@ -1231,7 +1238,7 @@ void ICorePrivate::init()
m_editorManager = new EditorManager(this);
m_externalToolManager = new ExternalToolManager();
m_progressManager->progressView()->setParent(q);
m_progressManager->progressView()->setParent(m_mainwindow);
connect(qApp, &QApplication::focusChanged, this, &ICorePrivate::updateFocusWidget);
@@ -1265,19 +1272,7 @@ void ICorePrivate::init()
}
}
MainWindow::MainWindow()
{
m_mainwindow = this;
d = new ICorePrivate(this);
d->init(); // Separation needed for now as the call triggers other MainWindow calls.
setWindowTitle(QGuiApplication::applicationDisplayName());
setDockNestingEnabled(true);
setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea);
setCentralWidget(d->m_modeStack);
}
NavigationWidget *ICorePrivate::navigationWidget(Side side) const
{
@@ -1290,12 +1285,6 @@ void ICorePrivate::setSidebarVisible(bool visible, Side side)
navigationWidget(side)->setShown(visible);
}
MainWindow::~MainWindow()
{
delete d;
d = nullptr;
}
ICorePrivate::~ICorePrivate()
{
// explicitly delete window support, because that calls methods from ICore that call methods
@@ -1343,6 +1332,9 @@ ICorePrivate::~ICorePrivate()
delete m_jsExpander;
m_jsExpander = nullptr;
delete m_mainwindow;
m_mainwindow = nullptr;
}
} // Internal
@@ -1358,7 +1350,7 @@ void ICore::extensionsInitialized()
{
EditorManagerPrivate::extensionsInitialized();
MimeTypeSettings::restoreSettings();
d->m_windowSupport = new WindowSupport(m_mainwindow, Context("Core.MainWindow"));
d->m_windowSupport = new WindowSupport(d->m_mainwindow, Context("Core.MainWindow"));
d->m_windowSupport->setCloseActionEnabled(false);
OutputPaneManager::initialize();
VcsManager::extensionsInitialized();
@@ -1380,9 +1372,9 @@ void ICore::aboutToShutdown()
{
disconnect(qApp, &QApplication::focusChanged, d, &ICorePrivate::updateFocusWidget);
for (auto contextPair : d->m_contextWidgets)
disconnect(contextPair.second, &QObject::destroyed, m_mainwindow, nullptr);
disconnect(contextPair.second, &QObject::destroyed, d->m_mainwindow, nullptr);
d->m_activeContext.clear();
m_mainwindow->hide();
d->m_mainwindow->hide();
}
void ICore::restartTrimmer()
@@ -1459,7 +1451,7 @@ void MainWindow::mousePressEvent(QMouseEvent *event)
void ICorePrivate::openDroppedFiles(const QList<DropSupport::FileSpec> &files)
{
q->raiseWindow();
m_mainwindow->raiseWindow();
const FilePaths filePaths = Utils::transform(files, &DropSupport::FileSpec::filePath);
ICore::openFiles(filePaths, ICore::SwitchMode);
}
@@ -1469,7 +1461,7 @@ void ICorePrivate::registerDefaultContainers()
ActionContainer *menubar = ActionManager::createMenuBar(Constants::MENU_BAR);
if (!HostOsInfo::isMacHost()) // System menu bar on Mac
q->setMenuBar(menubar->menuBar());
m_mainwindow->setMenuBar(menubar->menuBar());
menubar->appendGroup(Constants::G_FILE);
menubar->appendGroup(Constants::G_EDIT);
menubar->appendGroup(Constants::G_VIEW);
@@ -2100,12 +2092,12 @@ void ICore::exit()
// so to prevent the deleting of that object we
// just append it
QMetaObject::invokeMethod(
m_mainwindow,
d->m_mainwindow,
[] {
// Modal dialogs block the close event. So close them, in case this was triggered from
// a RestartDialog in the settings dialog.
acceptModalDialogs();
m_mainwindow->close();
d->m_mainwindow->close();
},
Qt::QueuedConnection);
}
@@ -2211,7 +2203,7 @@ void ICorePrivate::updateFocusWidget(QWidget *old, QWidget *now)
}
// ignore toplevels that define no context, like popups without parent
if (!newContext.isEmpty() || QApplication::focusWidget() == q->focusWidget())
if (!newContext.isEmpty() || QApplication::focusWidget() == m_mainwindow->focusWidget())
updateContextObject(newContext);
}
@@ -2281,10 +2273,10 @@ void ICorePrivate::saveWindowSettings()
// To be able to restore the correct non-full screen geometry, we have to put
// the window out of full screen before saving the geometry.
// Works around QTBUG-45241
if (Utils::HostOsInfo::isMacHost() && q->isFullScreen())
q->setWindowState(q->windowState() & ~Qt::WindowFullScreen);
settings->setValue(windowGeometryKey, q->saveGeometry());
settings->setValue(windowStateKey, q->saveState());
if (Utils::HostOsInfo::isMacHost() && m_mainwindow->isFullScreen())
m_mainwindow->setWindowState(m_mainwindow->windowState() & ~Qt::WindowFullScreen);
settings->setValue(windowGeometryKey, m_mainwindow->saveGeometry());
settings->setValue(windowStateKey, m_mainwindow->saveState());
settings->setValue(modeSelectorLayoutKey, int(ModeManager::modeStyle()));
settings->endGroup();
@@ -2357,7 +2349,7 @@ void ICorePrivate::aboutToShowRecentFiles()
void ICorePrivate::aboutQtCreator()
{
if (!m_versionDialog) {
m_versionDialog = new VersionDialog(q);
m_versionDialog = new VersionDialog(m_mainwindow);
connect(m_versionDialog, &QDialog::finished,
this, &ICorePrivate::destroyVersionDialog);
ICore::registerWindow(m_versionDialog, Context("Core.VersionDialog"));
@@ -2377,7 +2369,7 @@ void ICorePrivate::destroyVersionDialog()
void ICorePrivate::aboutPlugins()
{
PluginDialog dialog(q);
PluginDialog dialog(m_mainwindow);
dialog.exec();
}
@@ -2533,11 +2525,11 @@ void ICorePrivate::restoreWindowState()
NANOTRACE_SCOPE("Core", "MainWindow::restoreWindowState");
QtcSettings *settings = PluginManager::settings();
settings->beginGroup(settingsGroup);
if (!q->restoreGeometry(settings->value(windowGeometryKey).toByteArray()))
q->resize(1260, 700); // size without window decoration
q->restoreState(settings->value(windowStateKey).toByteArray());
if (!m_mainwindow->restoreGeometry(settings->value(windowGeometryKey).toByteArray()))
m_mainwindow->resize(1260, 700); // size without window decoration
m_mainwindow->restoreState(settings->value(windowStateKey).toByteArray());
settings->endGroup();
q->show();
m_mainwindow->show();
StatusBarManager::restoreSettings();
}