Core: Pimpl MainWindow

I'd like to disentangle things a bit, and there's quite a bit
non-window-ish stuff here.

Change-Id: Iad1e1d17ccd10b3ffff14251039ae2a5d6bfb675
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
hjk
2023-09-15 12:10:35 +02:00
parent 4282aff307
commit 080cb86761
12 changed files with 279 additions and 254 deletions

View File

@@ -12,6 +12,7 @@
#include <cmakeprojectmanager/cmakeprojectconstants.h> #include <cmakeprojectmanager/cmakeprojectconstants.h>
#include <coreplugin/icontext.h>
#include <coreplugin/messagemanager.h> #include <coreplugin/messagemanager.h>
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>

View File

@@ -25,6 +25,7 @@ class Context;
namespace Internal { namespace Internal {
class CorePlugin; class CorePlugin;
class MainWindow; class MainWindow;
class MainWindowPrivate;
} // Internal } // Internal
class CORE_EXPORT ActionManager : public QObject class CORE_EXPORT ActionManager : public QObject
@@ -67,6 +68,7 @@ private:
friend class Core::Internal::CorePlugin; // initialization friend class Core::Internal::CorePlugin; // initialization
friend class Core::Internal::MainWindow; // saving settings and setting context friend class Core::Internal::MainWindow; // saving settings and setting context
friend class Core::Internal::MainWindowPrivate; // saving settings and setting context
}; };
} // namespace Core } // namespace Core

View File

@@ -20,7 +20,7 @@ class IDocument;
namespace Internal { namespace Internal {
class DocumentManagerPrivate; class DocumentManagerPrivate;
class MainWindow; class MainWindowPrivate;
} }
class CORE_EXPORT DocumentManager : public QObject class CORE_EXPORT DocumentManager : public QObject
@@ -152,7 +152,7 @@ private:
void updateSaveAll(); void updateSaveAll();
static void registerSaveAllAction(); static void registerSaveAllAction();
friend class Core::Internal::MainWindow; friend class Core::Internal::MainWindowPrivate;
friend class Core::Internal::DocumentManagerPrivate; friend class Core::Internal::DocumentManagerPrivate;
}; };

View File

@@ -29,7 +29,7 @@ namespace Core {
class IDocument; class IDocument;
class LocatorFilterEntry; class LocatorFilterEntry;
namespace Internal { class MainWindow; } namespace Internal { class MainWindowPrivate; }
class CORE_EXPORT EditorManagerPlaceHolder final : public QWidget class CORE_EXPORT EditorManagerPlaceHolder final : public QWidget
{ {
@@ -188,7 +188,7 @@ private:
explicit EditorManager(QObject *parent); explicit EditorManager(QObject *parent);
~EditorManager() override; ~EditorManager() override;
friend class Core::Internal::MainWindow; friend class Core::Internal::MainWindowPrivate;
}; };
} // namespace Core } // namespace Core

View File

@@ -29,7 +29,10 @@ namespace Core {
class Context; class Context;
class IWizardFactory; class IWizardFactory;
namespace Internal { class MainWindow; } namespace Internal {
class MainWindow;
class MainWindowPrivate;
} // Internal
class NewDialog; class NewDialog;
@@ -38,6 +41,7 @@ class CORE_EXPORT ICore : public QObject
Q_OBJECT Q_OBJECT
friend class Internal::MainWindow; friend class Internal::MainWindow;
friend class Internal::MainWindowPrivate;
friend class IWizardFactory; friend class IWizardFactory;
explicit ICore(Internal::MainWindow *mw); explicit ICore(Internal::MainWindow *mw);

View File

@@ -20,7 +20,7 @@ class MacroExpander;
namespace Core { namespace Core {
namespace Internal { namespace Internal {
class MainWindow; class MainWindowPrivate;
class JsExpanderPrivate; class JsExpanderPrivate;
} // namespace Internal } // namespace Internal
@@ -50,7 +50,7 @@ private:
static JsExpander *createGlobalJsExpander(); static JsExpander *createGlobalJsExpander();
Internal::JsExpanderPrivate *d; Internal::JsExpanderPrivate *d;
friend class Core::Internal::MainWindow; friend class Core::Internal::MainWindowPrivate;
}; };
} // namespace Core } // namespace Core

View File

@@ -79,6 +79,7 @@
#include <QStatusBar> #include <QStatusBar>
#include <QStyleFactory> #include <QStyleFactory>
#include <QTextBrowser> #include <QTextBrowser>
#include <QTimer>
#include <QToolButton> #include <QToolButton>
#include <QVersionNumber> #include <QVersionNumber>
@@ -106,26 +107,122 @@ static bool hideToolsMenu()
enum { debugMainWindow = 0 }; enum { debugMainWindow = 0 };
MainWindow::MainWindow()
: AppMainWindow() class MainWindowPrivate : public QObject
, m_coreImpl(new ICore(this))
, m_lowPrioAdditionalContexts(Constants::C_GLOBAL)
, m_progressManager(new ProgressManagerPrivate)
, m_jsExpander(JsExpander::createGlobalJsExpander())
, m_vcsManager(new VcsManager)
, m_modeStack(new FancyTabWidget(this))
, m_shortcutSettings(new ShortcutSettings)
, m_toolSettings(new ToolSettings)
, m_mimeTypeSettings(new MimeTypeSettings)
, m_systemEditor(new SystemEditor)
, m_toggleLeftSideBarButton(new QToolButton)
, m_toggleRightSideBarButton(new QToolButton)
{ {
(void) new DocumentManager(this); public:
explicit MainWindowPrivate(MainWindow *mainWindow)
: q(mainWindow)
{}
~MainWindowPrivate();
void init();
static void openFile();
static IDocument *openFiles(const FilePaths &filePaths, ICore::OpenFilesFlags flags,
const FilePath &workingDirectory = {});
void aboutToShowRecentFiles();
static void setFocusToEditor();
void aboutQtCreator();
void aboutPlugins();
void changeLog();
void contact();
void updateFocusWidget(QWidget *old, QWidget *now);
NavigationWidget *navigationWidget(Side side) const;
void setSidebarVisible(bool visible, Side side);
void destroyVersionDialog();
void openDroppedFiles(const QList<Utils::DropSupport::FileSpec> &files);
void restoreWindowState();
void openFileFromDevice();
void updateContextObject(const QList<IContext *> &context);
void updateContext();
void registerDefaultContainers();
void registerDefaultActions();
void registerModeSelectorStyleActions();
void readSettings();
void saveWindowSettings();
void updateModeSelectorStyleMenu();
MainWindow *q = nullptr;
ICore *m_coreImpl = nullptr;
QTimer m_trimTimer;
QStringList m_aboutInformation;
Context m_highPrioAdditionalContexts;
Context m_lowPrioAdditionalContexts{Constants::C_GLOBAL};
mutable QPrinter *m_printer = nullptr;
WindowSupport *m_windowSupport = nullptr;
EditorManager *m_editorManager = nullptr;
ExternalToolManager *m_externalToolManager = nullptr;
MessageManager *m_messageManager = nullptr;
ProgressManagerPrivate *m_progressManager = nullptr;
JsExpander *m_jsExpander = nullptr;
VcsManager *m_vcsManager = nullptr;
ModeManager *m_modeManager = nullptr;
FancyTabWidget *m_modeStack = nullptr;
NavigationWidget *m_leftNavigationWidget = nullptr;
NavigationWidget *m_rightNavigationWidget = nullptr;
RightPaneWidget *m_rightPaneWidget = nullptr;
VersionDialog *m_versionDialog = nullptr;
QList<IContext *> m_activeContext;
std::unordered_map<QWidget *, IContext *> m_contextWidgets;
ShortcutSettings *m_shortcutSettings = nullptr;
ToolSettings *m_toolSettings = nullptr;
MimeTypeSettings *m_mimeTypeSettings = nullptr;
SystemEditor *m_systemEditor = nullptr;
// actions
QAction *m_focusToEditor = nullptr;
QAction *m_newAction = nullptr;
QAction *m_openAction = nullptr;
QAction *m_openWithAction = nullptr;
QAction *m_openFromDeviceAction = nullptr;
QAction *m_saveAllAction = nullptr;
QAction *m_exitAction = nullptr;
QAction *m_optionsAction = nullptr;
QAction *m_loggerAction = nullptr;
QAction *m_toggleLeftSideBarAction = nullptr;
QAction *m_toggleRightSideBarAction = nullptr;
QAction *m_toggleMenubarAction = nullptr;
QAction *m_cycleModeSelectorStyleAction = nullptr;
QAction *m_setModeSelectorStyleIconsAndTextAction = nullptr;
QAction *m_setModeSelectorStyleHiddenAction = nullptr;
QAction *m_setModeSelectorStyleIconsOnlyAction = nullptr;
QAction *m_themeAction = nullptr;
QToolButton *m_toggleLeftSideBarButton = nullptr;
QToolButton *m_toggleRightSideBarButton = nullptr;
QColor m_overrideColor;
QList<std::function<bool()>> m_preCloseListeners;
};
void MainWindowPrivate::init()
{
m_coreImpl = new ICore(q);
m_progressManager = new ProgressManagerPrivate;
m_jsExpander = JsExpander::createGlobalJsExpander();
m_vcsManager = new VcsManager;
m_modeStack = new FancyTabWidget(q);
m_shortcutSettings = new ShortcutSettings;
m_toolSettings = new ToolSettings;
m_mimeTypeSettings = new MimeTypeSettings;
m_systemEditor = new SystemEditor;
m_toggleLeftSideBarButton = new QToolButton;
m_toggleRightSideBarButton = new QToolButton;
(void) new DocumentManager(q);
HistoryCompleter::setSettings(PluginManager::settings()); HistoryCompleter::setSettings(PluginManager::settings());
setWindowTitle(QGuiApplication::applicationDisplayName());
if (HostOsInfo::isLinuxHost()) if (HostOsInfo::isLinuxHost())
QApplication::setWindowIcon(Icons::QTCREATORLOGO_BIG.icon()); QApplication::setWindowIcon(Icons::QTCREATORLOGO_BIG.icon());
QString baseName = QApplication::style()->objectName(); QString baseName = QApplication::style()->objectName();
@@ -148,12 +245,7 @@ MainWindow::MainWindow()
QApplication::setStyle(new ManhattanStyle(baseName)); QApplication::setStyle(new ManhattanStyle(baseName));
setDockNestingEnabled(true); m_modeManager = new ModeManager(q, m_modeStack);
setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea);
m_modeManager = new ModeManager(this, m_modeStack);
connect(m_modeStack, &FancyTabWidget::topAreaClicked, this, [](Qt::MouseButton, Qt::KeyboardModifiers modifiers) { connect(m_modeStack, &FancyTabWidget::topAreaClicked, this, [](Qt::MouseButton, Qt::KeyboardModifiers modifiers) {
if (modifiers & Qt::ShiftModifier) { if (modifiers & Qt::ShiftModifier) {
QColor color = QColorDialog::getColor(StyleHelper::requestedBaseColor(), ICore::dialogParent()); QColor color = QColorDialog::getColor(StyleHelper::requestedBaseColor(), ICore::dialogParent());
@@ -172,28 +264,27 @@ MainWindow::MainWindow()
m_messageManager = new MessageManager; m_messageManager = new MessageManager;
m_editorManager = new EditorManager(this); m_editorManager = new EditorManager(this);
m_externalToolManager = new ExternalToolManager(); m_externalToolManager = new ExternalToolManager();
setCentralWidget(m_modeStack);
m_progressManager->progressView()->setParent(this); m_progressManager->progressView()->setParent(q);
connect(qApp, &QApplication::focusChanged, this, &MainWindow::updateFocusWidget); connect(qApp, &QApplication::focusChanged, this, &MainWindowPrivate::updateFocusWidget);
// Add small Toolbuttons for toggling the navigation widgets // Add small Toolbuttons for toggling the navigation widgets
StatusBarManager::addStatusBarWidget(m_toggleLeftSideBarButton, StatusBarManager::First); StatusBarManager::addStatusBarWidget(m_toggleLeftSideBarButton, StatusBarManager::First);
int childsCount = statusBar()->findChildren<QWidget *>(QString(), Qt::FindDirectChildrenOnly).count(); int childsCount = q->statusBar()->findChildren<QWidget *>(QString(), Qt::FindDirectChildrenOnly).count();
statusBar()->insertPermanentWidget(childsCount - 1, m_toggleRightSideBarButton); // before QSizeGrip q->statusBar()->insertPermanentWidget(childsCount - 1, m_toggleRightSideBarButton); // before QSizeGrip
// setUnifiedTitleAndToolBarOnMac(true); // setUnifiedTitleAndToolBarOnMac(true);
//if (HostOsInfo::isAnyUnixHost()) //if (HostOsInfo::isAnyUnixHost())
//signal(SIGINT, handleSigInt); //signal(SIGINT, handleSigInt);
statusBar()->setProperty("p_styled", true); q->statusBar()->setProperty("p_styled", true);
auto dropSupport = new DropSupport(this, [](QDropEvent *event, DropSupport *) { auto dropSupport = new DropSupport(q, [](QDropEvent *event, DropSupport *) {
return event->source() == nullptr; // only accept drops from the "outside" (e.g. file manager) return event->source() == nullptr; // only accept drops from the "outside" (e.g. file manager)
}); });
connect(dropSupport, &DropSupport::filesDropped, connect(dropSupport, &DropSupport::filesDropped,
this, &MainWindow::openDroppedFiles); this, &MainWindowPrivate::openDroppedFiles);
if (HostOsInfo::isLinuxHost()) { if (HostOsInfo::isLinuxHost()) {
m_trimTimer.setSingleShot(true); m_trimTimer.setSingleShot(true);
@@ -205,12 +296,25 @@ MainWindow::MainWindow()
} }
} }
NavigationWidget *MainWindow::navigationWidget(Side side) const MainWindow::MainWindow()
: d(new MainWindowPrivate(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 *MainWindowPrivate::navigationWidget(Side side) const
{ {
return side == Side::Left ? m_leftNavigationWidget : m_rightNavigationWidget; return side == Side::Left ? m_leftNavigationWidget : m_rightNavigationWidget;
} }
void MainWindow::setSidebarVisible(bool visible, Side side) void MainWindowPrivate::setSidebarVisible(bool visible, Side side)
{ {
if (NavigationWidgetPlaceHolder::current(side)) if (NavigationWidgetPlaceHolder::current(side))
navigationWidget(side)->setShown(visible); navigationWidget(side)->setShown(visible);
@@ -218,30 +322,35 @@ void MainWindow::setSidebarVisible(bool visible, Side side)
void MainWindow::setOverrideColor(const QColor &color) void MainWindow::setOverrideColor(const QColor &color)
{ {
m_overrideColor = color; d->m_overrideColor = color;
} }
QStringList MainWindow::additionalAboutInformation() const QStringList MainWindow::additionalAboutInformation() const
{ {
return m_aboutInformation; return d->m_aboutInformation;
} }
void MainWindow::clearAboutInformation() void MainWindow::clearAboutInformation()
{ {
m_aboutInformation.clear(); d->m_aboutInformation.clear();
} }
void MainWindow::appendAboutInformation(const QString &line) void MainWindow::appendAboutInformation(const QString &line)
{ {
m_aboutInformation.append(line); d->m_aboutInformation.append(line);
} }
void MainWindow::addPreCloseListener(const std::function<bool ()> &listener) void MainWindow::addPreCloseListener(const std::function<bool ()> &listener)
{ {
m_preCloseListeners.append(listener); d->m_preCloseListeners.append(listener);
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
{
delete d;
}
MainWindowPrivate::~MainWindowPrivate()
{ {
// explicitly delete window support, because that calls methods from ICore that call methods // explicitly delete window support, because that calls methods from ICore that call methods
// from mainwindow, so mainwindow still needs to be alive // from mainwindow, so mainwindow still needs to be alive
@@ -295,7 +404,7 @@ MainWindow::~MainWindow()
void MainWindow::init() void MainWindow::init()
{ {
m_progressManager->init(); // needs the status bar manager d->m_progressManager->init(); // needs the status bar manager
MessageManager::init(); MessageManager::init();
OutputPaneManager::create(); OutputPaneManager::create();
} }
@@ -304,22 +413,22 @@ void MainWindow::extensionsInitialized()
{ {
EditorManagerPrivate::extensionsInitialized(); EditorManagerPrivate::extensionsInitialized();
MimeTypeSettings::restoreSettings(); MimeTypeSettings::restoreSettings();
m_windowSupport = new WindowSupport(this, Context("Core.MainWindow")); d->m_windowSupport = new WindowSupport(this, Context("Core.MainWindow"));
m_windowSupport->setCloseActionEnabled(false); d->m_windowSupport->setCloseActionEnabled(false);
OutputPaneManager::initialize(); OutputPaneManager::initialize();
VcsManager::extensionsInitialized(); VcsManager::extensionsInitialized();
m_leftNavigationWidget->setFactories(INavigationWidgetFactory::allNavigationFactories()); d->m_leftNavigationWidget->setFactories(INavigationWidgetFactory::allNavigationFactories());
m_rightNavigationWidget->setFactories(INavigationWidgetFactory::allNavigationFactories()); d->m_rightNavigationWidget->setFactories(INavigationWidgetFactory::allNavigationFactories());
ModeManager::extensionsInitialized(); ModeManager::extensionsInitialized();
readSettings(); d->readSettings();
updateContext(); d->updateContext();
emit m_coreImpl->coreAboutToOpen(); emit d->m_coreImpl->coreAboutToOpen();
// Delay restoreWindowState, since it is overridden by LayoutRequest event // Delay restoreWindowState, since it is overridden by LayoutRequest event
QMetaObject::invokeMethod(this, &MainWindow::restoreWindowState, Qt::QueuedConnection); QMetaObject::invokeMethod(d, &MainWindowPrivate::restoreWindowState, Qt::QueuedConnection);
QMetaObject::invokeMethod(m_coreImpl, &ICore::coreOpened, Qt::QueuedConnection); QMetaObject::invokeMethod(d->m_coreImpl, &ICore::coreOpened, Qt::QueuedConnection);
} }
static void setRestart(bool restart) static void setRestart(bool restart)
@@ -335,8 +444,8 @@ void MainWindow::restart()
void MainWindow::restartTrimmer() void MainWindow::restartTrimmer()
{ {
if (HostOsInfo::isLinuxHost() && !m_trimTimer.isActive()) if (HostOsInfo::isLinuxHost() && !d->m_trimTimer.isActive())
m_trimTimer.start(); d->m_trimTimer.start();
} }
void MainWindow::closeEvent(QCloseEvent *event) void MainWindow::closeEvent(QCloseEvent *event)
@@ -372,7 +481,7 @@ void MainWindow::closeEvent(QCloseEvent *event)
return; return;
} }
const QList<std::function<bool()>> listeners = m_preCloseListeners; const QList<std::function<bool()>> listeners = d->m_preCloseListeners;
for (const std::function<bool()> &listener : listeners) { for (const std::function<bool()> &listener : listeners) {
if (!listener()) { if (!listener()) {
cancelClose(); cancelClose();
@@ -380,12 +489,12 @@ void MainWindow::closeEvent(QCloseEvent *event)
} }
} }
emit m_coreImpl->coreAboutToClose(); emit d->m_coreImpl->coreAboutToClose();
saveWindowSettings(); d->saveWindowSettings();
m_leftNavigationWidget->closeSubWidgets(); d->m_leftNavigationWidget->closeSubWidgets();
m_rightNavigationWidget->closeSubWidgets(); d->m_rightNavigationWidget->closeSubWidgets();
event->accept(); event->accept();
alreadyClosed = true; alreadyClosed = true;
@@ -403,34 +512,34 @@ void MainWindow::mousePressEvent(QMouseEvent *event)
AppMainWindow::mousePressEvent(event); AppMainWindow::mousePressEvent(event);
} }
void MainWindow::openDroppedFiles(const QList<DropSupport::FileSpec> &files) void MainWindowPrivate::openDroppedFiles(const QList<DropSupport::FileSpec> &files)
{ {
raiseWindow(); q->raiseWindow();
const FilePaths filePaths = Utils::transform(files, &DropSupport::FileSpec::filePath); const FilePaths filePaths = Utils::transform(files, &DropSupport::FileSpec::filePath);
openFiles(filePaths, ICore::SwitchMode); q->openFiles(filePaths, ICore::SwitchMode);
} }
IContext *MainWindow::currentContextObject() const IContext *MainWindow::currentContextObject() const
{ {
return m_activeContext.isEmpty() ? nullptr : m_activeContext.first(); return d->m_activeContext.isEmpty() ? nullptr : d->m_activeContext.first();
} }
QStatusBar *MainWindow::statusBar() const QStatusBar *MainWindow::statusBar() const
{ {
return m_modeStack->statusBar(); return d->m_modeStack->statusBar();
} }
InfoBar *MainWindow::infoBar() const InfoBar *MainWindow::infoBar() const
{ {
return m_modeStack->infoBar(); return d->m_modeStack->infoBar();
} }
void MainWindow::registerDefaultContainers() void MainWindowPrivate::registerDefaultContainers()
{ {
ActionContainer *menubar = ActionManager::createMenuBar(Constants::MENU_BAR); ActionContainer *menubar = ActionManager::createMenuBar(Constants::MENU_BAR);
if (!HostOsInfo::isMacHost()) // System menu bar on Mac if (!HostOsInfo::isMacHost()) // System menu bar on Mac
setMenuBar(menubar->menuBar()); q->setMenuBar(menubar->menuBar());
menubar->appendGroup(Constants::G_FILE); menubar->appendGroup(Constants::G_FILE);
menubar->appendGroup(Constants::G_EDIT); menubar->appendGroup(Constants::G_EDIT);
menubar->appendGroup(Constants::G_VIEW); menubar->appendGroup(Constants::G_VIEW);
@@ -451,7 +560,7 @@ void MainWindow::registerDefaultContainers()
filemenu->appendGroup(Constants::G_FILE_CLOSE); filemenu->appendGroup(Constants::G_FILE_CLOSE);
filemenu->appendGroup(Constants::G_FILE_PRINT); filemenu->appendGroup(Constants::G_FILE_PRINT);
filemenu->appendGroup(Constants::G_FILE_OTHER); filemenu->appendGroup(Constants::G_FILE_OTHER);
connect(filemenu->menu(), &QMenu::aboutToShow, this, &MainWindow::aboutToShowRecentFiles); connect(filemenu->menu(), &QMenu::aboutToShow, this, &MainWindowPrivate::aboutToShowRecentFiles);
// Edit Menu // Edit Menu
@@ -515,7 +624,7 @@ static QMenuBar *globalMenuBar()
return ActionManager::actionContainer(Constants::MENU_BAR)->menuBar(); return ActionManager::actionContainer(Constants::MENU_BAR)->menuBar();
} }
void MainWindow::registerDefaultActions() void MainWindowPrivate::registerDefaultActions()
{ {
ActionContainer *mfile = ActionManager::actionContainer(Constants::M_FILE); ActionContainer *mfile = ActionManager::actionContainer(Constants::M_FILE);
ActionContainer *medit = ActionManager::actionContainer(Constants::M_EDIT); ActionContainer *medit = ActionManager::actionContainer(Constants::M_EDIT);
@@ -541,7 +650,7 @@ void MainWindow::registerDefaultActions()
m_focusToEditor = new QAction(Tr::tr("Return to Editor"), this); m_focusToEditor = new QAction(Tr::tr("Return to Editor"), this);
Command *cmd = ActionManager::registerAction(m_focusToEditor, Constants::S_RETURNTOEDITOR); Command *cmd = ActionManager::registerAction(m_focusToEditor, Constants::S_RETURNTOEDITOR);
cmd->setDefaultKeySequence(QKeySequence(Qt::Key_Escape)); cmd->setDefaultKeySequence(QKeySequence(Qt::Key_Escape));
connect(m_focusToEditor, &QAction::triggered, this, &MainWindow::setFocusToEditor); connect(m_focusToEditor, &QAction::triggered, this, &MainWindowPrivate::setFocusToEditor);
// New File Action // New File Action
QIcon icon = Icon::fromTheme("document-new"); QIcon icon = Icon::fromTheme("document-new");
@@ -585,7 +694,7 @@ void MainWindow::registerDefaultActions()
cmd = ActionManager::registerAction(m_openAction, Constants::OPEN); cmd = ActionManager::registerAction(m_openAction, Constants::OPEN);
cmd->setDefaultKeySequence(QKeySequence::Open); cmd->setDefaultKeySequence(QKeySequence::Open);
mfile->addAction(cmd, Constants::G_FILE_OPEN); mfile->addAction(cmd, Constants::G_FILE_OPEN);
connect(m_openAction, &QAction::triggered, this, &MainWindow::openFile); connect(m_openAction, &QAction::triggered, this, &MainWindowPrivate::openFile);
// Open With Action // Open With Action
m_openWithAction = new QAction(Tr::tr("Open File &With..."), this); m_openWithAction = new QAction(Tr::tr("Open File &With..."), this);
@@ -598,7 +707,7 @@ void MainWindow::registerDefaultActions()
m_openFromDeviceAction = new QAction(Tr::tr("Open From Device..."), this); m_openFromDeviceAction = new QAction(Tr::tr("Open From Device..."), this);
cmd = ActionManager::registerAction(m_openFromDeviceAction, Constants::OPEN_FROM_DEVICE); cmd = ActionManager::registerAction(m_openFromDeviceAction, Constants::OPEN_FROM_DEVICE);
mfile->addAction(cmd, Constants::G_FILE_OPEN); mfile->addAction(cmd, Constants::G_FILE_OPEN);
connect(m_openFromDeviceAction, &QAction::triggered, this, &MainWindow::openFileFromDevice); connect(m_openFromDeviceAction, &QAction::triggered, this, &MainWindowPrivate::openFileFromDevice);
} }
// File->Recent Files Menu // File->Recent Files Menu
@@ -645,7 +754,7 @@ void MainWindow::registerDefaultActions()
cmd = ActionManager::registerAction(m_exitAction, Constants::EXIT); cmd = ActionManager::registerAction(m_exitAction, Constants::EXIT);
cmd->setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Q"))); cmd->setDefaultKeySequence(QKeySequence(Tr::tr("Ctrl+Q")));
mfile->addAction(cmd, Constants::G_FILE_OTHER); mfile->addAction(cmd, Constants::G_FILE_OTHER);
connect(m_exitAction, &QAction::triggered, this, &MainWindow::exit); connect(m_exitAction, &QAction::triggered, q, &MainWindow::exit);
// Undo Action // Undo Action
icon = Icon::fromTheme("edit-undo"); icon = Icon::fromTheme("edit-undo");
@@ -872,7 +981,7 @@ void MainWindow::registerDefaultActions()
cmd = ActionManager::registerAction(tmpaction, Constants::ABOUT_QTCREATOR); cmd = ActionManager::registerAction(tmpaction, Constants::ABOUT_QTCREATOR);
mhelp->addAction(cmd, Constants::G_HELP_ABOUT); mhelp->addAction(cmd, Constants::G_HELP_ABOUT);
tmpaction->setEnabled(true); tmpaction->setEnabled(true);
connect(tmpaction, &QAction::triggered, this, &MainWindow::aboutQtCreator); connect(tmpaction, &QAction::triggered, this, &MainWindowPrivate::aboutQtCreator);
//About Plugins Action //About Plugins Action
tmpaction = new QAction(Tr::tr("About &Plugins..."), this); tmpaction = new QAction(Tr::tr("About &Plugins..."), this);
@@ -880,7 +989,7 @@ void MainWindow::registerDefaultActions()
cmd = ActionManager::registerAction(tmpaction, Constants::ABOUT_PLUGINS); cmd = ActionManager::registerAction(tmpaction, Constants::ABOUT_PLUGINS);
mhelp->addAction(cmd, Constants::G_HELP_ABOUT); mhelp->addAction(cmd, Constants::G_HELP_ABOUT);
tmpaction->setEnabled(true); tmpaction->setEnabled(true);
connect(tmpaction, &QAction::triggered, this, &MainWindow::aboutPlugins); connect(tmpaction, &QAction::triggered, this, &MainWindowPrivate::aboutPlugins);
// About Qt Action // About Qt Action
// tmpaction = new QAction(Tr::tr("About &Qt..."), this); // tmpaction = new QAction(Tr::tr("About &Qt..."), this);
// cmd = ActionManager::registerAction(tmpaction, Constants:: ABOUT_QT); // cmd = ActionManager::registerAction(tmpaction, Constants:: ABOUT_QT);
@@ -894,14 +1003,14 @@ void MainWindow::registerDefaultActions()
cmd = ActionManager::registerAction(tmpaction, Constants::CHANGE_LOG); cmd = ActionManager::registerAction(tmpaction, Constants::CHANGE_LOG);
mhelp->addAction(cmd, Constants::G_HELP_ABOUT); mhelp->addAction(cmd, Constants::G_HELP_ABOUT);
tmpaction->setEnabled(true); tmpaction->setEnabled(true);
connect(tmpaction, &QAction::triggered, this, &MainWindow::changeLog); connect(tmpaction, &QAction::triggered, this, &MainWindowPrivate::changeLog);
// Contact // Contact
tmpaction = new QAction(Tr::tr("Contact..."), this); tmpaction = new QAction(Tr::tr("Contact..."), this);
cmd = ActionManager::registerAction(tmpaction, "QtCreator.Contact"); cmd = ActionManager::registerAction(tmpaction, "QtCreator.Contact");
mhelp->addAction(cmd, Constants::G_HELP_ABOUT); mhelp->addAction(cmd, Constants::G_HELP_ABOUT);
tmpaction->setEnabled(true); tmpaction->setEnabled(true);
connect(tmpaction, &QAction::triggered, this, &MainWindow::contact); connect(tmpaction, &QAction::triggered, this, &MainWindowPrivate::contact);
// About sep // About sep
if (!HostOsInfo::isMacHost()) { // doesn't have the "About" actions in the Help menu if (!HostOsInfo::isMacHost()) { // doesn't have the "About" actions in the Help menu
@@ -912,7 +1021,7 @@ void MainWindow::registerDefaultActions()
} }
} }
void MainWindow::registerModeSelectorStyleActions() void MainWindowPrivate::registerModeSelectorStyleActions()
{ {
ActionContainer *mview = ActionManager::actionContainer(Constants::M_VIEW); ActionContainer *mview = ActionManager::actionContainer(Constants::M_VIEW);
@@ -948,7 +1057,7 @@ void MainWindow::registerModeSelectorStyleActions()
styleMenu->addActions(stylesGroup->actions()); styleMenu->addActions(stylesGroup->actions());
} }
void MainWindow::openFile() void MainWindowPrivate::openFile()
{ {
openFiles(EditorManager::getOpenFilePaths(), ICore::SwitchMode); openFiles(EditorManager::getOpenFilePaths(), ICore::SwitchMode);
} }
@@ -981,6 +1090,13 @@ static IDocumentFactory *findDocumentFactory(const QList<IDocumentFactory*> &fil
IDocument *MainWindow::openFiles(const FilePaths &filePaths, IDocument *MainWindow::openFiles(const FilePaths &filePaths,
ICore::OpenFilesFlags flags, ICore::OpenFilesFlags flags,
const FilePath &workingDirectory) const FilePath &workingDirectory)
{
return MainWindowPrivate::openFiles(filePaths, flags, workingDirectory);
}
IDocument *MainWindowPrivate::openFiles(const FilePaths &filePaths,
ICore::OpenFilesFlags flags,
const FilePath &workingDirectory)
{ {
const QList<IDocumentFactory*> documentFactories = IDocumentFactory::allDocumentFactories(); const QList<IDocumentFactory*> documentFactories = IDocumentFactory::allDocumentFactories();
IDocument *res = nullptr; IDocument *res = nullptr;
@@ -1027,7 +1143,7 @@ IDocument *MainWindow::openFiles(const FilePaths &filePaths,
return res; return res;
} }
void MainWindow::setFocusToEditor() void MainWindowPrivate::setFocusToEditor()
{ {
EditorManagerPrivate::doEscapeKeyFocusMoveMagic(); EditorManagerPrivate::doEscapeKeyFocusMoveMagic();
} }
@@ -1079,15 +1195,15 @@ void MainWindow::openFileWith()
} }
} }
void MainWindow::openFileFromDevice() void MainWindowPrivate::openFileFromDevice()
{ {
openFiles(EditorManager::getOpenFilePaths(QFileDialog::DontUseNativeDialog), ICore::SwitchMode); openFiles(EditorManager::getOpenFilePaths(QFileDialog::DontUseNativeDialog), ICore::SwitchMode);
} }
IContext *MainWindow::contextObject(QWidget *widget) const IContext *MainWindow::contextObject(QWidget *widget) const
{ {
const auto it = m_contextWidgets.find(widget); const auto it = d->m_contextWidgets.find(widget);
return it == m_contextWidgets.end() ? nullptr : it->second; return it == d->m_contextWidgets.end() ? nullptr : it->second;
} }
void MainWindow::addContextObject(IContext *context) void MainWindow::addContextObject(IContext *context)
@@ -1095,10 +1211,10 @@ void MainWindow::addContextObject(IContext *context)
if (!context) if (!context)
return; return;
QWidget *widget = context->widget(); QWidget *widget = context->widget();
if (m_contextWidgets.find(widget) != m_contextWidgets.end()) if (d->m_contextWidgets.find(widget) != d->m_contextWidgets.end())
return; return;
m_contextWidgets.insert({widget, context}); d->m_contextWidgets.insert({widget, context});
connect(context, &QObject::destroyed, this, [this, context] { removeContextObject(context); }); connect(context, &QObject::destroyed, this, [this, context] { removeContextObject(context); });
} }
@@ -1109,20 +1225,20 @@ void MainWindow::removeContextObject(IContext *context)
disconnect(context, &QObject::destroyed, this, nullptr); disconnect(context, &QObject::destroyed, this, nullptr);
const auto it = std::find_if(m_contextWidgets.cbegin(), const auto it = std::find_if(d->m_contextWidgets.cbegin(),
m_contextWidgets.cend(), d->m_contextWidgets.cend(),
[context](const std::pair<QWidget *, IContext *> &v) { [context](const std::pair<QWidget *, IContext *> &v) {
return v.second == context; return v.second == context;
}); });
if (it == m_contextWidgets.cend()) if (it == d->m_contextWidgets.cend())
return; return;
m_contextWidgets.erase(it); d->m_contextWidgets.erase(it);
if (m_activeContext.removeAll(context) > 0) if (d->m_activeContext.removeAll(context) > 0)
updateContextObject(m_activeContext); d->updateContextObject(d->m_activeContext);
} }
void MainWindow::updateFocusWidget(QWidget *old, QWidget *now) void MainWindowPrivate::updateFocusWidget(QWidget *old, QWidget *now)
{ {
Q_UNUSED(old) Q_UNUSED(old)
@@ -1134,7 +1250,7 @@ void MainWindow::updateFocusWidget(QWidget *old, QWidget *now)
if (QWidget *p = QApplication::focusWidget()) { if (QWidget *p = QApplication::focusWidget()) {
IContext *context = nullptr; IContext *context = nullptr;
while (p) { while (p) {
context = contextObject(p); context = q->contextObject(p);
if (context) if (context)
newContext.append(context); newContext.append(context);
p = p->parentWidget(); p = p->parentWidget();
@@ -1142,11 +1258,11 @@ void MainWindow::updateFocusWidget(QWidget *old, QWidget *now)
} }
// ignore toplevels that define no context, like popups without parent // ignore toplevels that define no context, like popups without parent
if (!newContext.isEmpty() || QApplication::focusWidget() == focusWidget()) if (!newContext.isEmpty() || QApplication::focusWidget() == q->focusWidget())
updateContextObject(newContext); updateContextObject(newContext);
} }
void MainWindow::updateContextObject(const QList<IContext *> &context) void MainWindowPrivate::updateContextObject(const QList<IContext *> &context)
{ {
emit m_coreImpl->contextAboutToChange(context); emit m_coreImpl->contextAboutToChange(context);
m_activeContext = context; m_activeContext = context;
@@ -1160,14 +1276,14 @@ void MainWindow::updateContextObject(const QList<IContext *> &context)
void MainWindow::aboutToShutdown() void MainWindow::aboutToShutdown()
{ {
disconnect(qApp, &QApplication::focusChanged, this, &MainWindow::updateFocusWidget); disconnect(qApp, &QApplication::focusChanged, d, &MainWindowPrivate::updateFocusWidget);
for (auto contextPair : m_contextWidgets) for (auto contextPair : d->m_contextWidgets)
disconnect(contextPair.second, &QObject::destroyed, this, nullptr); disconnect(contextPair.second, &QObject::destroyed, this, nullptr);
m_activeContext.clear(); d->m_activeContext.clear();
hide(); hide();
} }
void MainWindow::readSettings() void MainWindowPrivate::readSettings()
{ {
QtcSettings *settings = PluginManager::settings(); QtcSettings *settings = PluginManager::settings();
settings->beginGroup(QLatin1String(settingsGroup)); settings->beginGroup(QLatin1String(settingsGroup));
@@ -1217,7 +1333,7 @@ void MainWindow::saveSettings()
QtcSettings *settings = PluginManager::settings(); QtcSettings *settings = PluginManager::settings();
settings->beginGroup(QLatin1String(settingsGroup)); settings->beginGroup(QLatin1String(settingsGroup));
if (!(m_overrideColor.isValid() && StyleHelper::baseColor() == m_overrideColor)) if (!(d->m_overrideColor.isValid() && StyleHelper::baseColor() == d->m_overrideColor))
settings->setValueWithDefault(colorKey, settings->setValueWithDefault(colorKey,
StyleHelper::requestedBaseColor(), StyleHelper::requestedBaseColor(),
QColor(StyleHelper::DEFAULT_BASE_COLOR)); QColor(StyleHelper::DEFAULT_BASE_COLOR));
@@ -1230,8 +1346,8 @@ void MainWindow::saveSettings()
DocumentManager::saveSettings(); DocumentManager::saveSettings();
ActionManager::saveSettings(); ActionManager::saveSettings();
EditorManagerPrivate::saveSettings(); EditorManagerPrivate::saveSettings();
m_leftNavigationWidget->saveSettings(settings); d->m_leftNavigationWidget->saveSettings(settings);
m_rightNavigationWidget->saveSettings(settings); d->m_rightNavigationWidget->saveSettings(settings);
// TODO Remove some time after Qt Creator 11 // TODO Remove some time after Qt Creator 11
// Work around Qt Creator <= 10 writing the default terminal to the settings. // Work around Qt Creator <= 10 writing the default terminal to the settings.
@@ -1242,7 +1358,7 @@ void MainWindow::saveSettings()
TerminalCommand::setTerminalEmulator(TerminalCommand::terminalEmulator()); TerminalCommand::setTerminalEmulator(TerminalCommand::terminalEmulator());
} }
void MainWindow::saveWindowSettings() void MainWindowPrivate::saveWindowSettings()
{ {
QtcSettings *settings = PluginManager::settings(); QtcSettings *settings = PluginManager::settings();
settings->beginGroup(settingsGroup); settings->beginGroup(settingsGroup);
@@ -1251,16 +1367,16 @@ void MainWindow::saveWindowSettings()
// To be able to restore the correct non-full screen geometry, we have to put // 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. // the window out of full screen before saving the geometry.
// Works around QTBUG-45241 // Works around QTBUG-45241
if (Utils::HostOsInfo::isMacHost() && isFullScreen()) if (Utils::HostOsInfo::isMacHost() && q->isFullScreen())
setWindowState(windowState() & ~Qt::WindowFullScreen); q->setWindowState(q->windowState() & ~Qt::WindowFullScreen);
settings->setValue(windowGeometryKey, saveGeometry()); settings->setValue(windowGeometryKey, q->saveGeometry());
settings->setValue(windowStateKey, saveState()); settings->setValue(windowStateKey, q->saveState());
settings->setValue(modeSelectorLayoutKey, int(ModeManager::modeStyle())); settings->setValue(modeSelectorLayoutKey, int(ModeManager::modeStyle()));
settings->endGroup(); settings->endGroup();
} }
void MainWindow::updateModeSelectorStyleMenu() void MainWindowPrivate::updateModeSelectorStyleMenu()
{ {
switch (ModeManager::modeStyle()) { switch (ModeManager::modeStyle()) {
case ModeManager::Style::IconsAndText: case ModeManager::Style::IconsAndText:
@@ -1281,27 +1397,27 @@ void MainWindow::updateAdditionalContexts(const Context &remove, const Context &
for (const Id id : remove) { for (const Id id : remove) {
if (!id.isValid()) if (!id.isValid())
continue; continue;
int index = m_lowPrioAdditionalContexts.indexOf(id); int index = d->m_lowPrioAdditionalContexts.indexOf(id);
if (index != -1) if (index != -1)
m_lowPrioAdditionalContexts.removeAt(index); d->m_lowPrioAdditionalContexts.removeAt(index);
index = m_highPrioAdditionalContexts.indexOf(id); index = d->m_highPrioAdditionalContexts.indexOf(id);
if (index != -1) if (index != -1)
m_highPrioAdditionalContexts.removeAt(index); d->m_highPrioAdditionalContexts.removeAt(index);
} }
for (const Id id : add) { for (const Id id : add) {
if (!id.isValid()) if (!id.isValid())
continue; continue;
Context &cref = (priority == ICore::ContextPriority::High ? m_highPrioAdditionalContexts Context &cref = (priority == ICore::ContextPriority::High ? d->m_highPrioAdditionalContexts
: m_lowPrioAdditionalContexts); : d->m_lowPrioAdditionalContexts);
if (!cref.contains(id)) if (!cref.contains(id))
cref.prepend(id); cref.prepend(id);
} }
updateContext(); d->updateContext();
} }
void MainWindow::updateContext() void MainWindowPrivate::updateContext()
{ {
Context contexts = m_highPrioAdditionalContexts; Context contexts = m_highPrioAdditionalContexts;
@@ -1320,7 +1436,7 @@ void MainWindow::updateContext()
emit m_coreImpl->contextChanged(uniquecontexts); emit m_coreImpl->contextChanged(uniquecontexts);
} }
void MainWindow::aboutToShowRecentFiles() void MainWindowPrivate::aboutToShowRecentFiles()
{ {
ActionContainer *aci = ActionManager::actionContainer(Constants::M_FILE_RECENTFILES); ActionContainer *aci = ActionManager::actionContainer(Constants::M_FILE_RECENTFILES);
QMenu *menu = aci->menu(); QMenu *menu = aci->menu();
@@ -1350,12 +1466,12 @@ void MainWindow::aboutToShowRecentFiles()
} }
} }
void MainWindow::aboutQtCreator() void MainWindowPrivate::aboutQtCreator()
{ {
if (!m_versionDialog) { if (!m_versionDialog) {
m_versionDialog = new VersionDialog(this); m_versionDialog = new VersionDialog(q);
connect(m_versionDialog, &QDialog::finished, connect(m_versionDialog, &QDialog::finished,
this, &MainWindow::destroyVersionDialog); this, &MainWindowPrivate::destroyVersionDialog);
ICore::registerWindow(m_versionDialog, Context("Core.VersionDialog")); ICore::registerWindow(m_versionDialog, Context("Core.VersionDialog"));
m_versionDialog->show(); m_versionDialog->show();
} else { } else {
@@ -1363,7 +1479,7 @@ void MainWindow::aboutQtCreator()
} }
} }
void MainWindow::destroyVersionDialog() void MainWindowPrivate::destroyVersionDialog()
{ {
if (m_versionDialog) { if (m_versionDialog) {
m_versionDialog->deleteLater(); m_versionDialog->deleteLater();
@@ -1371,9 +1487,9 @@ void MainWindow::destroyVersionDialog()
} }
} }
void MainWindow::aboutPlugins() void MainWindowPrivate::aboutPlugins()
{ {
PluginDialog dialog(this); PluginDialog dialog(q);
dialog.exec(); dialog.exec();
} }
@@ -1396,7 +1512,7 @@ public:
} }
}; };
void MainWindow::changeLog() void MainWindowPrivate::changeLog()
{ {
static QPointer<LogDialog> dialog; static QPointer<LogDialog> dialog;
if (dialog) { if (dialog) {
@@ -1497,7 +1613,7 @@ void MainWindow::changeLog()
dialog->show(); dialog->show();
} }
void MainWindow::contact() void MainWindowPrivate::contact()
{ {
QMessageBox dlg(QMessageBox::Information, Tr::tr("Contact"), QMessageBox dlg(QMessageBox::Information, Tr::tr("Contact"),
Tr::tr("<p>Qt Creator developers can be reached at the Qt Creator mailing list:</p>" Tr::tr("<p>Qt Creator developers can be reached at the Qt Creator mailing list:</p>"
@@ -1520,27 +1636,27 @@ void MainWindow::contact()
.arg("<a href=\"https://pastebin.com\">" .arg("<a href=\"https://pastebin.com\">"
"https://pastebin.com" "https://pastebin.com"
"</a>"), "</a>"),
QMessageBox::Ok, this); QMessageBox::Ok, q);
dlg.exec(); dlg.exec();
} }
QPrinter *MainWindow::printer() const QPrinter *MainWindow::printer() const
{ {
if (!m_printer) if (!d->m_printer)
m_printer = new QPrinter(QPrinter::HighResolution); d->m_printer = new QPrinter(QPrinter::HighResolution);
return m_printer; return d->m_printer;
} }
void MainWindow::restoreWindowState() void MainWindowPrivate::restoreWindowState()
{ {
NANOTRACE_SCOPE("Core", "MainWindow::restoreWindowState"); NANOTRACE_SCOPE("Core", "MainWindow::restoreWindowState");
QtcSettings *settings = PluginManager::settings(); QtcSettings *settings = PluginManager::settings();
settings->beginGroup(settingsGroup); settings->beginGroup(settingsGroup);
if (!restoreGeometry(settings->value(windowGeometryKey).toByteArray())) if (!q->restoreGeometry(settings->value(windowGeometryKey).toByteArray()))
resize(1260, 700); // size without window decoration q->resize(1260, 700); // size without window decoration
restoreState(settings->value(windowStateKey).toByteArray()); q->restoreState(settings->value(windowStateKey).toByteArray());
settings->endGroup(); settings->endGroup();
show(); q->show();
StatusBarManager::restoreSettings(); StatusBarManager::restoreSettings();
} }

View File

@@ -7,48 +7,23 @@
#include "icore.h" #include "icore.h"
#include <utils/appmainwindow.h> #include <utils/appmainwindow.h>
#include <utils/dropsupport.h>
#include <QColor>
#include <QTimer>
#include <functional> #include <functional>
#include <unordered_map>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QColor;
class QPrinter; class QPrinter;
class QToolButton;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace Utils { namespace Utils { class InfoBar; }
class InfoBar;
}
namespace Core { namespace Core {
class EditorManager;
class ExternalToolManager;
class IDocument; class IDocument;
class JsExpander;
class MessageManager;
class ModeManager;
class ProgressManager;
class NavigationWidget;
enum class Side;
class RightPaneWidget;
class VcsManager;
namespace Internal { namespace Internal {
class FancyTabWidget; class MainWindowPrivate;
class GeneralSettings;
class ProgressManagerPrivate;
class ShortcutSettings;
class ToolSettings;
class MimeTypeSettings;
class VersionDialog;
class WindowSupport;
class SystemEditor;
class MainWindow : public Utils::AppMainWindow class MainWindow : public Utils::AppMainWindow
{ {
@@ -70,7 +45,7 @@ public:
ICore::OpenFilesFlags flags, ICore::OpenFilesFlags flags,
const Utils::FilePath &workingDirectory = {}); const Utils::FilePath &workingDirectory = {});
virtual QPrinter *printer() const; QPrinter *printer() const;
IContext *currentContextObject() const; IContext *currentContextObject() const;
QStatusBar *statusBar() const; QStatusBar *statusBar() const;
Utils::InfoBar *infoBar() const; Utils::InfoBar *infoBar() const;
@@ -90,98 +65,18 @@ public:
void restart(); void restart();
void openFileFromDevice();
void restartTrimmer(); void restartTrimmer();
public slots: public slots:
static void openFileWith(); static void openFileWith();
void exit(); void exit();
protected: private:
void closeEvent(QCloseEvent *event) override; void closeEvent(QCloseEvent *event) override;
void keyPressEvent(QKeyEvent *event) override; void keyPressEvent(QKeyEvent *event) override;
void mousePressEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override;
private: MainWindowPrivate *d = nullptr;
static void openFile();
void aboutToShowRecentFiles();
static void setFocusToEditor();
void aboutQtCreator();
void aboutPlugins();
void changeLog();
void contact();
void updateFocusWidget(QWidget *old, QWidget *now);
NavigationWidget *navigationWidget(Side side) const;
void setSidebarVisible(bool visible, Side side);
void destroyVersionDialog();
void openDroppedFiles(const QList<Utils::DropSupport::FileSpec> &files);
void restoreWindowState();
void updateContextObject(const QList<IContext *> &context);
void updateContext();
void registerDefaultContainers();
void registerDefaultActions();
void registerModeSelectorStyleActions();
void readSettings();
void saveWindowSettings();
void updateModeSelectorStyleMenu();
ICore *m_coreImpl = nullptr;
QTimer m_trimTimer;
QStringList m_aboutInformation;
Context m_highPrioAdditionalContexts;
Context m_lowPrioAdditionalContexts;
mutable QPrinter *m_printer = nullptr;
WindowSupport *m_windowSupport = nullptr;
EditorManager *m_editorManager = nullptr;
ExternalToolManager *m_externalToolManager = nullptr;
MessageManager *m_messageManager = nullptr;
ProgressManagerPrivate *m_progressManager = nullptr;
JsExpander *m_jsExpander = nullptr;
VcsManager *m_vcsManager = nullptr;
ModeManager *m_modeManager = nullptr;
FancyTabWidget *m_modeStack = nullptr;
NavigationWidget *m_leftNavigationWidget = nullptr;
NavigationWidget *m_rightNavigationWidget = nullptr;
RightPaneWidget *m_rightPaneWidget = nullptr;
VersionDialog *m_versionDialog = nullptr;
QList<IContext *> m_activeContext;
std::unordered_map<QWidget *, IContext *> m_contextWidgets;
ShortcutSettings *m_shortcutSettings = nullptr;
ToolSettings *m_toolSettings = nullptr;
MimeTypeSettings *m_mimeTypeSettings = nullptr;
SystemEditor *m_systemEditor = nullptr;
// actions
QAction *m_focusToEditor = nullptr;
QAction *m_newAction = nullptr;
QAction *m_openAction = nullptr;
QAction *m_openWithAction = nullptr;
QAction *m_openFromDeviceAction = nullptr;
QAction *m_saveAllAction = nullptr;
QAction *m_exitAction = nullptr;
QAction *m_optionsAction = nullptr;
QAction *m_loggerAction = nullptr;
QAction *m_toggleLeftSideBarAction = nullptr;
QAction *m_toggleRightSideBarAction = nullptr;
QAction *m_toggleMenubarAction = nullptr;
QAction *m_cycleModeSelectorStyleAction = nullptr;
QAction *m_setModeSelectorStyleIconsAndTextAction = nullptr;
QAction *m_setModeSelectorStyleHiddenAction = nullptr;
QAction *m_setModeSelectorStyleIconsOnlyAction = nullptr;
QAction *m_themeAction = nullptr;
QToolButton *m_toggleLeftSideBarButton = nullptr;
QToolButton *m_toggleRightSideBarButton = nullptr;
QColor m_overrideColor;
QList<std::function<bool()>> m_preCloseListeners;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -4,7 +4,6 @@
#pragma once #pragma once
#include "core_global.h" #include "core_global.h"
#include "ioutputpane.h"
#include <QMetaType> #include <QMetaType>
#include <QObject> #include <QObject>
@@ -15,7 +14,10 @@ QT_END_NAMESPACE
namespace Core { namespace Core {
namespace Internal { class MainWindow; } namespace Internal {
class MainWindow;
class MainWindowPrivate;
}
class CORE_EXPORT MessageManager : public QObject class CORE_EXPORT MessageManager : public QObject
{ {
@@ -41,6 +43,7 @@ private:
static void init(); static void init();
friend class Core::Internal::MainWindow; friend class Core::Internal::MainWindow;
friend class Core::Internal::MainWindowPrivate;
}; };
} // namespace Core } // namespace Core

View File

@@ -19,6 +19,7 @@ class IMode;
namespace Internal { namespace Internal {
class MainWindow; class MainWindow;
class MainWindowPrivate;
class FancyTabWidget; class FancyTabWidget;
} }
@@ -69,6 +70,7 @@ private:
friend class IMode; friend class IMode;
friend class Core::Internal::MainWindow; friend class Core::Internal::MainWindow;
friend class Core::Internal::MainWindowPrivate;
}; };
} // namespace Core } // namespace Core

View File

@@ -18,6 +18,7 @@ namespace Core {
namespace Internal { namespace Internal {
class MainWindow; class MainWindow;
class MainWindowPrivate;
class OutputPaneToggleButton; class OutputPaneToggleButton;
class OutputPaneManageButton; class OutputPaneManageButton;
@@ -45,6 +46,7 @@ protected:
private: private:
// the only class that is allowed to create and destroy // the only class that is allowed to create and destroy
friend class MainWindow; friend class MainWindow;
friend class MainWindowPrivate;
friend class OutputPaneManageButton; friend class OutputPaneManageButton;
static void create(); static void create();

View File

@@ -15,7 +15,7 @@ namespace Core {
class IVersionControl; class IVersionControl;
namespace Internal { class MainWindow; } namespace Internal { class MainWindowPrivate; }
/* VcsManager: /* VcsManager:
* 1) Provides functionality for finding the IVersionControl * for a given * 1) Provides functionality for finding the IVersionControl * for a given
@@ -87,7 +87,7 @@ private:
void handleConfigurationChanges(IVersionControl *vc); void handleConfigurationChanges(IVersionControl *vc);
static void addVersionControl(IVersionControl *vc); static void addVersionControl(IVersionControl *vc);
friend class Core::Internal::MainWindow; friend class Core::Internal::MainWindowPrivate;
friend class Core::IVersionControl; friend class Core::IVersionControl;
}; };