File indexing completed on 2024-05-19 05:14:36
0001 /* 0002 This file is part of KAddressBook. 0003 0004 SPDX-FileCopyrightText: 2009 Tobias Koenig <tokoe@kde.org> 0005 0006 SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 #include "contactsorter.h" 0010 0011 #include <KContacts/Addressee> 0012 0013 using namespace KAddressBookImportExport; 0014 0015 class ContactSortHelper 0016 { 0017 public: 0018 ContactSortHelper(ContactFields::Field field, Qt::SortOrder sortOrder) 0019 : mSortField(field) 0020 , mSortOrder(sortOrder) 0021 { 0022 } 0023 0024 inline bool operator()(const KContacts::Addressee &contact, const KContacts::Addressee &otherContact) const 0025 { 0026 int result = QString::localeAwareCompare(ContactFields::value(mSortField, contact), ContactFields::value(mSortField, otherContact)); 0027 0028 if (result == 0) { 0029 int givenNameResult = QString::localeAwareCompare(ContactFields::value(ContactFields::GivenName, contact), 0030 ContactFields::value(ContactFields::GivenName, otherContact)); 0031 0032 if (givenNameResult == 0) { 0033 int familyNameResult = QString::localeAwareCompare(ContactFields::value(ContactFields::FamilyName, contact), 0034 ContactFields::value(ContactFields::FamilyName, otherContact)); 0035 0036 if (familyNameResult == 0) { 0037 result = QString::localeAwareCompare(ContactFields::value(ContactFields::FormattedName, contact), 0038 ContactFields::value(ContactFields::FormattedName, otherContact)); 0039 } else { 0040 result = familyNameResult; 0041 } 0042 } else { 0043 result = givenNameResult; 0044 } 0045 } 0046 0047 bool lesser = result < 0; 0048 0049 if (mSortOrder == Qt::DescendingOrder) { 0050 lesser = !lesser; 0051 } 0052 0053 return lesser; 0054 } 0055 0056 private: 0057 const ContactFields::Field mSortField; 0058 const Qt::SortOrder mSortOrder; 0059 }; 0060 0061 ContactSorter::ContactSorter(ContactFields::Field field, Qt::SortOrder sortOrder) 0062 : mSortField(field) 0063 , mSortOrder(sortOrder) 0064 { 0065 } 0066 0067 void ContactSorter::sort(KContacts::Addressee::List &contacts) const 0068 { 0069 std::stable_sort(contacts.begin(), contacts.end(), ContactSortHelper(mSortField, mSortOrder)); 0070 }