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 "document_metadata_dialog.hpp"
0008 #include "ui_document_metadata_dialog.h"
0009 #include <QEvent>
0010 
0011 
0012 using namespace glaxnimate::gui;
0013 using namespace glaxnimate;
0014 
0015 class DocumentMetadataDialog::Private
0016 {
0017 public:
0018     Ui::DocumentMetadataDialog ui;
0019     model::Document* document;
0020 
0021     void add_placeholder()
0022     {
0023         int row = ui.table_widget->rowCount() - 1;
0024 
0025         auto name = new QTableWidgetItem("");
0026         ui.table_widget->setItem(row, 0, name);
0027 
0028         auto value = new QTableWidgetItem();
0029         value->setData(Qt::DisplayRole, "");
0030         value->setData(Qt::EditRole, "");
0031         ui.table_widget->setItem(row, 1, value);
0032     }
0033 };
0034 
0035 DocumentMetadataDialog::DocumentMetadataDialog(model::Document* document, QWidget* parent)
0036     : QDialog(parent), d(std::make_unique<Private>())
0037 {
0038     d->ui.setupUi(this);
0039     d->document = document;
0040 
0041     d->ui.table_widget->setRowCount(d->document->metadata().size() + 1);
0042     int row = 0;
0043     for ( auto it = d->document->metadata().begin(); it != d->document->metadata().end(); ++it, row++ )
0044     {
0045         auto name = new QTableWidgetItem(it.key());
0046 
0047         auto value = new QTableWidgetItem();
0048         value->setData(Qt::DisplayRole, *it);
0049         value->setData(Qt::EditRole, *it);
0050 
0051 
0052         d->ui.table_widget->setItem(row, 0, name);
0053         d->ui.table_widget->setItem(row, 1, value);
0054     }
0055 
0056     d->ui.edit_author->setText(d->document->info().author);
0057     d->ui.edit_description->setText(d->document->info().description);
0058     d->ui.edit_keywords->setPlainText(d->document->info().keywords.join("\n"));
0059 
0060     d->add_placeholder();
0061 }
0062 
0063 DocumentMetadataDialog::~DocumentMetadataDialog() = default;
0064 
0065 void DocumentMetadataDialog::changeEvent ( QEvent* e )
0066 {
0067     QDialog::changeEvent(e);
0068 
0069     if ( e->type() == QEvent::LanguageChange)
0070     {
0071         d->ui.retranslateUi(this);
0072     }
0073 }
0074 
0075 void DocumentMetadataDialog::update_item(QTableWidgetItem* item)
0076 {
0077     int row = d->ui.table_widget->row(item);
0078     if ( row == d->ui.table_widget->rowCount() - 1 )
0079     {
0080         if ( !item->data(Qt::EditRole).toString().isEmpty() )
0081         {
0082             d->ui.table_widget->setRowCount(d->ui.table_widget->rowCount() + 1);
0083             d->add_placeholder();
0084         }
0085     }
0086     else
0087     {
0088         int column = d->ui.table_widget->column(item);
0089         if ( column == 0 && item->data(Qt::EditRole).toString().isEmpty() )
0090         {
0091             d->ui.table_widget->removeRow(d->ui.table_widget->row(item));
0092         }
0093     }
0094 }
0095 
0096 void DocumentMetadataDialog::button_clicked(QAbstractButton* button)
0097 {
0098     if ( d->ui.button_box->buttonRole(button) == QDialogButtonBox::AcceptRole )
0099     {
0100         QVariantMap meta;
0101         for ( int row = 0; row < d->ui.table_widget->rowCount() - 1; row++ )
0102         {
0103             QString name = d->ui.table_widget->item(row, 0)->data(Qt::EditRole).toString();
0104             if ( name.isEmpty() )
0105                 continue;
0106 
0107             meta[name] = d->ui.table_widget->item(row, 1)->data(Qt::EditRole);
0108         }
0109 
0110         /// \todo undo commands (and macro)
0111         d->document->set_metadata(meta);
0112         d->document->info().author = d->ui.edit_author->text();
0113         d->document->info().description = d->ui.edit_description->text();
0114         d->document->info().keywords = d->ui.edit_keywords->toPlainText().split("\n");
0115         accept();
0116     }
0117     else
0118     {
0119         reject();
0120     }
0121 }
0122