2015-09-06 20:20:00 +02:00
|
|
|
#include "./entertargetdialog.h"
|
2015-09-06 15:41:17 +02:00
|
|
|
|
2015-12-05 22:55:05 +01:00
|
|
|
#include "ui_entertargetdialog.h"
|
2015-04-22 19:33:53 +02:00
|
|
|
|
|
|
|
#include <tagparser/signature.h>
|
|
|
|
#include <tagparser/mediafileinfo.h>
|
|
|
|
#include <tagparser/abstracttrack.h>
|
|
|
|
#include <tagparser/matroska/matroskatagid.h>
|
|
|
|
#include <tagparser/matroska/matroskacontainer.h>
|
|
|
|
#include <tagparser/matroska/matroskaeditionentry.h>
|
|
|
|
|
|
|
|
#include <qtutilities/models/checklistmodel.h>
|
2015-09-26 20:37:16 +02:00
|
|
|
#include <qtutilities/misc/dialogutils.h>
|
2015-04-22 19:33:53 +02:00
|
|
|
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
using namespace Models;
|
2015-09-26 20:37:16 +02:00
|
|
|
using namespace Dialogs;
|
2015-04-22 19:33:53 +02:00
|
|
|
using namespace Media;
|
|
|
|
|
|
|
|
namespace QtGui {
|
|
|
|
|
|
|
|
void addIds(vector<uint64> &target, ChecklistModel *sourceModel)
|
|
|
|
{
|
|
|
|
for(const auto &item : sourceModel->items()) {
|
|
|
|
if(item.isChecked()) {
|
|
|
|
target.push_back(item.id().toULongLong());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
template<class T>
|
|
|
|
void addIds(ChecklistModel *targetModel, const T &fileIds, const vector<uint64> &targetIds)
|
|
|
|
{
|
|
|
|
QList<uint64> ids;
|
|
|
|
QList<ChecklistItem> items;
|
|
|
|
for(const auto &i : fileIds) {
|
|
|
|
items << ChecklistItem(QVariant::fromValue(i->id()),
|
|
|
|
QString::fromLocal8Bit(i->label().c_str()),
|
|
|
|
std::find(targetIds.cbegin(), targetIds.cend(), i->id()) == targetIds.cend() ? Qt::Unchecked : Qt::Checked);
|
|
|
|
ids << i->id();
|
|
|
|
}
|
|
|
|
for(auto id : targetIds) {
|
|
|
|
if(!ids.contains(id)) {
|
|
|
|
items << ChecklistItem(QVariant::fromValue(id), QStringLiteral("ID: %1").arg(id), Qt::Checked);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
targetModel->setItems(items);
|
|
|
|
}
|
|
|
|
|
|
|
|
void addIds(ChecklistModel *targetModel, const vector<uint64> &targetIds)
|
|
|
|
{
|
|
|
|
QList<ChecklistItem> items;
|
|
|
|
for(auto id : targetIds) {
|
|
|
|
items << ChecklistItem(QVariant::fromValue(id), QStringLiteral("ID: %1").arg(id), Qt::Checked);
|
|
|
|
}
|
|
|
|
targetModel->setItems(items);
|
|
|
|
}
|
|
|
|
|
|
|
|
EnterTargetDialog::EnterTargetDialog(QWidget *parent) :
|
|
|
|
QDialog(parent),
|
|
|
|
m_ui(new Ui::EnterTargetDialog),
|
|
|
|
m_tracksModel(new ChecklistModel(this)),
|
|
|
|
m_chaptersModel(new ChecklistModel(this)),
|
|
|
|
m_editionsModel(new ChecklistModel(this)),
|
2016-05-26 02:15:41 +02:00
|
|
|
m_attachmentsModel(new ChecklistModel(this)),
|
|
|
|
m_currentContainerFormat(ContainerFormat::Unknown)
|
2015-04-22 19:33:53 +02:00
|
|
|
{
|
|
|
|
// setup UI
|
|
|
|
m_ui->setupUi(this);
|
|
|
|
// apply style sheets
|
|
|
|
#ifdef Q_OS_WIN32
|
2015-09-26 20:37:16 +02:00
|
|
|
setStyleSheet(dialogStyle());
|
2015-04-22 19:33:53 +02:00
|
|
|
#endif
|
|
|
|
// setup views
|
|
|
|
m_ui->tracksListView->setModel(m_tracksModel);
|
|
|
|
m_ui->chaptersListView->setModel(m_chaptersModel);
|
|
|
|
m_ui->editionsListView->setModel(m_editionsModel);
|
|
|
|
m_ui->attachmentsListView->setModel(m_attachmentsModel);
|
|
|
|
// connect signals and slots
|
|
|
|
connect(m_ui->levelSpinBox, static_cast<void (QSpinBox:: *) (int)>(&QSpinBox::valueChanged), this, &EnterTargetDialog::updateLevelNamePlaceholderText);
|
2016-05-26 02:15:41 +02:00
|
|
|
connect(m_ui->confirmPushButton, &QPushButton::clicked, this, &EnterTargetDialog::accept);
|
2015-04-22 19:33:53 +02:00
|
|
|
connect(m_ui->abortPushButton, &QPushButton::clicked, this, &EnterTargetDialog::reject);
|
|
|
|
}
|
|
|
|
|
|
|
|
EnterTargetDialog::~EnterTargetDialog()
|
|
|
|
{}
|
|
|
|
|
|
|
|
void EnterTargetDialog::updateLevelNamePlaceholderText(int i)
|
|
|
|
{
|
2016-05-26 02:15:41 +02:00
|
|
|
const char *levelName = i >= 0 ? tagTargetLevelName(containerTargetLevel(m_currentContainerFormat, static_cast<uint32>(i))) : nullptr;
|
|
|
|
m_ui->levelNameLineEdit->setPlaceholderText(levelName ? QString::fromUtf8(levelName) : QString());
|
2015-04-22 19:33:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Media::TagTarget EnterTargetDialog::target() const
|
|
|
|
{
|
|
|
|
TagTarget target;
|
|
|
|
target.setLevel(static_cast<uint64>(m_ui->levelSpinBox->value()));
|
|
|
|
target.setLevelName(m_ui->levelNameLineEdit->text().toLocal8Bit().data());
|
|
|
|
addIds(target.tracks(), m_tracksModel);
|
|
|
|
addIds(target.chapters(), m_chaptersModel);
|
|
|
|
addIds(target.editions(), m_editionsModel);
|
|
|
|
addIds(target.attachments(), m_attachmentsModel);
|
|
|
|
return target;
|
|
|
|
}
|
|
|
|
|
|
|
|
void EnterTargetDialog::setTarget(const TagTarget &target, const MediaFileInfo *file)
|
|
|
|
{
|
2016-05-26 02:15:41 +02:00
|
|
|
m_currentContainerFormat = file ? file->containerFormat() : ContainerFormat::Unknown;
|
2015-04-22 19:33:53 +02:00
|
|
|
if(m_ui->levelSpinBox->maximum() >= 0
|
|
|
|
&& target.level() <= static_cast<unsigned int>(m_ui->levelSpinBox->maximum())
|
|
|
|
&& (m_ui->levelSpinBox->minimum() < 0 || target.level() >= static_cast<unsigned int>(m_ui->levelSpinBox->minimum()))) {
|
|
|
|
m_ui->levelSpinBox->setValue(static_cast<int>(target.level()));
|
|
|
|
m_ui->levelWarningLabel->setHidden(true);
|
|
|
|
} else {
|
|
|
|
m_ui->levelWarningLabel->setHidden(false);
|
|
|
|
}
|
|
|
|
m_ui->levelNameLineEdit->setText(QString::fromLocal8Bit(target.levelName().c_str()));
|
|
|
|
if(file) {
|
|
|
|
// add track IDs
|
|
|
|
addIds(m_tracksModel, file->tracks(), target.tracks());
|
|
|
|
// add chapter IDs
|
|
|
|
addIds(m_chaptersModel, file->chapters(), target.chapters());
|
|
|
|
// add edition IDs
|
|
|
|
if(file->containerFormat() == ContainerFormat::Matroska) {
|
|
|
|
addIds(m_editionsModel, static_cast<const MatroskaContainer *>(file->container())->editionEntires(), target.editions());
|
|
|
|
}
|
|
|
|
// add attachment IDs
|
|
|
|
addIds(m_attachmentsModel, file->attachments(), target.attachments());
|
|
|
|
|
|
|
|
} else {
|
|
|
|
// add track IDs
|
|
|
|
addIds(m_tracksModel, target.tracks());
|
|
|
|
// add chapter IDs
|
|
|
|
addIds(m_chaptersModel, target.chapters());
|
|
|
|
// add edition IDs
|
|
|
|
addIds(m_editionsModel, target.editions());
|
|
|
|
// add attachment IDs
|
|
|
|
addIds(m_attachmentsModel, target.attachments());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|