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: