Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
PIM
Akonadi Contacts
Commits
4a48fe00
Commit
4a48fe00
authored
Mar 08, 2022
by
Laurent Montel
😁
Browse files
Improve search element
parent
dce31b90
Pipeline
#147198
passed with stage
in 2 minutes and 29 seconds
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
src/akonadi-contacts/contactsfilterproxymodel.cpp
View file @
4a48fe00
...
...
@@ -19,6 +19,32 @@ using namespace Akonadi;
static
bool
contactMatchesFilter
(
const
KContacts
::
Addressee
&
contact
,
const
QString
&
filterString
,
ContactsFilterProxyModel
::
MatchFilterContactFlag
flag
);
static
bool
contactGroupMatchesFilter
(
const
KContacts
::
ContactGroup
&
group
,
const
QString
&
filterString
);
static
QString
normalize
(
QStringView
str
)
{
QString
out
;
out
.
reserve
(
str
.
size
());
for
(
const
auto
c
:
str
)
{
// case folding
const
auto
n
=
c
.
toCaseFolded
();
// if the character has a canonical decomposition use that and skip the
// combining diacritic markers following it
// see https://en.wikipedia.org/wiki/Unicode_equivalence
// see https://en.wikipedia.org/wiki/Combining_character
if
(
n
.
decompositionTag
()
==
QChar
::
Canonical
)
{
out
.
push_back
(
n
.
decomposition
().
at
(
0
));
}
// handle compatibility compositions such as ligatures
// see https://en.wikipedia.org/wiki/Unicode_compatibility_characters
else
if
(
n
.
decompositionTag
()
==
QChar
::
Compat
&&
n
.
isLetter
()
&&
n
.
script
()
==
QChar
::
Script_Latin
)
{
out
.
append
(
n
.
decomposition
());
}
else
{
out
.
push_back
(
n
);
}
}
return
out
;
}
class
Akonadi
::
ContactsFilterProxyModelPrivate
{
public:
...
...
@@ -63,7 +89,7 @@ bool ContactsFilterProxyModel::filterAcceptsRow(int row, const QModelIndex &pare
if
((
d
->
mFilter
.
isEmpty
())
&&
(
!
(
d
->
flags
&
ContactsFilterProxyModel
::
HasEmail
)))
{
return
true
;
}
const
QString
filterStr
=
normalize
(
d
->
mFilter
);
const
auto
item
=
index
.
data
(
Akonadi
::
EntityTreeModel
::
ItemRole
).
value
<
Akonadi
::
Item
>
();
if
(
item
.
hasPayload
<
KContacts
::
Addressee
>
())
{
...
...
@@ -74,13 +100,13 @@ bool ContactsFilterProxyModel::filterAcceptsRow(int row, const QModelIndex &pare
}
}
if
(
!
d
->
mFilter
.
isEmpty
())
{
return
contactMatchesFilter
(
contact
,
d
->
mF
ilter
,
d
->
matchFilterFlag
);
return
contactMatchesFilter
(
contact
,
f
ilter
Str
,
d
->
matchFilterFlag
);
}
}
else
{
if
(
!
d
->
mFilter
.
isEmpty
())
{
if
(
item
.
hasPayload
<
KContacts
::
ContactGroup
>
())
{
const
auto
group
=
item
.
payload
<
KContacts
::
ContactGroup
>
();
return
contactGroupMatchesFilter
(
group
,
d
->
mF
ilter
);
return
contactGroupMatchesFilter
(
group
,
f
ilter
Str
);
}
}
}
...
...
@@ -173,15 +199,15 @@ static bool addressMatchesFilter(const KContacts::Address &address, const QStrin
static
bool
contactMatchesFilter
(
const
KContacts
::
Addressee
&
contact
,
const
QString
&
filterString
,
ContactsFilterProxyModel
::
MatchFilterContactFlag
flag
)
{
if
(
contact
.
assembledName
().
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
if
(
normalize
(
contact
.
assembledName
()
)
.
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
return
true
;
}
if
(
contact
.
formattedName
().
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
if
(
normalize
(
contact
.
formattedName
()
)
.
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
return
true
;
}
if
(
contact
.
nickName
().
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
if
(
normalize
(
contact
.
nickName
()
)
.
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
return
true
;
}
...
...
@@ -210,7 +236,7 @@ static bool contactMatchesFilter(const KContacts::Addressee &contact, const QStr
const
QStringList
emails
=
contact
.
emails
();
count
=
emails
.
count
();
for
(
int
i
=
0
;
i
<
count
;
++
i
)
{
if
(
emails
.
at
(
i
).
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
if
(
normalize
(
emails
.
at
(
i
)
)
.
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
return
true
;
}
}
...
...
@@ -227,7 +253,7 @@ static bool contactMatchesFilter(const KContacts::Addressee &contact, const QStr
return
true
;
}
if
(
contact
.
title
().
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
if
(
normalize
(
contact
.
title
()
)
.
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
return
true
;
}
...
...
@@ -235,15 +261,15 @@ static bool contactMatchesFilter(const KContacts::Addressee &contact, const QStr
return
true
;
}
if
(
contact
.
organization
().
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
if
(
normalize
(
contact
.
organization
()
)
.
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
return
true
;
}
if
(
contact
.
department
().
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
if
(
normalize
(
contact
.
department
()
)
.
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
return
true
;
}
if
(
contact
.
note
().
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
if
(
normalize
(
contact
.
note
()
)
.
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
return
true
;
}
...
...
@@ -265,16 +291,16 @@ static bool contactMatchesFilter(const KContacts::Addressee &contact, const QStr
bool
contactGroupMatchesFilter
(
const
KContacts
::
ContactGroup
&
group
,
const
QString
&
filterString
)
{
if
(
group
.
name
().
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
if
(
normalize
(
group
.
name
()
)
.
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
return
true
;
}
const
int
count
=
group
.
dataCount
();
for
(
int
i
=
0
;
i
<
count
;
++
i
)
{
if
(
group
.
data
(
i
).
name
().
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
if
(
normalize
(
group
.
data
(
i
).
name
()
)
.
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
return
true
;
}
if
(
group
.
data
(
i
).
email
().
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
if
(
normalize
(
group
.
data
(
i
).
email
()
)
.
contains
(
filterString
,
Qt
::
CaseInsensitive
))
{
return
true
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a 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