Akonadi Contacts

addresseslocationwidget.cpp
1 /*
2  This file is part of Contact Editor.
3 
4  SPDX-FileCopyrightText: 2016 eyeOS S.L.U., a Telefonica company, [email protected]
5  SPDX-FileCopyrightText: 2016-2020 Laurent Montel <montel.org>
6 
7  SPDX-License-Identifier: LGPL-2.0-or-later
8 */
9 
10 #include "addresseslocationwidget.h"
11 #include "addressdelegate.h"
12 #include "addresslocationwidget.h"
13 #include "addressmodel.h"
14 #include "contacteditor_debug.h"
15 
16 #include <KLocalizedString>
17 #include <KMessageBox>
18 #include <QMenu>
19 #include <QTreeView>
20 
21 using namespace ContactEditor;
22 
23 AddressesLocationWidget::AddressesLocationWidget(QWidget *parent)
24  : QSplitter(parent)
25  , mAddressLocationWidget(new AddressLocationWidget(this))
26  , mAddressesLocationView(new QTreeView(this))
27  , mAddressModel(new AddressModel(this))
28 {
29  mAddressLocationWidget->setObjectName(QStringLiteral("addresslocationwidget"));
30  addWidget(mAddressLocationWidget);
31 
32  mAddressesLocationView->setRootIsDecorated(false);
33  mAddressesLocationView->setHeaderHidden(true);
34  mAddressesLocationView->setModel(mAddressModel);
35  mAddressesLocationView->setItemDelegate(new AddressDelegate(this));
36  mAddressesLocationView->setContextMenuPolicy(Qt::CustomContextMenu);
37  mAddressesLocationView->setObjectName(QStringLiteral("addresseslocationviewer"));
38  addWidget(mAddressesLocationView);
39 
40  connect(mAddressesLocationView->selectionModel(), &QItemSelectionModel::selectionChanged, this, [this](const QItemSelection &selection) {
41  mAddressLocationWidget->clear();
42  if (selection.size() != 1) {
43  return;
44  }
45  const auto idx = selection.at(0).topLeft();
46  if (!idx.isValid()) {
47  return;
48  }
49  mAddressLocationWidget->slotModifyAddress(idx.data(Qt::UserRole).value<KContacts::Address>(), idx.row());
50  });
51  connect(mAddressLocationWidget, &AddressLocationWidget::addNewAddress, mAddressModel, &AddressModel::addAddress);
52  connect(mAddressLocationWidget, &AddressLocationWidget::removeAddress, mAddressModel, &AddressModel::removeAddress);
53  connect(mAddressLocationWidget,
54  &AddressLocationWidget::updateAddressCanceled,
55  mAddressesLocationView->selectionModel(),
57  connect(mAddressLocationWidget, &AddressLocationWidget::updateAddress, mAddressModel, &AddressModel::replaceAddress);
58  connect(mAddressesLocationView, &QWidget::customContextMenuRequested, this, [this](QPoint pos) {
59  const auto idx = mAddressesLocationView->indexAt(pos);
60  if (!idx.isValid()) {
61  return;
62  }
63  QMenu menu;
64  auto action = menu.addAction(QIcon::fromTheme(QStringLiteral("edit-delete")), i18n("Remove Address"));
65  action->setEnabled(!mReadOnly);
66  connect(action, &QAction::triggered, this, [this, idx]() {
67  const auto result = KMessageBox::questionTwoActions(this,
68  i18n("Do you really want to delete this address?"),
69  QString(),
72  if (result == KMessageBox::ButtonCode::PrimaryAction) {
73  mAddressModel->removeAddress(idx.row());
74  }
75  });
76  menu.exec(mAddressesLocationView->viewport()->mapToGlobal(pos));
77  });
78 
79  setChildrenCollapsible(false);
80  setSizes({400, 300});
81 }
82 
83 AddressesLocationWidget::~AddressesLocationWidget() = default;
84 
85 void AddressesLocationWidget::loadContact(const KContacts::Addressee &contact)
86 {
87  mAddressModel->setAddresses(contact.addresses());
88 }
89 
90 void AddressesLocationWidget::storeContact(KContacts::Addressee &contact) const
91 {
92  // delete all previous addresses
93  const KContacts::Address::List oldAddresses = contact.addresses();
94  const int numberOfOldAddresses(oldAddresses.count());
95  for (int i = 0; i < numberOfOldAddresses; ++i) {
96  contact.removeAddress(oldAddresses.at(i));
97  }
98 
99  const KContacts::Address::List addressList = mAddressModel->addresses();
100  // insert the new ones
101  const int numberOfAddress(addressList.count());
102  for (int i = 0; i < numberOfAddress; ++i) {
103  const KContacts::Address address(addressList.at(i));
104  if (!address.isEmpty()) {
105  contact.insertAddress(address);
106  }
107  }
108 }
109 
110 void AddressesLocationWidget::setReadOnly(bool readOnly)
111 {
112  mReadOnly = readOnly;
113  mAddressLocationWidget->setReadOnly(readOnly);
114 }
115 
116 bool AddressesLocationWidget::hasNoSavedData() const
117 {
118  return mAddressLocationWidget->wasChanged();
119 }
void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
void removeAddress(const Address &address)
UserRole
void customContextMenuRequested(const QPoint &pos)
QIcon fromTheme(const QString &name)
CustomContextMenu
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QAction * addAction(const QString &text)
KGuiItem cancel()
QString i18n(const char *text, const TYPE &arg...)
void insertAddress(const Address &address)
const T & at(int i) const const
const T & at(int i) const const
PostalAddress address(const QVariant &location)
ButtonCode questionTwoActions(QWidget *parent, const QString &text, const QString &title, const KGuiItem &primaryAction, const KGuiItem &secondaryAction, const QString &dontAskAgainName=QString(), Options options=Notify)
KGuiItem del()
void triggered(bool checked)
void setEnabled(bool)
void setObjectName(const QString &name)
int count(const T &value) const const
Address::List addresses() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Sat Apr 1 2023 04:09:04 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.