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"