Format all GUI-only files

This commit is contained in:
Martchus 2018-03-11 18:58:50 +01:00
parent 4f53029a6e
commit 3ac822c5fe
8 changed files with 452 additions and 445 deletions

View File

@ -4,39 +4,37 @@
#include "resources/config.h" #include "resources/config.h"
#include <tagparser/backuphelper.h>
#include <tagparser/mediafileinfo.h> #include <tagparser/mediafileinfo.h>
#include <tagparser/tag.h> #include <tagparser/tag.h>
#include <tagparser/backuphelper.h>
#include <QApplication> #include <QApplication>
#include <QSettings>
#include <QFile> #include <QFile>
#include <QSettings>
using namespace TagParser; using namespace TagParser;
namespace Settings { namespace Settings {
AutoCompletition::AutoCompletition() : AutoCompletition::AutoCompletition()
fields(nullptr, KnownFieldModel::DefaultSelection::None) : fields(nullptr, KnownFieldModel::DefaultSelection::None)
{} {
}
Editor::Editor() : Editor::Editor()
fields(nullptr, KnownFieldModel::DefaultSelection::CommonFields), : fields(nullptr, KnownFieldModel::DefaultSelection::CommonFields)
defaultTargets(nullptr, TargetLevelModel::DefaultSelection::MostUsefulTargets) , defaultTargets(nullptr, TargetLevelModel::DefaultSelection::MostUsefulTargets)
{} {
}
DbQuery::DbQuery() : DbQuery::DbQuery()
fields(QList<Models::ChecklistItem>() : fields(QList<Models::ChecklistItem>() << KnownFieldModel::mkItem(KnownField::Title) << KnownFieldModel::mkItem(KnownField::TrackPosition)
<< KnownFieldModel::mkItem(KnownField::Title) << KnownFieldModel::mkItem(KnownField::DiskPosition) << KnownFieldModel::mkItem(KnownField::Album)
<< KnownFieldModel::mkItem(KnownField::TrackPosition) << KnownFieldModel::mkItem(KnownField::Album) << KnownFieldModel::mkItem(KnownField::Year)
<< KnownFieldModel::mkItem(KnownField::DiskPosition) << KnownFieldModel::mkItem(KnownField::Genre) << KnownFieldModel::mkItem(KnownField::Cover, Qt::Unchecked)
<< KnownFieldModel::mkItem(KnownField::Album)
<< KnownFieldModel::mkItem(KnownField::Album)
<< KnownFieldModel::mkItem(KnownField::Year)
<< KnownFieldModel::mkItem(KnownField::Genre)
<< KnownFieldModel::mkItem(KnownField::Cover, Qt::Unchecked)
<< KnownFieldModel::mkItem(KnownField::Lyrics, Qt::Unchecked)) << KnownFieldModel::mkItem(KnownField::Lyrics, Qt::Unchecked))
{} {
}
Settings &values() Settings &values()
{ {
@ -48,13 +46,14 @@ void restore()
{ {
QSettings settings(QSettings::IniFormat, QSettings::UserScope, QStringLiteral(PROJECT_NAME)); QSettings settings(QSettings::IniFormat, QSettings::UserScope, QStringLiteral(PROJECT_NAME));
// move old config to new location // move old config to new location
const QString oldConfig = QSettings(QSettings::IniFormat, QSettings::UserScope, QApplication::organizationName(), QApplication::applicationName()).fileName(); const QString oldConfig
= QSettings(QSettings::IniFormat, QSettings::UserScope, QApplication::organizationName(), QApplication::applicationName()).fileName();
QFile::rename(oldConfig, settings.fileName()) || QFile::remove(oldConfig); QFile::rename(oldConfig, settings.fileName()) || QFile::remove(oldConfig);
settings.sync(); settings.sync();
Settings &v = values(); Settings &v = values();
settings.beginGroup(QStringLiteral("editor")); settings.beginGroup(QStringLiteral("editor"));
switch(settings.value(QStringLiteral("adoptfields"), 0).toInt()) { switch (settings.value(QStringLiteral("adoptfields"), 0).toInt()) {
case 1: case 1:
v.editor.adoptFields = AdoptFields::WithinDirectory; v.editor.adoptFields = AdoptFields::WithinDirectory;
break; break;
@ -67,7 +66,7 @@ void restore()
}; };
v.editor.saveAndShowNextOnEnter = settings.value(QStringLiteral("saveandshownextonenter"), false).toBool(); v.editor.saveAndShowNextOnEnter = settings.value(QStringLiteral("saveandshownextonenter"), false).toBool();
v.editor.askBeforeDeleting = settings.value(QStringLiteral("askbeforedeleting"), true).toBool(); v.editor.askBeforeDeleting = settings.value(QStringLiteral("askbeforedeleting"), true).toBool();
switch(settings.value(QStringLiteral("multipletaghandling"), 0).toInt()) { switch (settings.value(QStringLiteral("multipletaghandling"), 0).toInt()) {
case 0: case 0:
v.editor.multipleTagHandling = MultipleTagHandling::SingleEditorPerTarget; v.editor.multipleTagHandling = MultipleTagHandling::SingleEditorPerTarget;
break; break;
@ -102,7 +101,7 @@ void restore()
settings.endGroup(); settings.endGroup();
settings.beginGroup(QStringLiteral("tagprocessing")); settings.beginGroup(QStringLiteral("tagprocessing"));
switch(settings.value(QStringLiteral("preferredencoding"), 1).toInt()) { switch (settings.value(QStringLiteral("preferredencoding"), 1).toInt()) {
case 0: case 0:
v.tagPocessing.preferredEncoding = TagParser::TagTextEncoding::Latin1; v.tagPocessing.preferredEncoding = TagParser::TagTextEncoding::Latin1;
break; break;
@ -115,7 +114,7 @@ void restore()
default: default:
v.tagPocessing.preferredEncoding = TagParser::TagTextEncoding::Utf8; v.tagPocessing.preferredEncoding = TagParser::TagTextEncoding::Utf8;
}; };
switch(settings.value(QStringLiteral("unsupportedfieldhandling"), 0).toInt()) { switch (settings.value(QStringLiteral("unsupportedfieldhandling"), 0).toInt()) {
case 1: case 1:
v.tagPocessing.unsupportedFieldHandling = UnsupportedFieldHandling::Discard; v.tagPocessing.unsupportedFieldHandling = UnsupportedFieldHandling::Discard;
break; break;
@ -124,37 +123,42 @@ void restore()
}; };
v.tagPocessing.autoTagManagement = settings.value(QStringLiteral("autotagmanagement"), true).toBool(); v.tagPocessing.autoTagManagement = settings.value(QStringLiteral("autotagmanagement"), true).toBool();
settings.beginGroup(QStringLiteral("id3v1")); settings.beginGroup(QStringLiteral("id3v1"));
switch(settings.value(QStringLiteral("usage"), 0).toInt()) { switch (settings.value(QStringLiteral("usage"), 0).toInt()) {
case 1: case 1:
v.tagPocessing.id3.v1Usage = TagUsage::KeepExisting; v.tagPocessing.creationSettings.id3v1usage = TagUsage::KeepExisting;
break; break;
case 2: case 2:
v.tagPocessing.id3.v1Usage = TagUsage::Never; v.tagPocessing.creationSettings.id3v1usage = TagUsage::Never;
break; break;
default: default:
v.tagPocessing.id3.v1Usage = TagUsage::Always; v.tagPocessing.creationSettings.id3v1usage = TagUsage::Always;
break; break;
}; };
settings.endGroup(); settings.endGroup();
settings.beginGroup(QStringLiteral("id3v2")); settings.beginGroup(QStringLiteral("id3v2"));
switch(settings.value(QStringLiteral("usage"), 0).toInt()) { switch (settings.value(QStringLiteral("usage"), 0).toInt()) {
case 1: case 1:
v.tagPocessing.id3.v2Usage = TagUsage::KeepExisting; v.tagPocessing.creationSettings.id3v2usage = TagUsage::KeepExisting;
break; break;
case 2: case 2:
v.tagPocessing.id3.v2Usage = TagUsage::Never; v.tagPocessing.creationSettings.id3v2usage = TagUsage::Never;
break; break;
default: default:
v.tagPocessing.id3.v2Usage = TagUsage::Always; v.tagPocessing.creationSettings.id3v2usage = TagUsage::Always;
}; };
v.tagPocessing.id3.v2Version = settings.value(QStringLiteral("versiontobeused"), 3).toUInt(); v.tagPocessing.creationSettings.id3v2MajorVersion = static_cast<byte>(settings.value(QStringLiteral("versiontobeused")).toUInt());
v.tagPocessing.id3.keepVersionOfExistingId3v2Tag = settings.value(QStringLiteral("keepversionofexistingtag"), true).toBool(); if (v.tagPocessing.creationSettings.id3v2MajorVersion < 1 || v.tagPocessing.creationSettings.id3v2MajorVersion > 4) {
v.tagPocessing.id3.mergeMultipleSuccessiveId3v2Tags = settings.value(QStringLiteral("mergemultiplesuccessivetags"), true).toBool(); v.tagPocessing.creationSettings.id3v2MajorVersion = 3;
}
v.tagPocessing.creationSettings.setFlag(
TagCreationFlags::KeepExistingId3v2Version, settings.value(QStringLiteral("keepversionofexistingtag"), true).toBool());
v.tagPocessing.creationSettings.setFlag(
TagCreationFlags::MergeMultipleSuccessiveId3v2Tags, settings.value(QStringLiteral("mergemultiplesuccessivetags"), true).toBool());
settings.endGroup(); settings.endGroup();
v.editor.defaultTargets.restore(settings, QStringLiteral("targets")); v.editor.defaultTargets.restore(settings, QStringLiteral("targets"));
settings.beginGroup(QStringLiteral("filelayout")); settings.beginGroup(QStringLiteral("filelayout"));
v.tagPocessing.fileLayout.forceRewrite = settings.value(QStringLiteral("forcerewrite"), true).toBool(); v.tagPocessing.fileLayout.forceRewrite = settings.value(QStringLiteral("forcerewrite"), true).toBool();
switch(settings.value(QStringLiteral("tagpos")).toInt()) { switch (settings.value(QStringLiteral("tagpos")).toInt()) {
case 0: case 0:
v.tagPocessing.fileLayout.preferredTagPosition = ElementPosition::BeforeData; v.tagPocessing.fileLayout.preferredTagPosition = ElementPosition::BeforeData;
break; break;
@ -163,7 +167,7 @@ void restore()
break; break;
} }
v.tagPocessing.fileLayout.forceTagPosition = settings.value(QStringLiteral("forcetagpos"), true).toBool(); v.tagPocessing.fileLayout.forceTagPosition = settings.value(QStringLiteral("forcetagpos"), true).toBool();
switch(settings.value(QStringLiteral("indexpos")).toInt()) { switch (settings.value(QStringLiteral("indexpos")).toInt()) {
case 0: case 0:
v.tagPocessing.fileLayout.preferredIndexPosition = ElementPosition::BeforeData; v.tagPocessing.fileLayout.preferredIndexPosition = ElementPosition::BeforeData;
break; break;
@ -243,13 +247,14 @@ void save()
settings.setValue(QStringLiteral("unsupportedfieldhandling"), static_cast<int>(v.tagPocessing.unsupportedFieldHandling)); settings.setValue(QStringLiteral("unsupportedfieldhandling"), static_cast<int>(v.tagPocessing.unsupportedFieldHandling));
settings.setValue(QStringLiteral("autotagmanagement"), v.tagPocessing.autoTagManagement); settings.setValue(QStringLiteral("autotagmanagement"), v.tagPocessing.autoTagManagement);
settings.beginGroup(QStringLiteral("id3v1")); settings.beginGroup(QStringLiteral("id3v1"));
settings.setValue(QStringLiteral("usage"), static_cast<int>(v.tagPocessing.id3.v1Usage)); settings.setValue(QStringLiteral("usage"), static_cast<int>(v.tagPocessing.creationSettings.id3v1usage));
settings.endGroup(); settings.endGroup();
settings.beginGroup(QStringLiteral("id3v2")); settings.beginGroup(QStringLiteral("id3v2"));
settings.setValue(QStringLiteral("usage"), static_cast<int>(v.tagPocessing.id3.v2Usage)); settings.setValue(QStringLiteral("usage"), static_cast<int>(v.tagPocessing.creationSettings.id3v2usage));
settings.setValue(QStringLiteral("versiontobeused"), v.tagPocessing.id3.v2Version); settings.setValue(QStringLiteral("versiontobeused"), v.tagPocessing.creationSettings.id3v2MajorVersion);
settings.setValue(QStringLiteral("keepversionofexistingtag"), v.tagPocessing.id3.keepVersionOfExistingId3v2Tag); settings.setValue(QStringLiteral("keepversionofexistingtag"), v.tagPocessing.creationSettings.flags & TagCreationFlags::KeepExistingId3v2Version);
settings.setValue(QStringLiteral("mergemultiplesuccessivetags"), v.tagPocessing.id3.mergeMultipleSuccessiveId3v2Tags); settings.setValue(
QStringLiteral("mergemultiplesuccessivetags"), v.tagPocessing.creationSettings.flags & TagCreationFlags::MergeMultipleSuccessiveId3v2Tags);
settings.endGroup(); settings.endGroup();
v.editor.defaultTargets.save(settings, QStringLiteral("targets")); v.editor.defaultTargets.save(settings, QStringLiteral("targets"));
settings.beginGroup(QStringLiteral("filelayout")); settings.beginGroup(QStringLiteral("filelayout"));
@ -288,4 +293,4 @@ void save()
v.qt.save(settings); v.qt.save(settings);
} }
} } // namespace Settings

View File

@ -1,45 +1,30 @@
#ifndef SETTINGS_H #ifndef SETTINGS_H
#define SETTINGS_H #define SETTINGS_H
#include "./targetlevelmodel.h"
#include "./knownfieldmodel.h" #include "./knownfieldmodel.h"
#include "./targetlevelmodel.h"
#include <c++utilities/conversion/types.h> #include <c++utilities/conversion/types.h>
#include <tagparser/abstractcontainer.h> #include <tagparser/abstractcontainer.h>
#include <tagparser/tagvalue.h>
#include <tagparser/settings.h> #include <tagparser/settings.h>
#include <tagparser/tag.h> #include <tagparser/tag.h>
#include <tagparser/tagvalue.h>
#include <qtutilities/settingsdialog/qtsettings.h> #include <qtutilities/settingsdialog/qtsettings.h>
#include <QString>
#include <QByteArray> #include <QByteArray>
#include <QString>
namespace Settings { namespace Settings {
enum class ActionEnabled enum class ActionEnabled { Ask, Yes, No };
{
Ask,
Yes,
No
};
enum class AdoptFields enum class AdoptFields { Never, WithinDirectory, Always };
{
Never,
WithinDirectory,
Always
};
enum class MultipleTagHandling enum class MultipleTagHandling { SingleEditorPerTarget, SeparateEditors };
{
SingleEditorPerTarget,
SeparateEditors
};
struct AutoCompletition struct AutoCompletition {
{
AutoCompletition(); AutoCompletition();
bool insertTitleFromFilename = false; bool insertTitleFromFilename = false;
bool trimWhitespaces = true; bool trimWhitespaces = true;
@ -48,8 +33,7 @@ struct AutoCompletition
KnownFieldModel fields; KnownFieldModel fields;
}; };
struct Editor struct Editor {
{
Editor(); Editor();
AdoptFields adoptFields = AdoptFields::Never; AdoptFields adoptFields = AdoptFields::Never;
bool saveAndShowNextOnEnter = false; bool saveAndShowNextOnEnter = false;
@ -66,20 +50,14 @@ struct Editor
TargetLevelModel defaultTargets; TargetLevelModel defaultTargets;
}; };
enum class UnsupportedFieldHandling enum class UnsupportedFieldHandling { Ignore, Discard };
{
Ignore,
Discard
};
struct FileBrowser struct FileBrowser {
{
bool hideBackupFiles = true; bool hideBackupFiles = true;
bool readOnly = true; bool readOnly = true;
}; };
struct FileLayout struct FileLayout {
{
bool forceRewrite = true; bool forceRewrite = true;
TagParser::ElementPosition preferredTagPosition = TagParser::ElementPosition::BeforeData; TagParser::ElementPosition preferredTagPosition = TagParser::ElementPosition::BeforeData;
bool forceTagPosition = true; bool forceTagPosition = true;
@ -90,8 +68,7 @@ struct FileLayout
std::size_t preferredPadding = 0; std::size_t preferredPadding = 0;
}; };
struct TagProcessing struct TagProcessing {
{
TagParser::TagTextEncoding preferredEncoding = TagParser::TagTextEncoding::Utf8; TagParser::TagTextEncoding preferredEncoding = TagParser::TagTextEncoding::Utf8;
UnsupportedFieldHandling unsupportedFieldHandling = UnsupportedFieldHandling::Ignore; UnsupportedFieldHandling unsupportedFieldHandling = UnsupportedFieldHandling::Ignore;
bool autoTagManagement = true; bool autoTagManagement = true;
@ -99,16 +76,14 @@ struct TagProcessing
FileLayout fileLayout; FileLayout fileLayout;
}; };
struct MainWindow struct MainWindow {
{
QByteArray geometry; QByteArray geometry;
QByteArray state; QByteArray state;
QString currentFileBrowserDirectory; QString currentFileBrowserDirectory;
bool layoutLocked = false; bool layoutLocked = false;
}; };
struct DbQuery struct DbQuery {
{
DbQuery(); DbQuery();
bool widgetShown = false; bool widgetShown = false;
bool override = false; bool override = false;
@ -118,15 +93,13 @@ struct DbQuery
QString lyricsWikiaUrl; QString lyricsWikiaUrl;
}; };
struct RenamingUtility struct RenamingUtility {
{
int scriptSource = 0; int scriptSource = 0;
QString externalScript; QString externalScript;
QString editorScript; QString editorScript;
}; };
struct Settings struct Settings {
{
Editor editor; Editor editor;
FileBrowser fileBrowser; FileBrowser fileBrowser;
TagProcessing tagPocessing; TagProcessing tagPocessing;
@ -140,6 +113,6 @@ Settings &values();
void restore(); void restore();
void save(); void save();
} } // namespace Settings
#endif // SETTINGS_H #endif // SETTINGS_H

View File

@ -14,7 +14,7 @@ namespace Settings {
const char *TargetLevelModel::fieldName(TagTargetLevel targetLevel) const char *TargetLevelModel::fieldName(TagTargetLevel targetLevel)
{ {
switch(targetLevel) { switch (targetLevel) {
case TagTargetLevel::Unspecified: case TagTargetLevel::Unspecified:
return QT_TR_NOOP("unspecified, everything"); return QT_TR_NOOP("unspecified, everything");
case TagTargetLevel::Shot: case TagTargetLevel::Shot:
@ -46,8 +46,8 @@ QString TargetLevelModel::labelForId(const QVariant &id) const
return translatedFieldName(static_cast<TagTargetLevel>(id.toInt())); return translatedFieldName(static_cast<TagTargetLevel>(id.toInt()));
} }
TargetLevelModel::TargetLevelModel(QObject *parent, DefaultSelection defaultSelection) : TargetLevelModel::TargetLevelModel(QObject *parent, DefaultSelection defaultSelection)
ChecklistModel(parent) : ChecklistModel(parent)
{ {
QList<ChecklistItem> items; QList<ChecklistItem> items;
items.reserve(8); items.reserve(8);
@ -63,30 +63,28 @@ TargetLevelModel::TargetLevelModel(QObject *parent, DefaultSelection defaultSele
setItems(items); setItems(items);
} }
TargetLevelModel::TargetLevelModel(const QList<Models::ChecklistItem> &items, QObject *parent) : TargetLevelModel::TargetLevelModel(const QList<Models::ChecklistItem> &items, QObject *parent)
ChecklistModel(parent) : ChecklistModel(parent)
{ {
setItems(items); setItems(items);
} }
QVariant TargetLevelModel::headerData(int section, Qt::Orientation orientation, int role) const QVariant TargetLevelModel::headerData(int section, Qt::Orientation orientation, int role) const
{ {
switch(orientation) { switch (orientation) {
case Qt::Horizontal: case Qt::Horizontal:
switch(role) { switch (role) {
case Qt::DisplayRole: case Qt::DisplayRole:
switch(section) { switch (section) {
case 0: case 0:
return tr("Target level"); return tr("Target level");
default: default:;
;
} }
} }
break; break;
default: default:;
;
} }
return QVariant(); return QVariant();
} }
} } // namespace Settings

View File

@ -12,15 +12,10 @@ DECLARE_ENUM_CLASS(TagTargetLevel, unsigned char);
namespace Settings { namespace Settings {
class TargetLevelModel : public Models::ChecklistModel class TargetLevelModel : public Models::ChecklistModel {
{
Q_OBJECT Q_OBJECT
public: public:
enum class DefaultSelection enum class DefaultSelection { None, MostUsefulTargets };
{
None,
MostUsefulTargets
};
static const char *fieldName(TagParser::TagTargetLevel targetLevel); static const char *fieldName(TagParser::TagTargetLevel targetLevel);
static QString translatedFieldName(TagParser::TagTargetLevel targetLevel); static QString translatedFieldName(TagParser::TagTargetLevel targetLevel);
@ -38,6 +33,6 @@ inline Models::ChecklistItem TargetLevelModel::mkItem(TagParser::TagTargetLevel
return Models::ChecklistItem(static_cast<int>(field), translatedFieldName(field), checkState); return Models::ChecklistItem(static_cast<int>(field), translatedFieldName(field), checkState);
} }
} } // namespace Settings
#endif // TARGETLEVELMODEL_H #endif // TARGETLEVELMODEL_H

View File

@ -1,54 +1,53 @@
#include "./htmlinfo.h" #include "./htmlinfo.h"
#include "./utility.h" #include "./utility.h"
#include <tagparser/signature.h> #include <tagparser/abstractattachment.h>
#include <tagparser/mediafileinfo.h>
#include <tagparser/abstractcontainer.h> #include <tagparser/abstractcontainer.h>
#include <tagparser/abstracttrack.h>
#include <tagparser/matroska/matroskacontainer.h> #include <tagparser/matroska/matroskacontainer.h>
#include <tagparser/matroska/matroskaeditionentry.h> #include <tagparser/matroska/matroskaeditionentry.h>
#include <tagparser/mediafileinfo.h>
#include <tagparser/mp4/mp4container.h> #include <tagparser/mp4/mp4container.h>
#include <tagparser/abstracttrack.h> #include <tagparser/signature.h>
#include <tagparser/abstractattachment.h>
#include <qtutilities/resources/resources.h> #include <qtutilities/resources/resources.h>
#include <c++utilities/chrono/timespan.h>
#include <c++utilities/chrono/datetime.h> #include <c++utilities/chrono/datetime.h>
#include <c++utilities/chrono/timespan.h>
#include <c++utilities/conversion/stringconversion.h> #include <c++utilities/conversion/stringconversion.h>
#if defined(TAGEDITOR_GUI_QTWIDGETS) #if defined(TAGEDITOR_GUI_QTWIDGETS)
# include <QApplication> #include <QApplication>
# include <QStyle> #include <QStyle>
#elif defined(TAGEDITOR_GUI_QTQUICK) #elif defined(TAGEDITOR_GUI_QTQUICK)
# include <QGuiApplication> #include <QGuiApplication>
#endif #endif
#if defined(TAGEDITOR_GUI_QTWIDGETS) || defined(TAGEDITOR_GUI_QTQUICK) #if defined(TAGEDITOR_GUI_QTWIDGETS) || defined(TAGEDITOR_GUI_QTQUICK)
# include <QFont> #include <QFont>
# include <QFontMetrics> #include <QFontMetrics>
# include <QIcon> #include <QIcon>
#endif #endif
#include <QString>
#include <QStringBuilder>
#include <QResource>
#include <QBuffer> #include <QBuffer>
#include <QByteArray> #include <QByteArray>
#include <QResource>
#include <QString>
#include <QStringBuilder>
#include <QXmlStreamWriter> #include <QXmlStreamWriter>
#ifdef QT_DEBUG #ifdef QT_DEBUG
# include <QFile> #include <QFile>
#endif #endif
#include <list> #include <list>
#if defined(TAGEDITOR_GUI_QTWIDGETS) || defined(TAGEDITOR_GUI_QTQUICK) #if defined(TAGEDITOR_GUI_QTWIDGETS) || defined(TAGEDITOR_GUI_QTQUICK)
# define APPEND_GUI_RULE(rule, fallback) \ #define APPEND_GUI_RULE(rule, fallback) \
if(ApplicationInstances::hasGuiApp()) { \ if (ApplicationInstances::hasGuiApp()) { \
res.append(rule); \ res.append(rule); \
} else { \ } else { \
res.append(fallback); \ res.append(fallback); \
} }
#else #else
# define APPEND_GUI_RULE(rule, fallback) \ #define APPEND_GUI_RULE(rule, fallback) res.append(fallback);
res.append(fallback);
#endif #endif
using namespace std; using namespace std;
@ -69,13 +68,13 @@ inline QString qstr(const string &stdstr)
return QString::fromUtf8(stdstr.data(), static_cast<int>(stdstr.size())); return QString::fromUtf8(stdstr.data(), static_cast<int>(stdstr.size()));
} }
class RowMaker class RowMaker {
{
public: public:
RowMaker(QXmlStreamWriter &writer) : RowMaker(QXmlStreamWriter &writer)
writer(writer), : writer(writer)
m_even(true) , m_even(true)
{} {
}
void reset() void reset()
{ {
@ -85,7 +84,7 @@ public:
void startRow(const QString &label, bool head = true) void startRow(const QString &label, bool head = true)
{ {
writer.writeStartElement(QStringLiteral("tr")); writer.writeStartElement(QStringLiteral("tr"));
if((m_even = !m_even)) { if ((m_even = !m_even)) {
writer.writeAttribute(QStringLiteral("class"), QStringLiteral("even")); writer.writeAttribute(QStringLiteral("class"), QStringLiteral("even"));
} }
writer.writeTextElement(head ? QStringLiteral("th") : QStringLiteral("td"), label); writer.writeTextElement(head ? QStringLiteral("th") : QStringLiteral("td"), label);
@ -95,7 +94,7 @@ public:
void startRow(const QString &label, const QString &helpText) void startRow(const QString &label, const QString &helpText)
{ {
writer.writeStartElement(QStringLiteral("tr")); writer.writeStartElement(QStringLiteral("tr"));
if((m_even = !m_even)) { if ((m_even = !m_even)) {
writer.writeAttribute(QStringLiteral("class"), QStringLiteral("even")); writer.writeAttribute(QStringLiteral("class"), QStringLiteral("even"));
} }
writer.writeAttribute(QStringLiteral("title"), helpText); writer.writeAttribute(QStringLiteral("title"), helpText);
@ -134,12 +133,12 @@ public:
void startSubTab(const QString &subLabel, size_t index, unsigned int level = 0) void startSubTab(const QString &subLabel, size_t index, unsigned int level = 0)
{ {
writer.writeStartElement(QStringLiteral("tr")); writer.writeStartElement(QStringLiteral("tr"));
if((m_even = !m_even)) { if ((m_even = !m_even)) {
writer.writeAttribute(QStringLiteral("class"), QStringLiteral("even")); writer.writeAttribute(QStringLiteral("class"), QStringLiteral("even"));
} }
writer.writeStartElement(QStringLiteral("th")); writer.writeStartElement(QStringLiteral("th"));
writer.writeCharacters(subLabel % QStringLiteral(" #") % QString::number(index)); writer.writeCharacters(subLabel % QStringLiteral(" #") % QString::number(index));
if(level) { if (level) {
writer.writeEmptyElement(QStringLiteral("br")); writer.writeEmptyElement(QStringLiteral("br"));
writer.writeCharacters(QString::number(level)); writer.writeCharacters(QString::number(level));
} }
@ -153,7 +152,7 @@ public:
void startSubTab(const QString &subLabel) void startSubTab(const QString &subLabel)
{ {
writer.writeStartElement(QStringLiteral("tr")); writer.writeStartElement(QStringLiteral("tr"));
if((m_even = !m_even)) { if ((m_even = !m_even)) {
writer.writeAttribute(QStringLiteral("class"), QStringLiteral("even")); writer.writeAttribute(QStringLiteral("class"), QStringLiteral("even"));
} }
writer.writeTextElement(QStringLiteral("th"), subLabel); writer.writeTextElement(QStringLiteral("th"), subLabel);
@ -166,7 +165,7 @@ public:
void startHorizontalSubTab(const QString &subLabel, const QStringList &headerLabels) void startHorizontalSubTab(const QString &subLabel, const QStringList &headerLabels)
{ {
writer.writeStartElement(QStringLiteral("tr")); writer.writeStartElement(QStringLiteral("tr"));
if((m_even = !m_even)) { if ((m_even = !m_even)) {
writer.writeAttribute(QStringLiteral("class"), QStringLiteral("even")); writer.writeAttribute(QStringLiteral("class"), QStringLiteral("even"));
} }
writer.writeTextElement(QStringLiteral("th"), subLabel); writer.writeTextElement(QStringLiteral("th"), subLabel);
@ -175,7 +174,7 @@ public:
writer.writeAttribute(QStringLiteral("class"), QStringLiteral("headerhorizontal")); writer.writeAttribute(QStringLiteral("class"), QStringLiteral("headerhorizontal"));
writer.writeStartElement(QStringLiteral("thead")); writer.writeStartElement(QStringLiteral("thead"));
writer.writeStartElement(QStringLiteral("tr")); writer.writeStartElement(QStringLiteral("tr"));
for(const auto &label : headerLabels) { for (const auto &label : headerLabels) {
writer.writeTextElement(QStringLiteral("th"), label); writer.writeTextElement(QStringLiteral("th"), label);
} }
writer.writeEndElement(); writer.writeEndElement();
@ -199,7 +198,7 @@ private:
QString mkFontStyle(const QFont &font) QString mkFontStyle(const QFont &font)
{ {
QString style; QString style;
switch(font.style()) { switch (font.style()) {
case QFont::StyleItalic: case QFont::StyleItalic:
style = QStringLiteral("italic"); style = QStringLiteral("italic");
break; break;
@ -210,7 +209,7 @@ QString mkFontStyle(const QFont &font)
style = QStringLiteral("normal"); style = QStringLiteral("normal");
} }
QString weight; QString weight;
switch(font.weight()) { switch (font.weight()) {
case QFont::Light: case QFont::Light:
weight = QStringLiteral("light"); weight = QStringLiteral("light");
break; break;
@ -224,7 +223,7 @@ QString mkFontStyle(const QFont &font)
weight = QStringLiteral("normal"); weight = QStringLiteral("normal");
} }
QString size; QString size;
if(font.pixelSize() > 0) { if (font.pixelSize() > 0) {
size = QStringLiteral("%1px").arg(font.pixelSize()); size = QStringLiteral("%1px").arg(font.pixelSize());
} else { } else {
size = QStringLiteral("%1pt").arg(font.pointSize()); size = QStringLiteral("%1pt").arg(font.pointSize());
@ -232,8 +231,8 @@ QString mkFontStyle(const QFont &font)
return QStringLiteral("font-family: \"%1\", sans-serif;" return QStringLiteral("font-family: \"%1\", sans-serif;"
"font-style: %2;" "font-style: %2;"
"font-weight: %3;" "font-weight: %3;"
"font-size: %4;").arg( "font-size: %4;")
font.family(), style, weight, size); .arg(font.family(), style, weight, size);
} }
QByteArray mkBase64(const QIcon &icon) QByteArray mkBase64(const QIcon &icon)
@ -269,26 +268,28 @@ const QByteArray &mkDebugIconData()
return data; return data;
} }
template<class ElementType> void mkElementContent(QXmlStreamWriter &, ElementType *) template <class ElementType> void mkElementContent(QXmlStreamWriter &, ElementType *)
{}
template<> void mkElementContent(QXmlStreamWriter &writer, EbmlElement *element)
{ {
switch(element->id()) { }
template <> void mkElementContent(QXmlStreamWriter &writer, EbmlElement *element)
{
switch (element->id()) {
case MatroskaIds::SeekID: { case MatroskaIds::SeekID: {
const uint64 seekId = element->readUInteger(); const uint64 seekId = element->readUInteger();
writer.writeCharacters(QStringLiteral(", denoted type: 0x")); writer.writeCharacters(QStringLiteral(", denoted type: 0x"));
writer.writeCharacters(QString::number(seekId, 16)); writer.writeCharacters(QString::number(seekId, 16));
if(seekId <= numeric_limits<uint32>::max()) { if (seekId <= numeric_limits<uint32>::max()) {
const char *const seekIdName = matroskaIdName(static_cast<uint32>(seekId)); const char *const seekIdName = matroskaIdName(static_cast<uint32>(seekId));
if(*seekIdName) { if (*seekIdName) {
writer.writeCharacters(QStringLiteral(" \"")); writer.writeCharacters(QStringLiteral(" \""));
writer.writeCharacters(QString::fromLatin1(seekIdName)); writer.writeCharacters(QString::fromLatin1(seekIdName));
writer.writeCharacters(QStringLiteral("\"")); writer.writeCharacters(QStringLiteral("\""));
} }
} }
break; break;
} case MatroskaIds::SeekPosition: { }
case MatroskaIds::SeekPosition: {
writer.writeCharacters(QStringLiteral(", denoted position: ")); writer.writeCharacters(QStringLiteral(", denoted position: "));
const uint64 seekPos = element->readUInteger(); const uint64 seekPos = element->readUInteger();
const auto seekPosStr = QString::number(seekPos); const auto seekPosStr = QString::number(seekPos);
@ -299,22 +300,21 @@ template<> void mkElementContent(QXmlStreamWriter &writer, EbmlElement *element)
writer.writeCharacters(seekPosStr); writer.writeCharacters(seekPosStr);
writer.writeEndElement(); writer.writeEndElement();
break; break;
} default: }
; default:;
} }
} }
class Generator class Generator {
{
public: public:
Generator(const MediaFileInfo &file, Diagnostics &diag, Diagnostics &diagReparsing)
Generator(const MediaFileInfo &file, Diagnostics &diag, Diagnostics &diagReparsing) : : m_writer(&m_res)
m_writer(&m_res), , m_rowMaker(m_writer)
m_rowMaker(m_writer), , m_file(file)
m_file(file), , m_diag(diag)
m_diag(diag), , m_diagReparsing(diagReparsing)
m_diagReparsing(diagReparsing) {
{} }
QString mkStyle() QString mkStyle()
{ {
@ -324,7 +324,7 @@ public:
"margin: 0px;")); "margin: 0px;"));
#ifndef GUI_NONE #ifndef GUI_NONE
QPalette palette; QPalette palette;
if(ApplicationInstances::hasGuiApp()) { if (ApplicationInstances::hasGuiApp()) {
palette = QGuiApplication::palette(); palette = QGuiApplication::palette();
res.append(mkFontStyle(QGuiApplication::font())); res.append(mkFontStyle(QGuiApplication::font()));
res.append(QStringLiteral("background-color: %1;").arg(palette.color(QPalette::Base).name())); res.append(QStringLiteral("background-color: %1;").arg(palette.color(QPalette::Base).name()));
@ -338,22 +338,25 @@ public:
#endif #endif
res.append(QStringLiteral("}" res.append(QStringLiteral("}"
"a:link, #structure .parent-node {")); "a:link, #structure .parent-node {"));
APPEND_GUI_RULE(QStringLiteral("color: %1;").arg(palette.color(QPalette::Link).name()), APPEND_GUI_RULE(QStringLiteral("color: %1;").arg(palette.color(QPalette::Link).name()), QStringLiteral("color: #337AB7;"))
QStringLiteral("color: #337AB7;"))
res.append(QStringLiteral("text-decoration: none;" res.append(QStringLiteral("text-decoration: none;"
"}" "}"
"a:focus, a:hover {")); "a:focus, a:hover {"));
APPEND_GUI_RULE(QStringLiteral("color: %1;").arg(palette.link().color().darker(palette.color(QPalette::Background).lightness() > palette.color(QPalette::Link).lightness() ? 150 : 50).name()), APPEND_GUI_RULE(QStringLiteral("color: %1;")
.arg(palette.link()
.color()
.darker(palette.color(QPalette::Background).lightness() > palette.color(QPalette::Link).lightness() ? 150 : 50)
.name()),
QStringLiteral("color: #23527c;")) QStringLiteral("color: #23527c;"))
res.append(QStringLiteral("text-decoration: underline;" res.append(QStringLiteral("text-decoration: underline;"
"} table {" "} table {"
"border-collapse: collapse;" "border-collapse: collapse;"
"width: 100%;" "width: 100%;"
"} tr {")); "} tr {"));
APPEND_GUI_RULE(QStringLiteral("background-color: %1;").arg(palette.color(QPalette::Base).name()), APPEND_GUI_RULE(QStringLiteral("background-color: %1;").arg(palette.color(QPalette::Base).name()), QStringLiteral("background-color: #fff;"))
QStringLiteral("background-color: #fff;"))
res.append(QStringLiteral("} tr.even {")); res.append(QStringLiteral("} tr.even {"));
APPEND_GUI_RULE(QStringLiteral("background-color: %1!important;").arg(palette.color(QPalette::AlternateBase).name()), QStringLiteral("background-color: #fafafa!important;")) APPEND_GUI_RULE(QStringLiteral("background-color: %1!important;").arg(palette.color(QPalette::AlternateBase).name()),
QStringLiteral("background-color: #fafafa!important;"))
res.append(QStringLiteral("}" res.append(QStringLiteral("}"
"table.headervertical th, table.headervertical td {" "table.headervertical th, table.headervertical td {"
"padding: 2px 5px;" "padding: 2px 5px;"
@ -404,7 +407,7 @@ public:
"margin-right: 5px;" "margin-right: 5px;"
"}")); "}"));
#if defined(TAGEDITOR_GUI_QTWIDGETS) #if defined(TAGEDITOR_GUI_QTWIDGETS)
if(ApplicationInstances::hasWidgetsApp()) { if (ApplicationInstances::hasWidgetsApp()) {
res.append(QStringLiteral("td.warning {background-image: url(data:image/png;base64,")); res.append(QStringLiteral("td.warning {background-image: url(data:image/png;base64,"));
res.append(mkWarningIconData()); res.append(mkWarningIconData());
res.append(QStringLiteral(");}td.critical {background-image: url(data:image/png;base64,")); res.append(QStringLiteral(");}td.critical {background-image: url(data:image/png;base64,"));
@ -517,134 +520,156 @@ public:
{ {
RowMaker rowMaker(m_writer); RowMaker rowMaker(m_writer);
rowMaker.startSubTab(QCoreApplication::translate("HtmlInfo", "Track"), trackNumber); rowMaker.startSubTab(QCoreApplication::translate("HtmlInfo", "Track"), trackNumber);
if(track->id()) { if (track->id()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "ID"), QCoreApplication::translate("HtmlInfo", "The unique number used to identify the track in the container file."), QString::number(track->id())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "ID"),
QCoreApplication::translate("HtmlInfo", "The unique number used to identify the track in the container file."),
QString::number(track->id()));
} }
if(track->trackNumber()) { if (track->trackNumber()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Number"), QCoreApplication::translate("HtmlInfo", "The index of the track in the container file."), QString::number(track->trackNumber())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Number"),
QCoreApplication::translate("HtmlInfo", "The index of the track in the container file."), QString::number(track->trackNumber()));
} }
if(!track->name().empty()) { if (!track->name().empty()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Name"), qstr(track->name())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Name"), qstr(track->name()));
} }
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Type"), qstr(track->mediaTypeName())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Type"), qstr(track->mediaTypeName()));
const char *fmtName = track->formatName(), *fmtAbbr = track->formatAbbreviation(); const char *fmtName = track->formatName(), *fmtAbbr = track->formatAbbreviation();
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Format"), QCoreApplication::translate("HtmlInfo", "The unabbreviated name of the track's format."), qstr(fmtName)); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Format"),
if(track->format() != GeneralMediaFormat::Unknown && strcmp(fmtName, fmtAbbr)) { // format name and abbreviation differ QCoreApplication::translate("HtmlInfo", "The unabbreviated name of the track's format."), qstr(fmtName));
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Abbreviation"), QCoreApplication::translate("HtmlInfo", "The abbreviated name of the track's format."), qstr(fmtAbbr)); if (track->format() != GeneralMediaFormat::Unknown && strcmp(fmtName, fmtAbbr)) { // format name and abbreviation differ
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Abbreviation"),
QCoreApplication::translate("HtmlInfo", "The abbreviated name of the track's format."), qstr(fmtAbbr));
} }
if(track->version() != 0.0) { if (track->version() != 0.0) {
switch(track->format().general) { switch (track->format().general) {
case GeneralMediaFormat::Mpeg4Video: case GeneralMediaFormat::Mpeg4Video:
case GeneralMediaFormat::Avc: case GeneralMediaFormat::Avc:
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Level"), QCoreApplication::translate("HtmlInfo", "The version/level of the track's format."), QChar('L') + QString::number(track->version())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Level"),
QCoreApplication::translate("HtmlInfo", "The version/level of the track's format."),
QChar('L') + QString::number(track->version()));
break; break;
default: default:
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Version"), QCoreApplication::translate("HtmlInfo", "The version/level of the track's format."), QString::number(track->version())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Version"),
QCoreApplication::translate("HtmlInfo", "The version/level of the track's format."), QString::number(track->version()));
} }
} }
fmtName = track->format().extensionName(); fmtName = track->format().extensionName();
if(*fmtName) { if (*fmtName) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Extension"), QCoreApplication::translate("HtmlInfo", "Used format extensions."), qstr(fmtName)); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Extension"), QCoreApplication::translate("HtmlInfo", "Used format extensions."),
qstr(fmtName));
} }
if(!track->formatId().empty()) { if (!track->formatId().empty()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Format/codec ID"), QCoreApplication::translate("HtmlInfo", "The raw format/codec identifier extracted from the container."), qstr(track->formatId())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Format/codec ID"),
QCoreApplication::translate("HtmlInfo", "The raw format/codec identifier extracted from the container."), qstr(track->formatId()));
} }
if(track->size()) { if (track->size()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Size"), qstr(dataSizeToString(track->size(), true))); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Size"), qstr(dataSizeToString(track->size(), true)));
} }
if(!track->duration().isNull()) { if (!track->duration().isNull()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Duration"), qstr(track->duration().toString(TimeSpanOutputFormat::WithMeasures)) % QStringLiteral(" (") % QString::number(track->duration().totalTicks()) % QChar(')')); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Duration"),
qstr(track->duration().toString(TimeSpanOutputFormat::WithMeasures)) % QStringLiteral(" (")
% QString::number(track->duration().totalTicks()) % QChar(')'));
} }
if(track->bitrate() != 0.0) { if (track->bitrate() != 0.0) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Avg. bitrate"), qstr(bitrateToString(track->bitrate()))); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Avg. bitrate"), qstr(bitrateToString(track->bitrate())));
} }
if(track->maxBitrate() != 0.0) { if (track->maxBitrate() != 0.0) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Maximum bitrate"), qstr(bitrateToString(track->maxBitrate()))); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Maximum bitrate"), qstr(bitrateToString(track->maxBitrate())));
} }
if(!track->creationTime().isNull()) { if (!track->creationTime().isNull()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Creation time"), qstr(track->creationTime().toString(DateTimeOutputFormat::DateAndTime, true))); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Creation time"),
qstr(track->creationTime().toString(DateTimeOutputFormat::DateAndTime, true)));
} }
if(!track->modificationTime().isNull()) { if (!track->modificationTime().isNull()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Modification time"), qstr(track->modificationTime().toString(DateTimeOutputFormat::DateAndTime, true))); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Modification time"),
qstr(track->modificationTime().toString(DateTimeOutputFormat::DateAndTime, true)));
} }
if(!track->language().empty()) { if (!track->language().empty()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Language"), qstr(track->language())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Language"), qstr(track->language()));
} }
if(!track->compressorName().empty()) { if (!track->compressorName().empty()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Compressor name"), qstr(track->compressorName())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Compressor name"), qstr(track->compressorName()));
} }
if(track->samplingFrequency()) { if (track->samplingFrequency()) {
if(track->extensionSamplingFrequency()) { if (track->extensionSamplingFrequency()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Sampling frequency"), QString::number(track->extensionSamplingFrequency()) % QStringLiteral(" Hz / ") % QString::number(track->samplingFrequency()) % QStringLiteral(" Hz")); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Sampling frequency"),
QString::number(track->extensionSamplingFrequency()) % QStringLiteral(" Hz / ") % QString::number(track->samplingFrequency())
% QStringLiteral(" Hz"));
} else { } else {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Sampling frequency"), QString::number(track->samplingFrequency()) + QStringLiteral(" Hz")); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Sampling frequency"),
QString::number(track->samplingFrequency()) + QStringLiteral(" Hz"));
} }
} }
if(track->sampleCount()) { if (track->sampleCount()) {
rowMaker.mkRow(track->mediaType() == MediaType::Video rowMaker.mkRow(track->mediaType() == MediaType::Video ? QCoreApplication::translate("HtmlInfo", "Frame count")
? QCoreApplication::translate("HtmlInfo", "Frame count")
: QCoreApplication::translate("HtmlInfo", "Sample count"), : QCoreApplication::translate("HtmlInfo", "Sample count"),
QString::number(track->sampleCount())); QString::number(track->sampleCount()));
} }
if(track->bitsPerSample()) { if (track->bitsPerSample()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Bits per sample"), QString::number(track->bitsPerSample())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Bits per sample"), QString::number(track->bitsPerSample()));
} }
if(track->quality()) { if (track->quality()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Quality"), QString::number(track->quality())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Quality"), QString::number(track->quality()));
} }
if(!track->pixelSize().isNull()) { if (!track->pixelSize().isNull()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Pixel size"), qstr(track->pixelSize().toString())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Pixel size"), qstr(track->pixelSize().toString()));
} }
if(!track->displaySize().isNull()) { if (!track->displaySize().isNull()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Display size"), qstr(track->displaySize().toString())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Display size"), qstr(track->displaySize().toString()));
} }
if(track->pixelAspectRatio().isValid()) { if (track->pixelAspectRatio().isValid()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Pixel Aspect Ratio"), QString::number(track->pixelAspectRatio().numerator) % QStringLiteral(" : ") % QString::number(track->pixelAspectRatio().denominator)); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Pixel Aspect Ratio"),
QString::number(track->pixelAspectRatio().numerator) % QStringLiteral(" : ")
% QString::number(track->pixelAspectRatio().denominator));
} }
if(!track->cropping().isNull()) { if (!track->cropping().isNull()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Cropping"), qstr(track->cropping().toString())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Cropping"), qstr(track->cropping().toString()));
} }
if(!track->resolution().isNull()) { if (!track->resolution().isNull()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Resolution"), qstr(track->resolution().toString())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Resolution"), qstr(track->resolution().toString()));
} }
if(track->channelConfigString()) { if (track->channelConfigString()) {
if(track->extensionChannelConfigString()) { if (track->extensionChannelConfigString()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Channel config"), QCoreApplication::translate("HtmlInfo", "Channel configuration"), QStringLiteral("%1 / %2").arg(QString::fromUtf8(track->extensionChannelConfigString()), QString::fromUtf8(track->channelConfigString()))); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Channel config"),
QCoreApplication::translate("HtmlInfo", "Channel configuration"),
QStringLiteral("%1 / %2").arg(
QString::fromUtf8(track->extensionChannelConfigString()), QString::fromUtf8(track->channelConfigString())));
} else { } else {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Channel config"), QCoreApplication::translate("HtmlInfo", "Channel configuration"), QString::fromUtf8(track->channelConfigString())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Channel config"),
QCoreApplication::translate("HtmlInfo", "Channel configuration"), QString::fromUtf8(track->channelConfigString()));
} }
} else if(track->channelCount()) { } else if (track->channelCount()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Channel count"), QString::number(track->channelCount())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Channel count"), QString::number(track->channelCount()));
} }
if(track->depth()) { if (track->depth()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Bit depth"), QString::number(track->depth())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Bit depth"), QString::number(track->depth()));
} }
if(track->fps()) { if (track->fps()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Frames per second"), QString::number(track->fps())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Frames per second"), QString::number(track->fps()));
} }
if(track->chromaFormat()) { if (track->chromaFormat()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Chroma format"), qstr(track->chromaFormat())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Chroma format"), qstr(track->chromaFormat()));
} }
QStringList labels; QStringList labels;
if(track->isInterlaced()) { if (track->isInterlaced()) {
labels << QCoreApplication::translate("HtmlInfo", "interlaced"); labels << QCoreApplication::translate("HtmlInfo", "interlaced");
} }
if(!track->isEnabled()) { if (!track->isEnabled()) {
labels << QCoreApplication::translate("HtmlInfo", "disabled"); labels << QCoreApplication::translate("HtmlInfo", "disabled");
} }
if(track->isDefault()) { if (track->isDefault()) {
labels << QCoreApplication::translate("HtmlInfo", "default"); labels << QCoreApplication::translate("HtmlInfo", "default");
} }
if(track->isForced()) { if (track->isForced()) {
labels << QCoreApplication::translate("HtmlInfo", "forced"); labels << QCoreApplication::translate("HtmlInfo", "forced");
} }
if(track->hasLacing()) { if (track->hasLacing()) {
labels << QCoreApplication::translate("HtmlInfo", "has lacing"); labels << QCoreApplication::translate("HtmlInfo", "has lacing");
} }
if(track->isEncrypted()) { if (track->isEncrypted()) {
labels << QCoreApplication::translate("HtmlInfo", "encrypted"); labels << QCoreApplication::translate("HtmlInfo", "encrypted");
} }
if(!labels.isEmpty()) { if (!labels.isEmpty()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Labeled as"), labels.join(QStringLiteral(", "))); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Labeled as"), labels.join(QStringLiteral(", ")));
} }
rowMaker.endSubTab(); rowMaker.endSubTab();
@ -654,19 +679,20 @@ public:
{ {
RowMaker rowMaker(m_writer); RowMaker rowMaker(m_writer);
m_rowMaker.startSubTab(QCoreApplication::translate("HtmlInfo", "Attachment"), attachmentNumber); m_rowMaker.startSubTab(QCoreApplication::translate("HtmlInfo", "Attachment"), attachmentNumber);
if(attachment->id()) { if (attachment->id()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "ID"), QString::number(attachment->id())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "ID"), QString::number(attachment->id()));
} }
if(!attachment->name().empty()) { if (!attachment->name().empty()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Name"), qstr(attachment->name())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Name"), qstr(attachment->name()));
} }
if(attachment->data()) { if (attachment->data()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Size"), qstr(dataSizeToString(static_cast<uint64>(attachment->data()->size()), true))); rowMaker.mkRow(
QCoreApplication::translate("HtmlInfo", "Size"), qstr(dataSizeToString(static_cast<uint64>(attachment->data()->size()), true)));
} }
if(!attachment->mimeType().empty()) { if (!attachment->mimeType().empty()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Mime-type"), qstr(attachment->mimeType())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Mime-type"), qstr(attachment->mimeType()));
} }
if(!attachment->description().empty()) { if (!attachment->description().empty()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Description"), qstr(attachment->description())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Description"), qstr(attachment->description()));
} }
rowMaker.endSubTab(); rowMaker.endSubTab();
@ -676,40 +702,42 @@ public:
{ {
RowMaker rowMaker(m_writer); RowMaker rowMaker(m_writer);
rowMaker.startSubTab(QCoreApplication::translate("HtmlInfo", "Chapter"), chapterNumber + 1, level); rowMaker.startSubTab(QCoreApplication::translate("HtmlInfo", "Chapter"), chapterNumber + 1, level);
if(chapter.id()) { if (chapter.id()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "ID"), QString::number(chapter.id())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "ID"), QString::number(chapter.id()));
} }
for(const LocaleAwareString &name : chapter.names()) { for (const LocaleAwareString &name : chapter.names()) {
static const string delim(", "); static const string delim(", ");
const string locale = joinStrings(initializer_list<string>{joinStrings(name.languages(), delim, true), joinStrings(name.countries(), delim, true)}, delim, true); const string locale = joinStrings(
initializer_list<string>{ joinStrings(name.languages(), delim, true), joinStrings(name.countries(), delim, true) }, delim, true);
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Name (%1)").arg(qstr(locale)), qstr(name)); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Name (%1)").arg(qstr(locale)), qstr(name));
} }
if(!chapter.startTime().isNegative()) { if (!chapter.startTime().isNegative()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Start time"), qstr(chapter.startTime().toString(TimeSpanOutputFormat::WithMeasures))); rowMaker.mkRow(
QCoreApplication::translate("HtmlInfo", "Start time"), qstr(chapter.startTime().toString(TimeSpanOutputFormat::WithMeasures)));
} }
if(!chapter.endTime().isNegative()) { if (!chapter.endTime().isNegative()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "End time"), qstr(chapter.endTime().toString(TimeSpanOutputFormat::WithMeasures))); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "End time"), qstr(chapter.endTime().toString(TimeSpanOutputFormat::WithMeasures)));
} }
QStringList labels; QStringList labels;
if(chapter.isHidden()) { if (chapter.isHidden()) {
labels << QCoreApplication::translate("HtmlInfo", "hidden"); labels << QCoreApplication::translate("HtmlInfo", "hidden");
} }
if(!chapter.isEnabled()) { if (!chapter.isEnabled()) {
labels << QCoreApplication::translate("HtmlInfo", "disabled"); labels << QCoreApplication::translate("HtmlInfo", "disabled");
} }
if(!labels.empty()) { if (!labels.empty()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Labeled as"), labels.join(QStringLiteral(", "))); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Labeled as"), labels.join(QStringLiteral(", ")));
} }
if(!chapter.tracks().empty()) { if (!chapter.tracks().empty()) {
QStringList trackIds; QStringList trackIds;
for(uint64 id : chapter.tracks()) { for (uint64 id : chapter.tracks()) {
trackIds << QString::number(id); trackIds << QString::number(id);
} }
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Tracks"), trackIds.join(QStringLiteral(", "))); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Tracks"), trackIds.join(QStringLiteral(", ")));
} }
rowMaker.endSubTab(); rowMaker.endSubTab();
++level; ++level;
for(size_t i = 0, nestedChapters = chapter.nestedChapterCount(); i < nestedChapters; ++i) { for (size_t i = 0, nestedChapters = chapter.nestedChapterCount(); i < nestedChapters; ++i) {
mkChapter(*chapter.nestedChapter(i), i, level); mkChapter(*chapter.nestedChapter(i), i, level);
} }
} }
@ -718,46 +746,48 @@ public:
{ {
RowMaker rowMaker(m_writer); RowMaker rowMaker(m_writer);
rowMaker.startSubTab(QCoreApplication::translate("HtmlInfo", "Edition"), editionNumber + 1); rowMaker.startSubTab(QCoreApplication::translate("HtmlInfo", "Edition"), editionNumber + 1);
if(edition.id()) { if (edition.id()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "ID"), QString::number(edition.id())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "ID"), QString::number(edition.id()));
} }
QStringList labels; QStringList labels;
if(edition.isHidden()) { if (edition.isHidden()) {
labels << QCoreApplication::translate("HtmlInfo", "hidden"); labels << QCoreApplication::translate("HtmlInfo", "hidden");
} }
if(edition.isDefault()) { if (edition.isDefault()) {
labels << QCoreApplication::translate("HtmlInfo", "default"); labels << QCoreApplication::translate("HtmlInfo", "default");
} }
if(edition.isOrdered()) { if (edition.isOrdered()) {
labels << QCoreApplication::translate("HtmlInfo", "ordered"); labels << QCoreApplication::translate("HtmlInfo", "ordered");
} }
if(!labels.isEmpty()) { if (!labels.isEmpty()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Labeled as"), labels.join(QStringLiteral(", "))); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Labeled as"), labels.join(QStringLiteral(", ")));
} }
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Chapters"), rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Chapters"),
QCoreApplication::translate("HtmlInfo", "edition contains %1 chapter(s)", nullptr, static_cast<int>(edition.chapters().size())).arg(edition.chapters().size())); QCoreApplication::translate("HtmlInfo", "edition contains %1 chapter(s)", nullptr, static_cast<int>(edition.chapters().size()))
.arg(edition.chapters().size()));
rowMaker.endSubTab(); rowMaker.endSubTab();
unsigned int chapterNumber = 0; unsigned int chapterNumber = 0;
for(const auto &chapter : edition.chapters()) { for (const auto &chapter : edition.chapters()) {
mkChapter(*chapter, chapterNumber); mkChapter(*chapter, chapterNumber);
++chapterNumber; ++chapterNumber;
} }
} }
template<class ElementType, bool isAdditional = false> void mkElementNode(ElementType *element) template <class ElementType, bool isAdditional = false> void mkElementNode(ElementType *element)
{ {
m_writer.writeStartElement(QStringLiteral("ul")); m_writer.writeStartElement(QStringLiteral("ul"));
m_writer.writeAttribute(QStringLiteral("class"), element && element->parent() ? QStringLiteral("nodecollapsed") : QStringLiteral("nodeexpanded")); m_writer.writeAttribute(
while(element) { QStringLiteral("class"), element && element->parent() ? QStringLiteral("nodecollapsed") : QStringLiteral("nodeexpanded"));
if(element->isParsed()) { while (element) {
if (element->isParsed()) {
m_writer.writeStartElement(QStringLiteral("li")); m_writer.writeStartElement(QStringLiteral("li"));
if(element->firstChild()) { if (element->firstChild()) {
m_writer.writeStartElement(QStringLiteral("span")); m_writer.writeStartElement(QStringLiteral("span"));
m_writer.writeAttribute(QStringLiteral("class"), QStringLiteral("parent-node")); m_writer.writeAttribute(QStringLiteral("class"), QStringLiteral("parent-node"));
m_writer.writeAttribute(QStringLiteral("onclick"), QStringLiteral("expandCollapse(this.parentElement);")); m_writer.writeAttribute(QStringLiteral("onclick"), QStringLiteral("expandCollapse(this.parentElement);"));
} }
string idString = element->idToString(); string idString = element->idToString();
if(!idString.empty()) { if (!idString.empty()) {
m_writer.writeTextElement(QStringLiteral("em"), QString::fromLatin1(idString.data(), static_cast<int>(idString.size()))); m_writer.writeTextElement(QStringLiteral("em"), QString::fromLatin1(idString.data(), static_cast<int>(idString.size())));
} }
@ -781,7 +811,7 @@ public:
mkElementContent(m_writer, element); mkElementContent(m_writer, element);
if(element->firstChild()) { if (element->firstChild()) {
m_writer.writeEndElement(); m_writer.writeEndElement();
mkElementNode(element->firstChild()); mkElementNode(element->firstChild());
} }
@ -789,7 +819,7 @@ public:
element = element->nextSibling(); element = element->nextSibling();
m_writer.writeEndElement(); m_writer.writeEndElement();
} else { } else {
if(!isAdditional) { if (!isAdditional) {
m_writer.writeStartElement(QStringLiteral("li")); m_writer.writeStartElement(QStringLiteral("li"));
m_writer.writeAttribute(QStringLiteral("style"), QStringLiteral("color: red;")); m_writer.writeAttribute(QStringLiteral("style"), QStringLiteral("color: red;"));
m_writer.writeCharacters(QCoreApplication::translate("HtmlInfo", "section has not been analyzed")); m_writer.writeCharacters(QCoreApplication::translate("HtmlInfo", "section has not been analyzed"));
@ -801,10 +831,10 @@ public:
m_writer.writeEndElement(); m_writer.writeEndElement();
} }
template<class ContainerType> void mkElementTree(ContainerType *container) template <class ContainerType> void mkElementTree(ContainerType *container)
{ {
mkElementNode(container->firstElement()); mkElementNode(container->firstElement());
for(auto &element : container->additionalElements()) { for (auto &element : container->additionalElements()) {
mkElementNode<typename ContainerType::ContainerElementType, true>(element.get()); mkElementNode<typename ContainerType::ContainerElementType, true>(element.get());
} }
} }
@ -816,16 +846,20 @@ public:
} }
startTableSection(); startTableSection();
const QString moreId(reparsing ? QStringLiteral("notificationsReparsingMore") : QStringLiteral("notificationsMore")); const QString moreId(reparsing ? QStringLiteral("notificationsReparsingMore") : QStringLiteral("notificationsMore"));
m_rowMaker.startRow(reparsing ? QCoreApplication::translate("HtmlInfo", "Notifications (reparsing after saving)") : QCoreApplication::translate("HtmlInfo", "Notifications")); m_rowMaker.startRow(reparsing ? QCoreApplication::translate("HtmlInfo", "Notifications (reparsing after saving)")
m_writer.writeCharacters(QCoreApplication::translate("HtmlInfo", "%1 notification(s) available", nullptr, trQuandity(diag.size())).arg(diag.size())); : QCoreApplication::translate("HtmlInfo", "Notifications"));
m_writer.writeCharacters(
QCoreApplication::translate("HtmlInfo", "%1 notification(s) available", nullptr, trQuandity(diag.size())).arg(diag.size()));
mkSpace(); mkSpace();
mkDetailsLink(moreId, QCoreApplication::translate("HtmlInfo", "show notifications")); mkDetailsLink(moreId, QCoreApplication::translate("HtmlInfo", "show notifications"));
m_rowMaker.endRow(); m_rowMaker.endRow();
m_writer.writeEndElement(); m_writer.writeEndElement();
startExtendedTableSection(moreId); startExtendedTableSection(moreId);
m_rowMaker.startHorizontalSubTab(QString(), QStringList({QString(), QCoreApplication::translate("HtmlInfo", "Context"), QCoreApplication::translate("HtmlInfo", "Message"), QCoreApplication::translate("HtmlInfo", "Time")})); m_rowMaker.startHorizontalSubTab(QString(),
for(const auto &msg : diag) { QStringList({ QString(), QCoreApplication::translate("HtmlInfo", "Context"), QCoreApplication::translate("HtmlInfo", "Message"),
QCoreApplication::translate("HtmlInfo", "Time") }));
for (const auto &msg : diag) {
m_writer.writeStartElement(QStringLiteral("tr")); m_writer.writeStartElement(QStringLiteral("tr"));
m_writer.writeEmptyElement(QStringLiteral("td")); m_writer.writeEmptyElement(QStringLiteral("td"));
m_writer.writeAttribute(QStringLiteral("class"), qstr(msg.levelName())); m_writer.writeAttribute(QStringLiteral("class"), qstr(msg.levelName()));
@ -845,7 +879,8 @@ public:
#endif #endif
// <!DOCTYPE ... <html> <head> // <!DOCTYPE ... <html> <head>
m_writer.writeStartDocument(); m_writer.writeStartDocument();
m_writer.writeDTD(QStringLiteral("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">")); m_writer.writeDTD(
QStringLiteral("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"));
m_writer.writeStartElement(QStringLiteral("html")); m_writer.writeStartElement(QStringLiteral("html"));
m_writer.writeAttribute(QStringLiteral("xmlns"), QStringLiteral("http://www.w3.org/1999/xhtml")); m_writer.writeAttribute(QStringLiteral("xmlns"), QStringLiteral("http://www.w3.org/1999/xhtml"));
m_writer.writeStartElement(QStringLiteral("head")); m_writer.writeStartElement(QStringLiteral("head"));
@ -877,23 +912,24 @@ public:
m_rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Path"), qstr(m_file.path())); m_rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Path"), qstr(m_file.path()));
m_rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Size"), qstr(dataSizeToString(m_file.size(), true))); m_rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Size"), qstr(dataSizeToString(m_file.size(), true)));
const TimeSpan duration = m_file.duration(); const TimeSpan duration = m_file.duration();
if(!duration.isNull()) { if (!duration.isNull()) {
m_rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Duration"), qstr(duration.toString(TimeSpanOutputFormat::WithMeasures))); m_rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Duration"), qstr(duration.toString(TimeSpanOutputFormat::WithMeasures)));
m_rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Overall avg. bitrate"), qstr(bitrateToString(0.0078125 * m_file.size() / duration.totalSeconds()))); m_rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Overall avg. bitrate"),
qstr(bitrateToString(0.0078125 * m_file.size() / duration.totalSeconds())));
} }
const char *const mimeType = m_file.mimeType(); const char *const mimeType = m_file.mimeType();
if(*mimeType) { if (*mimeType) {
m_rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Mime-type"), qstr(mimeType)); m_rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Mime-type"), qstr(mimeType));
} }
m_rowMaker.startRow(QCoreApplication::translate("HtmlInfo", "Container")); m_rowMaker.startRow(QCoreApplication::translate("HtmlInfo", "Container"));
m_writer.writeCharacters(qstr(m_file.containerFormatName())); m_writer.writeCharacters(qstr(m_file.containerFormatName()));
const char *const subversion = m_file.containerFormatSubversion(); const char *const subversion = m_file.containerFormatSubversion();
if(*subversion) { if (*subversion) {
mkSpace(); mkSpace();
m_writer.writeCharacters(qstr(subversion)); m_writer.writeCharacters(qstr(subversion));
} }
AbstractContainer *container = m_file.container(); AbstractContainer *container = m_file.container();
if(container || m_file.paddingSize()) { if (container || m_file.paddingSize()) {
mkSpace(); mkSpace();
mkDetailsLink(QStringLiteral("containerMore"), QCoreApplication::translate("HtmlInfo", "show details")); mkDetailsLink(QStringLiteral("containerMore"), QCoreApplication::translate("HtmlInfo", "show details"));
} }
@ -901,39 +937,43 @@ public:
m_writer.writeEndElement(); m_writer.writeEndElement();
// container // container
if(container || m_file.paddingSize()) { if (container || m_file.paddingSize()) {
startExtendedTableSection(QStringLiteral("containerMore")); startExtendedTableSection(QStringLiteral("containerMore"));
RowMaker rowMaker(m_writer); RowMaker rowMaker(m_writer);
if(container) { if (container) {
size_t segmentIndex = 0; size_t segmentIndex = 0;
for(const auto &title : container->titles()) { for (const auto &title : container->titles()) {
if(segmentIndex) { if (segmentIndex) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Title (segment %1)").arg(++segmentIndex), qstr(title)); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Title (segment %1)").arg(++segmentIndex), qstr(title));
} else { } else {
++segmentIndex; ++segmentIndex;
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Title"), qstr(title)); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Title"), qstr(title));
} }
} }
if(container->version()) { if (container->version()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Version"), QString::number(container->version())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Version"), QString::number(container->version()));
} }
if(container->readVersion()) { if (container->readVersion()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Read version"), QString::number(container->readVersion())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Read version"), QString::number(container->readVersion()));
} }
if(!container->documentType().empty()) { if (!container->documentType().empty()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Document type"), qstr(container->documentType())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Document type"), qstr(container->documentType()));
} }
if(container->doctypeVersion()) { if (container->doctypeVersion()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Document version"), QString::number(container->doctypeVersion())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Document version"), QString::number(container->doctypeVersion()));
} }
if(container->doctypeReadVersion()) { if (container->doctypeReadVersion()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Document read version"), QString::number(container->doctypeReadVersion())); rowMaker.mkRow(
QCoreApplication::translate("HtmlInfo", "Document read version"), QString::number(container->doctypeReadVersion()));
} }
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Tag position"), container->determineTagPosition(m_diagReparsing)); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Tag position"), container->determineTagPosition(m_diagReparsing));
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Index position"), container->determineIndexPosition(m_diagReparsing)); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Index position"), container->determineIndexPosition(m_diagReparsing));
} }
if(m_file.paddingSize()) { if (m_file.paddingSize()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Padding size"), QStringLiteral("%1 (%2 %)").arg(qstr(dataSizeToString(m_file.paddingSize(), true))).arg(static_cast<double>(m_file.paddingSize()) / m_file.size() * 100.0, 0, 'g', 2)); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Padding size"),
QStringLiteral("%1 (%2 %)")
.arg(qstr(dataSizeToString(m_file.paddingSize(), true)))
.arg(static_cast<double>(m_file.paddingSize()) / m_file.size() * 100.0, 0, 'g', 2));
} }
m_writer.writeEndElement(); m_writer.writeEndElement();
@ -941,24 +981,25 @@ public:
// tags // tags
auto tags = m_file.tags(); auto tags = m_file.tags();
if(!tags.empty()) { if (!tags.empty()) {
startTableSection(); startTableSection();
const QString moreId(QStringLiteral("tagsMore")); const QString moreId(QStringLiteral("tagsMore"));
m_rowMaker.startRow(QCoreApplication::translate("HtmlInfo", "Tags")); m_rowMaker.startRow(QCoreApplication::translate("HtmlInfo", "Tags"));
m_writer.writeCharacters(QCoreApplication::translate("HtmlInfo", "%1 tag(s) assigned", nullptr, static_cast<int>(tags.size())).arg(tags.size())); m_writer.writeCharacters(
QCoreApplication::translate("HtmlInfo", "%1 tag(s) assigned", nullptr, static_cast<int>(tags.size())).arg(tags.size()));
mkSpace(); mkSpace();
mkDetailsLink(moreId, QCoreApplication::translate("HtmlInfo", "show details")); mkDetailsLink(moreId, QCoreApplication::translate("HtmlInfo", "show details"));
m_rowMaker.endRow(); m_rowMaker.endRow();
m_writer.writeEndElement(); m_writer.writeEndElement();
startExtendedTableSection(moreId); startExtendedTableSection(moreId);
for(const Tag *tag : tags) { for (const Tag *tag : tags) {
RowMaker rowMaker(m_writer); RowMaker rowMaker(m_writer);
rowMaker.startSubTab(tag->typeName()); rowMaker.startSubTab(tag->typeName());
if(!tag->version().empty()) { if (!tag->version().empty()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Version"), qstr(tag->version())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Version"), qstr(tag->version()));
} }
if(tag->supportsTarget() && !tag->target().isEmpty()) { if (tag->supportsTarget() && !tag->target().isEmpty()) {
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Target level"), qstr(tag->targetString())); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Target level"), qstr(tag->targetString()));
} }
rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Size"), qstr(dataSizeToString(tag->size(), true))); rowMaker.mkRow(QCoreApplication::translate("HtmlInfo", "Size"), qstr(dataSizeToString(tag->size(), true)));
@ -970,13 +1011,14 @@ public:
// tracks // tracks
const auto tracks = m_file.tracks(); const auto tracks = m_file.tracks();
if(!tracks.empty()) { if (!tracks.empty()) {
startTableSection(); startTableSection();
const QString moreId(QStringLiteral("tracksMore")); const QString moreId(QStringLiteral("tracksMore"));
m_rowMaker.startRow(QCoreApplication::translate("HtmlInfo", "Tracks")); m_rowMaker.startRow(QCoreApplication::translate("HtmlInfo", "Tracks"));
m_writer.writeCharacters(QCoreApplication::translate("HtmlInfo", "file has %1 track(s)", nullptr, static_cast<int>(tracks.size())).arg(tracks.size())); m_writer.writeCharacters(
QCoreApplication::translate("HtmlInfo", "file has %1 track(s)", nullptr, static_cast<int>(tracks.size())).arg(tracks.size()));
const string summary(m_file.technicalSummary()); const string summary(m_file.technicalSummary());
if(!summary.empty()) { if (!summary.empty()) {
m_writer.writeCharacters(QStringLiteral(": ")); m_writer.writeCharacters(QStringLiteral(": "));
m_writer.writeCharacters(QString::fromUtf8(summary.data(), static_cast<int>(summary.size()))); m_writer.writeCharacters(QString::fromUtf8(summary.data(), static_cast<int>(summary.size())));
mkBreak(); mkBreak();
@ -988,7 +1030,7 @@ public:
startExtendedTableSection(moreId); startExtendedTableSection(moreId);
unsigned int trackNumber = 1; unsigned int trackNumber = 1;
for(const auto *track : tracks) { for (const auto *track : tracks) {
mkTrack(track, trackNumber); mkTrack(track, trackNumber);
++trackNumber; ++trackNumber;
} }
@ -997,11 +1039,13 @@ public:
// attachments // attachments
auto attachments = m_file.attachments(); auto attachments = m_file.attachments();
if(!attachments.empty()) { if (!attachments.empty()) {
startTableSection(); startTableSection();
const QString moreId(QStringLiteral("attachmentsMore")); const QString moreId(QStringLiteral("attachmentsMore"));
m_rowMaker.startRow(QCoreApplication::translate("HtmlInfo", "Attachments")); m_rowMaker.startRow(QCoreApplication::translate("HtmlInfo", "Attachments"));
m_writer.writeCharacters(QCoreApplication::translate("HtmlInfo", "%1 attachment(s) assigned", nullptr, static_cast<int>(attachments.size())).arg(attachments.size())); m_writer.writeCharacters(
QCoreApplication::translate("HtmlInfo", "%1 attachment(s) assigned", nullptr, static_cast<int>(attachments.size()))
.arg(attachments.size()));
mkSpace(); mkSpace();
mkDetailsLink(moreId, QCoreApplication::translate("HtmlInfo", "show details")); mkDetailsLink(moreId, QCoreApplication::translate("HtmlInfo", "show details"));
m_rowMaker.endRow(); m_rowMaker.endRow();
@ -1009,7 +1053,7 @@ public:
startExtendedTableSection(moreId); startExtendedTableSection(moreId);
unsigned int attachmentNumber = 1; unsigned int attachmentNumber = 1;
for(const auto *attachment : attachments) { for (const auto *attachment : attachments) {
mkAttachment(attachment, attachmentNumber); mkAttachment(attachment, attachmentNumber);
++attachmentNumber; ++attachmentNumber;
} }
@ -1017,14 +1061,16 @@ public:
} }
// chapters // chapters
if(container) { if (container) {
if(m_file.containerFormat() == ContainerFormat::Matroska) { if (m_file.containerFormat() == ContainerFormat::Matroska) {
const auto &editionEntries = static_cast<const MatroskaContainer *>(container)->editionEntires(); const auto &editionEntries = static_cast<const MatroskaContainer *>(container)->editionEntires();
if(!editionEntries.empty()) { if (!editionEntries.empty()) {
startTableSection(); startTableSection();
const QString moreId(QStringLiteral("editionsMore")); const QString moreId(QStringLiteral("editionsMore"));
m_rowMaker.startRow(QCoreApplication::translate("HtmlInfo", "Editions/chapters")); m_rowMaker.startRow(QCoreApplication::translate("HtmlInfo", "Editions/chapters"));
m_writer.writeCharacters(QCoreApplication::translate("HtmlInfo", "file has %1 edition(s)", nullptr, static_cast<int>(editionEntries.size())).arg(editionEntries.size())); m_writer.writeCharacters(
QCoreApplication::translate("HtmlInfo", "file has %1 edition(s)", nullptr, static_cast<int>(editionEntries.size()))
.arg(editionEntries.size()));
mkSpace(); mkSpace();
mkDetailsLink(moreId, QCoreApplication::translate("HtmlInfo", "show details")); mkDetailsLink(moreId, QCoreApplication::translate("HtmlInfo", "show details"));
m_rowMaker.endRow(); m_rowMaker.endRow();
@ -1032,24 +1078,25 @@ public:
startExtendedTableSection(moreId); startExtendedTableSection(moreId);
unsigned int editionNumber = 0; unsigned int editionNumber = 0;
for(const auto &edition : static_cast<const MatroskaContainer *>(container)->editionEntires()) { for (const auto &edition : static_cast<const MatroskaContainer *>(container)->editionEntires()) {
mkEdition(*edition, editionNumber); mkEdition(*edition, editionNumber);
++editionNumber; ++editionNumber;
} }
m_writer.writeEndElement(); m_writer.writeEndElement();
} }
} else if(size_t chapterCount = container->chapterCount()) { } else if (size_t chapterCount = container->chapterCount()) {
startTableSection(); startTableSection();
const QString moreId(QStringLiteral("chaptersMore")); const QString moreId(QStringLiteral("chaptersMore"));
m_rowMaker.startRow(QCoreApplication::translate("HtmlInfo", "chapters")); m_rowMaker.startRow(QCoreApplication::translate("HtmlInfo", "chapters"));
m_writer.writeCharacters(QCoreApplication::translate("HtmlInfo", "file has %1 chapter(s)", nullptr, static_cast<int>(chapterCount)).arg(chapterCount)); m_writer.writeCharacters(
QCoreApplication::translate("HtmlInfo", "file has %1 chapter(s)", nullptr, static_cast<int>(chapterCount)).arg(chapterCount));
mkSpace(); mkSpace();
mkDetailsLink(moreId, QCoreApplication::translate("HtmlInfo", "show details")); mkDetailsLink(moreId, QCoreApplication::translate("HtmlInfo", "show details"));
m_rowMaker.endRow(); m_rowMaker.endRow();
m_writer.writeEndElement(); m_writer.writeEndElement();
startExtendedTableSection(moreId); startExtendedTableSection(moreId);
for(size_t i = 0; i < chapterCount; ++i) { for (size_t i = 0; i < chapterCount; ++i) {
mkChapter(*container->chapter(i), i); mkChapter(*container->chapter(i), i);
} }
m_writer.writeEndElement(); m_writer.writeEndElement();
@ -1057,7 +1104,7 @@ public:
} }
// structure // structure
switch(m_file.containerFormat()) { switch (m_file.containerFormat()) {
case ContainerFormat::Mp4: case ContainerFormat::Mp4:
case ContainerFormat::QuickTime: case ContainerFormat::QuickTime:
case ContainerFormat::Matroska: case ContainerFormat::Matroska:
@ -1090,7 +1137,7 @@ public:
startTableSection(QStringLiteral("structure")); startTableSection(QStringLiteral("structure"));
m_rowMaker.startRow(QString()); m_rowMaker.startRow(QString());
switch(m_file.containerFormat()) { switch (m_file.containerFormat()) {
case ContainerFormat::Mp4: case ContainerFormat::Mp4:
case ContainerFormat::QuickTime: case ContainerFormat::QuickTime:
mkElementTree(static_cast<Mp4Container *>(m_file.container())); mkElementTree(static_cast<Mp4Container *>(m_file.container()));
@ -1100,14 +1147,12 @@ public:
case ContainerFormat::Ebml: case ContainerFormat::Ebml:
mkElementTree(static_cast<MatroskaContainer *>(m_file.container())); mkElementTree(static_cast<MatroskaContainer *>(m_file.container()));
break; break;
default: default:;
;
} }
m_rowMaker.endRow(); m_rowMaker.endRow();
m_writer.writeEndElement(); m_writer.writeEndElement();
break; break;
default: default:;
;
} }
// notifications // notifications
@ -1154,4 +1199,4 @@ QByteArray generateInfo(const MediaFileInfo &file, Diagnostics &diag, Diagnostic
return gen.res(); return gen.res();
} }
} } // namespace HtmlInfo

View File

@ -8,12 +8,11 @@
namespace TagParser { namespace TagParser {
class MediaFileInfo; class MediaFileInfo;
class Diagnostics; class Diagnostics;
} } // namespace TagParser
namespace HtmlInfo { namespace HtmlInfo {
QByteArray generateInfo(const TagParser::MediaFileInfo &file, TagParser::Diagnostics &diag, TagParser::Diagnostics &diagReparsing); QByteArray generateInfo(const TagParser::MediaFileInfo &file, TagParser::Diagnostics &diag, TagParser::Diagnostics &diagReparsing);
} }
#endif // HTMLINFO_H #endif // HTMLINFO_H

View File

@ -3,34 +3,33 @@
#include "../application/settings.h" #include "../application/settings.h"
#include <tagparser/exceptions.h> #include <tagparser/exceptions.h>
#include <tagparser/signature.h>
#include <tagparser/mediafileinfo.h>
#include <tagparser/tag.h>
#include <tagparser/id3/id3v1tag.h> #include <tagparser/id3/id3v1tag.h>
#include <tagparser/id3/id3v2tag.h> #include <tagparser/id3/id3v2tag.h>
#include <tagparser/mediafileinfo.h>
#include <tagparser/signature.h>
#include <tagparser/tag.h>
#include <c++utilities/io/path.h> #include <c++utilities/io/path.h>
#include <QAbstractItemModel>
#include <QCoreApplication> #include <QCoreApplication>
#include <QDir> #include <QDir>
#include <QFileInfo>
#include <QDirIterator> #include <QDirIterator>
#include <QFileInfo>
#include <QTextCodec> #include <QTextCodec>
#include <QAbstractItemModel>
#include <ios> #include <ios>
#include <stdexcept>
#include <iostream> #include <iostream>
#include <stdexcept>
using namespace std; using namespace std;
using namespace TagParser; using namespace TagParser;
namespace Utility namespace Utility {
{
const char *textEncodingToCodecName(TagTextEncoding textEncoding) const char *textEncodingToCodecName(TagTextEncoding textEncoding)
{ {
switch(textEncoding) { switch (textEncoding) {
case TagTextEncoding::Latin1: case TagTextEncoding::Latin1:
return "ISO 8859-1"; return "ISO 8859-1";
case TagTextEncoding::Utf8: case TagTextEncoding::Utf8:
@ -47,8 +46,8 @@ const char *textEncodingToCodecName(TagTextEncoding textEncoding)
QString tagValueToQString(const TagValue &value) QString tagValueToQString(const TagValue &value)
{ {
if(!value.isEmpty()) { if (!value.isEmpty()) {
switch(value.type()) { switch (value.type()) {
case TagDataType::Text: case TagDataType::Text:
return dataToQString(value.dataPointer(), value.dataSize(), value.dataEncoding()); return dataToQString(value.dataPointer(), value.dataSize(), value.dataEncoding());
case TagDataType::Integer: case TagDataType::Integer:
@ -57,8 +56,7 @@ QString tagValueToQString(const TagValue &value)
case TagDataType::TimeSpan: case TagDataType::TimeSpan:
case TagDataType::PositionInSet: case TagDataType::PositionInSet:
return QString::fromUtf8(value.toString().c_str()); return QString::fromUtf8(value.toString().c_str());
default: default:;
;
} }
} }
return QString(); return QString();
@ -66,10 +64,10 @@ QString tagValueToQString(const TagValue &value)
QString dataToQString(const char *data, size_t dataSize, TagTextEncoding encoding) QString dataToQString(const char *data, size_t dataSize, TagTextEncoding encoding)
{ {
if(data && dataSize) { if (data && dataSize) {
const char *codecName = textEncodingToCodecName(encoding); const char *codecName = textEncodingToCodecName(encoding);
auto *codec = QTextCodec::codecForName(codecName); auto *codec = QTextCodec::codecForName(codecName);
if(!codec) { if (!codec) {
codec = QTextCodec::codecForLocale(); codec = QTextCodec::codecForLocale();
} }
return codec->toUnicode(data, static_cast<int>(dataSize)); return codec->toUnicode(data, static_cast<int>(dataSize));
@ -79,10 +77,10 @@ QString dataToQString(const char *data, size_t dataSize, TagTextEncoding encodin
QString stringToQString(const string &value, TagTextEncoding textEncoding) QString stringToQString(const string &value, TagTextEncoding textEncoding)
{ {
if(!value.empty()) { if (!value.empty()) {
const char *codecName = textEncodingToCodecName(textEncoding); const char *codecName = textEncodingToCodecName(textEncoding);
auto *codec = QTextCodec::codecForName(codecName); auto *codec = QTextCodec::codecForName(codecName);
if(!codec) { if (!codec) {
codec = QTextCodec::codecForLocale(); codec = QTextCodec::codecForLocale();
} }
return codec->toUnicode(value.c_str()); return codec->toUnicode(value.c_str());
@ -92,10 +90,10 @@ QString stringToQString(const string &value, TagTextEncoding textEncoding)
string qstringToString(const QString &value, TagTextEncoding textEncoding) string qstringToString(const QString &value, TagTextEncoding textEncoding)
{ {
if(!value.isEmpty()) { if (!value.isEmpty()) {
const char *codecName = textEncodingToCodecName(textEncoding); const char *codecName = textEncodingToCodecName(textEncoding);
auto *codec = QTextCodec::codecForName(codecName); auto *codec = QTextCodec::codecForName(codecName);
if(!codec) { if (!codec) {
codec = QTextCodec::codecForLocale(); codec = QTextCodec::codecForLocale();
} }
const auto encodedString = codec->fromUnicode(value); const auto encodedString = codec->fromUnicode(value);
@ -111,13 +109,12 @@ TagValue qstringToTagValue(const QString &value, TagTextEncoding textEncoding)
QString elementPositionToQString(ElementPosition elementPosition) QString elementPositionToQString(ElementPosition elementPosition)
{ {
switch(elementPosition) { switch (elementPosition) {
case ElementPosition::BeforeData: case ElementPosition::BeforeData:
return QCoreApplication::translate("Utility", "before data"); return QCoreApplication::translate("Utility", "before data");
case ElementPosition::AfterData: case ElementPosition::AfterData:
return QCoreApplication::translate("Utility", "after data"); return QCoreApplication::translate("Utility", "after data");
case ElementPosition::Keep: case ElementPosition::Keep:;
;
} }
return QString(); return QString();
} }
@ -126,27 +123,27 @@ QString formatName(const QString &str, bool underscoreToWhitespace)
{ {
QString res; QString res;
bool whitespace = true; bool whitespace = true;
for(int i = 0, size = str.size(); i != size; ++i) { for (int i = 0, size = str.size(); i != size; ++i) {
const QChar current = str.at(i); const QChar current = str.at(i);
if(current.isSpace() || current == QChar('(') || current == QChar('[')) { if (current.isSpace() || current == QChar('(') || current == QChar('[')) {
whitespace = true; whitespace = true;
res += current; res += current;
} else if(underscoreToWhitespace && current == QChar('_')) { } else if (underscoreToWhitespace && current == QChar('_')) {
whitespace = true; whitespace = true;
res += ' '; res += ' ';
} else if(whitespace) { } else if (whitespace) {
if(i) { if (i) {
auto rest = str.midRef(i); auto rest = str.midRef(i);
static const char *const connectingWords[] = {"the ", "a ", "an ", "of ", "or ", "and ", "in ", "to ", "at ", "on ", "as "}; static const char *const connectingWords[] = { "the ", "a ", "an ", "of ", "or ", "and ", "in ", "to ", "at ", "on ", "as " };
for(const char *word : connectingWords) { for (const char *word : connectingWords) {
if(rest.startsWith(QLatin1String(word), Qt::CaseInsensitive)) { if (rest.startsWith(QLatin1String(word), Qt::CaseInsensitive)) {
res += current.toLower(); res += current.toLower();
whitespace = false; whitespace = false;
break; break;
} }
} }
} }
if(whitespace) { if (whitespace) {
res += current.toUpper(); res += current.toUpper();
whitespace = false; whitespace = false;
} }
@ -160,23 +157,20 @@ QString formatName(const QString &str, bool underscoreToWhitespace)
QString fixUmlauts(const QString &str) QString fixUmlauts(const QString &str)
{ {
auto words = str.split(QChar(' ')); auto words = str.split(QChar(' '));
static const QLatin1String exceptions[] = { static const QLatin1String exceptions[] = { QLatin1String("reggae"), QLatin1String("blues"), QLatin1String("auer"), QLatin1String("aues"),
QLatin1String("reggae"), QLatin1String("blues"), QLatin1String("auer"), QLatin1String("aues"), QLatin1String("manuel"), QLatin1String("manuel"), QLatin1String("duet"), QLatin1String("neue"), QLatin1String("prologue") };
QLatin1String("duet"), QLatin1String("neue"), QLatin1String("prologue") static const QLatin1String pairs[6][2] = { { QLatin1String("ae"), QLatin1String("\xe4") }, { QLatin1String("ue"), QLatin1String("\xfc") },
}; { QLatin1String("oe"), QLatin1String("\xf6") }, { QLatin1String("Ae"), QLatin1String("\xc4") },
static const QLatin1String pairs[6][2] = { { QLatin1String("Ue"), QLatin1String("\xdc") }, { QLatin1String("Oe"), QLatin1String("\xd6") } };
{QLatin1String("ae"), QLatin1String("\xe4")}, {QLatin1String("ue"), QLatin1String("\xfc")}, {QLatin1String("oe"), QLatin1String("\xf6")}, for (auto &word : words) {
{QLatin1String("Ae"), QLatin1String("\xc4")}, {QLatin1String("Ue"), QLatin1String("\xdc")}, {QLatin1String("Oe"), QLatin1String("\xd6")}
};
for(auto &word : words) {
// preserve words containing any of the exceptions // preserve words containing any of the exceptions
for(const auto &exception : exceptions) { for (const auto &exception : exceptions) {
if(word.contains(exception, Qt::CaseInsensitive)) { if (word.contains(exception, Qt::CaseInsensitive)) {
goto continueOuterLoop; goto continueOuterLoop;
} }
} }
// fix all umlauts // fix all umlauts
for(const auto *pair : pairs) { for (const auto *pair : pairs) {
word = word.replace(pair[0], pair[1], Qt::CaseSensitive); word = word.replace(pair[0], pair[1], Qt::CaseSensitive);
} }
continueOuterLoop:; continueOuterLoop:;
@ -189,24 +183,22 @@ void parseFileName(const QString &fileName, QString &title, int &trackNumber)
title = fileName.trimmed(); title = fileName.trimmed();
trackNumber = 0; trackNumber = 0;
int lastPoint = title.lastIndexOf(QChar('.')); int lastPoint = title.lastIndexOf(QChar('.'));
if(lastPoint > 0) { if (lastPoint > 0) {
title.truncate(lastPoint); title.truncate(lastPoint);
} else if(lastPoint == 0) { } else if (lastPoint == 0) {
title.remove(0, 1); title.remove(0, 1);
} }
static const QLatin1String delims[] = { static const QLatin1String delims[] = { QLatin1String(" - "), QLatin1String(", "), QLatin1String("-"), QLatin1String(" ") };
QLatin1String(" - "), QLatin1String(", "), QLatin1String("-"), QLatin1String(" ") for (const auto &delim : delims) {
};
for(const auto &delim : delims) {
int lastDelimIndex = 0; int lastDelimIndex = 0;
int delimIndex = title.indexOf(delim); int delimIndex = title.indexOf(delim);
while(delimIndex > lastDelimIndex) { while (delimIndex > lastDelimIndex) {
bool ok = false; bool ok = false;
trackNumber = title.midRef(lastDelimIndex, delimIndex - lastDelimIndex).toInt(&ok); trackNumber = title.midRef(lastDelimIndex, delimIndex - lastDelimIndex).toInt(&ok);
if(ok) { if (ok) {
int titleStart = delimIndex + delim.size(); int titleStart = delimIndex + delim.size();
for(const auto &delim : delims) { for (const auto &delim : delims) {
if(title.midRef(titleStart).startsWith(delim)) { if (title.midRef(titleStart).startsWith(delim)) {
titleStart += delim.size(); titleStart += delim.size();
break; break;
} }
@ -229,12 +221,12 @@ QString printModel(QAbstractItemModel *model)
void printModelIndex(const QModelIndex &index, QString &res, int level) void printModelIndex(const QModelIndex &index, QString &res, int level)
{ {
if(index.isValid()) { if (index.isValid()) {
const auto data = index.data().toString(); const auto data = index.data().toString();
if(!data.isEmpty()) { if (!data.isEmpty()) {
switch(index.column()) { switch (index.column()) {
case 0: case 0:
for(int i = 0; i < level; ++i) { for (int i = 0; i < level; ++i) {
res += "\t"; res += "\t";
} }
break; break;
@ -247,16 +239,16 @@ void printModelIndex(const QModelIndex &index, QString &res, int level)
const auto nextInCol = index.sibling(index.row(), index.column() + 1); const auto nextInCol = index.sibling(index.row(), index.column() + 1);
const auto child = index.child(0, 0); const auto child = index.child(0, 0);
const auto next = index.sibling(index.row() + 1, 0); const auto next = index.sibling(index.row() + 1, 0);
if(nextInCol.isValid()) { if (nextInCol.isValid()) {
printModelIndex(nextInCol, res, level); printModelIndex(nextInCol, res, level);
} else { } else {
res += "\n"; res += "\n";
} }
if(index.column() == 0) { if (index.column() == 0) {
printModelIndex(child, res, level + 1); printModelIndex(child, res, level + 1);
printModelIndex(next, res, level); printModelIndex(next, res, level);
} }
} }
} }
} } // namespace Utility

View File

@ -13,7 +13,7 @@ namespace TagParser {
class MediaFileInfo; class MediaFileInfo;
class Tag; class Tag;
enum class ElementPosition; enum class ElementPosition;
} } // namespace TagParser
namespace Utility { namespace Utility {
@ -40,6 +40,6 @@ constexpr int trQuandity(quint64 quandity)
return quandity > std::numeric_limits<int>::max() ? std::numeric_limits<int>::max() : static_cast<int>(quandity); return quandity > std::numeric_limits<int>::max() ? std::numeric_limits<int>::max() : static_cast<int>(quandity);
} }
} } // namespace Utility
#endif // UTILITYFEATURES_H #endif // UTILITYFEATURES_H