Skip to content

Commit

Permalink
Allow config that has only one external option to directly launch (#80)
Browse files Browse the repository at this point in the history
  • Loading branch information
wengxt authored May 29, 2024
1 parent cd127e3 commit 8b853b1
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 18 deletions.
45 changes: 39 additions & 6 deletions src/kcm/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,42 @@
#include <QQuickItem>
#include <QQuickRenderControl>
#include <QQuickWindow>
#include <QString>
#include <QVariantMap>
#include <QtGlobal>
#include <config.h>
#include <fcitx-utils/misc.h>
#include <fcitx-utils/standardpath.h>
#include <fcitx-utils/stringutils.h>

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)
Expand Down Expand Up @@ -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) {
Expand All @@ -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);
}
});
}

Expand Down Expand Up @@ -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<fcitx::kcm::FcitxModule>();)
Expand Down
6 changes: 4 additions & 2 deletions src/lib/configwidgetslib/addonselector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -278,8 +278,10 @@ void AddonDelegate::configureClicked() {
QPointer<QDialog> 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)
Expand Down
41 changes: 37 additions & 4 deletions src/lib/configwidgetslib/configwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
*
*/
#include "configwidget.h"
#include "addonmodel.h"
#include "dbusprovider.h"
#include "keylistwidget.h"
#include "logging.h"
Expand All @@ -14,16 +15,17 @@
#include <QComboBox>
#include <QFormLayout>
#include <QGroupBox>
#include <QGuiApplication>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QScrollArea>
#include <QSpinBox>
#include <QString>
#include <fcitx-utils/i18n.h>
#include <fcitxqtcontrollerproxy.h>

namespace fcitx {
namespace kcm {
namespace fcitx::kcm {

namespace {
QString joinPath(const QString &path, const QString &option) {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 |
Expand Down Expand Up @@ -246,5 +280,4 @@ ConfigWidget *getConfigWidget(QWidget *widget) {
return configWidget;
}

} // namespace kcm
} // namespace fcitx
} // namespace fcitx::kcm
2 changes: 2 additions & 0 deletions src/lib/configwidgetslib/configwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
6 changes: 4 additions & 2 deletions src/lib/configwidgetslib/impage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -393,8 +393,10 @@ void IMPage::configureIM() {
QPointer<QDialog> 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() {
Expand Down
13 changes: 9 additions & 4 deletions src/lib/configwidgetslib/optionwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <QDialogButtonBox>
#include <QFileInfo>
#include <QFormLayout>
#include <QGuiApplication>
#include <QLineEdit>
#include <QPointer>
#include <QProcess>
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -481,8 +484,10 @@ class ExternalOptionWidget : public OptionWidget {
}
QPointer<QDialog> 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") {
Expand Down

0 comments on commit 8b853b1

Please sign in to comment.