File indexing completed on 2024-05-19 05:08:19
0001 /* 0002 SPDX-FileCopyrightText: 2000-2002 Michael Edwardes <mte@users.sourceforge.net> 0003 SPDX-FileCopyrightText: 2000-2002 Javier Campos Morales <javi_c@users.sourceforge.net> 0004 SPDX-FileCopyrightText: 2000-2002 Felix Rodriguez <frodriguez@users.sourceforge.net> 0005 SPDX-FileCopyrightText: 2000-2002 John C <thetacoturtle@users.sourceforge.net> 0006 SPDX-FileCopyrightText: 2000-2002 Thomas Baumgart <ipwizard@users.sourceforge.net> 0007 SPDX-FileCopyrightText: 2000-2002 Kevin Tambascio <ktambascio@users.sourceforge.net> 0008 SPDX-FileCopyrightText: 2000-2002 Andreas Nicolai <Andreas.Nicolai@gmx.net> 0009 SPDX-FileCopyrightText: 2017 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com> 0010 SPDX-License-Identifier: GPL-2.0-or-later 0011 */ 0012 0013 #include "kpayeesview.h" 0014 #include "kpayeesview_p.h" 0015 0016 // ---------------------------------------------------------------------------- 0017 // QT Includes 0018 0019 #include <QAction> 0020 0021 // ---------------------------------------------------------------------------- 0022 // KDE Includes 0023 0024 // ---------------------------------------------------------------------------- 0025 // Project Includes 0026 0027 using namespace Icons; 0028 0029 // *** KPayeesView Implementation *** 0030 0031 KPayeesView::KPayeesView(QWidget *parent) : 0032 KMyMoneyViewBase(*new KPayeesViewPrivate(this), parent) 0033 { 0034 Q_D(KPayeesView); 0035 d->init(); 0036 0037 connect(d->ui->m_payees, &QWidget::customContextMenuRequested, this, [&](QPoint pos) { 0038 Q_D(KPayeesView); 0039 updateActions(d->m_selections); 0040 Q_EMIT requestCustomContextMenu(eMenu::Menu::Payee, d->ui->m_payees->mapToGlobal(pos)); 0041 }); 0042 0043 connect(d->ui->m_register, &QWidget::customContextMenuRequested, this, [&](QPoint pos) { 0044 Q_D(KPayeesView); 0045 // it does not make sense to jump to myself 0046 pActions[eMenu::Action::GoToPayee]->setDisabled(true); 0047 Q_EMIT requestCustomContextMenu(eMenu::Menu::Transaction, d->ui->m_register->mapToGlobal(pos)); 0048 }); 0049 0050 connect(d->ui->m_filterBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [&](int idx) { 0051 Q_D(KPayeesView); 0052 d->m_renameProxyModel->setReferenceFilter(d->ui->m_filterBox->itemData(idx)); 0053 }); 0054 0055 connect(d->ui->m_register, &LedgerView::transactionSelectionChanged, this, [&](const SelectedObjects& selections) { 0056 Q_D(KPayeesView); 0057 d->m_selections.setSelection(SelectedObjects::JournalEntry, selections.selection(SelectedObjects::JournalEntry)); 0058 if (selections.selection(SelectedObjects::JournalEntry).count() == 1) { 0059 const auto file = MyMoneyFile::instance(); 0060 const auto idx = file->journalModel()->indexById(selections.firstSelection(SelectedObjects::JournalEntry)); 0061 d->m_selections.setSelection(SelectedObjects::Account, idx.data(eMyMoney::Model::SplitAccountIdRole).toString()); 0062 } 0063 Q_EMIT requestSelectionChange(d->m_selections); 0064 }); 0065 0066 connect(d->ui->m_register, &LedgerView::requestView, this, &KPayeesView::requestView); 0067 0068 connect(LedgerViewSettings::instance(), &LedgerViewSettings::settingsChanged, this, [&]() { 0069 Q_D(KPayeesView); 0070 d->m_transactionFilter->setHideReconciledTransactions(LedgerViewSettings::instance()->hideReconciledTransactions()); 0071 d->m_transactionFilter->setHideTransactionsBefore(LedgerViewSettings::instance()->hideTransactionsBefore()); 0072 }); 0073 0074 connect(pActions[eMenu::Action::NewPayee], &QAction::triggered, this, &KPayeesView::slotNewPayee); 0075 connect(pActions[eMenu::Action::DeletePayee], &QAction::triggered, this, &KPayeesView::slotDeletePayee); 0076 connect(pActions[eMenu::Action::RenamePayee], &QAction::triggered, this, &KPayeesView::slotRenamePayee); 0077 connect(pActions[eMenu::Action::MergePayee], &QAction::triggered, this, &KPayeesView::slotMergePayee); 0078 0079 d->m_sharedToolbarActions.insert(eMenu::Action::FileNew, pActions[eMenu::Action::NewPayee]); 0080 } 0081 0082 KPayeesView::~KPayeesView() 0083 { 0084 } 0085 0086 void KPayeesView::slotChooseDefaultAccount() 0087 { 0088 Q_D(KPayeesView); 0089 MyMoneyFile* file = MyMoneyFile::instance(); 0090 QMap<QString, int> account_count; 0091 0092 0093 QModelIndex idx; 0094 const auto rows = d->m_transactionFilter->rowCount(); 0095 for(int row = 0; row < rows; ++row) { 0096 idx = d->m_transactionFilter->index(row, 0); 0097 if (!idx.data(eMyMoney::Model::TransactionIsTransferRole).toBool() 0098 && idx.data(eMyMoney::Model::TransactionSplitCountRole).toInt() == 2) { 0099 const auto accountId = idx.data(eMyMoney::Model::SplitAccountIdRole).toString(); 0100 const auto action = idx.data(eMyMoney::Model::SplitActionRole).toString(); 0101 const MyMoneyAccount& acc = file->account(accountId); 0102 if (action != MyMoneySplit::actionName(eMyMoney::Split::Action::Amortization) 0103 && acc.accountType() != eMyMoney::Account::Type::AssetLoan) { 0104 const auto counterAccount = idx.data(eMyMoney::Model::TransactionCounterAccountIdRole).toString(); 0105 if (!counterAccount.isEmpty()) { 0106 if (account_count.contains(counterAccount)) { 0107 account_count[counterAccount]++; 0108 } else { 0109 account_count[counterAccount] = 1; 0110 } 0111 } 0112 } 0113 } 0114 } 0115 0116 QMap<QString, int>::Iterator most_frequent, iter; 0117 most_frequent = account_count.begin(); 0118 for (iter = account_count.begin(); iter != account_count.end(); ++iter) { 0119 if (iter.value() > most_frequent.value()) { 0120 most_frequent = iter; 0121 } 0122 } 0123 0124 if (most_frequent != account_count.end()) { 0125 d->ui->checkEnableDefaultCategory->setChecked(true); 0126 d->ui->comboDefaultCategory->setSelected(most_frequent.key()); 0127 d->setDirty(true); 0128 } 0129 } 0130 0131 void KPayeesView::slotRenameSinglePayee(const QModelIndex& idx, const QVariant& value) 0132 { 0133 Q_D(KPayeesView); 0134 //if there is no current item selected, exit 0135 if (!idx.isValid()) 0136 return; 0137 0138 //qDebug() << "[KPayeesView::slotRenamePayee]"; 0139 // create a copy of the new name without appended whitespaces 0140 QString new_name = value.toString(); 0141 if (d->m_payee.name() != new_name) { 0142 MyMoneyFileTransaction ft; 0143 try { 0144 // check if we already have a payee with the new name 0145 if (!MyMoneyFile::instance()->payeeByName(new_name).id().isEmpty()) { 0146 // the name already exists, ask the user whether he's sure to keep the name 0147 if (KMessageBox::questionTwoActions(this, 0148 i18n("A payee with the name '%1' already exists. It is not advisable to have " 0149 "multiple payees with the same identification name. Are you sure you would like " 0150 "to rename the payee?", 0151 new_name), 0152 i18nc("@title:window", "Duplicate payee name"), 0153 KMMYesNo::yes(), 0154 KMMYesNo::no()) 0155 != KMessageBox::PrimaryAction) { 0156 // p->setText(d->m_payee.name()); 0157 return; 0158 } 0159 } 0160 0161 d->m_payee.setName(new_name); 0162 d->m_newName = new_name; 0163 MyMoneyFile::instance()->modifyPayee(d->m_payee); 0164 0165 // the above call to modifyPayee will reload the view so 0166 // all references and pointers to the view have to be 0167 // re-established. 0168 0169 ft.commit(); 0170 0171 // make sure, that the record is visible even if it moved 0172 // out of sight due to the rename operation 0173 d->ensurePayeeVisible(d->m_payee.id()); 0174 0175 } catch (const MyMoneyException &e) { 0176 KMessageBox::detailedError(this, i18n("Unable to modify payee"), QString::fromLatin1(e.what())); 0177 } 0178 } 0179 } 0180 0181 void KPayeesView::updateActions(const SelectedObjects& selections) 0182 { 0183 Q_D(KPayeesView); 0184 const auto selectedItemCount = selections.selection(SelectedObjects::Payee).count(); 0185 0186 d->ui->m_syncAddressbook->setEnabled(true); 0187 d->ui->m_tabWidget->setEnabled(false); // disable tab widget 0188 0189 pActions[eMenu::Action::RenamePayee]->setEnabled(false); 0190 pActions[eMenu::Action::DeletePayee]->setEnabled(false); 0191 pActions[eMenu::Action::MergePayee]->setEnabled(false); 0192 0193 switch (selectedItemCount) { 0194 case 0: // no selection 0195 d->ui->m_balanceLabel->hide(); 0196 if (isVisible()) { 0197 d->clearItemData(); 0198 } 0199 d->ui->m_syncAddressbook->setEnabled(false); 0200 break; 0201 0202 case 1: // single selection 0203 pActions[eMenu::Action::RenamePayee]->setEnabled(true); 0204 pActions[eMenu::Action::DeletePayee]->setEnabled(true); 0205 d->ui->m_tabWidget->setEnabled(true); // enable tab widget 0206 break; 0207 0208 default: // if we have multiple payees selected, clear and disable the payee information 0209 pActions[eMenu::Action::DeletePayee]->setEnabled(true); 0210 pActions[eMenu::Action::MergePayee]->setEnabled(true); 0211 d->ui->m_balanceLabel->hide(); 0212 if (isVisible()) { 0213 d->clearItemData(); 0214 } 0215 break; 0216 } 0217 } 0218 0219 void KPayeesView::aboutToShow() 0220 { 0221 Q_D(KPayeesView); 0222 d->loadDetails(); 0223 d->showTransactions(); 0224 0225 // don't forget base class logic 0226 KMyMoneyViewBase::aboutToShow(); 0227 } 0228 0229 void KPayeesView::aboutToHide() 0230 { 0231 Q_D(KPayeesView); 0232 0233 d->finalizePendingChanges(); 0234 0235 KMyMoneyViewBase::aboutToHide(); 0236 } 0237 0238 void KPayeesView::slotPayeeSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected) 0239 { 0240 Q_UNUSED(selected) 0241 Q_UNUSED(deselected) 0242 Q_D(KPayeesView); 0243 0244 d->finalizePendingChanges(); 0245 d->selectPayee(); 0246 } 0247 0248 void KPayeesView::slotKeyListChanged() 0249 { 0250 Q_D(KPayeesView); 0251 bool rc = false; 0252 bool ignorecase = false; 0253 QStringList keys; 0254 0255 d->m_payee.matchData(ignorecase, keys); 0256 if (static_cast<eMyMoney::Payee::MatchType>(d->ui->matchTypeCombo->currentData().toUInt()) == eMyMoney::Payee::MatchType::Key) { 0257 rc |= (keys != d->ui->matchKeyEditList->items()); 0258 } 0259 d->setDirty(rc); 0260 } 0261 0262 void KPayeesView::slotModelDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight) 0263 { 0264 Q_D(KPayeesView); 0265 QModelIndex idx; 0266 if (topLeft.model() == d->m_renameProxyModel) { 0267 const auto baseModel = MyMoneyFile::instance()->payeesModel(); 0268 for (int row = topLeft.row(); row <= bottomRight.row(); ++row) { 0269 idx = topLeft.model()->index(row, 0, topLeft.parent()); 0270 if (d->m_payee.id() == idx.data(eMyMoney::Model::IdRole).toString()) { 0271 d->m_payee = baseModel->itemById(d->m_payee.id()); 0272 d->loadDetails(); 0273 } 0274 } 0275 } 0276 } 0277 0278 0279 void KPayeesView::slotPayeeDataChanged() 0280 { 0281 Q_D(KPayeesView); 0282 bool rc = false; 0283 0284 if (d->ui->m_tabWidget->isEnabled()) { 0285 rc |= ((d->m_payee.email().isEmpty() != d->ui->emailEdit->text().isEmpty()) 0286 || (!d->ui->emailEdit->text().isEmpty() && d->m_payee.email() != d->ui->emailEdit->text())); 0287 rc |= ((d->m_payee.address().isEmpty() != d->ui->addressEdit->toPlainText().isEmpty()) 0288 || (!d->ui->addressEdit->toPlainText().isEmpty() && d->m_payee.address() != d->ui->addressEdit->toPlainText())); 0289 rc |= ((d->m_payee.city().isEmpty() != d->ui->payeecityEdit->text().isEmpty()) 0290 || (!d->ui->payeecityEdit->text().isEmpty() && d->m_payee.city() != d->ui->payeecityEdit->text())); 0291 rc |= ((d->m_payee.state().isEmpty() != d->ui->payeestateEdit->text().isEmpty()) 0292 || (!d->ui->payeestateEdit->text().isEmpty() && d->m_payee.state() != d->ui->payeestateEdit->text())); 0293 rc |= ((d->m_payee.postcode().isEmpty() != d->ui->postcodeEdit->text().isEmpty()) 0294 || (!d->ui->postcodeEdit->text().isEmpty() && d->m_payee.postcode() != d->ui->postcodeEdit->text())); 0295 rc |= ((d->m_payee.telephone().isEmpty() != d->ui->telephoneEdit->text().isEmpty()) 0296 || (!d->ui->telephoneEdit->text().isEmpty() && d->m_payee.telephone() != d->ui->telephoneEdit->text())); 0297 rc |= ((d->m_payee.name().isEmpty() != d->m_newName.isEmpty()) 0298 || (!d->m_newName.isEmpty() && d->m_payee.name() != d->m_newName)); 0299 rc |= ((d->m_payee.notes().isEmpty() != d->ui->notesEdit->toPlainText().isEmpty()) 0300 || (!d->ui->notesEdit->toPlainText().isEmpty() && d->m_payee.notes() != d->ui->notesEdit->toPlainText())); 0301 0302 bool ignorecase = false; 0303 QStringList keys; 0304 0305 const auto selectedMatchType = static_cast<eMyMoney::Payee::MatchType>(d->ui->matchTypeCombo->currentData().toUInt()); 0306 const auto storedMatchType = d->m_payee.matchData(ignorecase, keys); 0307 rc |= (storedMatchType != selectedMatchType); 0308 0309 d->ui->checkMatchIgnoreCase->setEnabled(false); 0310 d->ui->matchKeyEditList->setEnabled(false); 0311 0312 if (selectedMatchType != eMyMoney::Payee::MatchType::Disabled) { 0313 d->ui->checkMatchIgnoreCase->setEnabled(true); 0314 // if we turn matching on, we default to 'ignore case' 0315 // TODO maybe make the default a user option 0316 if (storedMatchType == eMyMoney::Payee::MatchType::Disabled && (selectedMatchType != eMyMoney::Payee::MatchType::Disabled)) 0317 d->ui->checkMatchIgnoreCase->setChecked(true); 0318 rc |= (ignorecase != d->ui->checkMatchIgnoreCase->isChecked()); 0319 if (selectedMatchType == eMyMoney::Payee::MatchType::Key) { 0320 d->ui->matchKeyEditList->setEnabled(true); 0321 rc |= (keys != d->ui->matchKeyEditList->items()); 0322 } 0323 } 0324 0325 rc |= (d->ui->checkEnableDefaultCategory->isChecked() != !d->m_payee.defaultAccountId().isEmpty()); 0326 if (d->ui->checkEnableDefaultCategory->isChecked()) { 0327 d->ui->comboDefaultCategory->setEnabled(true); 0328 d->ui->labelDefaultCategory->setEnabled(true); 0329 // this is only going to understand the first in the list of selected accounts 0330 if (d->ui->comboDefaultCategory->getSelected().isEmpty()) { 0331 rc |= !d->m_payee.defaultAccountId().isEmpty(); 0332 } else { 0333 QString temp = d->ui->comboDefaultCategory->getSelected(); 0334 rc |= (temp.isEmpty() != d->m_payee.defaultAccountId().isEmpty()) 0335 || (!d->m_payee.defaultAccountId().isEmpty() && temp != d->m_payee.defaultAccountId()); 0336 } 0337 } else { 0338 d->ui->comboDefaultCategory->setEnabled(false); 0339 d->ui->labelDefaultCategory->setEnabled(false); 0340 } 0341 0342 rc |= (d->m_payee.payeeIdentifiers() != d->ui->payeeIdentifiers->identifiers()); 0343 } 0344 d->setDirty(rc); 0345 } 0346 0347 void KPayeesView::slotUpdatePayee() 0348 { 0349 Q_D(KPayeesView); 0350 if (d->isDirty()) { 0351 MyMoneyFileTransaction ft; 0352 d->setDirty(false); 0353 try { 0354 d->m_payee.setName(d->m_newName); 0355 d->m_payee.setAddress(d->ui->addressEdit->toPlainText()); 0356 d->m_payee.setCity(d->ui->payeecityEdit->text()); 0357 d->m_payee.setState(d->ui->payeestateEdit->text()); 0358 d->m_payee.setPostcode(d->ui->postcodeEdit->text()); 0359 d->m_payee.setTelephone(d->ui->telephoneEdit->text()); 0360 d->m_payee.setEmail(d->ui->emailEdit->text()); 0361 d->m_payee.setNotes(d->ui->notesEdit->toPlainText()); 0362 d->m_payee.setMatchData(static_cast<eMyMoney::Payee::MatchType>(d->ui->matchTypeCombo->currentData().toUInt()), d->ui->checkMatchIgnoreCase->isChecked(), d->ui->matchKeyEditList->items()); 0363 d->m_payee.setDefaultAccountId(); 0364 d->m_payee.resetPayeeIdentifiers(d->ui->payeeIdentifiers->identifiers()); 0365 0366 if (d->ui->checkEnableDefaultCategory->isChecked()) { 0367 QString temp; 0368 if (!d->ui->comboDefaultCategory->getSelected().isEmpty()) { 0369 temp = d->ui->comboDefaultCategory->getSelected(); 0370 d->m_payee.setDefaultAccountId(temp); 0371 } 0372 } 0373 0374 MyMoneyFile::instance()->modifyPayee(d->m_payee); 0375 ft.commit(); 0376 0377 } catch (const MyMoneyException &e) { 0378 KMessageBox::detailedError(this, i18n("Unable to modify payee"), QString::fromLatin1(e.what())); 0379 } 0380 } 0381 } 0382 0383 void KPayeesView::slotSyncAddressBook() 0384 { 0385 Q_D(KPayeesView); 0386 if (d->m_payeesToSync.isEmpty()) { // empty list means no syncing is pending... 0387 d->m_payeesToSync = d->selectedPayees(); // ...so initialize one 0388 d->m_syncedPayees = 0; 0389 d->ui->m_syncAddressbook->setEnabled(false); // disallow concurrent syncs 0390 } 0391 0392 if (d->m_payeesToSync.count() <= d->m_syncedPayees) { 0393 if (!d->m_payeesToSync.isEmpty()) { 0394 MyMoneyFileTransaction ft; 0395 try { 0396 for (const auto& payee : d->m_payeesToSync) { 0397 MyMoneyFile::instance()->modifyPayee(payee); 0398 } 0399 ft.commit(); 0400 } catch (const MyMoneyException &e) { 0401 KMessageBox::detailedError(this, i18n("Unable to modify payee"), QString::fromLatin1(e.what())); 0402 } 0403 } 0404 d->m_payeesToSync.clear(); // that means end of sync 0405 d->m_syncedPayees = 0; 0406 d->ui->m_syncAddressbook->setEnabled(true); 0407 return; 0408 } 0409 0410 // search for payee's data in addressbook and receive it in slotContactFetched 0411 d->m_contact->fetchContact(d->m_payeesToSync[d->m_syncedPayees].email()); 0412 } 0413 0414 void KPayeesView::slotContactFetched(const ContactData &identity) 0415 { 0416 Q_D(KPayeesView); 0417 MyMoneyPayee& payee = d->m_payeesToSync[d->m_syncedPayees]; 0418 0419 if (!identity.email.isEmpty()) { // empty e-mail means no identity fetched 0420 QString txt; 0421 if (!identity.street.isEmpty()) 0422 txt.append(identity.street + '\n'); 0423 if (!identity.locality.isEmpty()) { 0424 txt.append(identity.locality); 0425 if (!identity.postalCode.isEmpty()) 0426 txt.append(' ' + identity.postalCode + '\n'); 0427 else 0428 txt.append('\n'); 0429 } 0430 if (!identity.country.isEmpty()) 0431 txt.append(identity.country + '\n'); 0432 0433 if (!txt.isEmpty() && d->m_payee.address().compare(txt) != 0) 0434 d->m_payee.setAddress(txt); 0435 0436 if (!identity.city.isEmpty() && d->m_payee.city().compare(identity.city) != 0) 0437 d->m_payee.setCity(identity.city); 0438 0439 if (!identity.state.isEmpty() && d->m_payee.state().compare(identity.state) != 0) 0440 d->m_payee.setState(identity.state); 0441 0442 if (!identity.postalCode.isEmpty() && d->m_payee.postcode().compare(identity.postalCode) != 0) 0443 d->m_payee.setPostcode(identity.postalCode); 0444 0445 if (!identity.postalCode.isEmpty() && payee.postcode().compare(identity.postalCode) != 0) 0446 payee.setPostcode(identity.postalCode); 0447 0448 if (!identity.phoneNumber.isEmpty() && payee.telephone().compare(identity.phoneNumber) != 0) 0449 payee.setTelephone(identity.phoneNumber); 0450 } 0451 0452 ++d->m_syncedPayees; 0453 slotSyncAddressBook(); // process next payee 0454 } 0455 0456 void KPayeesView::slotSendMail() 0457 { 0458 Q_D(KPayeesView); 0459 QRegularExpression re(".+@.+"); 0460 if (re.match(d->m_payee.email()).hasMatch()) 0461 QDesktopServices::openUrl(QUrl(QStringLiteral("mailto:?to=") + d->m_payee.email(), QUrl::TolerantMode)); 0462 } 0463 0464 void KPayeesView::executeAction(eMenu::Action action, const SelectedObjects& selections) 0465 { 0466 const auto payeeId(selections.firstSelection(SelectedObjects::Payee)); 0467 const auto accountId(selections.firstSelection(SelectedObjects::Account)); 0468 const auto journalEntryId(selections.firstSelection(SelectedObjects::JournalEntry)); 0469 0470 Q_D(KPayeesView); 0471 const auto idx = d->ui->m_register->currentIndex(); 0472 switch (action) { 0473 case eMenu::Action::GoToPayee: 0474 if (d->isActiveView()) { 0475 d->selectPayeeAndTransaction(payeeId, accountId, journalEntryId); 0476 } 0477 break; 0478 case eMenu::Action::EditTransaction: 0479 if (d->isActiveView()) { 0480 d->ui->m_register->edit(d->ui->m_register->currentIndex()); 0481 } 0482 break; 0483 case eMenu::Action::EditSplits: 0484 if (d->isActiveView()) { 0485 d->ui->m_register->edit(idx); 0486 const auto editor = d->ui->m_register->indexWidget(d->ui->m_register->editIndex()); 0487 if (editor) { 0488 QMetaObject::invokeMethod(editor, "editSplits", Qt::QueuedConnection); 0489 } 0490 } 0491 break; 0492 0493 case eMenu::Action::SelectAllTransactions: 0494 if (d->isActiveView()) { 0495 d->ui->m_register->selectAllTransactions(); 0496 } 0497 break; 0498 0499 case eMenu::Action::FileClose: 0500 d->ui->payeeIdentifiers->closeSource(); 0501 break; 0502 0503 case eMenu::Action::ShowTransaction: 0504 d->ui->m_register->showEditor(); 0505 break; 0506 0507 default: 0508 break; 0509 } 0510 } 0511 0512 void KPayeesView::slotSettingsChanged() 0513 { 0514 Q_D(KPayeesView); 0515 if (d->ui->m_register) { 0516 d->ui->m_register->slotSettingsChanged(); 0517 } 0518 } 0519 0520 void KPayeesView::slotHelp() 0521 { 0522 KHelpClient::invokeHelp("details.payees"); 0523 } 0524 0525 void KPayeesView::slotNewPayee() 0526 { 0527 Q_D(KPayeesView); 0528 bool ok; 0529 QString id; 0530 std::tie(ok, id) = KMyMoneyUtils::newPayee(i18n("New Payee")); 0531 d->selectPayeeAndTransaction(id); 0532 } 0533 0534 void KPayeesView::slotRenamePayee() 0535 { 0536 Q_D(KPayeesView); 0537 if (d->ui->m_payees->currentIndex().isValid() && d->ui->m_payees->selectionModel()->selectedIndexes().count() == 1) { 0538 d->ui->m_payees->edit(d->ui->m_payees->currentIndex()); 0539 } 0540 } 0541 0542 void KPayeesView::slotDeletePayee() 0543 { 0544 Q_D(KPayeesView); 0545 const auto payeesList = d->selectedPayees(); 0546 0547 if (payeesList.isEmpty()) 0548 return; // shouldn't happen 0549 0550 // get confirmation from user 0551 QString prompt; 0552 if (payeesList.count() == 1) 0553 prompt = i18n("<p>Do you really want to remove the payee <b>%1</b>?</p>", payeesList.front().name()); 0554 else 0555 prompt = i18n("Do you really want to remove all selected payees?"); 0556 0557 if (KMessageBox::questionTwoActions(this, prompt, i18n("Remove Payee"), KMMYesNo::yes(), KMMYesNo::no()) == KMessageBox::SecondaryAction) 0558 return; 0559 0560 d->payeeReassign(KPayeeReassignDlg::TypeDelete); 0561 } 0562 0563 void KPayeesView::slotMergePayee() 0564 { 0565 Q_D(KPayeesView); 0566 const auto payeesList = d->selectedPayees(); 0567 if (payeesList.count() < 1) 0568 return; // shouldn't happen 0569 0570 if (KMessageBox::questionTwoActions(this, 0571 i18n("<p>Do you really want to merge the selected payees?"), 0572 i18n("Merge Payees"), 0573 KMMYesNo::yes(), 0574 KMMYesNo::no()) 0575 == KMessageBox::SecondaryAction) 0576 return; 0577 0578 if (d->payeeReassign(KPayeeReassignDlg::TypeMerge)) 0579 /// @todo maybe select the one that is remaining and call 0580 /// d->ensurePayeeVisible 0581 // clean selection since we just deleted the selected payees 0582 d->ui->m_payees->selectionModel()->clear(); 0583 }