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