File indexing completed on 2025-02-02 04:11:25

0001 /*
0002  * SPDX-FileCopyrightText: 2019-2023 Mattia Basaglia <dev@dragon.best>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #include "io_status_dialog.hpp"
0008 #include "ui_io_status_dialog.h"
0009 
0010 
0011 using namespace glaxnimate::gui;
0012 using namespace glaxnimate;
0013 
0014 class IoStatusDialog::Private : public Ui::IoStatusDialog
0015 {
0016 public:
0017     bool delete_on_close;
0018     QIcon icon;
0019     bool has_errors = false;
0020     bool finished = false;
0021     io::ImportExport* ie = nullptr;
0022 };
0023 
0024 IoStatusDialog::IoStatusDialog(const QIcon& icon, const QString& title, bool delete_on_close, QWidget* parent)
0025     : QDialog(parent), d(std::make_unique<Private>())
0026 {
0027     d->delete_on_close = delete_on_close;
0028     d->icon = icon;
0029     d->setupUi(this);
0030     setWindowTitle(title);
0031     setWindowIcon(icon);
0032 }
0033 
0034 IoStatusDialog::~IoStatusDialog() = default;
0035 
0036 
0037 void IoStatusDialog::show_errors(const QString& success, const QString& failure)
0038 {
0039     d->progress_bar->hide();
0040     d->button_box->setEnabled(true);
0041 
0042     if ( d->has_errors )
0043     {
0044         d->group_box->show();
0045         d->icon_label->setPixmap(QIcon::fromTheme("dialog-error").pixmap(64));
0046         d->label->setText(failure);
0047     }
0048     else
0049     {
0050         d->icon_label->setPixmap(QIcon::fromTheme("dialog-positive").pixmap(64));
0051         d->label->setText(success);
0052     }
0053 }
0054 
0055 void IoStatusDialog::_on_completed(bool success)
0056 {
0057     d->finished = true;
0058 
0059     if ( success && !d->has_errors )
0060         hide();
0061     else
0062         show();
0063 
0064     d->progress_bar->hide();
0065     d->button_box->setEnabled(true);
0066 
0067     if ( !success )
0068     {
0069         d->icon_label->setPixmap(QIcon::fromTheme("dialog-error").pixmap(64));
0070         d->group_box->show();
0071         d->list_widget->addItem(new QListWidgetItem(QIcon::fromTheme("data-error"), i18n("Operation Failed")));
0072     }
0073     else
0074     {
0075         d->icon_label->setPixmap(QIcon::fromTheme("dialog-warning").pixmap(64));
0076     }
0077 
0078     if ( d->delete_on_close && !isVisible() )
0079         deleteLater();
0080 
0081     disconnect_import_export();
0082 }
0083 
0084 void IoStatusDialog::_on_error(const QString& message, app::log::Severity severity)
0085 {
0086     d->group_box->show();
0087     QIcon icon;
0088     switch ( severity )
0089     {
0090         case app::log::Info:
0091             icon = QIcon::fromTheme("data-information");
0092             break;
0093         case app::log::Warning:
0094             icon = QIcon::fromTheme("data-warning");
0095             break;
0096         case app::log::Error:
0097             icon = QIcon::fromTheme("data-error");
0098             break;
0099     }
0100     d->list_widget->addItem(new QListWidgetItem(icon, message));
0101     d->has_errors = true;
0102     show();
0103 }
0104 
0105 void IoStatusDialog::_on_progress(int value)
0106 {
0107     d->progress_bar->setValue(value);
0108 }
0109 
0110 void IoStatusDialog::_on_progress_max_changed(int max)
0111 {
0112     d->progress_bar->setMaximum(max);
0113     show();
0114 }
0115 
0116 void IoStatusDialog::reset(io::ImportExport* ie, const QString& label)
0117 {
0118     d->progress_bar->show();
0119     d->progress_bar->setValue(0);
0120     d->progress_bar->setMaximum(0);
0121     d->list_widget->clear();
0122     d->button_box->setEnabled(false);
0123     d->group_box->hide();
0124     d->label->setText(label);
0125     d->finished = false;
0126     d->icon_label->setPixmap(d->icon.pixmap(64));
0127     d->has_errors = false;
0128 
0129 
0130     d->ie = ie;
0131     connect(ie, &io::ImportExport::message, this, &IoStatusDialog::_on_error);
0132     connect(ie, &io::ImportExport::progress, this, &IoStatusDialog::_on_progress);
0133     connect(ie, &io::ImportExport::progress_max_changed, this, &IoStatusDialog::_on_progress_max_changed);
0134     connect(ie, &io::ImportExport::completed, this, &IoStatusDialog::_on_completed);
0135 }
0136 
0137 void glaxnimate::gui::IoStatusDialog::disconnect_import_export()
0138 {
0139     if ( d->ie )
0140     {
0141         disconnect(d->ie, nullptr, this, nullptr);
0142         d->ie = nullptr;
0143     }
0144 }
0145 
0146 
0147 void IoStatusDialog::closeEvent(QCloseEvent* ev)
0148 {
0149     if ( d->finished && d->delete_on_close )
0150         deleteLater();
0151 
0152     QDialog::closeEvent(ev);
0153 }
0154 
0155 
0156 
0157 void IoStatusDialog::changeEvent(QEvent *e)
0158 {
0159     QDialog::changeEvent(e);
0160 
0161     if ( e->type() == QEvent::LanguageChange)
0162     {
0163         d->retranslateUi(this);
0164     }
0165 }
0166 
0167 bool IoStatusDialog::has_errors() const
0168 {
0169     return d->has_errors;
0170 }