1 /*
2 * SPDX-FileCopyrightText: 2020~2020 CSSlayer <wengxt@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 *
6 */
7 #include "mainwindow.h"
8 #include "logging.h"
9 #include "verticalscrollarea.h"
10 #include <QKeyEvent>
11 #include <QMessageBox>
12 #include <QPushButton>
13 #include <QSessionManager>
14 #include <fcitx-utils/i18n.h>
15
16 namespace fcitx {
17 namespace kcm {
18
MainWindow(QWidget * parent)19 MainWindow::MainWindow(QWidget *parent)
20 : QMainWindow(parent), dbus_(new DBusProvider(this)),
21 errorOverlay_(new ErrorOverlay(dbus_, this)),
22 impage_(new IMPage(dbus_, this)),
23 addonPage_(new AddonSelector(this, dbus_)),
24 configPage_(new ConfigWidget("fcitx://config/global", dbus_, this)) {
25 QGuiApplication::setFallbackSessionManagementEnabled(false);
26 connect(qApp, &QGuiApplication::commitDataRequest, this,
27 &MainWindow::commitData);
28 connect(qApp, &QGuiApplication::saveStateRequest, this,
29 [](QSessionManager &manager) {
30 manager.setRestartHint(QSessionManager::RestartNever);
31 });
32
33 setupUi(this);
34
35 connect(impage_, &IMPage::changed, this, [this]() {
36 qCDebug(KCM_FCITX5) << "IMPage changed";
37 Q_EMIT changed(true);
38 });
39 connect(addonPage_, &AddonSelector::changed, this, [this]() {
40 qCDebug(KCM_FCITX5) << "AddonSelector changed";
41 Q_EMIT changed(true);
42 });
43 auto configPageWrapper = new VerticalScrollArea;
44 configPageWrapper->setWidget(configPage_);
45 pageWidget->addTab(impage_, _("Input Method"));
46 pageWidget->addTab(configPageWrapper, _("Global Options"));
47 pageWidget->addTab(addonPage_, _("Addons"));
48 connect(configPage_, &ConfigWidget::changed, this,
49 [this]() { Q_EMIT changed(true); });
50
51 connect(this, &MainWindow::changed, this, &MainWindow::handleChanged);
52
53 connect(buttonBox, &QDialogButtonBox::clicked, this, &MainWindow::clicked);
54 load();
55
56 buttonBox->button(QDialogButtonBox::Apply)->setText(_("&Apply"));
57 buttonBox->button(QDialogButtonBox::Ok)->setText(_("&OK"));
58 buttonBox->button(QDialogButtonBox::Close)->setText(_("&Close"));
59 buttonBox->button(QDialogButtonBox::Reset)->setText(_("&Reset"));
60 buttonBox->button(QDialogButtonBox::RestoreDefaults)
61 ->setText(_("Restore &Defaults"));
62 }
63
handleChanged(bool changed)64 void MainWindow::handleChanged(bool changed) {
65 changed_ = changed;
66 buttonBox->button(QDialogButtonBox::Ok)->setEnabled(changed);
67 buttonBox->button(QDialogButtonBox::Apply)->setEnabled(changed);
68 buttonBox->button(QDialogButtonBox::Reset)->setEnabled(changed);
69 }
70
load()71 void MainWindow::load() {
72 impage_->load();
73 addonPage_->load();
74 configPage_->load();
75 Q_EMIT changed(false);
76 }
77
save()78 void MainWindow::save() {
79 impage_->save();
80 addonPage_->save();
81 configPage_->save();
82 Q_EMIT changed(false);
83 }
84
defaults()85 void MainWindow::defaults() {
86 configPage_->buttonClicked(QDialogButtonBox::RestoreDefaults);
87 Q_EMIT changed(true);
88 }
89
keyPressEvent(QKeyEvent * event)90 void MainWindow::keyPressEvent(QKeyEvent *event) {
91 QMainWindow::keyPressEvent(event);
92 if (!event->isAccepted() && event->matches(QKeySequence::Cancel)) {
93 qApp->quit();
94 }
95 }
96
clicked(QAbstractButton * button)97 void MainWindow::clicked(QAbstractButton *button) {
98 QDialogButtonBox::StandardButton standardButton =
99 buttonBox->standardButton(button);
100 if (standardButton == QDialogButtonBox::Apply) {
101 save();
102 } else if (standardButton == QDialogButtonBox::Ok) {
103 save();
104 qApp->quit();
105 } else if (standardButton == QDialogButtonBox::Close) {
106 qApp->quit();
107 } else if (standardButton == QDialogButtonBox::Reset) {
108 load();
109 } else if (standardButton == QDialogButtonBox::RestoreDefaults) {
110 defaults();
111 }
112 }
113
commitData(QSessionManager & manager)114 void MainWindow::commitData(QSessionManager &manager) {
115 manager.setRestartHint(QSessionManager::RestartNever);
116 if (!manager.allowsInteraction() || !changed_) {
117 return;
118 }
119 int ret = QMessageBox::warning(
120 this, _("Apply configuration changes"),
121 _("Do you want to save the changes or discard them?"),
122 QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
123
124 switch (ret) {
125 case QMessageBox::Save:
126 save();
127 manager.release();
128 break;
129 case QMessageBox::Discard:
130 break;
131 case QMessageBox::Cancel:
132 default:
133 manager.cancel();
134 }
135 }
136
137 } // namespace kcm
138 } // namespace fcitx
139