File indexing completed on 2024-12-08 03:38:41
0001 /* 0002 SPDX-FileCopyrightText: 2003 Jason Keirstead <jason@keirstead.org> 0003 SPDX-FileCopyrightText: 2006 Michel Hermier <michel.hermier@gmail.com> 0004 SPDX-FileCopyrightText: 2007 Nick Shaforostoff <shafff@ukr.net> 0005 0006 SPDX-License-Identifier: LGPL-2.0-or-later 0007 */ 0008 0009 #include "kcodecaction.h" 0010 #include "kconfigwidgets_debug.h" 0011 0012 #include <KCharsets> 0013 #include <KEncodingProber> 0014 #include <KLocalizedString> 0015 0016 #include <QMenu> 0017 #include <QVariant> 0018 0019 class KCodecActionPrivate 0020 { 0021 public: 0022 KCodecActionPrivate(KCodecAction *parent) 0023 : q(parent) 0024 { 0025 } 0026 0027 void init(bool); 0028 0029 void subActionTriggered(QAction *); 0030 0031 KCodecAction *const q; 0032 QAction *defaultAction = nullptr; 0033 QAction *currentSubAction = nullptr; 0034 }; 0035 0036 KCodecAction::KCodecAction(QObject *parent, bool showAutoOptions) 0037 : KSelectAction(parent) 0038 , d(new KCodecActionPrivate(this)) 0039 { 0040 d->init(showAutoOptions); 0041 } 0042 0043 KCodecAction::KCodecAction(const QString &text, QObject *parent, bool showAutoOptions) 0044 : KSelectAction(text, parent) 0045 , d(new KCodecActionPrivate(this)) 0046 { 0047 d->init(showAutoOptions); 0048 } 0049 0050 KCodecAction::KCodecAction(const QIcon &icon, const QString &text, QObject *parent, bool showAutoOptions) 0051 : KSelectAction(icon, text, parent) 0052 , d(new KCodecActionPrivate(this)) 0053 { 0054 d->init(showAutoOptions); 0055 } 0056 0057 KCodecAction::~KCodecAction() = default; 0058 0059 void KCodecActionPrivate::init(bool showAutoOptions) 0060 { 0061 q->setToolBarMode(KSelectAction::MenuMode); 0062 defaultAction = q->addAction(i18nc("Encodings menu", "Default")); 0063 0064 const auto lstEncodings = KCharsets::charsets()->encodingsByScript(); 0065 for (const QStringList &encodingsForScript : lstEncodings) { 0066 KSelectAction *tmp = new KSelectAction(encodingsForScript.at(0), q); 0067 if (showAutoOptions) { 0068 KEncodingProber::ProberType scri = KEncodingProber::proberTypeForName(encodingsForScript.at(0)); 0069 if (scri != KEncodingProber::None) { 0070 tmp->addAction(i18nc("Encodings menu", "Autodetect"))->setData(QVariant((uint)scri)); 0071 tmp->menu()->addSeparator(); 0072 } 0073 } 0074 for (int i = 1; i < encodingsForScript.size(); ++i) { 0075 tmp->addAction(encodingsForScript.at(i)); 0076 } 0077 q->connect(tmp, &KSelectAction::actionTriggered, q, [this](QAction *action) { 0078 subActionTriggered(action); 0079 }); 0080 tmp->setCheckable(true); 0081 q->addAction(tmp); 0082 } 0083 q->setCurrentItem(0); 0084 } 0085 0086 void KCodecAction::slotActionTriggered(QAction *action) 0087 { 0088 // we don't want to emit any signals from top-level items 0089 // except for the default one 0090 if (action == d->defaultAction) { 0091 Q_EMIT defaultItemTriggered(); 0092 } 0093 } 0094 0095 void KCodecActionPrivate::subActionTriggered(QAction *action) 0096 { 0097 if (currentSubAction == action) { 0098 return; 0099 } 0100 currentSubAction = action; 0101 Q_EMIT q->textTriggered(action->text()); 0102 Q_EMIT q->codecNameTriggered(action->text().toUtf8()); 0103 } 0104 0105 QString KCodecAction::currentCodecName() const 0106 { 0107 return d->currentSubAction->text(); 0108 } 0109 0110 bool KCodecAction::setCurrentCodec(const QString &codecName) 0111 { 0112 if (codecName.isEmpty()) { 0113 return false; 0114 } 0115 0116 for (int i = 0; i < actions().size(); ++i) { 0117 if (actions().at(i)->menu()) { 0118 for (int j = 0; j < actions().at(i)->menu()->actions().size(); ++j) { 0119 if (!j && !actions().at(i)->menu()->actions().at(j)->data().isNull()) { 0120 continue; 0121 } 0122 if (codecName == actions().at(i)->menu()->actions().at(j)->text()) { 0123 d->currentSubAction = actions().at(i)->menu()->actions().at(j); 0124 d->currentSubAction->trigger(); 0125 return true; 0126 } 0127 } 0128 } 0129 } 0130 return false; 0131 } 0132 0133 #include "moc_kcodecaction.cpp"