#include "mainwindow.h" #include "./ui_mainwindow.h" #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); connect(ui->actionOpen, &QAction::triggered, this, [this](bool){open();}); connect(ui->nextButton, &QPushButton::clicked, this, [this](bool){setImage(index+1);}); connect(ui->prevButton, &QPushButton::clicked, this, [this](bool){setImage(index-1);}); connect(ui->actionSave, &QAction::triggered, this, [this](bool){save();}); connect(ui->actionQuit, &QAction::triggered, this, [this](bool){close();}); ui->verticalLayout->addWidget(&status); ui->imageLabel->setScaledContents( true ); ui->imageLabel->setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Ignored ); } MainWindow::~MainWindow() { delete ui; } void MainWindow::open() { QString dirpath = QFileDialog::getExistingDirectory(this, "Choose a directory with images", "", QFlags()); if(dirpath.isEmpty()) return; openDir(dirpath.toStdString()); } void MainWindow::openDir(const std::filesystem::path& path) { imageMetas.clear(); QDir dir(path); bool hasMetadata = false; std::vector imagePaths; for(QString filename : dir.entryList(QDir::Files)) { if(filename == "metadata.jsonl") hasMetadata = true; else if(filename.endsWith(".jpg") || filename.endsWith(".png")) imagePaths.push_back(path/filename.toStdString()); } if(imagePaths.empty()) { QMessageBox::warning(this, "No images found", "No valid images found in this directory"); return; } if(hasMetadata) { if(!loadMetadata(path/"metadata.jsonl")) QMessageBox::warning(this, "Could not read", (std::string("Could not read ") + path.string() + std::string("/metadata.jsonl, file contains errors")).c_str()); } for(const std::filesystem::path &path : imagePaths) { if(imageIsKnown(path)) continue; qDebug()<dir = path; ui->textEdit->document()->setPlainText(imageMetas[0].text); setImage(0); } void MainWindow::setImage(ssize_t index) { if(imageMetas.empty()) return; else if(index > imageMetas.size()-1) return; else if(index < 0) return; imageMetas[this->index].text = ui->textEdit->document()->toPlainText(); this->index = index; ui->counterLabel->setText(QString::asprintf("%04zu/%04zu", index, imageMetas.size()-1)); ui->textEdit->document()->setPlainText(imageMetas[index].text); QPixmap image; bool ret = image.load(imageMetas[index].path.string().c_str()); if(!ret) { ui->imageLabel->setPixmap(QPixmap()); ui->imageLabel->setText(("Unable to load " + imageMetas[index].path.string()).c_str()); ui->imageLabel->setText("No image loaded"); } else { ui->imageLabel->setPixmap(image); } ui->imageLabel->setText(""); } bool MainWindow::loadMetadata(const std::filesystem::path& path) { QFile meta(path); meta.open(QIODeviceBase::ReadOnly); if(!meta.isOpen()) { qWarning()<<("Could not open " + path.string()).c_str(); return false; } QByteArray line = meta.readLine(); while(!line.isEmpty()) { QJsonParseError error; QJsonDocument json = QJsonDocument::fromJson(line, &error); if(json.isNull()) { qWarning()<