Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
Close stale issues and PRs / stale (push) Has been cancelled
151 lines
4.9 KiB
C++
151 lines
4.9 KiB
C++
/*
|
|
* SPDX-FileCopyrightText: 2012~2017 CSSlayer <wengxt@gmail.com>
|
|
* SPDX-FileCopyrightText: 2017~2017 xzhao <i@xuzhao.net>
|
|
*
|
|
* SPDX-License-Identifier: LGPL-2.1-or-later
|
|
*/
|
|
|
|
#include "mainwindow.h"
|
|
#include "fcitxqtconfiguifactory.h"
|
|
#include "fcitxqtcontrollerproxy.h"
|
|
#include "fcitxqtwatcher.h"
|
|
#include <QDebug>
|
|
#include <QLocale>
|
|
#include <QMessageBox>
|
|
#include <QPushButton>
|
|
#include <QWindow>
|
|
#include <fcitx-utils/i18n.h>
|
|
|
|
namespace fcitx {
|
|
|
|
MainWindow::MainWindow(const QString &path, FcitxQtConfigUIWidget *pluginWidget,
|
|
QWidget *parent)
|
|
: QDialog(parent), path_(path), watcher_(new FcitxQtWatcher(this)),
|
|
pluginWidget_(pluginWidget), proxy_(0) {
|
|
setupUi(this);
|
|
watcher_->setConnection(QDBusConnection::sessionBus());
|
|
verticalLayout->insertWidget(0, pluginWidget_);
|
|
buttonBox->button(QDialogButtonBox::Ok)->setText(_("&Ok"));
|
|
buttonBox->button(QDialogButtonBox::Apply)->setText(_("&Apply"));
|
|
buttonBox->button(QDialogButtonBox::Reset)->setText(_("&Reset"));
|
|
buttonBox->button(QDialogButtonBox::Close)->setText(_("&Close"));
|
|
buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
|
|
buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false);
|
|
buttonBox->button(QDialogButtonBox::Reset)->setEnabled(false);
|
|
setWindowIcon(QIcon::fromTheme(pluginWidget_->icon()));
|
|
setWindowTitle(pluginWidget_->title());
|
|
|
|
connect(pluginWidget_, &FcitxQtConfigUIWidget::changed, this,
|
|
&MainWindow::changed);
|
|
if (pluginWidget_->asyncSave()) {
|
|
connect(pluginWidget_, &FcitxQtConfigUIWidget::saveFinished, this,
|
|
&MainWindow::saveFinished);
|
|
}
|
|
connect(pluginWidget_, &FcitxQtConfigUIWidget::saveSubConfig, this,
|
|
&MainWindow::saveSubConfig);
|
|
connect(buttonBox, &QDialogButtonBox::clicked, this, &MainWindow::clicked);
|
|
connect(watcher_, &FcitxQtWatcher::availabilityChanged, this,
|
|
&MainWindow::availabilityChanged);
|
|
|
|
watcher_->watch();
|
|
}
|
|
|
|
void MainWindow::availabilityChanged(bool avail) {
|
|
if (!avail) {
|
|
return;
|
|
}
|
|
if (proxy_) {
|
|
delete proxy_;
|
|
}
|
|
proxy_ = new FcitxQtControllerProxy(watcher_->serviceName(),
|
|
QLatin1String("/controller"),
|
|
watcher_->connection(), this);
|
|
}
|
|
|
|
void MainWindow::clicked(QAbstractButton *button) {
|
|
QDialogButtonBox::StandardButton standardButton =
|
|
buttonBox->standardButton(button);
|
|
if (standardButton == QDialogButtonBox::Apply ||
|
|
standardButton == QDialogButtonBox::Ok) {
|
|
if (pluginWidget_->asyncSave())
|
|
pluginWidget_->setEnabled(false);
|
|
if (standardButton == QDialogButtonBox::Ok) {
|
|
closeAfterSave_ = true;
|
|
}
|
|
pluginWidget_->save();
|
|
if (!pluginWidget_->asyncSave())
|
|
saveFinished();
|
|
} else if (standardButton == QDialogButtonBox::Close) {
|
|
qApp->quit();
|
|
} else if (standardButton == QDialogButtonBox::Reset) {
|
|
pluginWidget_->load();
|
|
}
|
|
}
|
|
|
|
void MainWindow::saveFinished() {
|
|
if (proxy_) {
|
|
// Pass some arbitrary thing.
|
|
auto watcher = new QDBusPendingCallWatcher(
|
|
proxy_->SetConfig(path_, QDBusVariant(0)), this);
|
|
connect(watcher, &QDBusPendingCallWatcher::finished, this,
|
|
&MainWindow::saveFinishedPhase2);
|
|
} else {
|
|
saveFinishedPhase2(nullptr);
|
|
}
|
|
}
|
|
|
|
void MainWindow::saveFinishedPhase2(QDBusPendingCallWatcher *watcher) {
|
|
if (watcher) {
|
|
watcher->deleteLater();
|
|
}
|
|
if (pluginWidget_->asyncSave()) {
|
|
pluginWidget_->setEnabled(true);
|
|
}
|
|
if (!watcher || watcher->isError()) {
|
|
QMessageBox::warning(
|
|
this, _("Failed to notify Fcitx"),
|
|
_("Failed to notify Fcitx about the configuration change."));
|
|
closeAfterSave_ = false;
|
|
return;
|
|
}
|
|
if (closeAfterSave_) {
|
|
qApp->quit();
|
|
}
|
|
}
|
|
|
|
void MainWindow::saveSubConfig(const QString &path) {
|
|
if (proxy_) {
|
|
// Pass some arbitrary thing.
|
|
proxy_->SetConfig(path, QDBusVariant(0));
|
|
}
|
|
}
|
|
|
|
void MainWindow::changed(bool changed) {
|
|
buttonBox->button(QDialogButtonBox::Ok)->setEnabled(changed);
|
|
buttonBox->button(QDialogButtonBox::Apply)->setEnabled(changed);
|
|
buttonBox->button(QDialogButtonBox::Reset)->setEnabled(changed);
|
|
}
|
|
|
|
void MainWindow::setParentWindow(WId id) { wid_ = id; }
|
|
|
|
void MainWindow::showEvent(QShowEvent *event) {
|
|
if (!wid_) {
|
|
return;
|
|
}
|
|
setAttribute(Qt::WA_NativeWindow, true);
|
|
QWindow *subWindow = windowHandle();
|
|
Q_ASSERT(subWindow);
|
|
|
|
QWindow *mainWindow = QWindow::fromWinId(wid_);
|
|
wid_ = 0;
|
|
if (!mainWindow) {
|
|
// foreign windows not supported on all platforms
|
|
return;
|
|
}
|
|
connect(this, &QObject::destroyed, mainWindow, &QObject::deleteLater);
|
|
subWindow->setTransientParent(mainWindow);
|
|
|
|
QDialog::showEvent(event);
|
|
}
|
|
} // namespace fcitx
|