Introduced styles - first version of Widgets
[opentodolist:opentodolist.git] / OpenTodoListCore / todosortfiltermodel.h
1 /*
2  *  OpenTodoList - A todo and task manager
3  *  Copyright (C) 2013  Martin Höher <martin@rpdev.net>
4  * 
5  *  This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation, either version 3 of the License, or
8  *  (at your option) any later version.
9  * 
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  * 
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19
20 #ifndef TODOSORTFILTERMODEL_H
21 #define TODOSORTFILTERMODEL_H
22
23 #include "objectmodel.h"
24 #include "opentodolistcore_global.h"
25
26 #include <QDateTime>
27 #include <QSortFilterProxyModel>
28
29 class AbstractTodo;
30
31 class OPENTODOLISTCORESHARED_EXPORT TodoSortFilterModel : public QSortFilterProxyModel
32 {
33     
34     Q_OBJECT
35     Q_ENUMS( FilterMode )
36     Q_ENUMS( SortMode )
37     Q_PROPERTY( QObject* sourceModel READ sourceModel WRITE setSourceModel NOTIFY sourceModelChanged )
38     Q_PROPERTY( int filterMode READ filterMode WRITE setFilterMode NOTIFY filterModeChanged )
39     Q_PROPERTY( SortMode sortMode READ sortMode WRITE setSortMode NOTIFY sortModeChanged )
40     Q_PROPERTY( QString searchString READ searchString WRITE setSearchString NOTIFY searchStringChanged )
41     Q_PROPERTY( QDateTime maxDueDate READ maxDueDate WRITE setMaxDueDate NOTIFY maxDueDateChanged )
42     Q_PROPERTY( QDateTime minDueDate READ minDueDate WRITE setMinDueDate NOTIFY minDueDateChanged )
43     Q_PROPERTY( int count READ itemCount NOTIFY itemCountChanged )
44     
45 public:
46     
47     typedef enum {
48         TodoListEntries     = 0x0001,
49         SubTodos            = 0x0002,
50         HideDeleted         = 0x0004,
51         HideNonDeleted      = 0x0008,
52         NoFilter            = 0
53     } FilterMode;
54
55     typedef enum {
56         NoSort,
57         PrioritySort,
58         ProgressSort
59     } SortMode;
60     
61     typedef ObjectModel< AbstractTodo > TodoModel;
62     
63     explicit TodoSortFilterModel( QObject* parent = 0 );
64     
65     void setSourceModel(TodoModel* sourceModel);
66     void setSourceModel( TodoSortFilterModel* sourceModel );
67     void setSourceModel( QObject* sourceModel );
68     
69     int filterMode() const {
70         return m_filterMode;
71     }
72     
73     void setFilterMode( int mode ) {
74         m_filterMode = mode;
75         invalidateFilter();
76         emit filterModeChanged();
77     }
78     
79     SortMode sortMode() const {
80         return m_sortMode;
81     }
82     
83     void setSortMode( SortMode sortMode ) {
84         emit beginResetModel();
85         m_sortMode = sortMode;
86         emit endResetModel();
87         emit sortModeChanged();
88     }
89     
90     AbstractTodo* parentTodo() const {
91         return m_parentTodo;
92     }
93
94     void setSearchString( const QString& searchString ) {
95         m_searchString = searchString;
96         invalidateFilter();
97         emit searchStringChanged();
98     }
99
100     QString searchString() const {
101         return m_searchString;
102     }
103
104     QDateTime maxDueDate() const {
105         return m_maxDueDate;
106     }
107
108     void setMaxDueDate( const QDateTime& maxDueDate ) {
109         m_maxDueDate = maxDueDate;
110         invalidateFilter();
111         emit maxDueDateChanged();
112     }
113
114     QDateTime minDueDate() const {
115         return m_minDueDate;
116     }
117
118     void setMinDueDate( const QDateTime& minDueDate ) {
119         m_minDueDate = minDueDate;
120         invalidateFilter();
121         emit minDueDateChanged();
122     }
123     
124     void setParentTodo( AbstractTodo* todo );
125     
126     virtual QHash< int, QByteArray > roleNames() const {
127         return sourceModel() ? sourceModel()->roleNames() : QAbstractProxyModel::roleNames();
128     }
129
130     Q_INVOKABLE int itemCount() const {
131         return rowCount();
132     }
133
134     Q_INVOKABLE QVariantMap getItem( int index ) const;
135
136 signals:
137
138     void sourceModelChanged();
139     void sortModeChanged();
140     void filterModeChanged();
141     void searchStringChanged();
142     void maxDueDateChanged();
143     void minDueDateChanged();
144     void itemCountChanged();
145
146 protected:
147     
148     virtual bool filterAcceptsRow(int source_row, 
149                                   const QModelIndex& source_parent) const;
150     virtual bool lessThan(const QModelIndex& left, const QModelIndex& right) const;
151     
152 private:
153     
154     int m_filterMode;
155     SortMode m_sortMode;
156     AbstractTodo *m_parentTodo;
157     QString m_searchString;
158     QDateTime m_maxDueDate;
159     QDateTime m_minDueDate;
160
161     virtual void setSourceModel(QAbstractItemModel*) {}
162     
163 };
164
165 #endif // TODOSORTFILTERMODEL_H