diff options
author | Saturn&Eric <[email protected]> | 2021-12-05 08:14:53 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-12-05 08:14:53 +0000 |
commit | ab7e3bac8b5f1d1fdd8367bdb1a185be36b281c2 (patch) | |
tree | 234892f5ae225d67b24619209cf57636ec9d9b2d /src/ui/UserInterfaceUtils.cpp | |
parent | Merge branch 'main' of github.com:saturneric/GpgFrontend (diff) | |
parent | Remove rapidjson and Improve update ploicy. (diff) | |
download | GpgFrontend-ab7e3bac8b5f1d1fdd8367bdb1a185be36b281c2.tar.gz GpgFrontend-ab7e3bac8b5f1d1fdd8367bdb1a185be36b281c2.zip |
Merge pull request #25 from saturneric/develop
Merge version 2.0.1 beta
Diffstat (limited to 'src/ui/UserInterfaceUtils.cpp')
-rw-r--r-- | src/ui/UserInterfaceUtils.cpp | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/src/ui/UserInterfaceUtils.cpp b/src/ui/UserInterfaceUtils.cpp new file mode 100644 index 00000000..e8f27d2c --- /dev/null +++ b/src/ui/UserInterfaceUtils.cpp @@ -0,0 +1,171 @@ +/** + * This file is part of GpgFrontend. + * + * GpgFrontend is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Foobar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from gpg4usb-team. + * Their source code version also complies with GNU General Public License. + * + * The source code version of this software was modified and released + * by Saturneric<[email protected]> starting on May 12, 2021. + * + */ + +#include "UserInterfaceUtils.h" + +#include "gpg/result_analyse/ResultAnalyse.h" +#include "ui/SignalStation.h" +#include "ui/WaitingDialog.h" +#include "ui/widgets/InfoBoardWidget.h" +#include "ui/widgets/TextEdit.h" + +namespace GpgFrontend::UI { + +std::unique_ptr<GpgFrontend::UI::CommonUtils> + GpgFrontend::UI::CommonUtils::_instance = nullptr; + +void refresh_info_board(InfoBoardWidget* info_board, int status, + const std::string& report_text) { + if (status < 0) + info_board->slotRefresh(QString::fromStdString(report_text), + INFO_ERROR_CRITICAL); + else if (status > 0) + info_board->slotRefresh(QString::fromStdString(report_text), INFO_ERROR_OK); + else + info_board->slotRefresh(QString::fromStdString(report_text), + INFO_ERROR_WARN); +} + +void process_result_analyse(TextEdit* edit, InfoBoardWidget* info_board, + const ResultAnalyse& result_analyse) { + info_board->associateTabWidget(edit->tabWidget); + info_board->associateFileTreeView(edit->curFilePage()); + refresh_info_board(info_board, result_analyse.getStatus(), + result_analyse.getResultReport()); +} + +void process_result_analyse(TextEdit* edit, InfoBoardWidget* info_board, + const ResultAnalyse& result_analyse_a, + const ResultAnalyse& result_analyse_b) { + LOG(INFO) << "process_result_analyse Started"; + + info_board->associateTabWidget(edit->tabWidget); + info_board->associateFileTreeView(edit->curFilePage()); + + refresh_info_board( + info_board, + std::min(result_analyse_a.getStatus(), result_analyse_b.getStatus()), + result_analyse_a.getResultReport() + result_analyse_b.getResultReport()); +} + +void process_operation(QWidget* parent, const std::string& waiting_title, + const std::function<void()>& func) { + auto thread = QThread::create(func); + QApplication::connect(thread, SIGNAL(finished()), thread, + SLOT(deleteLater())); + thread->start(); + + auto* dialog = + new WaitingDialog(QString::fromStdString(waiting_title), parent); + while (thread->isRunning()) { + QApplication::processEvents(); + } + dialog->close(); +} + +CommonUtils* CommonUtils::GetInstance() { + if (_instance == nullptr) { + _instance = std::make_unique<CommonUtils>(); + } + return _instance.get(); +} + +CommonUtils::CommonUtils() : QWidget(nullptr) { + connect(this, SIGNAL(signalKeyStatusUpdated()), SignalStation::GetInstance(), + SIGNAL(KeyDatabaseRefresh())); +} + +void CommonUtils::slotImportKeys(QWidget* parent, + const std::string& in_buffer) { + GpgImportInformation result = GpgKeyImportExportor::GetInstance().ImportKey( + std::make_unique<ByteArray>(in_buffer)); + emit signalKeyStatusUpdated(); + new KeyImportDetailDialog(result, false, parent); +} + +void CommonUtils::slotImportKeyFromFile(QWidget* parent) { + QString file_name = QFileDialog::getOpenFileName( + this, _("Open Key"), QString(), + QString(_("Key Files")) + " (*.asc *.txt);;" + _("Keyring files") + + " (*.gpg);;All Files (*)"); + if (!file_name.isNull()) { + slotImportKeys(parent, read_all_data_in_file(file_name.toStdString())); + } +} + +void CommonUtils::slotImportKeyFromKeyServer(QWidget* parent) { + auto dialog = new KeyServerImportDialog(false, parent); + dialog->show(); +} + +void CommonUtils::slotImportKeyFromClipboard(QWidget* parent) { + QClipboard* cb = QApplication::clipboard(); + slotImportKeys(parent, + cb->text(QClipboard::Clipboard).toUtf8().toStdString()); +} + +void CommonUtils::slotExecuteGpgCommand( + const QStringList& arguments, + const std::function<void(QProcess*)>& interact_func) { + QEventLoop looper; + auto dialog = new WaitingDialog(_("Processing"), nullptr); + dialog->show(); + auto* gpgProcess = new QProcess(&looper); + gpgProcess->setProcessChannelMode(QProcess::MergedChannels); + + connect(gpgProcess, qOverload<int, QProcess::ExitStatus>(&QProcess::finished), + &looper, &QEventLoop::quit); + connect(gpgProcess, qOverload<int, QProcess::ExitStatus>(&QProcess::finished), + dialog, &WaitingDialog::deleteLater); + connect(gpgProcess, &QProcess::errorOccurred, &looper, &QEventLoop::quit); + connect(gpgProcess, &QProcess::started, + []() -> void { LOG(ERROR) << "Gpg Process Started Success"; }); + connect(gpgProcess, &QProcess::readyReadStandardOutput, + [interact_func, gpgProcess]() { interact_func(gpgProcess); }); + connect(gpgProcess, &QProcess::errorOccurred, this, [=]() -> void { + LOG(ERROR) << "Error in Process"; + dialog->close(); + QMessageBox::critical(nullptr, _("Failure"), + _("Failed to execute command.")); + }); + connect(gpgProcess, qOverload<int, QProcess::ExitStatus>(&QProcess::finished), + this, [=](int, QProcess::ExitStatus status) { + dialog->close(); + if (status == QProcess::NormalExit) + QMessageBox::information(nullptr, _("Success"), + _("Succeed in executing command.")); + else + QMessageBox::information(nullptr, _("Warning"), + _("Finished executing command.")); + }); + + gpgProcess->setProgram(GpgContext::GetInstance().GetInfo().AppPath.c_str()); + gpgProcess->setArguments(arguments); + gpgProcess->start(); + looper.exec(); + dialog->close(); + dialog->deleteLater(); +} + +} // namespace GpgFrontend::UI
\ No newline at end of file |