File indexing completed on 2024-06-23 05:08:10

0001 /*
0002   This file is part of KOrganizer.
0003 
0004   SPDX-FileCopyrightText: 2000, 2001, 2003 Cornelius Schumacher <schumacher@kde.org>
0005   SPDX-FileCopyrightText: 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
0006   SPDX-FileCopyrightText: 2005 Rafal Rzepecki <divide@users.sourceforge.net>
0007   SPDX-FileCopyrightText: 2008 Thomas Thrainer <tom_t@gmx.at>
0008 
0009   SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
0010 */
0011 #pragma once
0012 
0013 #include "eventview.h"
0014 #include <Akonadi/IncidenceChanger>
0015 
0016 #include <QPointer>
0017 #include <akonadi/collectioncalendar.h>
0018 
0019 class KJob;
0020 class TodoCategoriesDelegate;
0021 class TodoViewQuickAddLine;
0022 class TodoViewQuickSearch;
0023 class TodoViewSortFilterProxyModel;
0024 class TodoViewView;
0025 
0026 namespace Akonadi
0027 {
0028 class ETMViewStateSaver;
0029 }
0030 
0031 class QItemSelection;
0032 class QMenu;
0033 class QModelIndex;
0034 class QToolButton;
0035 class QTimer;
0036 class KConfig;
0037 class KDatePickerPopup;
0038 namespace EventViews
0039 {
0040 
0041 class CalendarFilterModel;
0042 
0043 /**
0044  * This class provides a view for Todo items.
0045 
0046  * @short View for Todo components.
0047  * @author Cornelius Schumacher <schumacher@kde.org>, Reinhold Kainhofer <reinhold@kainhofer.com>
0048  * @see EventView
0049  */
0050 class EVENTVIEWS_EXPORT TodoView : public EventViews::EventView
0051 {
0052     Q_OBJECT
0053     friend class ModelStack;
0054 
0055 public:
0056     TodoView(const EventViews::PrefsPtr &preferences, bool sidebarView, QWidget *parent);
0057     ~TodoView() override;
0058 
0059     void setModel(QAbstractItemModel *model) override;
0060     void addCalendar(const Akonadi::CollectionCalendar::Ptr &calendar) override;
0061     void removeCalendar(const Akonadi::CollectionCalendar::Ptr &calendar) override;
0062 
0063     [[nodiscard]] Akonadi::Item::List selectedIncidences() const override;
0064     [[nodiscard]] KCalendarCore::DateList selectedIncidenceDates() const override;
0065     [[nodiscard]] int currentDateCount() const override
0066     {
0067         return 0;
0068     }
0069 
0070     void setDocumentId(const QString &)
0071     {
0072     }
0073 
0074     void saveLayout(KConfig *config, const QString &group) const;
0075 
0076     void restoreLayout(KConfig *config, const QString &group, bool minimalDefaults);
0077 
0078     /** documentation in baseview.h */
0079     void getHighlightMode(bool &highlightEvents, bool &highlightTodos, bool &highlightJournals);
0080 
0081     [[nodiscard]] bool usesFullWindow();
0082 
0083     [[nodiscard]] bool supportsDateRangeSelection() const
0084     {
0085         return false;
0086     }
0087 
0088 public Q_SLOTS:
0089     void setIncidenceChanger(Akonadi::IncidenceChanger *changer) override;
0090     void showDates(const QDate &start, const QDate &end, const QDate &preferredMonth = QDate()) override;
0091     void showIncidences(const Akonadi::Item::List &incidenceList, const QDate &date) override;
0092     void updateView() override;
0093     virtual void changeIncidenceDisplay(const Akonadi::Item &incidence, Akonadi::IncidenceChanger::ChangeType changeType);
0094     void updateConfig() override;
0095     void clearSelection() override;
0096     void expandIndex(const QModelIndex &index);
0097     void restoreViewState();
0098     void saveViewState();
0099 
0100     void createNote();
0101     void createEvent();
0102 
0103 protected Q_SLOTS:
0104     void resizeEvent(QResizeEvent *) override;
0105     void addQuickTodo(Qt::KeyboardModifiers modifier);
0106 
0107     void contextMenu(QPoint pos);
0108 
0109     void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
0110 
0111     // slots used by popup-menus
0112     void showTodo();
0113     void editTodo();
0114     void deleteTodo();
0115     void newTodo();
0116     void newSubTodo();
0117     void copyTodoToDate(QDate date);
0118 
0119 private Q_SLOTS:
0120     EVENTVIEWS_NO_EXPORT void scheduleResizeColumns();
0121     EVENTVIEWS_NO_EXPORT void resizeColumns();
0122     EVENTVIEWS_NO_EXPORT void itemDoubleClicked(const QModelIndex &index);
0123     EVENTVIEWS_NO_EXPORT void setNewDate(QDate date);
0124     EVENTVIEWS_NO_EXPORT void setStartDate(QDate date);
0125     EVENTVIEWS_NO_EXPORT void setNewPercentage(QAction *action);
0126     EVENTVIEWS_NO_EXPORT void setNewPriority(QAction *action);
0127     EVENTVIEWS_NO_EXPORT void changedCategories(QAction *action);
0128     EVENTVIEWS_NO_EXPORT void setFullView(bool fullView);
0129 
0130     EVENTVIEWS_NO_EXPORT void setFlatView(bool flatView, bool notifyOtherViews = true);
0131 
0132     EVENTVIEWS_NO_EXPORT void onRowsInserted(const QModelIndex &parent, int start, int end);
0133     EVENTVIEWS_NO_EXPORT void onTagsFetched(KJob *);
0134 
0135 Q_SIGNALS:
0136     void purgeCompletedSignal();
0137     void unSubTodoSignal();
0138     void unAllSubTodoSignal();
0139     void configChanged();
0140     void fullViewChanged(bool enabled);
0141     void printPreviewTodo();
0142     void printTodo();
0143 
0144     void createNote(const Akonadi::Item &item);
0145     void createEvent(const Akonadi::Item &item);
0146 
0147 private:
0148     EVENTVIEWS_NO_EXPORT QMenu *createCategoryPopupMenu();
0149     EVENTVIEWS_NO_EXPORT QString stateSaverGroup() const;
0150 
0151     /** Creates a new todo with the given text as summary under the given parent */
0152     void addTodo(const QString &summary, const Akonadi::Item &parentItem, const QStringList &categories = QStringList());
0153 
0154     TodoViewView *mView = nullptr;
0155     TodoViewSortFilterProxyModel *mProxyModel = nullptr;
0156     TodoCategoriesDelegate *mCategoriesDelegate = nullptr;
0157     std::unique_ptr<CalendarFilterModel> mCalendarFilterModel;
0158 
0159     TodoViewQuickSearch *mQuickSearch = nullptr;
0160     TodoViewQuickAddLine *mQuickAdd = nullptr;
0161     QToolButton *mFullViewButton = nullptr;
0162     QToolButton *mFlatViewButton = nullptr;
0163 
0164     QMenu *mItemPopupMenu = nullptr;
0165     KDatePickerPopup *mCopyPopupMenu = nullptr;
0166     KDatePickerPopup *mMovePopupMenu = nullptr;
0167     QMenu *mPriorityPopupMenu = nullptr;
0168     QMenu *mPercentageCompletedPopupMenu = nullptr;
0169     QList<QAction *> mItemPopupMenuItemOnlyEntries;
0170     QList<QAction *> mItemPopupMenuReadWriteEntries;
0171 
0172     QAction *mMakeTodoIndependent = nullptr;
0173     QAction *mMakeSubtodosIndependent = nullptr;
0174 
0175     QPointer<Akonadi::ETMViewStateSaver> mTreeStateRestorer;
0176 
0177     QMap<QAction *, int> mPercentage;
0178     QMap<QAction *, int> mPriority;
0179     bool mSidebarView;
0180     bool mResizeColumnsScheduled;
0181     QTimer *mResizeColumnsTimer = nullptr;
0182 };
0183 }