diff --git a/kmymoney/kmymoney.cpp b/kmymoney/kmymoney.cpp --- a/kmymoney/kmymoney.cpp +++ b/kmymoney/kmymoney.cpp @@ -1915,6 +1915,8 @@ {Action::UpdateAccount, QStringLiteral("account_online_update"), i18n("Update account..."), Icon::AccountUpdate}, {Action::UpdateAllAccounts, QStringLiteral("account_online_update_all"), i18n("Update all accounts..."), Icon::AccountUpdateAll}, {Action::AccountCreditTransfer, QStringLiteral("account_online_new_credit_transfer"), i18n("New credit transfer"), Icon::AccountCreditTransfer}, + {Action::AccountSetCustomIcon, QStringLiteral("account_set_custom_icon"), i18n("Set custom icon"), Icon::Empty}, + {Action::AccountRemoveCustomIcon, QStringLiteral("account_remove_custom_icon"), i18n("Remove custom icon"), Icon::Empty}, // ******************* // The categories menu // ******************* diff --git a/kmymoney/kmymoneyui.rc b/kmymoney/kmymoneyui.rc --- a/kmymoney/kmymoneyui.rc +++ b/kmymoney/kmymoneyui.rc @@ -1,5 +1,5 @@ - + @@ -135,6 +135,9 @@ + + + Category options diff --git a/kmymoney/menus/menuenums.h b/kmymoney/menus/menuenums.h --- a/kmymoney/menus/menuenums.h +++ b/kmymoney/menus/menuenums.h @@ -62,6 +62,7 @@ UpdateAccountMenu, UpdateAccount, UpdateAllAccounts, MapOnlineAccount, UnmapOnlineAccount, AccountCreditTransfer, + AccountSetCustomIcon, AccountRemoveCustomIcon, // ************* // The category menu // ************* diff --git a/kmymoney/mymoney/mymoneyaccount.cpp b/kmymoney/mymoney/mymoneyaccount.cpp --- a/kmymoney/mymoney/mymoneyaccount.cpp +++ b/kmymoney/mymoney/mymoneyaccount.cpp @@ -603,12 +603,17 @@ Icon ixIcon = accToIco.value(accountType(), Icon::ViewLiability); - QString kyIcon = accountTypeToString(accountType()) + QString::number(size); + const auto customIconPath = value("kmm_custom_icon_file"); + const auto kyIcon = customIconPath.isEmpty() ? accountTypeToString(accountType()) + QString::number(size) : QString("acc_custom_icon_" + id()); QPixmap pxIcon; if (!QPixmapCache::find(kyIcon, pxIcon)) { - pxIcon = Icons::get(ixIcon).pixmap(size); // Qt::AA_UseHighDpiPixmaps (in Qt 5.7) doesn't return highdpi pixmap - QPixmapCache::insert(kyIcon, pxIcon); + if (pxIcon.load(customIconPath)) { + QPixmapCache::insert(kyIcon, pxIcon); + } else { + pxIcon = Icons::get(ixIcon).pixmap(size); // Qt::AA_UseHighDpiPixmaps (in Qt 5.7) doesn't return highdpi pixmap + QPixmapCache::insert(kyIcon, pxIcon); + } } if (isClosed()) diff --git a/kmymoney/views/kaccountsview.h b/kmymoney/views/kaccountsview.h --- a/kmymoney/views/kaccountsview.h +++ b/kmymoney/views/kaccountsview.h @@ -87,6 +87,8 @@ void slotAccountUnmapOnline(); void slotAccountUpdateOnline(); void slotAccountUpdateOnlineAll(); + void slotSetCustomIcon(); + void slotRemoveCustomIcon(); }; #endif diff --git a/kmymoney/views/kaccountsview.cpp b/kmymoney/views/kaccountsview.cpp --- a/kmymoney/views/kaccountsview.cpp +++ b/kmymoney/views/kaccountsview.cpp @@ -25,6 +25,7 @@ #include #include #include +#include // ---------------------------------------------------------------------------- // KDE Includes @@ -47,16 +48,18 @@ KAccountsView::KAccountsView(QWidget *parent) : KMyMoneyAccountsViewBase(*new KAccountsViewPrivate(this), parent) { - connect(pActions[eMenu::Action::NewAccount], &QAction::triggered, this, &KAccountsView::slotNewAccount); - connect(pActions[eMenu::Action::EditAccount], &QAction::triggered, this, &KAccountsView::slotEditAccount); - connect(pActions[eMenu::Action::DeleteAccount], &QAction::triggered, this, &KAccountsView::slotDeleteAccount); - connect(pActions[eMenu::Action::CloseAccount], &QAction::triggered, this, &KAccountsView::slotCloseAccount); - connect(pActions[eMenu::Action::ReopenAccount], &QAction::triggered, this, &KAccountsView::slotReopenAccount); - connect(pActions[eMenu::Action::ChartAccountBalance], &QAction::triggered, this, &KAccountsView::slotChartAccountBalance); - connect(pActions[eMenu::Action::MapOnlineAccount], &QAction::triggered, this, &KAccountsView::slotAccountMapOnline); - connect(pActions[eMenu::Action::UnmapOnlineAccount], &QAction::triggered, this, &KAccountsView::slotAccountUnmapOnline); - connect(pActions[eMenu::Action::UpdateAccount], &QAction::triggered, this, &KAccountsView::slotAccountUpdateOnline); - connect(pActions[eMenu::Action::UpdateAllAccounts], &QAction::triggered, this, &KAccountsView::slotAccountUpdateOnlineAll); + connect(pActions[eMenu::Action::NewAccount], &QAction::triggered, this, &KAccountsView::slotNewAccount); + connect(pActions[eMenu::Action::EditAccount], &QAction::triggered, this, &KAccountsView::slotEditAccount); + connect(pActions[eMenu::Action::DeleteAccount], &QAction::triggered, this, &KAccountsView::slotDeleteAccount); + connect(pActions[eMenu::Action::CloseAccount], &QAction::triggered, this, &KAccountsView::slotCloseAccount); + connect(pActions[eMenu::Action::ReopenAccount], &QAction::triggered, this, &KAccountsView::slotReopenAccount); + connect(pActions[eMenu::Action::ChartAccountBalance], &QAction::triggered, this, &KAccountsView::slotChartAccountBalance); + connect(pActions[eMenu::Action::MapOnlineAccount], &QAction::triggered, this, &KAccountsView::slotAccountMapOnline); + connect(pActions[eMenu::Action::UnmapOnlineAccount], &QAction::triggered, this, &KAccountsView::slotAccountUnmapOnline); + connect(pActions[eMenu::Action::UpdateAccount], &QAction::triggered, this, &KAccountsView::slotAccountUpdateOnline); + connect(pActions[eMenu::Action::UpdateAllAccounts], &QAction::triggered, this, &KAccountsView::slotAccountUpdateOnlineAll); + connect(pActions[eMenu::Action::AccountSetCustomIcon], &QAction::triggered, this, &KAccountsView::slotSetCustomIcon); + connect(pActions[eMenu::Action::AccountRemoveCustomIcon], &QAction::triggered, this, &KAccountsView::slotRemoveCustomIcon); } KAccountsView::~KAccountsView() @@ -157,7 +160,8 @@ eMenu::Action::NewAccount, eMenu::Action::EditAccount, eMenu::Action::DeleteAccount, eMenu::Action::CloseAccount, eMenu::Action::ReopenAccount, eMenu::Action::ChartAccountBalance, - eMenu::Action::UnmapOnlineAccount, eMenu::Action::MapOnlineAccount, eMenu::Action::UpdateAccount + eMenu::Action::UnmapOnlineAccount, eMenu::Action::MapOnlineAccount, eMenu::Action::UpdateAccount, + eMenu::Action::AccountRemoveCustomIcon, eMenu::Action::AccountSetCustomIcon }; for (const auto& a : actionsToBeDisabled) @@ -213,7 +217,11 @@ } else { pActions[eMenu::Action::MapOnlineAccount]->setEnabled(d->m_onlinePlugins && !d->m_onlinePlugins->isEmpty()); } - + if (!file->isStandardAccount(d->m_currentAccount.id())) { + if (!d->m_currentAccount.value(QStringLiteral("kmm_custom_icon_file")).isEmpty()) + pActions[eMenu::Action::AccountRemoveCustomIcon]->setEnabled(true); + pActions[eMenu::Action::AccountSetCustomIcon]->setEnabled(true); + } break; } default: @@ -581,3 +589,16 @@ // re-enable the disabled actions updateActions(d->m_currentAccount); } + +void KAccountsView::slotSetCustomIcon() +{ + Q_D(KAccountsView); + auto fileName = QFileDialog::getOpenFileName(this, i18n("Select icon"), "", i18n("Image Files (*.png *.jpg *.jpeg *.bmp *.ico)")); + d->setCustomIcon(fileName); +} + +void KAccountsView::slotRemoveCustomIcon() +{ + Q_D(KAccountsView); + d->removeCustomIcon(); +} \ No newline at end of file diff --git a/kmymoney/views/kaccountsview_p.h b/kmymoney/views/kaccountsview_p.h --- a/kmymoney/views/kaccountsview_p.h +++ b/kmymoney/views/kaccountsview_p.h @@ -24,6 +24,7 @@ #include #include +#include // ---------------------------------------------------------------------------- // KDE Includes @@ -313,6 +314,33 @@ } } + void setCustomIcon(const QString iconFilename) + { + const auto kmmFile = MyMoneyFile::instance(); + if (kmmFile->isStandardAccount(m_currentAccount.id())) + return; + + const QFile iconFile(iconFilename); + if (iconFile.exists()) { + MyMoneyFileTransaction ft; + m_currentAccount.setValue(QStringLiteral("kmm_custom_icon_file"), iconFilename); + kmmFile->modifyAccount(m_currentAccount); + ft.commit(); + } + } + + void removeCustomIcon() + { + const auto kmmFile = MyMoneyFile::instance(); + if (kmmFile->isStandardAccount(m_currentAccount.id())) + return; + + MyMoneyFileTransaction ft; + m_currentAccount.deletePair(QStringLiteral("kmm_custom_icon_file")); + kmmFile->modifyAccount(m_currentAccount); + ft.commit(); + } + KAccountsView *q_ptr; Ui::KAccountsView *ui; bool m_haveUnusedCategories;