Source code

Revision control

Copy as Markdown

// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "inputtab.h"
#include "inputlistview.h"
#include "settingstab.h"
#include <QFileDialog>
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPlainTextEdit>
#include <QPushButton>
#include <QtQuick3DAssetImport/private/qssgassetimportmanager_p.h>
InputTab::InputTab(SettingsTab *settings, QWidget *parent) : QWidget(parent), settingsTab(settings)
{
QLabel *fileNameLabel = new QLabel(tr("Input files:"));
lastInputPath = QDir::currentPath();
inputFilesListBox = new InputListView;
convertButton = new QPushButton("Convert", this);
connect(convertButton, &QAbstractButton::clicked, this, [&]() { convert(); });
statusText = new QPlainTextEdit;
statusText->setReadOnly(true);
QObject::connect(&converterThread, &ConverterThread::convertDone, this, &InputTab::convertDone);
QObject::connect(&converterThread, &ConverterThread::convertStart, this, &InputTab::convertStart);
QObject::connect(&converterThread, &ConverterThread::convertUpdate, this, &InputTab::convertUpdate);
QPushButton *browseInputButton = new QPushButton(tr("Browse..."), this);
connect(browseInputButton, &QAbstractButton::clicked, this, &InputTab::browseInput);
QPushButton *removeSelectedButton = new QPushButton(tr("Remove selected"), this);
connect(removeSelectedButton, &QAbstractButton::clicked, this, &InputTab::removeSelected);
QPushButton *selectAllButton = new QPushButton(tr("Select all"), this);
connect(selectAllButton, &QAbstractButton::clicked, this, &InputTab::selectAll);
QLabel *pathLabel = new QLabel(tr("Output folder:"));
outputPathEdit = new QLineEdit(QDir::currentPath());
QPushButton *browseOutputButton = new QPushButton(tr("Browse..."), this);
connect(browseOutputButton, &QAbstractButton::clicked, this, &InputTab::browseOutput);
QLabel *emptyLabel = new QLabel();
QGridLayout *mainLayout = new QGridLayout;
constexpr int rowFileNameLabel = 0;
constexpr int rowinputFiles = 1;
constexpr int rowOutputPathLabel = 5;
constexpr int rowOutputPathEdit = 6;
constexpr int rowStatusLabel = 7;
mainLayout->addWidget(fileNameLabel, rowFileNameLabel, 0, 1, 2);
mainLayout->addWidget(inputFilesListBox, rowinputFiles, 0, 4, 1);
mainLayout->addWidget(browseInputButton, rowinputFiles, 1);
mainLayout->addWidget(removeSelectedButton, rowinputFiles + 1, 1);
mainLayout->addWidget(selectAllButton, rowinputFiles + 2, 1);
mainLayout->addWidget(emptyLabel, rowinputFiles + 3, 1);
mainLayout->setRowStretch(rowinputFiles + 3, 1);
mainLayout->addWidget(pathLabel, rowOutputPathLabel, 0, 1, 2);
mainLayout->addWidget(outputPathEdit, rowOutputPathEdit, 0);
mainLayout->addWidget(browseOutputButton, rowOutputPathEdit, 1);
mainLayout->addWidget(new QLabel("Status:"), rowStatusLabel, 0, 1, 2);
mainLayout->addWidget(statusText, rowStatusLabel + 1, 0, 1, 2);
mainLayout->addWidget(convertButton, rowStatusLabel + 2, 0, 1, 2);
setLayout(mainLayout);
}
void InputTab::convert()
{
QStringList filenames = getInputFiles();
QDir outputPath = getOutputPath();
const auto options = settingsTab->getOptions();
converterThread.convert(filenames, outputPath, options);
}
void InputTab::convertStart(const QString &text)
{
statusText->setPlainText(text);
convertButton->setText(QString("Converting..."));
convertButton->setDisabled(true);
}
void InputTab::convertUpdate(const QString &text)
{
statusText->appendPlainText(text);
}
void InputTab::convertDone(const QString &text)
{
statusText->appendPlainText(text);
convertButton->setText(QString("Convert"));
convertButton->setDisabled(false);
}
QStringList InputTab::getInputFiles() const
{
QStringList files;
for (int i = 0; i < inputFilesListBox->count(); ++i)
files.push_back(inputFilesListBox->item(i)->text());
return files;
}
QString InputTab::getOutputPath() const
{
return outputPathEdit->text();
}
void InputTab::browseInput()
{
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::ExistingFiles);
dialog.setDirectory(lastInputPath);
const auto allDescs = QSSGAssetImportManager().getImporterPluginInfos();
QStringList nameFilters;
for (const auto &plugin : allDescs) {
nameFilters.append(tr("%1 files (*.%2)").arg(plugin.typeDescription, plugin.inputExtensions.join(QStringLiteral(" *."))));
}
nameFilters.append(tr("Any files (*)"));
dialog.setNameFilters(nameFilters);
if (!dialog.exec())
return;
const auto selectedFiles = dialog.selectedFiles();
for (const auto &file : selectedFiles)
inputFilesListBox->tryAddItem(QDir::toNativeSeparators(file));
if (!selectedFiles.empty())
lastInputPath = QFileInfo(selectedFiles.first()).absoluteDir().absolutePath();
}
void InputTab::browseOutput()
{
QString dir = QFileDialog::getExistingDirectory(this,
tr("Open Directory"),
outputPathEdit->text(),
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if (!dir.isEmpty()) {
outputPathEdit->setText(dir);
}
}
void InputTab::removeSelected()
{
QList<QListWidgetItem *> selectedItems = inputFilesListBox->selectedItems();
for (int i = 0; i < inputFilesListBox->count(); ++i) {
auto item = inputFilesListBox->item(i);
if (selectedItems.contains(item)) {
inputFilesListBox->takeItem(i);
selectedItems.removeAll(item);
i--;
}
}
}
void InputTab::selectAll()
{
for (int i = 0; i < inputFilesListBox->count(); ++i) {
auto item = inputFilesListBox->item(i);
item->setSelected(true);
}
}