diff --git a/src/view/smartcardactions.cpp b/src/view/smartcardactions.cpp index 348d054d6..609d0e190 100644 --- a/src/view/smartcardactions.cpp +++ b/src/view/smartcardactions.cpp @@ -1,105 +1,102 @@ /* view/smartcardactions.cpp This file is part of Kleopatra, the KDE keymanager SPDX-FileCopyrightText: 2024 g10 Code GmbH SPDX-FileContributor: Ingo Klöcker <dev@ingo-kloecker.de> SPDX-License-Identifier: GPL-2.0-or-later */ #include "smartcardactions.h" #include <KActionCollection> #include <KLocalizedString> #include <algorithm> using namespace Qt::Literals::StringLiterals; SmartCardActions::SmartCardActions() : mActionCollection{std::make_unique<KActionCollection>(nullptr, u"smartcards"_s)} { mActionCollection->setComponentDisplayName(i18n("Smart Card Management")); // window actions mActionCollection->addAction(KStandardAction::StandardAction::Close, u"window_close"_s); // general actions { QAction *action = mActionCollection->addAction(KStandardAction::StandardAction::Redisplay, u"reload"_s); action->setText(i18nc("@action", "Reload")); action->setToolTip(i18nc("@info:tooltip", "Reload smart cards")); } // card slot actions - { - QAction *action = mActionCollection->addAction(u"card_slot_show_certificate_details"_s); - action->setText(i18nc("@action", "Show Certificate Details")); - action->setIcon(QIcon::fromTheme(u"dialog-information"_s)); - } - { - QAction *action = mActionCollection->addAction(u"card_slot_generate_key"_s); - action->setText(i18nc("@action", "Generate New Key")); - action->setToolTip(i18nc("@info:tooltip", "If the card slot already contains a key then the new key will irrevocably replace the old key.")); - action->setIcon(QIcon::fromTheme(u"view-certificate-add"_s)); - } - { - QAction *action = mActionCollection->addAction(u"card_slot_write_key"_s); - action->setText(i18nc("@action", "Write Key to Card")); - action->setToolTip(i18nc("@info:tooltip", "Write the key pair of a certificate to the card")); - action->setIcon(QIcon::fromTheme(u"view-certificate-export"_s)); - } - { - QAction *action = mActionCollection->addAction(u"card_slot_write_certificate"_s); - action->setText(i18nc("@action", "Write Certificate to Card")); - action->setToolTip(i18nc("@info:tooltip", "Write the certificate corresponding to this key to the card")); - action->setIcon(QIcon::fromTheme(u"view-certificate-export"_s)); - } - { - QAction *action = mActionCollection->addAction(u"card_slot_read_certificate"_s); - action->setText(i18nc("@action", "Import Certificate from Card")); - action->setToolTip(i18nc("@info:tooltip", "Import the certificate stored on the card")); - action->setIcon(QIcon::fromTheme(u"view-certificate-import"_s)); - } - { - QAction *action = mActionCollection->addAction(u"card_slot_create_csr"_s); - action->setText(i18nc("@action", "Create S/MIME Certification Request")); - action->setToolTip(i18nc("@info:tooltip", "Create an S/MIME certificate signing request for this key")); - action->setIcon(QIcon::fromTheme(u"view-certificate-add"_s)); - } + addAction(u"card_slot_show_certificate_details"_s, // + i18nc("@action", "Show Certificate Details"), + {}, + QIcon::fromTheme(u"dialog-information"_s)); + addAction(u"card_slot_generate_key"_s, // + i18nc("@action", "Generate New Key"), + i18nc("@info:tooltip", "If the card slot already contains a key then the new key will irrevocably replace the old key."), + QIcon::fromTheme(u"view-certificate-add"_s)); + addAction(u"card_slot_write_key"_s, // + i18nc("@action", "Write Key to Card"), + i18nc("@info:tooltip", "Write the key pair of a certificate to the card"), + QIcon::fromTheme(u"view-certificate-export"_s)); + addAction(u"card_slot_write_certificate"_s, // + i18nc("@action", "Write Certificate to Card"), + i18nc("@info:tooltip", "Write the certificate corresponding to this key to the card"), + QIcon::fromTheme(u"view-certificate-export"_s)); + addAction(u"card_slot_read_certificate"_s, // + i18nc("@action", "Import Certificate from Card"), + i18nc("@info:tooltip", "Import the certificate stored on the card"), + QIcon::fromTheme(u"view-certificate-import"_s)); + addAction(u"card_slot_create_csr"_s, // + i18nc("@action", "Create S/MIME Certification Request"), + i18nc("@info:tooltip", "Create an S/MIME certificate signing request for this key"), + QIcon::fromTheme(u"view-certificate-add"_s)); } SmartCardActions::~SmartCardActions() = default; +void SmartCardActions::addAction(const QString &id, const QString &text, const QString &toolTip, const QIcon &icon) +{ + QAction *action = mActionCollection->addAction(id); + action->setText(text); + action->setToolTip(toolTip); + action->setIcon(icon); +} + std::shared_ptr<const SmartCardActions> SmartCardActions::instance() { return mutableInstance(); } std::shared_ptr<SmartCardActions> SmartCardActions::mutableInstance() { static std::weak_ptr<SmartCardActions> self; if (std::shared_ptr<SmartCardActions> shared = self.lock()) { return shared; } else { const std::shared_ptr<SmartCardActions> s{new SmartCardActions}; self = s; return s; } } QAction *SmartCardActions::action(const QString &name) const { return mActionCollection->action(name); } std::vector<QAction *> SmartCardActions::actions(const std::vector<QString> &names) const { std::vector<QAction *> result; result.reserve(names.size()); std::ranges::transform(names, std::back_inserter(result), [this](const QString &name) { return action(name); }); std::erase(result, nullptr); return result; } diff --git a/src/view/smartcardactions.h b/src/view/smartcardactions.h index 3f7d3a7ad..24297c40e 100644 --- a/src/view/smartcardactions.h +++ b/src/view/smartcardactions.h @@ -1,50 +1,52 @@ /* view/smartcardactions.h This file is part of Kleopatra, the KDE keymanager SPDX-FileCopyrightText: 2024 g10 Code GmbH SPDX-FileContributor: Ingo Klöcker <dev@ingo-kloecker.de> SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include <QAction> #include <QString> #include <memory> #include <vector> class KActionCollection; class SmartCardActions { private: SmartCardActions(); + void addAction(const QString &id, const QString &text, const QString &toolTip, const QIcon &icon); + public: ~SmartCardActions(); static std::shared_ptr<const SmartCardActions> instance(); static std::shared_ptr<SmartCardActions> mutableInstance(); /** Returns the action with the name @p name or @c nullptr if no action with this name exists. */ QAction *action(const QString &name) const; /** Returns the actions with the names @p names. Unknown names/actions are skipped, * i.e. the list of actions does not contain any @c nullptr. */ std::vector<QAction *> actions(const std::vector<QString> &names) const; template<class Receiver, class Func> inline typename std::enable_if<!std::is_convertible<Func, const char *>::value, QMetaObject::Connection>::type connectAction(const QString &name, const Receiver *receiver, Func slot) const { if (QAction *a = action(name)) { return QObject::connect(a, &QAction::triggered, receiver, slot); } return {}; } private: const std::unique_ptr<KActionCollection> mActionCollection; };