/** * Copyright (C) 2021 Saturneric * * 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. * * GpgFrontend 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 GpgFrontend. If not, see . * * The initial version of the source code is inherited from * the gpg4usb project, which is under GPL-3.0-or-later. * * All the source code of GpgFrontend was modified and released by * Saturneric starting on May 12, 2021. * * SPDX-License-Identifier: GPL-3.0-or-later * */ #include "ui/widgets/InfoBoardWidget.h" #include "ui/SignalStation.h" #include "ui/settings/GlobalSettingStation.h" #include "ui_InfoBoard.h" namespace GpgFrontend::UI { InfoBoardWidget::InfoBoardWidget(QWidget* parent) : QWidget(parent), ui_(std::make_shared()) { ui_->setupUi(this); ui_->actionButtonLayout->addStretch(); ui_->copyButton->setText(_("Copy")); ui_->saveButton->setText(_("Save File")); ui_->clearButton->setText(_("Clear")); connect(ui_->copyButton, &QPushButton::clicked, this, &InfoBoardWidget::slot_copy); connect(ui_->saveButton, &QPushButton::clicked, this, &InfoBoardWidget::slot_save); connect(ui_->clearButton, &QPushButton::clicked, this, &InfoBoardWidget::SlotReset); connect(SignalStation::GetInstance(), &SignalStation::SignalRefreshInfoBoard, this, &InfoBoardWidget::SlotRefresh); } void InfoBoardWidget::SetInfoBoard(const QString& text, InfoBoardStatus verify_label_status) { QString color; ui_->infoBoard->clear(); switch (verify_label_status) { case INFO_ERROR_OK: color = "#008000"; break; case INFO_ERROR_WARN: color = "#FF8C00"; break; case INFO_ERROR_CRITICAL: color = "#DC143C"; break; default: break; } ui_->infoBoard->append(text); ui_->infoBoard->setAutoFillBackground(true); QPalette status = ui_->infoBoard->palette(); status.setColor(QPalette::Text, color); ui_->infoBoard->setPalette(status); auto& settings = GlobalSettingStation::GetInstance().GetUISettings(); // info board font size auto info_font_size = 10; try { info_font_size = settings.lookup("window.info_font_size"); if (info_font_size < 9 || info_font_size > 18) info_font_size = 10; } catch (...) { LOG(ERROR) << _("Setting Operation Error") << _("info_font_size"); } ui_->infoBoard->setFont(QFont("Times", info_font_size)); } void InfoBoardWidget::SlotRefresh(const QString& text, InfoBoardStatus status) { ui_->infoBoard->clear(); SetInfoBoard(text, status); ui_->infoBoard->verticalScrollBar()->setValue(0); } void InfoBoardWidget::AssociateTextEdit(QTextEdit* edit) { if (m_text_page_ != nullptr) disconnect(m_text_page_, &QTextEdit::textChanged, this, &InfoBoardWidget::SlotReset); this->m_text_page_ = edit; connect(edit, &QTextEdit::textChanged, this, &InfoBoardWidget::SlotReset); } void InfoBoardWidget::AssociateTabWidget(QTabWidget* tab) { m_text_page_ = nullptr; m_tab_widget_ = tab; connect(tab, &QTabWidget::tabBarClicked, this, &InfoBoardWidget::SlotReset); connect(tab, &QTabWidget::tabCloseRequested, this, &InfoBoardWidget::SlotReset); // reset this->SlotReset(); } void InfoBoardWidget::AddOptionalAction(const QString& name, const std::function& action) { LOG(INFO) << "add option" << name.toStdString(); auto actionButton = new QPushButton(name); auto layout = new QHBoxLayout(); layout->setContentsMargins(5, 0, 5, 0); ui_->infoBoard->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); // set margin from surroundings layout->addWidget(actionButton); ui_->actionButtonLayout->addLayout(layout); connect(actionButton, &QPushButton::clicked, this, [=]() { action(); }); } /** * Delete All item in actionButtonLayout */ void InfoBoardWidget::ResetOptionActionsMenu() { // skip stretch delete_widgets_in_layout(ui_->actionButtonLayout, 1); } void InfoBoardWidget::SlotReset() { ui_->infoBoard->clear(); ResetOptionActionsMenu(); } /** * Try Delete all widget from target layout * @param layout target layout */ void InfoBoardWidget::delete_widgets_in_layout(QLayout* layout, int start_index) { LOG(INFO) << "Called"; QLayoutItem* item; while ((item = layout->layout()->takeAt(start_index)) != nullptr) { layout->removeItem(item); if (item->layout() != nullptr) delete_widgets_in_layout(item->layout()); else if (item->widget() != nullptr) delete item->widget(); delete item; } } void InfoBoardWidget::slot_copy() { auto* clipboard = QGuiApplication::clipboard(); clipboard->setText(ui_->infoBoard->toPlainText()); } void InfoBoardWidget::slot_save() { auto file_path = QFileDialog::getSaveFileName( this, _("Save Information Board's Content"), {}, tr("Text (*.txt)")); LOG(INFO) << "file path" << file_path.toStdString(); if (file_path.isEmpty()) return; QFile file(file_path); if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { file.write(ui_->infoBoard->toPlainText().toUtf8()); } else { QMessageBox::critical( this, _("Error"), _("The file path is not exists, unprivileged or unreachable.")); } file.close(); } } // namespace GpgFrontend::UI