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