File indexing completed on 2024-05-12 05:14:50

0001 /*
0002  *  mainwindow.h  -  main application window
0003  *  Program:  kalarm
0004  *  SPDX-FileCopyrightText: 2001-2023 David Jarvie <djarvie@kde.org>
0005  *
0006  *  SPDX-License-Identifier: GPL-2.0-or-later
0007  */
0008 
0009 #pragma once
0010 
0011 /** @file mainwindow.h - main application window */
0012 
0013 #include "editdlg.h"
0014 #include "mainwindowbase.h"
0015 #include "messagedisplay.h"
0016 #include "undo.h"
0017 #include "kalarmcalendar/kaevent.h"
0018 
0019 #include <KCalendarCore/Calendar>
0020 
0021 #include <QList>
0022 #include <QMap>
0023 #include <QPointer>
0024 
0025 class QDragEnterEvent;
0026 class QHideEvent;
0027 class QShowEvent;
0028 class QResizeEvent;
0029 class QDropEvent;
0030 class QCloseEvent;
0031 class QSplitter;
0032 class QMenu;
0033 class QScrollArea;
0034 class QFrame;
0035 class QVBoxLayout;
0036 class QAction;
0037 class KToggleAction;
0038 class KToolBarPopupAction;
0039 class KHamburgerMenu;
0040 class AlarmListModel;
0041 class AlarmListView;
0042 class DatePicker;
0043 class DeferAlarmDlg;
0044 class NewAlarmAction;
0045 class TemplateDlg;
0046 class ResourceSelector;
0047 
0048 
0049 class MainWindow : public MainWindowBase, public KCalendarCore::Calendar::CalendarObserver
0050 {
0051     Q_OBJECT
0052 
0053 public:
0054     static MainWindow* create(bool restored = false);
0055     ~MainWindow() override;
0056     bool               isTrayParent() const;
0057     bool               isHiddenTrayParent() const   { return mHiddenTrayParent; }
0058     bool               showingArchived() const      { return mShowArchived; }
0059     void               selectEvent(const QString& eventId);
0060     KAEvent            selectedEvent() const;
0061     void               editAlarm(EditAlarmDlg*, const KAEvent&);
0062     void               showDeferAlarmDlg(MessageDisplay::DeferDlgData*);
0063     void               clearSelection();
0064     QMenu*             resourceContextMenu();
0065     bool               eventFilter(QObject*, QEvent*) override;
0066 
0067     static void        refresh();
0068     static void        executeDragEnterEvent(QDragEnterEvent*);
0069     static void        executeDropEvent(MainWindow*, QDropEvent*);
0070     static void        closeAll();
0071     static MainWindow* toggleWindow(MainWindow*);
0072     static MainWindow* mainMainWindow();
0073     static MainWindow* firstWindow()      { return mWindowList.isEmpty() ? nullptr : mWindowList[0]; }
0074     static int         count()            { return mWindowList.count(); }
0075 
0076 Q_SIGNALS:
0077     void           selectionChanged();
0078 
0079 protected:
0080     void           resizeEvent(QResizeEvent*) override;
0081     void           showEvent(QShowEvent*) override;
0082     void           hideEvent(QHideEvent*) override;
0083     void           closeEvent(QCloseEvent*) override;
0084     void           dragEnterEvent(QDragEnterEvent* e) override  { executeDragEnterEvent(e); }
0085     void           dropEvent(QDropEvent*) override;
0086     void           saveProperties(KConfigGroup&) override;
0087     void           readProperties(const KConfigGroup&) override;
0088 
0089 private Q_SLOTS:
0090     void           slotInitHamburgerMenu();
0091     void           slotNew(EditAlarmDlg::Type);
0092     void           slotNewFromTemplate(const KAlarmCal::KAEvent&);
0093     void           slotNewTemplate();
0094     void           slotCopy();
0095     void           slotModify();
0096     void           slotDeleteIf()     { slotDelete(false); }
0097     void           slotDeleteForce()  { slotDelete(true); }
0098     void           slotReactivate();
0099     void           slotEnable();
0100     void           slotToggleTrayIcon();
0101     void           slotRefreshAlarms();
0102     void           slotImportAlarms();
0103     void           slotExportAlarms();
0104     void           slotBirthdays();
0105     void           slotTemplates();
0106     void           slotTemplatesEnd();
0107     void           slotPreferences();
0108     void           slotToggleMenubar(bool dontShowWarning);
0109     void           slotConfigureKeys();
0110     void           slotConfigureNotifications();
0111     void           slotConfigureToolbar();
0112     void           slotNewToolbarConfig();
0113     void           slotQuit();
0114     void           slotSelection();
0115     void           slotContextMenuRequested(const QPoint& globalPos);
0116     void           slotShowArchived();
0117     void           slotSpreadWindowsShortcut();
0118     void           slotWakeFromSuspend();
0119     void           updateKeepArchived(int days);
0120     void           slotUndo();
0121     void           slotUndoItem(QAction* id);
0122     void           slotRedo();
0123     void           slotRedoItem(QAction* id);
0124     void           slotInitUndoMenu();
0125     void           slotInitRedoMenu();
0126     void           slotUndoStatus(const QString&, const QString&);
0127     void           slotFindActive(bool);
0128     void           updateTrayIconAction();
0129     void           slotToggleResourceSelector();
0130     void           slotToggleDateNavigator();
0131     void           slotCalendarStatusChanged();
0132     void           slotAlarmListColumnsChanged();
0133     void           datesSelected(const QList<QDate>& dates, bool workChange);
0134     void           resourcesResized();
0135     void           showMenuErrorMessage();
0136     void           showErrorMessage(const QString&);
0137     void           editAlarmOk();
0138     void           editAlarmDeleted(QObject*);
0139     void           deferAlarmDlgDone(int result);
0140     void           deferAlarmDlgDeleted(QObject* obj)  { processDeferAlarmDlg(obj, QDialog::Rejected); }
0141 
0142 private:
0143     using WindowList = QList<MainWindow*>;
0144 
0145     explicit MainWindow(bool restored);
0146     void            initActions();
0147     void            selectionCleared();
0148     void            setEnableText(bool enable);
0149     void            arrangePanel();
0150     void            setSplitterSizes();
0151     void            initUndoMenu(QMenu*, Undo::Type);
0152     void            slotDelete(bool force);
0153     void            processDeferAlarmDlg(QObject*, int result);
0154     static void     enableTemplateMenuItem(bool);
0155 
0156     static WindowList    mWindowList;    // active main windows
0157     static TemplateDlg*  mTemplateDlg;   // the one and only template dialog
0158 
0159     AlarmListModel*      mListFilterModel;
0160     AlarmListView*       mListView;
0161     ResourceSelector*    mResourceSelector;   // resource selector widget
0162     DatePicker*          mDatePicker;         // date navigator widget
0163     QSplitter*           mSplitter;           // splits window into list and resource selector
0164     QScrollArea*         mPanel;              // side panel containing resource selector & date navigator
0165     QVBoxLayout*         mPanelLayout;        // layout for side panel contents
0166     QFrame*              mPanelDivider{nullptr};
0167     QMap<EditAlarmDlg*, KAEvent> mEditAlarmMap; // edit alarm dialogs to be handled by this window
0168     QMap<DeferAlarmDlg*, MessageDisplay::DeferDlgData*> mDeferAlarmMap; // defer alarm dialogs to be handled by this window
0169     KToggleAction*       mActionShowMenuBar;
0170     KToggleAction*       mActionToggleResourceSel;
0171     KToggleAction*       mActionToggleDateNavigator;
0172     QAction*             mActionImportAlarms;
0173     QAction*             mActionExportAlarms;
0174     QAction*             mActionExport;
0175     QAction*             mActionImportBirthdays{nullptr};
0176     QAction*             mActionTemplates;
0177     NewAlarmAction*      mActionNew;
0178     QAction*             mActionCreateTemplate;
0179     QAction*             mActionCopy;
0180     QAction*             mActionModify;
0181     QAction*             mActionDelete;
0182     QAction*             mActionDeleteForce;
0183     QAction*             mActionReactivate;
0184     QAction*             mActionEnable;
0185     QAction*             mActionFindNext;
0186     QAction*             mActionFindPrev;
0187     KToolBarPopupAction* mActionUndo;
0188     KToolBarPopupAction* mActionRedo;
0189     KToggleAction*       mActionToggleTrayIcon;
0190     KToggleAction*       mActionShowArchived;
0191     KToggleAction*       mActionSpreadWindows;
0192     KHamburgerMenu*      mHamburgerMenu;
0193     QPointer<QMenu>      mContextMenu;
0194     QPointer<QMenu>      mResourceContextMenu;
0195     QMap<QAction*, int>  mUndoMenuIds;             // items in the undo/redo menu, in order of appearance
0196     int                  mResourcesWidth{-1};      // width of resource selector widget
0197     int                  mPanelScrollBarWidth{0};  // width of side panel vertical scroll bar
0198     bool                 mHiddenTrayParent{false}; // on session restoration, hide this window
0199     bool                 mShowResources;           // show resource selector
0200     bool                 mShowDateNavigator;       // show date navigator
0201     bool                 mDateNavigatorTop{true};  // date navigator is at top of panel
0202     bool                 mShowArchived;            // include archived alarms in the displayed list
0203     bool                 mShown{false};            // true once the window has been displayed
0204     bool                 mActionEnableEnable;      // Enable/Disable action is set to "Enable"
0205     bool                 mMenuError;               // error occurred creating menus: need to show error message
0206     bool                 mResizing{false};         // window resize is in progress
0207 };
0208 
0209 // vim: et sw=4: