File indexing completed on 2024-05-19 05:14:38

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 "modelcolumnmanager.h"
0010 #include "settings.h"
0011 
0012 #include <KContacts/Addressee>
0013 
0014 #include <KLocalizedString>
0015 
0016 #include <QContextMenuEvent>
0017 #include <QEvent>
0018 #include <QHeaderView>
0019 #include <QMenu>
0020 #include <QTimer>
0021 #include <QWidget>
0022 
0023 ModelColumnManager::ModelColumnManager(Akonadi::ContactsTreeModel *model, QObject *parent)
0024     : QObject(parent)
0025     , mModel(model)
0026 {
0027 }
0028 
0029 void ModelColumnManager::load()
0030 {
0031     const QList<int> settingsColumns = Settings::contactModelColumns();
0032     Akonadi::ContactsTreeModel::Columns columns;
0033     columns.reserve(settingsColumns.count());
0034 
0035     for (int column : settingsColumns) {
0036         columns.append(static_cast<Akonadi::ContactsTreeModel::Column>(column));
0037     }
0038 
0039     mModel->setColumns(columns);
0040 }
0041 
0042 void ModelColumnManager::store()
0043 {
0044     const Akonadi::ContactsTreeModel::Columns columns = mModel->columns();
0045     QList<int> settingsColumns;
0046     settingsColumns.reserve(columns.count());
0047 
0048     for (int column : columns) {
0049         settingsColumns.append(static_cast<int>(column));
0050     }
0051 
0052     Settings::setContactModelColumns(settingsColumns);
0053 }
0054 
0055 void ModelColumnManager::setWidget(QWidget *widget)
0056 {
0057     mWidget = widget;
0058     mWidget->installEventFilter(this);
0059 }
0060 
0061 bool ModelColumnManager::eventFilter(QObject *watched, QEvent *event)
0062 {
0063     if (watched == mWidget) {
0064         if (event->type() == QEvent::ContextMenu) {
0065             QMenu menu;
0066 
0067             const Akonadi::ContactsTreeModel::Columns modelColumns = mModel->columns();
0068 
0069             QAction *fullNameAction = menu.addAction(i18n("Full Name"));
0070             fullNameAction->setCheckable(true);
0071             fullNameAction->setChecked(modelColumns.contains(Akonadi::ContactsTreeModel::FullName));
0072             fullNameAction->setEnabled(false);
0073 
0074             QAction *familyNameAction = menu.addAction(i18n("Family Name"));
0075             familyNameAction->setCheckable(true);
0076             familyNameAction->setChecked(modelColumns.contains(Akonadi::ContactsTreeModel::FamilyName));
0077 
0078             QAction *givenNameAction = menu.addAction(i18n("Given Name"));
0079             givenNameAction->setCheckable(true);
0080             givenNameAction->setChecked(modelColumns.contains(Akonadi::ContactsTreeModel::GivenName));
0081 
0082             QAction *birthdayAction = menu.addAction(KContacts::Addressee::birthdayLabel());
0083             birthdayAction->setCheckable(true);
0084             birthdayAction->setChecked(modelColumns.contains(Akonadi::ContactsTreeModel::Birthday));
0085 
0086             QAction *homeAddressAction = menu.addAction(i18n("Home Address"));
0087             homeAddressAction->setCheckable(true);
0088             homeAddressAction->setChecked(modelColumns.contains(Akonadi::ContactsTreeModel::HomeAddress));
0089 
0090             QAction *businessAddressAction = menu.addAction(i18n("Business Address"));
0091             businessAddressAction->setCheckable(true);
0092             businessAddressAction->setChecked(modelColumns.contains(Akonadi::ContactsTreeModel::BusinessAddress));
0093 
0094             QAction *phoneNumbersAction = menu.addAction(i18n("Phone Numbers"));
0095             phoneNumbersAction->setCheckable(true);
0096             phoneNumbersAction->setChecked(modelColumns.contains(Akonadi::ContactsTreeModel::PhoneNumbers));
0097 
0098             QAction *preferredEmailAction = menu.addAction(i18n("Preferred EMail"));
0099             preferredEmailAction->setCheckable(true);
0100             preferredEmailAction->setChecked(modelColumns.contains(Akonadi::ContactsTreeModel::PreferredEmail));
0101 
0102             QAction *allEmailsAction = menu.addAction(i18n("All EMails"));
0103             allEmailsAction->setCheckable(true);
0104             allEmailsAction->setChecked(modelColumns.contains(Akonadi::ContactsTreeModel::AllEmails));
0105 
0106             QAction *organizationAction = menu.addAction(KContacts::Addressee::organizationLabel());
0107             organizationAction->setCheckable(true);
0108             organizationAction->setChecked(modelColumns.contains(Akonadi::ContactsTreeModel::Organization));
0109 
0110             QAction *roleAction = menu.addAction(KContacts::Addressee::roleLabel());
0111             roleAction->setCheckable(true);
0112             roleAction->setChecked(modelColumns.contains(Akonadi::ContactsTreeModel::Role));
0113 
0114             QAction *homepageAction = menu.addAction(KContacts::Addressee::urlLabel());
0115             homepageAction->setCheckable(true);
0116             homepageAction->setChecked(modelColumns.contains(Akonadi::ContactsTreeModel::Homepage));
0117 
0118             QAction *noteAction = menu.addAction(KContacts::Addressee::noteLabel());
0119             noteAction->setCheckable(true);
0120             noteAction->setChecked(modelColumns.contains(Akonadi::ContactsTreeModel::Note));
0121 
0122             if (menu.exec((static_cast<QContextMenuEvent *>(event))->globalPos())) {
0123                 Akonadi::ContactsTreeModel::Columns columns;
0124 
0125                 if (fullNameAction->isChecked()) {
0126                     columns << Akonadi::ContactsTreeModel::FullName;
0127                 }
0128                 if (familyNameAction->isChecked()) {
0129                     columns << Akonadi::ContactsTreeModel::FamilyName;
0130                 }
0131                 if (givenNameAction->isChecked()) {
0132                     columns << Akonadi::ContactsTreeModel::GivenName;
0133                 }
0134                 if (birthdayAction->isChecked()) {
0135                     columns << Akonadi::ContactsTreeModel::Birthday;
0136                 }
0137                 if (homeAddressAction->isChecked()) {
0138                     columns << Akonadi::ContactsTreeModel::HomeAddress;
0139                 }
0140                 if (businessAddressAction->isChecked()) {
0141                     columns << Akonadi::ContactsTreeModel::BusinessAddress;
0142                 }
0143                 if (phoneNumbersAction->isChecked()) {
0144                     columns << Akonadi::ContactsTreeModel::PhoneNumbers;
0145                 }
0146                 if (preferredEmailAction->isChecked()) {
0147                     columns << Akonadi::ContactsTreeModel::PreferredEmail;
0148                 }
0149                 if (allEmailsAction->isChecked()) {
0150                     columns << Akonadi::ContactsTreeModel::AllEmails;
0151                 }
0152                 if (organizationAction->isChecked()) {
0153                     columns << Akonadi::ContactsTreeModel::Organization;
0154                 }
0155                 if (roleAction->isChecked()) {
0156                     columns << Akonadi::ContactsTreeModel::Role;
0157                 }
0158                 if (homepageAction->isChecked()) {
0159                     columns << Akonadi::ContactsTreeModel::Homepage;
0160                 }
0161                 if (noteAction->isChecked()) {
0162                     columns << Akonadi::ContactsTreeModel::Note;
0163                 }
0164 
0165                 mModel->setColumns(columns);
0166                 QTimer::singleShot(0, this, &ModelColumnManager::adaptHeaderView);
0167             }
0168 
0169             return true;
0170         } else {
0171             return false;
0172         }
0173     }
0174 
0175     return false;
0176 }
0177 
0178 void ModelColumnManager::adaptHeaderView()
0179 {
0180     auto view = qobject_cast<QHeaderView *>(mWidget);
0181     if (view) {
0182         view->resizeSections(QHeaderView::Stretch);
0183 
0184         view->setDefaultAlignment(mModel->columns().count() == 1 ? Qt::AlignCenter : Qt::AlignLeft);
0185     }
0186 }
0187 
0188 #include "moc_modelcolumnmanager.cpp"