File indexing completed on 2025-03-09 04:54:33

0001 /*
0002    SPDX-FileCopyrightText: 2015-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "headerstylemenumanager.h"
0008 #include "headerstyleinterface.h"
0009 #include "headerstyleplugin.h"
0010 #include "headerstylepluginmanager.h"
0011 #include "messageviewer/messageviewersettings.h"
0012 #include "messageviewer_debug.h"
0013 #include "utils/messageviewerutil_p.h"
0014 
0015 #include <KActionCollection>
0016 #include <KActionMenu>
0017 #include <KLocalizedString>
0018 
0019 #include <QActionGroup>
0020 
0021 using namespace MessageViewer;
0022 
0023 class MessageViewer::HeaderStyleMenuManagerPrivate
0024 {
0025 public:
0026     HeaderStyleMenuManagerPrivate(HeaderStyleMenuManager *qq)
0027         : q(qq)
0028     {
0029     }
0030 
0031     void readSettings();
0032     void writeSettings(const QString &pluginName);
0033     void initialize(KActionCollection *ac);
0034     void setPluginName(const QString &pluginName);
0035     QHash<QString, MessageViewer::HeaderStyleInterface *> lstInterface;
0036     QActionGroup *group = nullptr;
0037     KActionMenu *headerMenu = nullptr;
0038     HeaderStyleMenuManager *const q = nullptr;
0039 };
0040 
0041 void HeaderStyleMenuManagerPrivate::setPluginName(const QString &pluginName)
0042 {
0043     MessageViewer::HeaderStyleInterface *interface = lstInterface.value(pluginName);
0044     if (interface) {
0045         if (!interface->action().isEmpty()) {
0046             interface->activateAction();
0047         }
0048     } else {
0049         if (lstInterface.isEmpty()) {
0050             qCCritical(MESSAGEVIEWER_LOG) << "No Header Style plugin found !";
0051             return;
0052         } else {
0053             interface = lstInterface.cbegin().value();
0054             if (!interface->action().isEmpty()) {
0055                 interface->activateAction();
0056             }
0057         }
0058     }
0059     Q_EMIT q->styleChanged(interface->headerStylePlugin());
0060 }
0061 
0062 void HeaderStyleMenuManagerPrivate::readSettings()
0063 {
0064     QString headerStyleName = MessageViewer::MessageViewerSettings::self()->headerPluginStyleName();
0065     if (headerStyleName.isEmpty()) {
0066         const QString headerStyle = MessageViewer::MessageViewerSettings::self()->headerStyle();
0067         const QString headerSetDisplayed = MessageViewer::MessageViewerSettings::self()->headerSetDisplayed();
0068 
0069         if ((headerStyle == QLatin1StringView("custom")) && (headerSetDisplayed == QLatin1StringView("custom"))) { // Custom
0070             headerStyleName = QStringLiteral("custom");
0071         } else if ((headerStyle == QLatin1StringView("plain")) && (headerSetDisplayed == QLatin1StringView("all"))) { // all
0072             headerStyleName = QStringLiteral("all-headers");
0073         } else if ((headerStyle == QLatin1StringView("brief")) && (headerSetDisplayed == QLatin1StringView("brief"))) { // brief
0074             headerStyleName = QStringLiteral("brief");
0075         } else if ((headerStyle == QLatin1StringView("enterprise")) && (headerSetDisplayed == QLatin1StringView("rich"))) { // enterprise
0076             headerStyleName = QStringLiteral("enterprise");
0077         } else if ((headerStyle == QLatin1StringView("fancy")) && (headerSetDisplayed == QLatin1StringView("rich"))) { // fancy
0078             headerStyleName = QStringLiteral("fancy");
0079         } else if ((headerStyle == QLatin1StringView("grantlee")) && (headerSetDisplayed == QLatin1StringView("grantlee"))) { // grantlee
0080             headerStyleName = QStringLiteral("grantlee");
0081         } else if ((headerStyle == QLatin1StringView("plain")) && (headerSetDisplayed == QLatin1StringView("rich"))) { // longheader
0082             headerStyleName = QStringLiteral("long-header");
0083         } else if ((headerStyle == QLatin1StringView("plain")) && (headerSetDisplayed == QLatin1StringView("standard"))) { // Standard
0084             headerStyleName = QStringLiteral("standards-header");
0085         } else {
0086             qCDebug(MESSAGEVIEWER_LOG) << "unknown style : headerstyle " << headerStyle << " headerstrategy :" << headerSetDisplayed;
0087         }
0088         MessageViewer::MessageViewerSettings::self()->setHeaderPluginStyleName(headerStyleName);
0089     }
0090     // Fallback
0091     if (headerStyleName.isEmpty()) {
0092         headerStyleName = QStringLiteral("fancy");
0093     }
0094     setPluginName(headerStyleName);
0095 }
0096 
0097 void HeaderStyleMenuManagerPrivate::writeSettings(const QString &pluginName)
0098 {
0099     MessageViewer::MessageViewerSettings::self()->setHeaderPluginStyleName(pluginName);
0100     MessageViewer::MessageViewerSettings::self()->save();
0101 }
0102 
0103 void HeaderStyleMenuManagerPrivate::initialize(KActionCollection *ac)
0104 {
0105     headerMenu = new KActionMenu(i18nc("View->", "&Headers"), q);
0106     if (ac) {
0107         ac->addAction(QStringLiteral("view_headers"), headerMenu);
0108     }
0109     MessageViewer::Util::addHelpTextAction(headerMenu, i18n("Choose display style of message headers"));
0110     group = new QActionGroup(q);
0111 
0112     const QList<MessageViewer::HeaderStylePlugin *> lstPlugin = MessageViewer::HeaderStylePluginManager::self()->pluginsList();
0113     for (MessageViewer::HeaderStylePlugin *plugin : lstPlugin) {
0114         if (plugin->isEnabled()) {
0115             MessageViewer::HeaderStyleInterface *interface = plugin->createView(headerMenu, group, ac, q);
0116             lstInterface.insert(plugin->name(), interface);
0117             q->connect(interface, &HeaderStyleInterface::styleChanged, q, &HeaderStyleMenuManager::slotStyleChanged);
0118             q->connect(interface, &HeaderStyleInterface::styleUpdated, q, &HeaderStyleMenuManager::styleUpdated);
0119         }
0120     }
0121 }
0122 
0123 HeaderStyleMenuManager::HeaderStyleMenuManager(KActionCollection *ac, QObject *parent)
0124     : QObject(parent)
0125     , d(new MessageViewer::HeaderStyleMenuManagerPrivate(this))
0126 {
0127     d->initialize(ac);
0128 }
0129 
0130 HeaderStyleMenuManager::~HeaderStyleMenuManager() = default;
0131 
0132 KActionMenu *HeaderStyleMenuManager::menu() const
0133 {
0134     return d->headerMenu;
0135 }
0136 
0137 void MessageViewer::HeaderStyleMenuManager::setPluginName(const QString &pluginName)
0138 {
0139     d->setPluginName(pluginName);
0140 }
0141 
0142 void HeaderStyleMenuManager::slotStyleChanged(MessageViewer::HeaderStylePlugin *plugin)
0143 {
0144     d->writeSettings(plugin->name());
0145     Q_EMIT styleChanged(plugin);
0146 }
0147 
0148 void HeaderStyleMenuManager::readConfig()
0149 {
0150     d->readSettings();
0151 }
0152 
0153 #include "moc_headerstylemenumanager.cpp"