← index
image_convert20/convert/gui/src/mainwindow.cpp
Source: image_convert20/convert/gui/src/mainwindow.cpp
#include "mainwindow.hpp"
#include "converter.hpp"

#include <QCheckBox>
#include <QComboBox>
#include <QFileDialog>
#include <QFormLayout>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QMessageBox>
#include <QPushButton>
#include <QSpinBox>
#include <QTextEdit>
#include <QVBoxLayout>
#include <QWidget>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    setWindowTitle("Image Convert Qt");
    resize(760, 520);

    auto *central = new QWidget(this);
    auto *mainLayout = new QVBoxLayout(central);

    auto *filesGroup = new QGroupBox("Input", central);
    auto *filesLayout = new QVBoxLayout(filesGroup);

    auto *listRow = new QHBoxLayout;
    listFileEdit = new QLineEdit(filesGroup);
    auto *listBrowse = new QPushButton("Browse List", filesGroup);
    listRow->addWidget(new QLabel("Input list file", filesGroup));
    listRow->addWidget(listFileEdit);
    listRow->addWidget(listBrowse);
    filesLayout->addLayout(listRow);

    auto *imageRow = new QHBoxLayout;
    imageFileEdit = new QLineEdit(filesGroup);
    auto *imageBrowse = new QPushButton("Browse Image", filesGroup);
    imageRow->addWidget(new QLabel("Single image file", filesGroup));
    imageRow->addWidget(imageFileEdit);
    imageRow->addWidget(imageBrowse);
    filesLayout->addLayout(imageRow);

    auto *optionsGroup = new QGroupBox("Options", central);
    auto *form = new QFormLayout(optionsGroup);

    outputFormatBox = new QComboBox(optionsGroup);
    outputFormatBox->addItems({"png", "jpg", "jpeg", "bmp", "webp", "tiff"});

    resizeCheck = new QCheckBox("Resize output", optionsGroup);
    widthSpin = new QSpinBox(optionsGroup);
    heightSpin = new QSpinBox(optionsGroup);
    qualitySpin = new QSpinBox(optionsGroup);

    widthSpin->setRange(1, 32768);
    heightSpin->setRange(1, 32768);
    widthSpin->setValue(640);
    heightSpin->setValue(360);

    qualitySpin->setRange(0, 100);
    qualitySpin->setValue(100);

    form->addRow("Output format", outputFormatBox);
    form->addRow("JPEG quality", qualitySpin);
    form->addRow("", resizeCheck);
    form->addRow("Width", widthSpin);
    form->addRow("Height", heightSpin);

    convertButton = new QPushButton("Convert", central);

    logEdit = new QTextEdit(central);
    logEdit->setReadOnly(true);

    mainLayout->addWidget(filesGroup);
    mainLayout->addWidget(optionsGroup);
    mainLayout->addWidget(convertButton);
    mainLayout->addWidget(new QLabel("Log", central));
    mainLayout->addWidget(logEdit, 1);

    setCentralWidget(central);

    connect(listBrowse, &QPushButton::clicked, this, &MainWindow::browseListFile);
    connect(imageBrowse, &QPushButton::clicked, this, &MainWindow::browseImageFile);
    connect(convertButton, &QPushButton::clicked, this, &MainWindow::runConversion);
    connect(resizeCheck, &QCheckBox::toggled, this, &MainWindow::updateResizeState);

    updateResizeState();
}

void MainWindow::browseListFile() {
    const QString file = QFileDialog::getOpenFileName(this, "Select input list file", QString(), "Text Files (*.txt);;All Files (*)");
    if (!file.isEmpty()) {
        listFileEdit->setText(file);
    }
}

void MainWindow::browseImageFile() {
    const QString file = QFileDialog::getOpenFileName(this, "Select image file", QString(), "Images (*.png *.jpg *.jpeg *.bmp *.tif *.tiff *.webp);;All Files (*)");
    if (!file.isEmpty()) {
        imageFileEdit->setText(file);
    }
}

void MainWindow::updateResizeState() {
    const bool enabled = resizeCheck->isChecked();
    widthSpin->setEnabled(enabled);
    heightSpin->setEnabled(enabled);
}

void MainWindow::runConversion() {
    logEdit->clear();

    ConvertOptions options;
    options.outputFormat = outputFormatBox->currentText().toStdString();
    options.quality = qualitySpin->value();

    if (resizeCheck->isChecked()) {
        options.width = widthSpin->value();
        options.height = heightSpin->value();
    }

    if (!listFileEdit->text().trimmed().isEmpty()) {
        std::string error;
        auto loaded = loadInputList(listFileEdit->text().trimmed().toStdString(), error);
        if (!error.empty()) {
            QMessageBox::warning(this, "Error", QString::fromStdString(error));
            return;
        }
        options.files.insert(options.files.end(), loaded.begin(), loaded.end());
    }

    if (!imageFileEdit->text().trimmed().isEmpty()) {
        options.files.emplace_back(imageFileEdit->text().trimmed().toStdString());
    }

    auto result = convertFiles(options);
    for (const auto &line : result.log) {
        logEdit->append(QString::fromStdString(line));
    }

    if (result.success) {
        QMessageBox::information(this, "Done", QString("Converted %1 image(s).").arg(result.converted));
    } else {
        QMessageBox::warning(this, "No files converted", "No images were converted.");
    }
}