#include "ArtDetailWindow.h" #include "imagelabel.h" #include #include #include #include #include #include #include #include #include #include #include #include ArtDetailWindow::ArtDetailWindow(const QString& filename, const QString& assetDirectory, QWidget* parent) : QDialog(parent) { setMinimumWidth(800); setMinimumHeight(600); setWindowModality(Qt::WindowModality::WindowModal); setWindowTitle(filename); QFileInfo info(filename); QString withoutExtension = info.completeBaseName(); auto mainLayout = new QHBoxLayout(); setLayout(mainLayout); auto formLayout = new QFormLayout(); auto formLayoutWidget = new QWidget(); formLayoutWidget->setMaximumWidth(450); formLayoutWidget->setLayout(formLayout); mainLayout->addWidget(formLayoutWidget); QImage image; image.load(QString("%1/%2.webp").arg(assetDirectory).arg(withoutExtension)); auto previewBox = new QGroupBox("Preview"); mainLayout->addWidget(previewBox); auto previewLayout = new QVBoxLayout(); previewBox->setLayout(previewLayout); auto imageView = new ImageLabel(); imageView->setPixmap(QPixmap::fromImage(image)); previewLayout->addWidget(imageView); m_titleEdit = new QLineEdit(); formLayout->addRow("Title", m_titleEdit); m_knowExactDateBox = new QCheckBox(); connect(m_knowExactDateBox, &QCheckBox::toggled, this, [=](bool checked) { if (checked) { m_dateEdit->setDisplayFormat("yyyy-MM-dd"); } else { m_dateEdit->setDisplayFormat("yyyy"); } }); formLayout->addRow("Know Exact Date?", m_knowExactDateBox); m_dateEdit = new QDateEdit(); m_dateEdit->setCalendarPopup(true); formLayout->addRow("Date", m_dateEdit); m_altTextEdit = new QTextEdit(); m_altTextEdit->setAcceptRichText(false); formLayout->addRow("Alt Text", m_altTextEdit); m_descriptionEdit = new QTextEdit(); m_descriptionEdit->setAcceptRichText(false); formLayout->addRow("Description", m_descriptionEdit); m_nsfwBox = new QCheckBox(); formLayout->addRow("Is NSFW?", m_nsfwBox); m_mastodonUrlEdit = new QLineEdit(); formLayout->addRow("Mastodon URL", m_mastodonUrlEdit); m_pixivUrlEdit = new QLineEdit(); formLayout->addRow("Pixiv URL", m_pixivUrlEdit); m_newgroundsUrlEdit = new QLineEdit(); formLayout->addRow("Newgrounds URL", m_newgroundsUrlEdit); m_programEdit = new QLineEdit(); formLayout->addRow("Program", m_programEdit); auto charactersLayout = new QVBoxLayout(); formLayout->addRow("Characters", charactersLayout); auto characterList = new QListView(); m_characterListModel = new QStringListModel(); characterList->setModel(m_characterListModel); charactersLayout->addWidget(characterList); auto characterButtonLayout = new QHBoxLayout(); charactersLayout->addLayout(characterButtonLayout); auto addCharacterButton = new QPushButton(QIcon::fromTheme("list-add"), "Add"); connect(addCharacterButton, &QPushButton::clicked, this, [=] { auto tmp = m_characterListModel->stringList();; tmp.push_back("New Character"); m_characterListModel->setStringList(tmp); }); characterButtonLayout->addWidget(addCharacterButton); characterButtonLayout->addStretch(1); auto removeCharacterButton = new QPushButton(QIcon::fromTheme("list-remove"), "Remove"); connect(removeCharacterButton, &QPushButton::clicked, this, [=] { if(characterList->selectionModel()->hasSelection()) { QString toRemove = characterList->selectionModel()->selectedRows()[0].data().toString(); auto tmp = m_characterListModel->stringList(); tmp.removeOne(toRemove); m_characterListModel->setStringList(tmp); } }); characterButtonLayout->addWidget(removeCharacterButton); auto tagLayout = new QVBoxLayout(); formLayout->addRow("Tags", tagLayout); auto tagsList = new QListView(); m_tagsListModel = new QStringListModel(); tagsList->setModel(m_tagsListModel); tagLayout->addWidget(tagsList); auto tagButtonLayout = new QHBoxLayout(); tagLayout->addLayout(tagButtonLayout); auto addTagButton = new QPushButton(QIcon::fromTheme("list-add"), "Add"); connect(addTagButton, &QPushButton::clicked, this, [=] { auto tmp = m_tagsListModel->stringList();; tmp.push_back("New Tag"); m_tagsListModel->setStringList(tmp); }); tagButtonLayout->addWidget(addTagButton); tagButtonLayout->addStretch(1); auto removeTagButton = new QPushButton(QIcon::fromTheme("list-remove"),"Remove"); connect(removeTagButton, &QPushButton::clicked, this, [=] { if(tagsList->selectionModel()->hasSelection()) { QString toRemove = tagsList->selectionModel()->selectedRows()[0].data().toString(); auto tmp = m_tagsListModel->stringList(); tmp.removeOne(toRemove); m_tagsListModel->setStringList(tmp); } }); tagButtonLayout->addWidget(removeTagButton); auto bottomButtonLayout = new QHBoxLayout(); formLayout->addRow(bottomButtonLayout); auto cancelButton = new QPushButton(QIcon::fromTheme("dialog-close"),"Cancel"); connect(cancelButton, &QPushButton::clicked, this, [=] { close(); }); bottomButtonLayout->addWidget(cancelButton); bottomButtonLayout->addStretch(1); auto saveButton = new QPushButton(QIcon::fromTheme("dialog-ok"), "Save"); connect(saveButton, &QPushButton::clicked, this, [=] { saveData(filename); }); bottomButtonLayout->addWidget(saveButton); if(QFile::exists(filename)) { loadData(filename); } } void ArtDetailWindow::loadData(const QString& filename) { qDebug() << "Loading data from" << filename; QFile artFile(filename); artFile.open(QFile::ReadOnly); QJsonDocument artJson = QJsonDocument::fromJson(artFile.readAll()); if(artJson.object().contains("title")) m_titleEdit->setText(artJson["title"].toString()); if(artJson.object().contains("alt_text")) m_altTextEdit->setText(artJson["alt_text"].toString()); if(artJson.object().contains("description")) m_descriptionEdit->setText(artJson["description"].toString()); m_knowExactDateBox->setChecked(artJson["date"].toString().contains("-")); if(m_knowExactDateBox->isChecked()) { m_dateEdit->setDate(QDate::fromString(artJson["date"].toString(), "yyyy-MM-dd")); m_dateEdit->setDisplayFormat("yyyy-MM-dd"); } else { m_dateEdit->setDate(QDate::fromString(artJson["date"].toString(), "yyyy")); m_dateEdit->setDisplayFormat("yyyy"); } if(artJson.object().contains("nsfw")) m_nsfwBox->setChecked(artJson["nsfw"].toBool()); if(artJson.object().contains("mastodon_url")) m_mastodonUrlEdit->setText(artJson["mastodon_url"].toString()); if(artJson.object().contains("pixiv_url")) m_pixivUrlEdit->setText(artJson["pixiv_url"].toString()); if(artJson.object().contains("newgrounds_url")) m_newgroundsUrlEdit->setText(artJson["newgrounds_url"].toString()); if(artJson.object().contains("program")) m_programEdit->setText(artJson["program"].toString()); if(artJson.object().contains("characters")) { QStringList list; for(auto character : artJson["characters"].toArray()) { list.append(character.toString()); } m_characterListModel->setStringList(list); } if(artJson.object().contains("tags")) { QStringList list; for(auto tag : artJson["tags"].toArray()) { list.append(tag.toString()); } m_tagsListModel->setStringList(list); } } void ArtDetailWindow::saveData(const QString& filename) { qDebug() << "Saving data to" << filename; QJsonObject object; if(!m_titleEdit->text().isEmpty()) object["title"] = m_titleEdit->text(); if(!m_altTextEdit->document()->isEmpty()) object["alt_text"] = m_altTextEdit->document()->toPlainText(); if(!m_descriptionEdit->document()->isEmpty()) object["description"] = m_descriptionEdit->document()->toPlainText(); if(m_knowExactDateBox->isChecked()) { object["date"] = m_dateEdit->date().toString("yyyy-MM-dd"); } else { object["date"] = m_dateEdit->date().toString("yyyy"); } if(m_nsfwBox->isChecked()) object["nsfw"] = m_nsfwBox->isChecked(); if(!m_mastodonUrlEdit->text().isEmpty()) object["mastodon_url"] = m_mastodonUrlEdit->text(); if(!m_pixivUrlEdit->text().isEmpty()) object["pixiv_url"] = m_pixivUrlEdit->text(); if(!m_newgroundsUrlEdit->text().isEmpty()) object["newgrounds_url"] = m_newgroundsUrlEdit->text(); if(!m_programEdit->text().isEmpty()) object["program"] = m_programEdit->text(); auto tags = m_tagsListModel->stringList(); if(!tags.isEmpty()) { object["tags"] = QJsonArray::fromStringList(tags); } auto characters = m_characterListModel->stringList(); if(!characters.isEmpty()) { object["characters"] = QJsonArray::fromStringList(characters); } QJsonDocument jsonDoc(object); QFile file(filename); file.open(QFile::WriteOnly); file.write(jsonDoc.toJson()); file.close(); close(); }