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 }