diff --git a/src/autotests/contactfieldstest.cpp b/src/autotests/contactfieldstest.cpp index 7c7497f3..9f745e6e 100644 --- a/src/autotests/contactfieldstest.cpp +++ b/src/autotests/contactfieldstest.cpp @@ -1,198 +1,198 @@ #include "../kaddressbookimportexportcontactfields.h" -#include +#include #include class ContactFieldsTest : public QObject { Q_OBJECT private Q_SLOTS: void testFieldCount(); void testSetGet(); private: KContacts::Addressee mContact; }; QTEST_MAIN(ContactFieldsTest) static const QString s_formattedName(QStringLiteral("User, Joe")); static const QString s_prefix(QStringLiteral("Mr.")); static const QString s_givenName(QStringLiteral("Joe")); static const QString s_additionalName(QStringLiteral("Doe")); static const QString s_familyName(QStringLiteral("User")); static const QString s_suffix(QStringLiteral("Jr.")); static const QString s_nickName(QStringLiteral("joe")); static const QString s_birthday(QStringLiteral("1966-12-03")); static const QString s_anniversary(QStringLiteral("1980-10-02")); static const QString s_homeAddressStreet(QStringLiteral("My Home Street")); static const QString s_homeAddressPostOfficeBox(QStringLiteral("My Home POB")); static const QString s_homeAddressLocality(QStringLiteral("My Home Locality")); static const QString s_homeAddressRegion(QStringLiteral("My Home Address")); static const QString s_homeAddressPostalCode(QStringLiteral("My Home Postal Code")); static const QString s_homeAddressCountry(QStringLiteral("My Home Country")); static const QString s_homeAddressLabel(QStringLiteral("My Home Label")); static const QString s_businessAddressStreet(QStringLiteral("My Business Street")); static const QString s_businessAddressPostOfficeBox(QStringLiteral("My Business POB")); static const QString s_businessAddressLocality(QStringLiteral("My Business Locality")); static const QString s_businessAddressRegion(QStringLiteral("My Business Region")); static const QString s_businessAddressPostalCode(QStringLiteral("My Business Postal Code")); static const QString s_businessAddressCountry(QStringLiteral("My Business Country")); static const QString s_businessAddressLabel(QStringLiteral("My Business Label")); static const QString s_homePhone(QStringLiteral("000111222")); static const QString s_businessPhone(QStringLiteral("333444555")); static const QString s_mobilePhone(QStringLiteral("666777888")); static const QString s_homeFax(QStringLiteral("999000111")); static const QString s_businessFax(QStringLiteral("222333444")); static const QString s_carPhone(QStringLiteral("555666777")); static const QString s_isdn(QStringLiteral("888999000")); static const QString s_pager(QStringLiteral("111222333")); static const QString s_preferredEmail(QStringLiteral("me@somewhere.org")); static const QString s_email2(QStringLiteral("you@somewhere.org")); static const QString s_email3(QStringLiteral("she@somewhere.org")); static const QString s_email4(QStringLiteral("it@somewhere.org")); static const QString s_mailer(QStringLiteral("kmail2")); static const QString s_title(QStringLiteral("Chief")); static const QString s_role(QStringLiteral("Developer")); static const QString s_organization(QStringLiteral("KDE")); static const QString s_note(QStringLiteral("That's a small note")); static const QString s_homepage(QStringLiteral("http://www.kde.de")); static const QString s_blogFeed(QStringLiteral("http://planetkde.org")); static const QString s_profession(QStringLiteral("Developer")); static const QString s_office(QStringLiteral("Room 2443")); static const QString s_manager(QStringLiteral("Hans")); static const QString s_assistant(QStringLiteral("Hins")); static const QString s_spouse(QStringLiteral("My Darling")); void ContactFieldsTest::testFieldCount() { QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::allFields().count(), 48); } void ContactFieldsTest::testSetGet() { KContacts::Addressee contact; KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::FormattedName, s_formattedName, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Prefix, s_prefix, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::GivenName, s_givenName, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::AdditionalName, s_additionalName, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::FamilyName, s_familyName, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Suffix, s_suffix, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::NickName, s_nickName, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Birthday, s_birthday, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Anniversary, s_anniversary, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeAddressStreet, s_homeAddressStreet, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeAddressPostOfficeBox, s_homeAddressPostOfficeBox, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeAddressLocality, s_homeAddressLocality, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeAddressRegion, s_homeAddressRegion, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeAddressPostalCode, s_homeAddressPostalCode, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeAddressCountry, s_homeAddressCountry, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeAddressLabel, s_homeAddressLabel, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessAddressStreet, s_businessAddressStreet, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessAddressPostOfficeBox, s_businessAddressPostOfficeBox, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessAddressLocality, s_businessAddressLocality, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessAddressRegion, s_businessAddressRegion, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessAddressPostalCode, s_businessAddressPostalCode, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessAddressCountry, s_businessAddressCountry, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessAddressLabel, s_businessAddressLabel, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::HomePhone, s_homePhone, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessPhone, s_businessPhone, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::MobilePhone, s_mobilePhone, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeFax, s_homeFax, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessFax, s_businessFax, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::CarPhone, s_carPhone, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Isdn, s_isdn, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Pager, s_pager, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::PreferredEmail, s_preferredEmail, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Email2, s_email2, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Email3, s_email3, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Email4, s_email4, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Mailer, s_mailer, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Title, s_title, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Role, s_role, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Organization, s_organization, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Note, s_note, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Homepage, s_homepage, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::BlogFeed, s_blogFeed, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Profession, s_profession, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Office, s_office, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Manager, s_manager, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Assistant, s_assistant, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Anniversary, s_anniversary, contact); KAddressBookImportExport::KAddressBookImportExportContactFields::setValue(KAddressBookImportExport::KAddressBookImportExportContactFields::Spouse, s_spouse, contact); const KContacts::Addressee contactCopy = contact; QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::FormattedName, contactCopy), s_formattedName); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Prefix, contactCopy), s_prefix); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::GivenName, contactCopy), s_givenName); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::AdditionalName, contactCopy), s_additionalName); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::FamilyName, contactCopy), s_familyName); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Suffix, contactCopy), s_suffix); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::NickName, contactCopy), s_nickName); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Birthday, contactCopy), s_birthday); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Anniversary, contactCopy), s_anniversary); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeAddressStreet, contactCopy), s_homeAddressStreet); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeAddressPostOfficeBox, contactCopy), s_homeAddressPostOfficeBox); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeAddressLocality, contactCopy), s_homeAddressLocality); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeAddressRegion, contactCopy), s_homeAddressRegion); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeAddressPostalCode, contactCopy), s_homeAddressPostalCode); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeAddressCountry, contactCopy), s_homeAddressCountry); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeAddressLabel, contactCopy), s_homeAddressLabel); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessAddressStreet, contactCopy), s_businessAddressStreet); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessAddressPostOfficeBox, contactCopy), s_businessAddressPostOfficeBox); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessAddressLocality, contactCopy), s_businessAddressLocality); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessAddressRegion, contactCopy), s_businessAddressRegion); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessAddressPostalCode, contactCopy), s_businessAddressPostalCode); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessAddressCountry, contactCopy), s_businessAddressCountry); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessAddressLabel, contactCopy), s_businessAddressLabel); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::HomePhone, contactCopy), s_homePhone); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessPhone, contactCopy), s_businessPhone); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::MobilePhone, contactCopy), s_mobilePhone); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::HomeFax, contactCopy), s_homeFax); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::BusinessFax, contactCopy), s_businessFax); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::CarPhone, contactCopy), s_carPhone); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Isdn, contactCopy), s_isdn); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Pager, contactCopy), s_pager); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::PreferredEmail, contactCopy), s_preferredEmail); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Email2, contactCopy), s_email2); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Email3, contactCopy), s_email3); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Email4, contactCopy), s_email4); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Mailer, contactCopy), s_mailer); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Title, contactCopy), s_title); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Role, contactCopy), s_role); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Organization, contactCopy), s_organization); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Note, contactCopy), s_note); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Homepage, contactCopy), s_homepage); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::BlogFeed, contactCopy), s_blogFeed); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Profession, contactCopy), s_profession); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Office, contactCopy), s_office); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Manager, contactCopy), s_manager); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Assistant, contactCopy), s_assistant); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Anniversary, contactCopy), s_anniversary); QCOMPARE(KAddressBookImportExport::KAddressBookImportExportContactFields::value(KAddressBookImportExport::KAddressBookImportExportContactFields::Spouse, contactCopy), s_spouse); } #include "contactfieldstest.moc" diff --git a/src/categoryfilterproxymodel.h b/src/categoryfilterproxymodel.h index 4b2210f8..895671e4 100644 --- a/src/categoryfilterproxymodel.h +++ b/src/categoryfilterproxymodel.h @@ -1,85 +1,85 @@ /* Copyright (c) 2014 Jonathan Marten This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef CATEGORYFILTERPROXYMODEL_H #define CATEGORYFILTERPROXYMODEL_H -#include +#include #include class CategoryFilterProxyModelPrivate; /** * @short A proxy model to filter contacts by categories (tags). * * @since 4.14 * @author Jonathan Marten **/ class CategoryFilterProxyModel : public QSortFilterProxyModel { Q_OBJECT Q_DECLARE_PRIVATE(CategoryFilterProxyModel) public: /** * Constructor. * * @param parent The parent object **/ explicit CategoryFilterProxyModel(QObject *parent = nullptr); /** * Destructor. **/ ~CategoryFilterProxyModel() override; public Q_SLOTS: /** * Set the categories to be accepted by the filter. * * @param idList A list of @c Akonadi::Tag::Id's of the categories * which are to be accepted by the filter. * @see CategorySelectModel::filterChanged **/ void setFilterCategories(const QList &idList); /** * Enable or disable the filter. * * @param enable If @c true, enable the filter to accept only those categories * set by @c setFilterCategories(). If false, disable the filter so that all * entries are accepted. * * The default state is that the filter is disabled. **/ void setFilterEnabled(bool enable); protected: /** * @reimp **/ bool filterAcceptsRow(int row, const QModelIndex &parent) const override; private: CategoryFilterProxyModelPrivate *const d_ptr; }; #endif // CATEGORYFILTERPROXYMODEL_H diff --git a/src/categoryselectwidget.cpp b/src/categoryselectwidget.cpp index d2295fb0..e014cb05 100644 --- a/src/categoryselectwidget.cpp +++ b/src/categoryselectwidget.cpp @@ -1,305 +1,305 @@ /* Copyright (c) 2014 Jonathan Marten This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "categoryselectwidget.h" #include "kaddressbook_debug.h" #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include using namespace Akonadi; static const int FILTER_ROLE = Qt::UserRole + 1; class CategorySelectWidgetPrivate : public QObject { Q_OBJECT Q_DECLARE_PUBLIC(CategorySelectWidget) public: explicit CategorySelectWidgetPrivate(CategorySelectWidget *parent); Akonadi::TagModel *tagModel = nullptr; int rowOffset; QTimer *updateTimer = nullptr; KPIM::KCheckComboBox *checkCombo = nullptr; void init(); QStandardItemModel *itemModel() const; void selectAll(Qt::CheckState state) const; QList filterTags() const; public Q_SLOTS: void slotSelectAll(); void slotSelectNone(); void slotTagsInserted(const QModelIndex &parent, int start, int end); void slotTagsRemoved(const QModelIndex &parent, int start, int end); void slotTagsChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); void slotCheckedItemsChanged(); void slotCheckedItemsTimer(); private: CategorySelectWidget *q_ptr; }; CategorySelectWidgetPrivate::CategorySelectWidgetPrivate(CategorySelectWidget *parent) : QObject() , tagModel(nullptr) , rowOffset(0) , updateTimer(nullptr) , checkCombo(nullptr) , q_ptr(parent) { } void CategorySelectWidgetPrivate::init() { Q_Q(CategorySelectWidget); QHBoxLayout *hbox = new QHBoxLayout(q); hbox->setSpacing(0); hbox->setContentsMargins(0, 0, 0, 0); checkCombo = new KPIM::KCheckComboBox; checkCombo->setMinimumWidth(150); checkCombo->setSqueezeText(true); connect(checkCombo, &KPIM::KCheckComboBox::checkedItemsChanged, this, &CategorySelectWidgetPrivate::slotCheckedItemsChanged); hbox->addWidget(checkCombo); Monitor *monitor = new Monitor(this); monitor->setTypeMonitored(Monitor::Tags); tagModel = new Akonadi::TagModel(monitor, this); connect(tagModel, &QAbstractItemModel::rowsInserted, this, &CategorySelectWidgetPrivate::slotTagsInserted); connect(tagModel, &QAbstractItemModel::rowsRemoved, this, &CategorySelectWidgetPrivate::slotTagsRemoved); connect(tagModel, &QAbstractItemModel::dataChanged, this, &CategorySelectWidgetPrivate::slotTagsChanged); updateTimer = new QTimer(this); updateTimer->setSingleShot(true); updateTimer->setInterval(200); connect(updateTimer, &QTimer::timeout, this, &CategorySelectWidgetPrivate::slotCheckedItemsTimer); QToolButton *but = new QToolButton(q); but->setAutoRaise(true); but->setIcon(QIcon::fromTheme(QStringLiteral("edit-undo"))); but->setToolTip(i18nc("@action:button", "Reset category filter")); connect(but, &QToolButton::clicked, this, &CategorySelectWidgetPrivate::slotSelectAll); hbox->addWidget(but); but = new QToolButton(q); but->setAutoRaise(true); but->setIcon(QIcon::fromTheme(QStringLiteral("edit-clear"))); but->setToolTip(i18nc("@action:button", "Clear category filter")); connect(but, &QToolButton::clicked, this, &CategorySelectWidgetPrivate::slotSelectNone); hbox->addWidget(but); QStandardItem *item = new QStandardItem(i18n("(Untagged)")); item->setCheckState(Qt::Checked); item->setData(CategorySelectWidget::FilterUntagged, FILTER_ROLE); itemModel()->appendRow(item); item = new QStandardItem(i18n("(Groups)")); item->setCheckState(Qt::Checked); item->setData(CategorySelectWidget::FilterGroups, FILTER_ROLE); itemModel()->appendRow(item); checkCombo->setAlwaysShowDefaultText(false); checkCombo->setDefaultText(i18n("(All)")); rowOffset = itemModel()->rowCount(); } QStandardItemModel *CategorySelectWidgetPrivate::itemModel() const { QStandardItemModel *m = qobject_cast(checkCombo->model()); Q_ASSERT(m != nullptr); return m; } void CategorySelectWidgetPrivate::slotTagsRemoved(const QModelIndex &parent, int start, int end) { itemModel()->removeRows(start + rowOffset, end + rowOffset, parent); } void CategorySelectWidgetPrivate::slotTagsChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) { for (int row = topLeft.row(); row <= bottomRight.row(); ++row) { QStandardItem *it = itemModel()->item(row + rowOffset); Q_ASSERT(it != nullptr); QModelIndex idx = tagModel->index(row, 0); it->setText(tagModel->data(idx, TagModel::NameRole).toString()); it->setIcon(tagModel->data(idx, Qt::DecorationRole).value()); it->setData(tagModel->data(idx, TagModel::IdRole), FILTER_ROLE); } } void CategorySelectWidgetPrivate::slotTagsInserted(const QModelIndex &parent, int start, int end) { for (int row = start; row <= end; ++row) { QModelIndex idx = tagModel->index(row, 0, parent); #if 0 qCDebug(KADDRESSBOOK_LOG) << "idx" << idx << "=" << tagModel->data(idx, Qt::DisplayRole).toString() << "name" << tagModel->data(idx, TagModel::NameRole).toString() << "tag" << tagModel->data(idx, TagModel::TagRole) << "id" << tagModel->data(idx, TagModel::IdRole).toInt(); #endif QStandardItem *it = new QStandardItem(tagModel->data(idx, TagModel::NameRole).toString()); it->setIcon(tagModel->data(idx, Qt::DecorationRole).value()); it->setData(tagModel->data(idx, TagModel::IdRole), FILTER_ROLE); it->setCheckState(Qt::Checked); // If a tag with a parent arrives from the model, we know that its parent // must already have arrived. So there is no need for a list of pending // tags, as is required in Akonadi::TagModel. // // FIXME: not tested (no way to create hierarchical tags at present) if (parent != QModelIndex()) { const Tag::Id parentId = tagModel->data(idx, TagModel::IdRole).value(); QModelIndexList matchList = itemModel()->match(itemModel()->index(0, 0), FILTER_ROLE, parentId, 1, Qt::MatchExactly | Qt::MatchRecursive); if (matchList.count() == 1) { // found the parent tag QModelIndex parentIndex = matchList.at(0); itemModel()->itemFromIndex(parentIndex)->appendRow(it); } else { qCWarning(KADDRESSBOOK_LOG) << "Cannot find parent with ID" << parentId; itemModel()->insertRow(row + rowOffset, it); } } else { itemModel()->insertRow(row + rowOffset, it); } } } void CategorySelectWidgetPrivate::selectAll(Qt::CheckState state) const { for (int row = 0; row < itemModel()->rowCount(); ++row) { QStandardItem *it = itemModel()->item(row); it->setCheckState(state); } } void CategorySelectWidgetPrivate::slotSelectAll() { selectAll(Qt::Checked); } void CategorySelectWidgetPrivate::slotSelectNone() { selectAll(Qt::Unchecked); } void CategorySelectWidgetPrivate::slotCheckedItemsChanged() { updateTimer->start(); } void CategorySelectWidgetPrivate::slotCheckedItemsTimer() { Q_Q(CategorySelectWidget); bool allOn = true; for (int row = 0; row < itemModel()->rowCount(); ++row) { const QStandardItem *it = itemModel()->item(row); Qt::CheckState rowState = static_cast(it->data(Qt::CheckStateRole).toInt()); if (rowState != Qt::Checked) { allOn = false; break; } } if (allOn) { checkCombo->setAlwaysShowDefaultText(true); checkCombo->setDefaultText(i18n("(All)")); } else { checkCombo->setAlwaysShowDefaultText(false); checkCombo->setDefaultText(i18n("(None)")); } const QStringList checkedList = checkCombo->checkedItems(); if (!checkedList.isEmpty()) { checkCombo->setToolTip(i18n("Category filter: %1", checkedList.join(i18n(", ")))); } else { checkCombo->setToolTip(QString()); } Q_EMIT q->filterChanged(filterTags()); } QList CategorySelectWidgetPrivate::filterTags() const { QList filter; bool allOn = true; for (int row = 0; row < itemModel()->rowCount(); ++row) { const QStandardItem *it = itemModel()->item(row); Q_ASSERT(it != nullptr); if (it->checkState() == Qt::Checked) { Tag::Id id = it->data(FILTER_ROLE).toInt(); if (id != 0) { filter.append(id); } } else { allOn = false; } } if (allOn) { filter.clear(); filter.append(CategorySelectWidget::FilterAll); } //qCDebug(KADDRESSBOOK_LOG) << "filter" << filter; return filter; } CategorySelectWidget::CategorySelectWidget(QWidget *parent) : QWidget(parent) , d_ptr(new CategorySelectWidgetPrivate(this)) { Q_D(CategorySelectWidget); d->init(); } CategorySelectWidget::~CategorySelectWidget() { delete d_ptr; } QList CategorySelectWidget::filterTags() const { Q_D(const CategorySelectWidget); return d->filterTags(); } #include "categoryselectwidget.moc" diff --git a/src/categoryselectwidget.h b/src/categoryselectwidget.h index 5b0a7329..38cf6c82 100644 --- a/src/categoryselectwidget.h +++ b/src/categoryselectwidget.h @@ -1,86 +1,86 @@ /* Copyright (c) 2014 Jonathan Marten This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef CATEGORYSELECTWIDGET_H #define CATEGORYSELECTWIDGET_H -#include +#include #include class CategorySelectWidgetPrivate; /** * @short A widget to specify a category (tag) filter. * * @since 4.14 * @author Jonathan Marten **/ class CategorySelectWidget : public QWidget { Q_OBJECT Q_DECLARE_PRIVATE(CategorySelectWidget) public: /** * Constructor. * * @param parent The parent widget **/ explicit CategorySelectWidget(QWidget *parent = nullptr); /** * Destructor. **/ ~CategorySelectWidget() override; /** * Special @c Akonadi::Tag::Id values for filtering. **/ enum FilterTag { FilterAll = -2, /**< All items */ FilterUntagged = -3, /**< Untagged items */ FilterGroups = -4 /**< Contact groups */ }; /** * Get the current tag filter list. * * @return The filter list, as would be sent by @c filterChanged() * * @see filterChanged **/ QList filterTags() const; Q_SIGNALS: /** * The tag filter selection has changed. * * @param idList A list of @c Akonadi::Tag::Id's of the tags which * are to be included in the filter. * * @see CategorySelectModel::filterChanged **/ void filterChanged(const QList &idList); private: CategorySelectWidgetPrivate *const d_ptr; }; #endif // CATEGORYSELECTWIDGET_H