File indexing completed on 2024-05-12 07:41:27
0001 /* 0002 File : MainWin.h 0003 Project : LabPlot 0004 Description : Main window of the application 0005 -------------------------------------------------------------------- 0006 SPDX-FileCopyrightText: 2011-2023 Alexander Semke <alexander.semke@web.de> 0007 SPDX-FileCopyrightText: 2008-2018 Stefan Gerlach <stefan.gerlach@uni.kn> 0008 0009 SPDX-License-Identifier: GPL-2.0-or-later 0010 */ 0011 0012 #ifndef MAINWIN_H 0013 #define MAINWIN_H 0014 0015 #include "backend/worksheet/plots/cartesian/CartesianPlot.h" 0016 0017 #include <KXmlGuiWindow> 0018 #include <QStringLiteral> 0019 #include <QTimer> 0020 0021 class AbstractAspect; 0022 class AspectTreeModel; 0023 class Folder; 0024 class ProjectExplorer; 0025 class Project; 0026 class Worksheet; 0027 class Spreadsheet; 0028 class GuiObserver; 0029 class CursorDock; 0030 class ContentDockWidget; 0031 class MemoryWidget; 0032 // class WelcomeScreenHelper; 0033 class WorksheetPreviewWidget; 0034 0035 class QDockWidget; 0036 class QDragEnterEvent; 0037 class QDropEvent; 0038 class QStackedWidget; 0039 class QToolButton; 0040 // class QQuickWidget; 0041 0042 class KColorSchemeManager; 0043 class KHamburgerMenu; 0044 class KRecentFilesAction; 0045 class KToggleAction; 0046 class KToggleFullScreenAction; 0047 0048 namespace ads { 0049 class CDockManager; 0050 class CDockWidget; 0051 } 0052 0053 #ifdef HAVE_KUSERFEEDBACK 0054 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) 0055 #include <KUserFeedbackQt6/Provider> 0056 #else 0057 #include <KUserFeedback/Provider> 0058 #endif 0059 #endif 0060 0061 #ifdef HAVE_PURPOSE 0062 namespace Purpose { 0063 class Menu; 0064 } 0065 #endif 0066 0067 #ifdef HAVE_TOUCHBAR 0068 class KDMacTouchBar; 0069 #endif 0070 0071 class MainWin : public KXmlGuiWindow { 0072 Q_OBJECT 0073 0074 public: 0075 explicit MainWin(QWidget* parent = nullptr, const QString& filename = QString()); 0076 ~MainWin() override; 0077 0078 void showPresenter(); 0079 AspectTreeModel* model() const; 0080 Project* project() const; 0081 void addAspectToProject(AbstractAspect*); 0082 static void updateLocale(); 0083 0084 enum class LoadOnStart { NewProject, LastProject, WelcomeScreen }; 0085 enum class NewProject { WithWorksheet, WithSpreadsheet, WithWorksheetSpreadsheet, WithNotebook }; 0086 enum class TitleBarMode { ShowFilePath, ShowFileName, ShowProjectName }; 0087 0088 #ifdef HAVE_KUSERFEEDBACK 0089 KUserFeedback::Provider& userFeedbackProvider() { 0090 return m_userFeedbackProvider; 0091 } 0092 #endif 0093 0094 private: 0095 ads::CDockManager* m_DockManager{nullptr}; 0096 KColorSchemeManager* m_schemeManager{nullptr}; 0097 ContentDockWidget* m_currentDock{nullptr}; // Currently selected dock 0098 Project* m_project{nullptr}; 0099 AspectTreeModel* m_aspectTreeModel{nullptr}; 0100 ProjectExplorer* m_projectExplorer{nullptr}; 0101 WorksheetPreviewWidget* m_worksheetPreviewWidget{nullptr}; 0102 ads::CDockWidget* m_projectExplorerDock{nullptr}; 0103 ads::CDockWidget* m_propertiesDock{nullptr}; 0104 ads::CDockWidget* m_worksheetPreviewDock{nullptr}; 0105 AbstractAspect* m_currentAspect{nullptr}; 0106 ads::CDockWidget* m_currentAspectDock{nullptr}; 0107 Folder* m_currentFolder{nullptr}; 0108 QString m_undoViewEmptyLabel; 0109 bool m_suppressCurrentSubWindowChangedEvent{false}; 0110 bool m_closing{false}; 0111 bool m_projectClosing{false}; 0112 bool m_autoSaveActive{false}; 0113 QTimer m_autoSaveTimer; 0114 // bool m_showWelcomeScreen{false}; 0115 // bool m_saveWelcomeScreen{true}; 0116 int undoStackIndexLastSave{0}; 0117 MemoryWidget* m_memoryInfoWidget{nullptr}; 0118 // QQuickWidget* m_welcomeWidget{nullptr}; 0119 // WelcomeScreenHelper* m_welcomeScreenHelper{nullptr}; 0120 QString m_lastOpenFileFilter; 0121 const Worksheet* m_lastWorksheet{nullptr}; 0122 const Spreadsheet* m_lastSpreadsheet{nullptr}; 0123 TitleBarMode m_titleBarMode{TitleBarMode::ShowFilePath}; 0124 0125 #ifdef HAVE_KUSERFEEDBACK 0126 KUserFeedback::Provider m_userFeedbackProvider; 0127 #endif 0128 0129 #ifdef Q_OS_MAC 0130 #ifdef HAVE_TOUCHBAR 0131 KDMacTouchBar* m_touchBar; 0132 #endif 0133 QAction* m_undoIconOnlyAction; 0134 QAction* m_redoIconOnlyAction; 0135 #endif 0136 0137 KRecentFilesAction* m_recentProjectsAction; 0138 QAction* m_searchAction; 0139 QAction* m_saveAction; 0140 QAction* m_saveAsAction; 0141 QAction* m_printAction; 0142 QAction* m_printPreviewAction; 0143 QAction* m_importFileAction; 0144 QAction* m_importFileAction_2; 0145 QAction* m_importSqlAction; 0146 QAction* m_importDatasetAction; 0147 QAction* m_importLabPlotAction; 0148 QAction* m_importOpjAction; 0149 QAction* m_exportAction; 0150 // QAction* m_closeAction; 0151 QAction* m_newFolderAction; 0152 QAction* m_newWorkbookAction; 0153 QAction* m_newSpreadsheetAction; 0154 QAction* m_newMatrixAction; 0155 QAction* m_newWorksheetAction; 0156 QAction* m_newNotesAction; 0157 QAction* m_newLiveDataSourceAction; 0158 QAction* m_newProjectAction; 0159 QAction* m_openProjectAction; 0160 QAction* m_historyAction; 0161 QAction* m_undoAction; 0162 QAction* m_redoAction; 0163 QAction* m_closeWindowAction; 0164 QAction* m_closeAllWindowsAction; 0165 QAction* m_nextWindowAction; 0166 QAction* m_prevWindowAction; 0167 QAction* m_newDatapickerAction; 0168 0169 // toggling dock widgets, status bar and full screen 0170 QAction* m_projectExplorerDockAction; 0171 QAction* m_propertiesDockAction; 0172 QAction* m_worksheetPreviewAction; 0173 KToggleAction* m_statusBarAction; 0174 QAction* m_memoryInfoAction; 0175 KToggleFullScreenAction* m_fullScreenAction; 0176 QAction* m_configureCASAction; 0177 0178 // window visibility 0179 QAction* m_visibilityFolderAction; 0180 QAction* m_visibilitySubfolderAction; 0181 QAction* m_visibilityAllAction; 0182 0183 // Menus 0184 QMenu* m_visibilityMenu{nullptr}; 0185 QMenu* m_newMenu{nullptr}; 0186 QMenu* m_importMenu{nullptr}; 0187 QMenu* m_newNotebookMenu{nullptr}; 0188 KHamburgerMenu* m_hamburgerMenu{nullptr}; 0189 0190 #ifdef HAVE_PURPOSE 0191 QAction* m_shareAction{nullptr}; 0192 Purpose::Menu* m_shareMenu{nullptr}; 0193 void fillShareMenu(); 0194 #endif 0195 0196 // Docks 0197 ads::CDockWidget* cursorDock{nullptr}; 0198 0199 QStackedWidget* stackedWidget{nullptr}; 0200 CursorDock* cursorWidget{nullptr}; 0201 0202 void initActions(); 0203 void initMenus(); 0204 bool warnModified(); 0205 void activateSubWindowForAspect(const AbstractAspect*); 0206 bool save(const QString&); 0207 // void toggleShowWidget(QWidget* widget, bool showToRight); 0208 // void toggleHideWidget(QWidget* widget, bool hideToLeft); 0209 // QQuickWidget* createWelcomeScreen(); 0210 // void resetWelcomeScreen(); 0211 void createADS(); 0212 0213 Spreadsheet* activeSpreadsheet() const; 0214 0215 friend class GuiObserver; 0216 GuiObserver* m_guiObserver{nullptr}; 0217 0218 protected: 0219 void closeEvent(QCloseEvent*) override; 0220 void dragEnterEvent(QDragEnterEvent*) override; 0221 void dropEvent(QDropEvent*) override; 0222 0223 private Q_SLOTS: 0224 void initGUI(const QString&); 0225 bool specialDock(ads::CDockWidget* dock); 0226 void changeVisibleAllDocks(bool); 0227 void activateNextDock(); 0228 void activatePreviousDock(); 0229 void dockWidgetAboutToBeRemoved(ads::CDockWidget*); 0230 void dockWidgetRemoved(ads::CDockWidget*); 0231 void dockFocusChanged(ads::CDockWidget* old, ads::CDockWidget* now); 0232 void updateGUI(); 0233 void updateGUIOnProjectChanges(const QByteArray& windowState = QByteArray()); 0234 void undo(); 0235 void redo(); 0236 0237 bool newProject(bool createInitialContent = true); 0238 void openProject(); 0239 void openProject(const QString&); 0240 void openRecentProject(const QUrl&); 0241 bool closeProject(); 0242 bool saveProject(); 0243 bool saveProjectAs(); 0244 void autoSaveProject(); 0245 void updateTitleBar(); 0246 0247 void print(); 0248 void printPreview(); 0249 0250 void historyDialog(); 0251 void importFileDialog(const QString& fileName = QString()); 0252 void importSqlDialog(); 0253 void importProjectDialog(); 0254 void importDatasetDialog(); 0255 void exportDialog(); 0256 void editFitsFileDialog(); 0257 void settingsDialog(); 0258 void projectChanged(); 0259 void colorSchemeChanged(QAction*); 0260 void openDatasetExample(); 0261 0262 // Cantor 0263 #ifdef HAVE_CANTOR_LIBS 0264 void newCantorWorksheet(); 0265 void cantorSettingsDialog(); 0266 void updateNotebookActions(); 0267 #endif 0268 0269 void newFolder(); 0270 void newWorkbook(); 0271 void newSpreadsheet(); 0272 void newMatrix(); 0273 void newWorksheet(); 0274 void newNotes(); 0275 void newDatapicker(); 0276 void newLiveDataSource(); 0277 0278 void createContextMenu(QMenu*) const; 0279 void createFolderContextMenu(const Folder*, QMenu*) const; 0280 0281 void handleAspectAdded(const AbstractAspect*); 0282 void handleAspectAboutToBeRemoved(const AbstractAspect*); 0283 void handleAspectRemoved(const AbstractAspect*, const AbstractAspect*, const AbstractAspect*); 0284 void handleCurrentAspectChanged(AbstractAspect*); 0285 void handleShowSubWindowRequested(); 0286 0287 void handleSettingsChanges(); 0288 0289 void setDockVisibility(QAction*); 0290 void updateDockWindowVisibility() const; 0291 void toggleDockWidget(QAction*); 0292 void toggleStatusBar(bool); 0293 void toggleMenuBar(bool); 0294 void toggleMemoryInfo(); 0295 void toggleFullScreen(bool); 0296 void projectExplorerDockVisibilityChanged(bool); 0297 void propertiesDockVisibilityChanged(bool); 0298 void worksheetPreviewDockVisibilityChanged(bool); 0299 void cursorDockVisibilityChanged(bool); 0300 void propertiesExplorerRequested(); 0301 0302 void focusCursorDock(); 0303 0304 void cartesianPlotMouseModeChanged(CartesianPlot::MouseMode); 0305 0306 #ifdef HAVE_PURPOSE 0307 void shareActionFinished(const QJsonObject& output, int error, const QString& message); 0308 #endif 0309 }; 0310 0311 #endif