Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
PIM
Kalendar
Commits
6dec58c4
Commit
6dec58c4
authored
Oct 16, 2022
by
Claudio Cambra
Browse files
Clean up todosortfilterproxymodel
Signed-off-by:
Claudio Cambra
<
claudio.cambra@kde.org
>
parent
abdcc06b
Pipeline
#248933
passed with stage
in 2 minutes and 39 seconds
Changes
4
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
src/contents/ui/MainViews/TodoTreeView.qml
View file @
6dec58c4
...
...
@@ -132,7 +132,7 @@ TreeListView {
id
:
todoModel
calendar
:
Kalendar
.
CalendarManager
.
calendar
incidenceChanger
:
Kalendar
.
CalendarManager
.
incidenceChanger
filter
Map
:
Kalendar
.
Filter
filter
Object
:
Kalendar
.
Filter
showCompleted
:
root
.
showCompleted
sortBy
:
root
.
sortBy
sortAscending
:
root
.
ascendingOrder
...
...
src/contents/ui/TreeView/InternalTreeListView.qml
View file @
6dec58c4
...
...
@@ -20,7 +20,8 @@ ListView {
Connections
{
target
:
root
.
sourceModel
function
onFilterMapAboutToChange
()
{
// NOTE: This is Kalendar and TodoSortFilterProxyModel-specific
function
onFilterObjectAboutToChange
()
{
// This is a must to prevent the KDescendantsProxyModel from crashing
for
(
let
i
=
0
;
i
<
descendantsModel
.
rowCount
();
i
++
)
{
descendantsModel
.
expandChildren
(
i
);
...
...
src/models/todosortfilterproxymodel.cpp
View file @
6dec58c4
...
...
@@ -8,11 +8,12 @@ TodoSortFilterProxyModel::TodoSortFilterProxyModel(QObject *parent)
:
QSortFilterProxyModel
(
parent
)
{
const
QString
todoMimeType
=
QStringLiteral
(
"application/x-vnd.akonadi.calendar.todo"
);
m_todoTreeModel
=
new
Akonadi
::
IncidenceTreeModel
(
QStringList
()
<<
todoMimeType
,
this
);
m_todoTreeModel
.
reset
(
new
Akonadi
::
IncidenceTreeModel
(
QStringList
()
<<
todoMimeType
,
this
));
const
auto
pref
=
EventViews
::
PrefsPtr
(
new
EventViews
::
Prefs
);
m_baseTodoModel
=
new
TodoModel
(
pref
,
this
);
m_baseTodoModel
->
setSourceModel
(
m_todoTreeModel
);
setSourceModel
(
m_baseTodoModel
);
m_baseTodoModel
.
reset
(
new
TodoModel
(
pref
,
this
)
)
;
m_baseTodoModel
->
setSourceModel
(
m_todoTreeModel
.
data
()
);
setSourceModel
(
m_baseTodoModel
.
data
()
);
setDynamicSortFilter
(
true
);
setSortCaseSensitivity
(
Qt
::
CaseInsensitive
);
...
...
@@ -21,7 +22,6 @@ TodoSortFilterProxyModel::TodoSortFilterProxyModel(QObject *parent)
KSharedConfig
::
Ptr
config
=
KSharedConfig
::
openConfig
();
KConfigGroup
rColorsConfig
(
config
,
"Resources Colors"
);
m_colorWatcher
=
KConfigWatcher
::
create
(
config
);
QObject
::
connect
(
m_colorWatcher
.
data
(),
&
KConfigWatcher
::
configChanged
,
this
,
&
TodoSortFilterProxyModel
::
loadColors
);
loadColors
();
...
...
@@ -31,12 +31,6 @@ TodoSortFilterProxyModel::TodoSortFilterProxyModel(QObject *parent)
m_dateRefreshTimer
.
start
();
}
TodoSortFilterProxyModel
::~
TodoSortFilterProxyModel
()
{
delete
m_baseTodoModel
;
delete
m_todoTreeModel
;
}
int
TodoSortFilterProxyModel
::
columnCount
(
const
QModelIndex
&
)
const
{
return
1
;
...
...
@@ -316,15 +310,15 @@ bool TodoSortFilterProxyModel::filterAcceptsRowCheck(int row, const QModelIndex
const
QModelIndex
sourceIndex
=
sourceModel
()
->
index
(
row
,
0
,
sourceParent
);
Q_ASSERT
(
sourceIndex
.
isValid
());
if
(
m_filter
Map
==
nullptr
)
{
if
(
m_filter
Object
==
nullptr
)
{
return
QSortFilterProxyModel
::
filterAcceptsRow
(
row
,
sourceParent
);
}
bool
acceptRow
=
true
;
if
(
m_filter
Map
->
collectionId
()
>
-
1
)
{
if
(
m_filter
Object
->
collectionId
()
>
-
1
)
{
const
auto
collectionId
=
sourceIndex
.
data
(
TodoModel
::
TodoRole
).
value
<
Akonadi
::
Item
>
().
parentCollection
().
id
();
acceptRow
=
acceptRow
&&
collectionId
==
m_filter
Map
->
collectionId
();
acceptRow
=
acceptRow
&&
collectionId
==
m_filter
Object
->
collectionId
();
}
switch
(
m_showCompleted
)
{
...
...
@@ -338,8 +332,8 @@ bool TodoSortFilterProxyModel::filterAcceptsRowCheck(int row, const QModelIndex
break
;
}
if
(
!
m_filter
Map
->
tags
().
isEmpty
())
{
const
auto
tags
=
m_filter
Map
->
tags
();
if
(
!
m_filter
Object
->
tags
().
isEmpty
())
{
const
auto
tags
=
m_filter
Object
->
tags
();
bool
containsTag
=
false
;
for
(
const
auto
&
tag
:
tags
)
{
const
auto
todoPtr
=
sourceIndex
.
data
(
TodoModel
::
TodoPtrRole
).
value
<
KCalendarCore
::
Todo
::
Ptr
>
();
...
...
@@ -440,44 +434,50 @@ void TodoSortFilterProxyModel::setShowCompleted(int showCompleted)
sortTodoModel
();
}
Filter
*
TodoSortFilterProxyModel
::
filter
Map
()
const
Filter
*
TodoSortFilterProxyModel
::
filter
Object
()
const
{
return
m_filter
Map
;
return
m_filter
Object
;
}
void
TodoSortFilterProxyModel
::
setFilter
Map
(
Filter
*
filter
Map
)
void
TodoSortFilterProxyModel
::
setFilter
Object
(
Filter
*
filter
Object
)
{
if
(
m_filter
Map
==
filter
Map
)
{
if
(
m_filter
Object
==
filter
Object
)
{
return
;
}
if
(
m_filter
Map
)
{
disconnect
(
m_filter
Map
,
nullptr
,
this
,
nullptr
);
if
(
m_filter
Object
)
{
disconnect
(
m_filter
Object
,
nullptr
,
this
,
nullptr
);
}
Q_EMIT
filterMapAboutToChange
();
Q_EMIT
filterObjectAboutToChange
();
Q_EMIT
layoutAboutToBeChanged
();
m_filter
Map
=
filter
Map
;
Q_EMIT
filter
Map
Changed
();
m_filter
Object
=
filter
Object
;
Q_EMIT
filter
Object
Changed
();
if
(
!
m_filterMap
->
name
().
isEmpty
())
{
const
auto
name
=
m_filterMap
->
name
();
setFilterFixedString
(
name
);
}
invalidateFilter
();
connect
(
m_filterMap
,
&
Filter
::
nameChanged
,
this
,
[
this
]()
{
Q_EMIT
filterMapAboutToChange
();
setFilterFixedString
(
m_filterMap
->
name
());
const
auto
nameFilter
=
m_filterObject
->
name
();
const
auto
handleFilterNameChange
=
[
this
]
{
Q_EMIT
filterObjectAboutToChange
();
setFilterFixedString
(
m_filterObject
->
name
());
Q_EMIT
layoutChanged
();
});
auto
handleFilterChange
=
[
this
]()
{
Q_EMIT
filterMapAboutToChange
();
Q_EMIT
filterObjectChanged
();
};
const
auto
handleFilterObjectChange
=
[
this
]
{
Q_EMIT
filterObjectAboutToChange
();
invalidateFilter
();
Q_EMIT
layoutChanged
();
Q_EMIT
filterObjectChanged
();
};
connect
(
m_filterMap
,
&
Filter
::
tagsChanged
,
this
,
handleFilterChange
);
connect
(
m_filterMap
,
&
Filter
::
collectionIdChanged
,
this
,
handleFilterChange
);
connect
(
m_filterObject
,
&
Filter
::
nameChanged
,
this
,
handleFilterNameChange
);
connect
(
m_filterObject
,
&
Filter
::
tagsChanged
,
this
,
handleFilterObjectChange
);
connect
(
m_filterObject
,
&
Filter
::
collectionIdChanged
,
this
,
handleFilterObjectChange
);
if
(
!
nameFilter
.
isEmpty
())
{
setFilterFixedString
(
nameFilter
);
}
invalidateFilter
();
Q_EMIT
layoutChanged
();
sortTodoModel
();
...
...
@@ -489,7 +489,7 @@ void TodoSortFilterProxyModel::sortTodoModel()
QSortFilterProxyModel
::
sort
(
m_sortColumn
,
order
);
}
void
TodoSortFilterProxyModel
::
filterTodoName
(
QString
name
,
int
showCompleted
)
void
TodoSortFilterProxyModel
::
filterTodoName
(
const
QString
&
name
,
const
int
showCompleted
)
{
Q_EMIT
layoutAboutToBeChanged
();
setFilterFixedString
(
name
);
...
...
src/models/todosortfilterproxymodel.h
View file @
6dec58c4
...
...
@@ -22,7 +22,7 @@ class TodoSortFilterProxyModel : public QSortFilterProxyModel
Q_OBJECT
Q_PROPERTY
(
Akonadi
::
IncidenceChanger
*
incidenceChanger
READ
incidenceChanger
WRITE
setIncidenceChanger
NOTIFY
incidenceChangerChanged
)
Q_PROPERTY
(
Akonadi
::
ETMCalendar
::
Ptr
calendar
READ
calendar
WRITE
setCalendar
NOTIFY
calendarChanged
)
Q_PROPERTY
(
Filter
*
filter
Map
READ
filter
Map
WRITE
setFilter
Map
NOTIFY
filter
Map
Changed
)
Q_PROPERTY
(
Filter
*
filter
Object
READ
filter
Object
WRITE
setFilter
Object
NOTIFY
filter
Object
Changed
)
Q_PROPERTY
(
int
showCompleted
READ
showCompleted
WRITE
setShowCompleted
NOTIFY
showCompletedChanged
)
Q_PROPERTY
(
int
sortBy
READ
sortBy
WRITE
setSortBy
NOTIFY
sortByChanged
)
Q_PROPERTY
(
bool
sortAscending
READ
sortAscending
WRITE
setSortAscending
NOTIFY
sortAscendingChanged
)
...
...
@@ -85,7 +85,7 @@ public:
Q_ENUM
(
DueDateDisplayFormat
)
explicit
TodoSortFilterProxyModel
(
QObject
*
parent
=
nullptr
);
~
TodoSortFilterProxyModel
()
override
;
~
TodoSortFilterProxyModel
()
=
default
;
int
columnCount
(
const
QModelIndex
&
parent
)
const
override
;
QHash
<
int
,
QByteArray
>
roleNames
()
const
override
;
...
...
@@ -95,29 +95,17 @@ public:
bool
hasAcceptedChildren
(
int
row
,
const
QModelIndex
&
sourceParent
)
const
;
Akonadi
::
ETMCalendar
::
Ptr
calendar
();
void
setCalendar
(
Akonadi
::
ETMCalendar
::
Ptr
&
calendar
);
Akonadi
::
IncidenceChanger
*
incidenceChanger
();
void
setIncidenceChanger
(
Akonadi
::
IncidenceChanger
*
changer
);
int
showCompleted
()
const
;
void
setShowCompleted
(
int
showCompleted
);
Filter
*
filterMap
()
const
;
void
setFilterMap
(
Filter
*
filterMap
);
Filter
*
filterObject
()
const
;
int
sortBy
()
const
;
void
setSortBy
(
int
sortBy
);
bool
sortAscending
()
const
;
void
setSortAscending
(
bool
sortAscending
);
bool
showCompletedSubtodosInIncomplete
()
const
;
void
setShowCompletedSubtodosInIncomplete
(
bool
showCompletedSubtodosInIncomplete
);
void
sortTodoModel
();
Q_INVOKABLE
void
filterTodoName
(
QString
name
,
int
showCompleted
=
ShowAll
);
Q_SIGNALS:
void
calendarChanged
();
void
filter
Map
AboutToChange
();
void
filter
Map
Changed
();
void
filter
Object
AboutToChange
();
void
filter
Object
Changed
();
void
showCompletedChanged
();
void
sortByChanged
();
void
sortAscendingChanged
();
...
...
@@ -125,6 +113,18 @@ Q_SIGNALS:
void
showCompletedSubtodosInIncompleteChanged
();
void
incidenceChangerChanged
();
public
Q_SLOTS
:
void
setCalendar
(
Akonadi
::
ETMCalendar
::
Ptr
&
calendar
);
void
setIncidenceChanger
(
Akonadi
::
IncidenceChanger
*
changer
);
void
setFilterObject
(
Filter
*
filterObject
);
void
setShowCompleted
(
const
int
showCompleted
);
void
setSortBy
(
const
int
sortBy
);
void
setSortAscending
(
const
bool
sortAscending
);
void
setShowCompletedSubtodosInIncomplete
(
const
bool
showCompletedSubtodosInIncomplete
);
void
sortTodoModel
();
void
filterTodoName
(
const
QString
&
name
,
const
int
showCompleted
=
ShowAll
);
protected:
bool
lessThan
(
const
QModelIndex
&
left
,
const
QModelIndex
&
right
)
const
override
;
...
...
@@ -146,14 +146,14 @@ private:
int
compareCompletion
(
const
QModelIndex
&
left
,
const
QModelIndex
&
right
)
const
;
Akonadi
::
ETMCalendar
::
Ptr
m_calendar
;
Akonadi
::
IncidenceTreeModel
*
m_todoTreeModel
=
nullptr
;
TodoModel
*
m_baseTodoModel
=
nullptr
;
QScopedPointer
<
Akonadi
::
IncidenceTreeModel
>
m_todoTreeModel
;
QScopedPointer
<
TodoModel
>
m_baseTodoModel
;
Akonadi
::
IncidenceChanger
*
m_lastSetChanger
=
nullptr
;
QHash
<
QString
,
QColor
>
m_colors
;
KConfigWatcher
::
Ptr
m_colorWatcher
;
int
m_showCompleted
=
ShowComplete
::
ShowAll
;
int
m_showCompletedStore
;
// For when searches happen
Filter
*
m_filter
Map
=
nullptr
;
Filter
*
m_filter
Object
=
nullptr
;
int
m_sortColumn
=
DueDateColumn
;
bool
m_sortAscending
=
false
;
bool
m_showCompletedSubtodosInIncomplete
=
true
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment