Improve coding style and documentation

This commit is contained in:
Martchus 2018-05-13 20:42:16 +02:00
parent 4edeaa1ab2
commit eec19fd710
3 changed files with 161 additions and 149 deletions

View File

@ -18,6 +18,7 @@
#include <c++utilities/io/catchiofailure.h>
#include <QAction>
#include <QCoreApplication>
#include <QCursor>
#include <QDragEnterEvent>
#include <QDropEvent>
@ -80,16 +81,17 @@ PicturePreviewSelection::~PicturePreviewSelection()
/*!
* \brief Sets the \a value of the current tag field manually using the given \a previousValueHandling.
*
* Used for editing tags programmatically, eg. in TagEditorWidget::insertTitleFromFilename() and DbQueryWidget::applyResults().
*/
void PicturePreviewSelection::setValue(const TagValue &value, PreviousValueHandling previousValueHandling)
{
assert(m_currentTypeIndex < m_values.size());
TagValue &currentValue = m_values[m_currentTypeIndex];
if (previousValueHandling == PreviousValueHandling::Clear || !value.isEmpty()) {
if (previousValueHandling != PreviousValueHandling::Keep || currentValue.isEmpty()) {
currentValue = value; // TODO: move(value);
emit pictureChanged();
}
if ((previousValueHandling == PreviousValueHandling::Clear || !value.isEmpty())
&& (previousValueHandling != PreviousValueHandling::Keep || currentValue.isEmpty())) {
currentValue = value; // TODO: move(value);
emit pictureChanged();
}
updatePreview(m_currentTypeIndex);
}
@ -315,7 +317,7 @@ void PicturePreviewSelection::addOfSelectedType(const QString &path)
this, tr("Enter/confirm mime type"), tr("Confirm or enter the mime type of the selected file."), QLineEdit::Normal, mimeType, &ok);
if (ok) {
if ((fileInfo.size() < 10485760)
|| (QMessageBox::warning(this, QApplication::applicationName(),
|| (QMessageBox::warning(this, QCoreApplication::applicationName(),
tr("The selected file is very large (for a cover). Do you want to continue?"), QMessageBox::Yes, QMessageBox::No)
== QMessageBox::No)) {
auto buff = make_unique<char[]>(fileInfo.size());
@ -327,10 +329,10 @@ void PicturePreviewSelection::addOfSelectedType(const QString &path)
}
}
} catch (const TagParser::Failure &) {
QMessageBox::critical(this, QApplication::applicationName(), tr("Unable to parse specified cover file."));
QMessageBox::critical(this, QCoreApplication::applicationName(), tr("Unable to parse specified cover file."));
} catch (...) {
::IoUtilities::catchIoFailure();
QMessageBox::critical(this, QApplication::applicationName(), tr("An IO error occured when parsing the specified cover file."));
QMessageBox::critical(this, QCoreApplication::applicationName(), tr("An IO error occured when parsing the specified cover file."));
}
updatePreview(m_currentTypeIndex);
}
@ -342,7 +344,7 @@ void PicturePreviewSelection::removeSelected()
{
if (m_currentTypeIndex < m_values.size()) {
if (m_values[m_currentTypeIndex].isEmpty()) {
QMessageBox::information(this, QApplication::applicationName(), tr("There is no cover to remove."));
QMessageBox::information(this, QCoreApplication::applicationName(), tr("There is no cover to remove."));
} else {
m_values[m_currentTypeIndex].clearData();
updatePreview(m_currentTypeIndex);
@ -361,23 +363,25 @@ void PicturePreviewSelection::extractSelected()
assert(m_currentTypeIndex < m_values.size());
TagValue &value = m_values[m_currentTypeIndex];
if (value.isEmpty()) {
QMessageBox::information(this, QApplication::applicationName(), tr("There is no image attached to be extracted."));
} else {
const auto path = QFileDialog::getSaveFileName(this, tr("Where do you want to save the cover?"));
if (!path.isEmpty()) {
QFile file(path);
if (file.open(QIODevice::WriteOnly)) {
if (file.write(value.dataPointer(), value.dataSize()) > 0) {
QMessageBox::information(this, QApplication::applicationName(), tr("The cover has extracted."));
} else {
QMessageBox::warning(this, QApplication::applicationName(), tr("Unable to write to output file."));
}
file.close();
} else {
QMessageBox::warning(this, QApplication::applicationName(), tr("Unable to open output file."));
}
}
QMessageBox::information(this, QCoreApplication::applicationName(), tr("There is no image attached to be extracted."));
return;
}
const auto path = QFileDialog::getSaveFileName(this, tr("Where do you want to save the cover?"));
if (path.isEmpty()) {
return;
}
QFile file(path);
if (!file.open(QIODevice::WriteOnly)) {
QMessageBox::warning(this, QCoreApplication::applicationName(), tr("Unable to open output file."));
return;
}
if (file.write(value.dataPointer(), value.dataSize()) > 0) {
QMessageBox::information(this, QCoreApplication::applicationName(), tr("The cover has extracted."));
} else {
QMessageBox::warning(this, QCoreApplication::applicationName(), tr("Unable to write to output file."));
}
file.close();
}
/*!
@ -394,18 +398,18 @@ void PicturePreviewSelection::displaySelected()
if (file.open(QFile::ReadOnly)) {
img = QImage::fromData(file.readAll());
} else {
QMessageBox::warning(this, QApplication::applicationName(), tr("The attached image can't be found."));
QMessageBox::warning(this, QCoreApplication::applicationName(), tr("The attached image can't be found."));
return;
}
} else {
img = QImage::fromData(reinterpret_cast<const uchar *>(value.dataPointer()), value.dataSize());
}
if (img.isNull()) {
QMessageBox::warning(this, QApplication::applicationName(), tr("The attached image can't be displayed."));
QMessageBox::warning(this, QCoreApplication::applicationName(), tr("The attached image can't be displayed."));
} else {
QDialog dlg;
dlg.setWindowFlags(Qt::Tool);
dlg.setWindowTitle(tr("Cover - %1").arg(QApplication::applicationName()));
dlg.setWindowTitle(tr("Cover - %1").arg(QCoreApplication::applicationName()));
QBoxLayout layout(QBoxLayout::Up);
layout.setMargin(0);
QGraphicsView view(&dlg);
@ -418,7 +422,7 @@ void PicturePreviewSelection::displaySelected()
dlg.exec();
}
} else {
QMessageBox::warning(this, QApplication::applicationName(), tr("There is no image attached."));
QMessageBox::warning(this, QCoreApplication::applicationName(), tr("There is no image attached."));
}
}

View File

@ -31,9 +31,9 @@ namespace QtGui {
TagEdit::TagEdit(QWidget *parent)
: QWidget(parent)
{
QVBoxLayout *mainLayout = new QVBoxLayout(this);
QVBoxLayout *const mainLayout = new QVBoxLayout(this);
mainLayout->setMargin(0);
QSplitter *splitter = new QSplitter(this);
QSplitter *const splitter = new QSplitter(this);
splitter->setOrientation(Qt::Horizontal);
QWidget *widget = new QWidget(this);
m_layoutLeft = new QFormLayout(widget);
@ -57,7 +57,7 @@ TagEdit::TagEdit(QWidget *parent)
*/
TagValue TagEdit::value(KnownField field, TagTextEncoding encoding) const
{
if (const TagFieldEdit *edit = m_widgets.value(field, nullptr)) {
if (const TagFieldEdit *const edit = m_widgets.value(field, nullptr)) {
return edit->value(encoding, false);
} else {
return TagValue();
@ -99,10 +99,12 @@ void TagEdit::setTags(const QList<Tag *> &tags, bool updateUi)
/*!
* \brief Sets the \a value for the specified \a field manually applying the specified \a previousValueHandling.
*
* Used for editing tags programmatically, eg. in TagEditorWidget::insertTitleFromFilename() and DbQueryWidget::applyResults().
*/
bool TagEdit::setValue(KnownField field, const TagParser::TagValue &value, PreviousValueHandling previousValueHandling)
{
if (TagFieldEdit *edit = m_widgets.value(field, nullptr)) {
if (TagFieldEdit *const edit = m_widgets.value(field, nullptr)) {
return edit->setValue(value, previousValueHandling);
} else {
return false;
@ -114,7 +116,7 @@ bool TagEdit::setValue(KnownField field, const TagParser::TagValue &value, Previ
*/
bool TagEdit::hasField(KnownField field) const
{
for (Tag *tag : m_tags) {
for (Tag *const tag : m_tags) {
if (tag->supportsField(field)) {
return true;
}
@ -129,29 +131,29 @@ bool TagEdit::hasField(KnownField field) const
*/
QString TagEdit::generateLabel() const
{
if (!m_tags.isEmpty()) {
const TagTarget &target = m_tags.at(0)->target();
bool differentTargets = false, haveMatroskaTags = false;
QStringList tagNames;
tagNames.reserve(m_tags.size());
for (const Tag *tag : m_tags) {
tagNames << QString::fromUtf8(tag->typeName());
if (!differentTargets && !(target == tag->target())) {
differentTargets = true;
}
if (tag->type() == TagType::MatroskaTag) {
haveMatroskaTags = true;
}
}
QString res = tagNames.join(QStringLiteral(", "));
if (differentTargets) {
res.append(tr(" with different targets"));
} else if (haveMatroskaTags || !target.isEmpty()) {
res.append(tr(" targeting %1").arg(QString::fromUtf8(m_tags.front()->targetString().c_str())));
}
return res;
if (m_tags.isEmpty()) {
return QString();
}
return QString();
const TagTarget &target = m_tags.at(0)->target();
bool differentTargets = false, haveMatroskaTags = false;
QStringList tagNames;
tagNames.reserve(m_tags.size());
for (const Tag *const tag : m_tags) {
tagNames << QString::fromUtf8(tag->typeName());
if (!differentTargets && !(target == tag->target())) {
differentTargets = true;
}
if (tag->type() == TagType::MatroskaTag) {
haveMatroskaTags = true;
}
}
QString res = tagNames.join(QStringLiteral(", "));
if (differentTargets) {
res.append(tr(" with different targets"));
} else if (haveMatroskaTags || !target.isEmpty()) {
res.append(tr(" targeting %1").arg(QString::fromUtf8(m_tags.front()->targetString().c_str())));
}
return res;
}
/*!
@ -159,7 +161,7 @@ QString TagEdit::generateLabel() const
*/
void TagEdit::clear()
{
for (TagFieldEdit *edit : m_widgets) {
for (TagFieldEdit *const edit : m_widgets) {
edit->clear();
}
}
@ -169,7 +171,7 @@ void TagEdit::clear()
*/
void TagEdit::restore()
{
for (TagFieldEdit *edit : m_widgets) {
for (TagFieldEdit *const edit : m_widgets) {
edit->restore();
}
}
@ -183,13 +185,13 @@ void TagEdit::apply()
case Settings::UnsupportedFieldHandling::Discard:
// remove all old fields of all tags to discard
// all unsupported values
for (Tag *tag : m_tags) {
for (Tag *const tag : m_tags) {
tag->removeAllFields();
}
break;
default:;
}
for (TagFieldEdit *edit : m_widgets) {
for (TagFieldEdit *const edit : m_widgets) {
edit->apply();
}
}
@ -203,7 +205,7 @@ void TagEdit::apply()
void TagEdit::invalidate()
{
// remove current widgets
for (QWidget *edit : m_widgets) {
for (QWidget *const edit : m_widgets) {
removeEdit(edit);
edit->deleteLater();
}
@ -228,94 +230,97 @@ void TagEdit::setCoverButtonsHidden(bool hideCoverButtons)
void TagEdit::setupUi()
{
setUpdatesEnabled(false);
if (!m_tags.size()) {
if (m_tags.empty()) {
// there are no tags assigned -> remove all editing controls
for (QWidget *edit : m_widgets) {
removeEdit(edit);
edit->deleteLater();
}
m_widgets.clear();
} else {
// there are tags assigned
// setup editing controls
TagFieldEdit *edit = nullptr;
int rowOverall = 0, rowLeft = 0, rowRight = 0;
for (const auto &item : Settings::values().editor.fields.items()) {
KnownField field = static_cast<KnownField>(item.id().toInt());
if (item.isChecked() && hasField(field)) {
// the field is not disabled and the field is supported by at least one of the assigned tags
edit = m_widgets.value(field, nullptr);
if (edit) {
// we have already an edit for the field -> try to recycle it
// the order might have changed
int prevIndex; // stores the previous index (NOT row)
switch (field) {
case KnownField::Cover:
case KnownField::Lyrics:
// these fields are shown at the right side
prevIndex = m_layoutRight->indexOf(edit);
if (prevIndex > 0 && (rowRight * 2 + 1) != prevIndex) {
QLayoutItem *item1 = m_layoutRight->itemAt(prevIndex - 1);
QLayoutItem *item2 = m_layoutRight->itemAt(prevIndex);
m_layoutRight->removeItem(item1);
m_layoutRight->removeItem(item2);
m_layoutRight->insertItem(rowRight * 2, item1);
m_layoutRight->insertItem(rowRight * 2 + 1, item2);
}
break;
default:
// the other fields are shown at the left side
prevIndex = m_layoutLeft->indexOf(edit);
if (prevIndex > 0 && (rowLeft * 2 + 1) != prevIndex) {
QLayoutItem *item1 = m_layoutLeft->itemAt(prevIndex - 1);
QLayoutItem *item2 = m_layoutLeft->itemAt(prevIndex);
QWidget *label = item1->widget();
m_layoutLeft->removeItem(item1);
m_layoutLeft->removeItem(item2);
delete item1;
delete item2;
m_layoutLeft->insertRow(rowLeft, label, edit);
}
}
// update the tag field
edit->setTagField(m_tags, field, m_previousValueHandling);
} else {
// we need to create a new edit for the field
edit = new TagFieldEdit(m_tags, field, this);
connect(edit, &TagFieldEdit::returnPressed, this, &TagEdit::returnPressed);
switch (field) {
case KnownField::Cover:
case KnownField::Lyrics:
// editing widgets for these fields will be show at the right side (m_layoutRight)
m_layoutRight->insertWidget(rowRight * 2, new QLabel(item.label(), this));
edit->setContentsMargins(10, 0, 0, 0);
m_layoutRight->insertWidget(rowRight * 2 + 1, edit);
break;
default:
// editing widgets for the other fields will be show at the left side (m_layoutLeft)
m_layoutLeft->insertRow(rowLeft, item.label(), edit);
}
m_widgets.insert(field, edit);
setUpdatesEnabled(true);
return;
}
// there are tags assigned
// setup editing controls
TagFieldEdit *edit = nullptr;
int rowOverall = 0, rowLeft = 0, rowRight = 0;
for (const auto &item : Settings::values().editor.fields.items()) {
KnownField field = static_cast<KnownField>(item.id().toInt());
if (!item.isChecked() || !hasField(field)) {
// the field is either disabled or it is not supported by at least one of the assigned tags
if ((edit = m_widgets.value(field))) {
m_widgets.remove(field);
removeEdit(edit);
edit->deleteLater();
}
continue;
}
// the field is not disabled and the field is supported by at least one of the assigned tags
edit = m_widgets.value(field, nullptr);
if (edit) {
// we have already an edit for the field -> try to recycle it
// the order might have changed
int prevIndex; // stores the previous index (NOT row)
switch (field) {
case KnownField::Cover:
case KnownField::Lyrics:
// these fields are shown at the right side
prevIndex = m_layoutRight->indexOf(edit);
if (prevIndex > 0 && (rowRight * 2 + 1) != prevIndex) {
QLayoutItem *item1 = m_layoutRight->itemAt(prevIndex - 1);
QLayoutItem *item2 = m_layoutRight->itemAt(prevIndex);
m_layoutRight->removeItem(item1);
m_layoutRight->removeItem(item2);
m_layoutRight->insertItem(rowRight * 2, item1);
m_layoutRight->insertItem(rowRight * 2 + 1, item2);
}
// update the current position
// the position is required to keep the order of Settings::fieldModel().fields()
++rowOverall;
switch (field) {
case KnownField::Cover:
case KnownField::Lyrics:
++rowRight;
break;
default:
++rowLeft;
}
} else {
// the field is either disabled or it is not supported by at least one of the assigned tags
if ((edit = m_widgets.value(field))) {
m_widgets.remove(field);
removeEdit(edit);
edit->deleteLater();
break;
default:
// the other fields are shown at the left side
prevIndex = m_layoutLeft->indexOf(edit);
if (prevIndex > 0 && (rowLeft * 2 + 1) != prevIndex) {
QLayoutItem *item1 = m_layoutLeft->itemAt(prevIndex - 1);
QLayoutItem *item2 = m_layoutLeft->itemAt(prevIndex);
QWidget *label = item1->widget();
m_layoutLeft->removeItem(item1);
m_layoutLeft->removeItem(item2);
delete item1;
delete item2;
m_layoutLeft->insertRow(rowLeft, label, edit);
}
}
// update the tag field
edit->setTagField(m_tags, field, m_previousValueHandling);
} else {
// we need to create a new edit for the field
edit = new TagFieldEdit(m_tags, field, this);
connect(edit, &TagFieldEdit::returnPressed, this, &TagEdit::returnPressed);
switch (field) {
case KnownField::Cover:
case KnownField::Lyrics:
// editing widgets for these fields will be show at the right side (m_layoutRight)
m_layoutRight->insertWidget(rowRight * 2, new QLabel(item.label(), this));
edit->setContentsMargins(10, 0, 0, 0);
m_layoutRight->insertWidget(rowRight * 2 + 1, edit);
break;
default:
// editing widgets for the other fields will be show at the left side (m_layoutLeft)
m_layoutLeft->insertRow(rowLeft, item.label(), edit);
}
m_widgets.insert(field, edit);
}
// update the current position
// the position is required to keep the order of Settings::fieldModel().fields()
++rowOverall;
switch (field) {
case KnownField::Cover:
case KnownField::Lyrics:
++rowRight;
break;
default:
++rowLeft;
}
}
setUpdatesEnabled(true);
@ -328,19 +333,20 @@ void TagEdit::removeEdit(QWidget *edit)
{
// delete label of the widget (if present) as well
// the left layout might contain the label
if (QWidget *label = m_layoutLeft->labelForField(edit)) {
if (QWidget *const label = m_layoutLeft->labelForField(edit)) {
label->deleteLater();
}
// or the right layout might contain the label
int i = m_layoutRight->indexOf(edit) - 1;
if (i >= 0) {
if (QLayoutItem *item = m_layoutRight->itemAt(i)) {
if (item->widget()) {
item->widget()->deleteLater();
m_layoutRight->removeWidget(item->widget());
}
}
if (i < 0) {
return;
}
QLayoutItem *const item = m_layoutRight->itemAt(i);
if (!item || !item->widget()) {
return;
}
item->widget()->deleteLater();
m_layoutRight->removeWidget(item->widget());
}
/*!
@ -348,7 +354,7 @@ void TagEdit::removeEdit(QWidget *edit)
*/
void TagEdit::assignTags()
{
for (TagFieldEdit *edit : m_widgets) {
for (TagFieldEdit *const edit : m_widgets) {
edit->setTagField(m_tags, edit->field(), m_previousValueHandling, true);
}
}

View File

@ -162,6 +162,8 @@ TagValue TagFieldEdit::value(TagTextEncoding encoding, bool includeDescription)
/*!
* \brief Sets the \a value of the current tag field manually using the given \a previousValueHandling.
*
* Used for editing tags programmatically, eg. in TagEditorWidget::insertTitleFromFilename() and DbQueryWidget::applyResults().
*/
bool TagFieldEdit::setValue(const TagValue &value, PreviousValueHandling previousValueHandling)
{