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, sales@eyeos.com
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
21using namespace Akonadi;
22
23AddressesLocationWidget::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(QLatin1StringView("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(QLatin1StringView("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
83AddressesLocationWidget::~AddressesLocationWidget() = default;
84
85void AddressesLocationWidget::loadContact(const KContacts::Addressee &contact)
86{
87 mAddressModel->setAddresses(contact.addresses());
88}
89
90void 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
110void AddressesLocationWidget::setReadOnly(bool readOnly)
111{
112 mReadOnly = readOnly;
113 mAddressLocationWidget->setReadOnly(readOnly);
114}
115
116bool AddressesLocationWidget::hasNoSavedData() const
117{
118 return mAddressLocationWidget->wasChanged();
119}
120
121#include "moc_addresseslocationwidget.cpp"
void removeAddress(const Address &address)
void insertAddress(const Address &address)
Address::List addresses() const
QString i18n(const char *text, const TYPE &arg...)
A widget for editing the display name of a contact.
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 cancel()
KGuiItem del()
void triggered(bool checked)
QIcon fromTheme(const QString &name)
void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
const_reference at(qsizetype i) const const
qsizetype count() const const
void setObjectName(QAnyStringView name)
CustomContextMenu
UserRole
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
void customContextMenuRequested(const QPoint &pos)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:13:20 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.