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 }