File indexing completed on 2025-02-02 04:11:21
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 "about_dialog.hpp" 0008 #include "ui_about_dialog.h" 0009 0010 #include <QSysInfo> 0011 #include <QDesktopServices> 0012 #include <QMessageBox> 0013 #include <QClipboard> 0014 #include <QUrl> 0015 #include <QScrollBar> 0016 0017 #include "glaxnimate_app.hpp" 0018 #include "utils/trace.hpp" 0019 #include "utils/tar.hpp" 0020 #include "io/video/video_format.hpp" 0021 #include "io/io_registry.hpp" 0022 0023 using namespace glaxnimate::gui; 0024 using namespace glaxnimate; 0025 0026 static void populate_io(QTableWidget* widget, const std::vector<io::ImportExport*>& data) 0027 { 0028 widget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); 0029 widget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents); 0030 widget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents); 0031 int height = 0; 0032 0033 widget->setRowCount(data.size()); 0034 int row = 0; 0035 for ( auto item : data ) 0036 { 0037 widget->setItem(row, 0, new QTableWidgetItem(item->name())); 0038 widget->setItem(row, 1, new QTableWidgetItem(item->slug())); 0039 widget->setItem(row, 2, new QTableWidgetItem(item->extensions().join(", "))); 0040 height += widget->rowHeight(row); 0041 row++; 0042 } 0043 0044 height += height / data.size() / 2; 0045 height += widget->horizontalHeader()->height(); 0046 height += widget->horizontalScrollBar()->height(); 0047 widget->setMinimumHeight(height); 0048 } 0049 0050 AboutDialog::AboutDialog(QWidget* parent) 0051 : QDialog(parent), d(new Ui::AboutDialog) 0052 { 0053 d->setupUi(this); 0054 0055 0056 d->label_icon->setPixmap(qApp->windowIcon().pixmap(d->label_icon->minimumWidth())); 0057 d->label_title->setText(qApp->applicationDisplayName()); 0058 d->label_version->setText(qApp->applicationVersion()); 0059 d->line_settings->setText(app::Application::instance()->data_file("settings.ini")); 0060 d->line_user_data->setText(app::Application::instance()->writable_data_path("")); 0061 d->line_backup->setText(GlaxnimateApp::instance()->backup_path()); 0062 0063 populate_view(d->view_data, app::Application::instance()->data_paths_unchecked("")); 0064 populate_view(d->view_icons, QIcon::themeSearchPaths()); 0065 0066 0067 int row = 0; 0068 d->view_system->verticalHeaderItem(0)->setText(qApp->applicationDisplayName()); 0069 d->view_system->setItem(row++, 0, new QTableWidgetItem(qApp->applicationVersion())); 0070 d->view_system->setItem(row++, 0, new QTableWidgetItem(QSysInfo::prettyProductName())); 0071 d->view_system->setItem(row++, 0, new QTableWidgetItem(QSysInfo::kernelType() + " " + QSysInfo::kernelVersion())); 0072 d->view_system->setItem(row++, 0, new QTableWidgetItem(QSysInfo::currentCpuArchitecture())); 0073 d->view_system->setItem(row++, 0, new QTableWidgetItem(QT_VERSION_STR)); 0074 d->view_system->setItem(row++, 0, new QTableWidgetItem(qVersion())); 0075 d->view_system->setItem(row++, 0, new QTableWidgetItem(utils::trace::Tracer::potrace_version())); 0076 d->view_system->setItem(row++, 0, new QTableWidgetItem(io::video::VideoFormat::library_version())); 0077 d->view_system->setItem(row++, 0, new QTableWidgetItem(utils::tar::libarchive_version())); 0078 0079 populate_io(d->table_formats_input, io::IoRegistry::instance().importers()); 0080 populate_io(d->table_formats_output, io::IoRegistry::instance().exporters()); 0081 0082 0083 QFile authors(app::Application::instance()->data_file("AUTHORS.md")); 0084 if ( authors.open(QFile::ReadOnly|QFile::Text) ) 0085 d->credits->setText(QString::fromUtf8(authors.readAll())); 0086 } 0087 0088 AboutDialog::~AboutDialog() = default; 0089 0090 void AboutDialog::changeEvent(QEvent *e) 0091 { 0092 QDialog::changeEvent(e); 0093 0094 if ( e->type() == QEvent::LanguageChange) 0095 { 0096 d->retranslateUi(this); 0097 } 0098 } 0099 0100 void AboutDialog::open_user_data() 0101 { 0102 QDesktopServices::openUrl(QUrl::fromLocalFile(d->line_user_data->text())); 0103 } 0104 0105 void AboutDialog::open_settings_file() 0106 { 0107 QDesktopServices::openUrl(QUrl::fromLocalFile(d->line_settings->text())); 0108 } 0109 0110 void AboutDialog::populate_view(QListWidget* wid, const QStringList& paths) 0111 { 0112 int h = 0; 0113 int c = 0; 0114 for ( const QString& str : paths ) 0115 { 0116 if ( str.startsWith(":/") ) 0117 continue; 0118 wid->addItem(str); 0119 h += wid->sizeHintForRow(c++); 0120 } 0121 if (c > 0) 0122 h += h/c/2; 0123 wid->setMinimumHeight(h); 0124 } 0125 0126 void AboutDialog::about_qt() 0127 { 0128 QMessageBox::aboutQt(this); 0129 } 0130 0131 void AboutDialog::copy_system() 0132 { 0133 QClipboard *clipboard = QGuiApplication::clipboard(); 0134 QString text_template("%1: %2\n"); 0135 0136 QString text; 0137 for ( int i = 0; i < d->view_system->rowCount(); i++ ) 0138 text += text_template.arg(d->view_system->verticalHeaderItem(i)->text()).arg(d->view_system->item(i, 0)->text()); 0139 0140 clipboard->setText(text); 0141 } 0142 0143 0144 void AboutDialog::dir_open(const QModelIndex& index) 0145 { 0146 QDesktopServices::openUrl(QUrl::fromLocalFile(index.data().toString())); 0147 } 0148 0149 void AboutDialog::open_backup() 0150 { 0151 QDesktopServices::openUrl(QUrl::fromLocalFile(d->line_backup->text())); 0152 }