redai/ArtDetailWindow.cpp
2023-04-15 16:29:10 -04:00

274 lines
8.2 KiB
C++

#include "ArtDetailWindow.h"
#include "imagelabel.h"
#include <QDateEdit>
#include <QFile>
#include <QFileInfo>
#include <QFormLayout>
#include <QGroupBox>
#include <QJsonArray>
#include <QJsonDocument>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QTextEdit>
#include <QHBoxLayout>
ArtDetailWindow::ArtDetailWindow(const QString& filename, const QString& assetDirectory) : QWidget() {
setMinimumWidth(800);
setMinimumHeight(600);
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();
formLayout->addRow("Know Exact Date?", m_knowExactDateBox);
m_dateEdit = new QDateEdit();
m_dateEdit->setCalendarPopup(true);
m_dateEdit->setDisplayFormat("yyyy-MM-dd");
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"));
} else {
m_dateEdit->setDate(QDate::fromString(artJson["date"].toString(), "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();
}