From db04f5b8a1a4be1a9a7faf206f4f15cf11dde3b3 Mon Sep 17 00:00:00 2001 From: Weng Xuetian Date: Tue, 28 May 2024 13:45:16 -0700 Subject: [PATCH] Allow config that has only one external option to directly launch --- src/kcm/main.cpp | 45 +++++++++++++++++++--- src/lib/configwidgetslib/addonselector.cpp | 6 ++- src/lib/configwidgetslib/configwidget.cpp | 41 ++++++++++++++++++-- src/lib/configwidgetslib/configwidget.h | 2 + src/lib/configwidgetslib/impage.cpp | 6 ++- src/lib/configwidgetslib/optionwidget.cpp | 13 +++++-- 6 files changed, 95 insertions(+), 18 deletions(-) diff --git a/src/kcm/main.cpp b/src/kcm/main.cpp index e573f0e..4b509e1 100644 --- a/src/kcm/main.cpp +++ b/src/kcm/main.cpp @@ -17,15 +17,42 @@ #include #include #include +#include +#include #include #include #include #include #include -namespace fcitx { +namespace fcitx::kcm { -namespace kcm { +namespace { +QString maybeExtractExternalCommand(const QVariantMap &typeMap, + const QString &baseTypeName) { + + if (!typeMap.contains(baseTypeName)) { + return {}; + } + auto list = typeMap.value(baseTypeName).toList(); + if (list.size() != 1) { + return {}; + } + auto option = list[0].toMap(); + if (option.value("type").toString() != "External") { + return {}; + } + + auto properties = option.value("properties").toMap(); + + if (properties.contains("LaunchSubConfig") && + properties.value("LaunchSubConfig").toString() == "True") { + return {}; + } + + return properties.value("External").toString(); +} +} // namespace #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) FcitxModule::FcitxModule(QObject *parent, const KPluginMetaData &metaData) @@ -222,7 +249,8 @@ void FcitxModule::pushConfigPage(const QString &title, const QString &uri) { map["uri"] = uri; map["rawValue"] = decomposeDBusVariant(reply.argumentAt<0>().variant()); - map["typeName"] = configTypes[0].name(); + QString baseTypeName = configTypes[0].name(); + map["typeName"] = baseTypeName; // Reserve the place for types. for (const auto &configType : configTypes) { @@ -236,7 +264,13 @@ void FcitxModule::pushConfigPage(const QString &title, const QString &uri) { } map["typeMap"] = typeMap; map["title"] = title; - push("ConfigPage.qml", map); + if (QString command = + maybeExtractExternalCommand(typeMap, baseTypeName); + !command.isEmpty()) { + launchExternal(command); + } else { + push("ConfigPage.qml", map); + } }); } @@ -415,8 +449,7 @@ void FcitxModule::fixInputMethod() { imConfig_->emitChanged(); } -} // namespace kcm -} // namespace fcitx +} // namespace fcitx::kcm K_PLUGIN_FACTORY_WITH_JSON(KCMFcitxFactory, "kcm_fcitx5.json", registerPlugin();) diff --git a/src/lib/configwidgetslib/addonselector.cpp b/src/lib/configwidgetslib/addonselector.cpp index ad57b2b..a57516b 100644 --- a/src/lib/configwidgetslib/addonselector.cpp +++ b/src/lib/configwidgetslib/addonselector.cpp @@ -278,8 +278,10 @@ void AddonDelegate::configureClicked() { QPointer dialog = ConfigWidget::configDialog( parent_, parent_->dbus(), QString("fcitx://config/addon/%1").arg(name), addonName); - dialog->exec(); - delete dialog; + if (dialog) { + dialog->exec(); + delete dialog; + } } AddonSelector::AddonSelector(QWidget *parent, DBusProvider *dbus) diff --git a/src/lib/configwidgetslib/configwidget.cpp b/src/lib/configwidgetslib/configwidget.cpp index b116754..fc44227 100644 --- a/src/lib/configwidgetslib/configwidget.cpp +++ b/src/lib/configwidgetslib/configwidget.cpp @@ -5,6 +5,7 @@ * */ #include "configwidget.h" +#include "addonmodel.h" #include "dbusprovider.h" #include "keylistwidget.h" #include "logging.h" @@ -14,16 +15,17 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include -namespace fcitx { -namespace kcm { +namespace fcitx::kcm { namespace { QString joinPath(const QString &path, const QString &option) { @@ -101,6 +103,28 @@ void ConfigWidget::requestConfigFinished(QDBusPendingCallWatcher *watcher) { adjustSize(); } +QString ConfigWidget::extractOnlyExternalCommand() const { + if (!desc_.contains(mainType_)) { + return {}; + } + auto options = desc_.value(mainType_); + if (options.size() != 1) { + return {}; + } + + if (options[0].type() != "External") { + return {}; + } + + const auto &properties = options[0].properties(); + if (properties.contains("LaunchSubConfig") && + properties.value("LaunchSubConfig").toString() == "True") { + return {}; + } + + return options[0].properties().value("External").toString(); +} + void ConfigWidget::load() { if (uri_.isEmpty()) { return; @@ -196,6 +220,16 @@ QDialog *ConfigWidget::configDialog(QWidget *parent, DBusProvider *dbus, const QString &uri, const QString &title) { auto configPage = new ConfigWidget(uri, dbus); configPage->requestConfig(true); + if (auto command = configPage->extractOnlyExternalCommand(); + !command.isEmpty()) { + WId wid = 0; + if (QGuiApplication::platformName() == "xcb") { + wid = parent->winId(); + } + launchExternalConfig(command, wid); + delete configPage; + return nullptr; + } QVBoxLayout *dialogLayout = new QVBoxLayout; QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | @@ -246,5 +280,4 @@ ConfigWidget *getConfigWidget(QWidget *widget) { return configWidget; } -} // namespace kcm -} // namespace fcitx +} // namespace fcitx::kcm diff --git a/src/lib/configwidgetslib/configwidget.h b/src/lib/configwidgetslib/configwidget.h index 0a2cf3c..5dc5c7b 100644 --- a/src/lib/configwidgetslib/configwidget.h +++ b/src/lib/configwidgetslib/configwidget.h @@ -49,6 +49,8 @@ public Q_SLOTS: QVariant value() const; void setValue(const QVariant &variant); + QString extractOnlyExternalCommand() const; + void requestConfig(bool sync = false); private Q_SLOTS: void requestConfigFinished(QDBusPendingCallWatcher *watcher); diff --git a/src/lib/configwidgetslib/impage.cpp b/src/lib/configwidgetslib/impage.cpp index accb735..93521e6 100644 --- a/src/lib/configwidgetslib/impage.cpp +++ b/src/lib/configwidgetslib/impage.cpp @@ -393,8 +393,10 @@ void IMPage::configureIM() { QPointer dialog = ConfigWidget::configDialog( this, dbus_, QString("fcitx://config/inputmethod/%1").arg(uniqueName), curIndex.data(Qt::DisplayRole).toString()); - dialog->exec(); - delete dialog; + if (dialog) { + dialog->exec(); + delete dialog; + } } void IMPage::moveUpIM() { diff --git a/src/lib/configwidgetslib/optionwidget.cpp b/src/lib/configwidgetslib/optionwidget.cpp index 307c10d..2414675 100644 --- a/src/lib/configwidgetslib/optionwidget.cpp +++ b/src/lib/configwidgetslib/optionwidget.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -359,8 +360,10 @@ class EnumOptionWidget : public OptionWidget { this, configWidget->dbus(), comboBox_->currentData(subConfigPathRole).toString(), comboBox_->currentText()); - dialog->exec(); - delete dialog; + if (dialog) { + dialog->exec(); + delete dialog; + } }); defaultValue_ = option.defaultValue().variant().toString(); @@ -481,8 +484,10 @@ class ExternalOptionWidget : public OptionWidget { } QPointer dialog = ConfigWidget::configDialog( this, configWidget->dbus(), uri_, name); - dialog->exec(); - delete dialog; + if (dialog) { + dialog->exec(); + delete dialog; + } } else { WId wid = 0; if (QGuiApplication::platformName() == "xcb") {