From a6edf645eb82c754209106593018b410c9422431 Mon Sep 17 00:00:00 2001 From: AL <26797547+Al12rs@users.noreply.github.com> Date: Fri, 30 Oct 2020 01:52:27 +0100 Subject: Add advanced counters as tooltip to general conflicts tab. Loose, archive, totals, percentages. --- src/modinfodialogconflicts.cpp | 96 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 85 insertions(+), 11 deletions(-) (limited to 'src/modinfodialogconflicts.cpp') diff --git a/src/modinfodialogconflicts.cpp b/src/modinfodialogconflicts.cpp index 06f0a31c..358571d6 100644 --- a/src/modinfodialogconflicts.cpp +++ b/src/modinfodialogconflicts.cpp @@ -625,10 +625,7 @@ void GeneralConflictsTab::restoreState(const Settings& s) bool GeneralConflictsTab::update() { clear(); - - int numNonConflicting = 0; - int numOverwrite = 0; - int numOverwritten = 0; + m_counts.clear(); if (m_tab->origin() != nullptr) { const auto rootPath = m_tab->mod().absolutePath(); @@ -640,29 +637,46 @@ bool GeneralConflictsTab::update() bool archive = false; const int fileOrigin = file->getOrigin(archive); + + ++m_counts.numTotalFiles; + const auto& alternatives = file->getAlternatives(); if (fileOrigin == m_tab->origin()->getID()) { + // current mod is primary origin, the winner + (archive) ? ++m_counts.numTotalArchive : ++m_counts.numTotalLoose; + if (!alternatives.empty()) { m_overwriteModel->add(createOverwriteItem( file->getIndex(), archive, std::move(fileName), std::move(relativeName), alternatives)); - ++numOverwrite; + ++m_counts.numOverwrite; + (archive) ? ++m_counts.numOverwriteArchive : ++m_counts.numOverwriteLoose; } else { // otherwise, put the file in the noconflict tree m_noConflictModel->add(createNoConflictItem( file->getIndex(), archive, std::move(fileName), std::move(relativeName))); - ++numNonConflicting; + ++m_counts.numNonConflicting; + (archive) ? ++m_counts.numNonConflictingArchive : ++m_counts.numNonConflictingLoose; } } else { + auto currId = m_tab->origin()->getID(); + auto currModAlt = std::find_if(alternatives.begin(), alternatives.end(), + [&currId](auto const& alt) { + return currId == alt.first; + }); + bool currModFileArchive = currModAlt->second.first.size() > 0; + m_overwrittenModel->add(createOverwrittenItem( file->getIndex(), fileOrigin, archive, std::move(fileName), std::move(relativeName))); - ++numOverwritten; + ++m_counts.numOverwritten; + (currModFileArchive) ? ++m_counts.numOverwrittenArchive : ++m_counts.numOverwrittenLoose; + (currModFileArchive) ? ++m_counts.numTotalArchive : ++m_counts.numTotalLoose; } } @@ -671,11 +685,9 @@ bool GeneralConflictsTab::update() m_noConflictModel->finished(); } - ui->overwriteCount->display(numOverwrite); - ui->overwrittenCount->display(numOverwritten); - ui->noConflictCount->display(numNonConflicting); + updateUICounters(); - return (numOverwrite > 0 || numOverwritten > 0); + return (m_counts.numOverwrite > 0 || m_counts.numOverwritten > 0); } ConflictItem GeneralConflictsTab::createOverwriteItem( @@ -723,6 +735,68 @@ ConflictItem GeneralConflictsTab::createOverwrittenItem( index, std::move(fileName), true, std::move(altOrigin), archive); } +QString percent(int a, int b) { + if (b == 0) { + return QString::number(0, 'f', 2); + } + return QString::number((((float)a / (float)b) * 100), 'f', 2); +} + +void GeneralConflictsTab::updateUICounters() +{ + ui->overwriteCount->display(m_counts.numOverwrite); + ui->overwrittenCount->display(m_counts.numOverwritten); + ui->noConflictCount->display(m_counts.numNonConflicting); + + QString tooltipBase = tr("" + "" + "" + "" + "" + "" + "" + "" + "
Type%1TotalPercent
Loose files: %2%3%4%
Archive files: %5%6%7%
Combined: %8%9%10%
"); + + QString tooltipOverwrite = tooltipBase.arg(tr("Winning")) + .arg(m_counts.numOverwriteLoose) + .arg(m_counts.numTotalLoose) + .arg(percent(m_counts.numOverwriteLoose, m_counts.numTotalLoose)) + .arg(m_counts.numOverwriteArchive) + .arg(m_counts.numTotalArchive) + .arg(percent(m_counts.numOverwriteArchive, m_counts.numTotalArchive)) + .arg(m_counts.numOverwrite) + .arg(m_counts.numTotalFiles) + .arg(percent(m_counts.numOverwrite, m_counts.numTotalFiles)); + + QString tooltipOverwritten = tooltipBase.arg(tr("Losing")) + .arg(m_counts.numOverwrittenLoose) + .arg(m_counts.numTotalLoose) + .arg(percent(m_counts.numOverwrittenLoose, m_counts.numTotalLoose)) + .arg(m_counts.numOverwrittenArchive) + .arg(m_counts.numTotalArchive) + .arg(percent(m_counts.numOverwrittenArchive, m_counts.numTotalArchive)) + .arg(m_counts.numOverwritten) + .arg(m_counts.numTotalFiles) + .arg(percent(m_counts.numOverwritten, m_counts.numTotalFiles)); + + + QString tooltipNonConflict = tooltipBase.arg(tr("Non conflicting")) + .arg(m_counts.numNonConflictingLoose) + .arg(m_counts.numTotalLoose) + .arg(percent(m_counts.numNonConflictingLoose, m_counts.numTotalLoose)) + .arg(m_counts.numNonConflictingArchive) + .arg(m_counts.numTotalArchive) + .arg(percent(m_counts.numNonConflictingArchive, m_counts.numTotalArchive)) + .arg(m_counts.numNonConflicting) + .arg(m_counts.numTotalFiles) + .arg(percent(m_counts.numNonConflicting, m_counts.numTotalFiles)); + + ui->overwriteCount->setToolTip(tooltipOverwrite); + ui->overwrittenCount->setToolTip(tooltipOverwritten); + ui->noConflictCount->setToolTip(tooltipNonConflict); +} + void GeneralConflictsTab::onOverwriteActivated(const QModelIndex& index) { const auto* proxy = dynamic_cast(ui->overwriteTree->model()); -- cgit v1.3.1 From d330a9d74b88a4d24c2e97b877c2641c94984737 Mon Sep 17 00:00:00 2001 From: AL <26797547+Al12rs@users.noreply.github.com> Date: Sat, 31 Oct 2020 17:54:56 +0100 Subject: Cleanup clear() --- src/modinfodialogconflicts.cpp | 3 ++- src/modinfodialogconflicts.h | 13 +------------ 2 files changed, 3 insertions(+), 13 deletions(-) (limited to 'src/modinfodialogconflicts.cpp') diff --git a/src/modinfodialogconflicts.cpp b/src/modinfodialogconflicts.cpp index 358571d6..f7a27bf8 100644 --- a/src/modinfodialogconflicts.cpp +++ b/src/modinfodialogconflicts.cpp @@ -593,6 +593,8 @@ GeneralConflictsTab::GeneralConflictsTab( void GeneralConflictsTab::clear() { + m_counts.clear(); + m_overwriteModel->clear(); m_overwrittenModel->clear(); m_noConflictModel->clear(); @@ -625,7 +627,6 @@ void GeneralConflictsTab::restoreState(const Settings& s) bool GeneralConflictsTab::update() { clear(); - m_counts.clear(); if (m_tab->origin() != nullptr) { const auto rootPath = m_tab->mod().absolutePath(); diff --git a/src/modinfodialogconflicts.h b/src/modinfodialogconflicts.h index 5c0e9158..db195e3d 100644 --- a/src/modinfodialogconflicts.h +++ b/src/modinfodialogconflicts.h @@ -67,18 +67,7 @@ private: int numOverwrittenArchive = 0; void clear() { - numTotalFiles = 0; - numTotalLoose = 0; - numTotalArchive = 0; - numNonConflicting = 0; - numNonConflictingLoose = 0; - numNonConflictingArchive = 0; - numOverwrite = 0; - numOverwriteLoose = 0; - numOverwriteArchive = 0; - numOverwritten = 0; - numOverwrittenLoose = 0; - numOverwrittenArchive = 0; + *this = {}; }; }; -- cgit v1.3.1 From b53a5b6a2a44298b83aef6fc1787e8a9214bb94a Mon Sep 17 00:00:00 2001 From: AL <26797547+Al12rs@users.noreply.github.com> Date: Sat, 31 Oct 2020 18:08:53 +0100 Subject: prefer if over ternary op --- src/modinfodialogconflicts.cpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'src/modinfodialogconflicts.cpp') diff --git a/src/modinfodialogconflicts.cpp b/src/modinfodialogconflicts.cpp index f7a27bf8..91a0d130 100644 --- a/src/modinfodialogconflicts.cpp +++ b/src/modinfodialogconflicts.cpp @@ -653,7 +653,12 @@ bool GeneralConflictsTab::update() std::move(fileName), std::move(relativeName), alternatives)); ++m_counts.numOverwrite; - (archive) ? ++m_counts.numOverwriteArchive : ++m_counts.numOverwriteLoose; + if (archive) { + ++m_counts.numOverwriteArchive; + } + else { + ++m_counts.numOverwriteLoose; + } } else { // otherwise, put the file in the noconflict tree m_noConflictModel->add(createNoConflictItem( @@ -661,7 +666,12 @@ bool GeneralConflictsTab::update() std::move(fileName), std::move(relativeName))); ++m_counts.numNonConflicting; - (archive) ? ++m_counts.numNonConflictingArchive : ++m_counts.numNonConflictingLoose; + if (archive) { + ++m_counts.numNonConflictingArchive; + } + else { + ++m_counts.numNonConflictingLoose; + } } } else { auto currId = m_tab->origin()->getID(); @@ -676,8 +686,14 @@ bool GeneralConflictsTab::update() std::move(fileName), std::move(relativeName))); ++m_counts.numOverwritten; - (currModFileArchive) ? ++m_counts.numOverwrittenArchive : ++m_counts.numOverwrittenLoose; - (currModFileArchive) ? ++m_counts.numTotalArchive : ++m_counts.numTotalLoose; + if (currModFileArchive) { + ++m_counts.numOverwrittenArchive; + ++m_counts.numTotalArchive; + } + else { + ++m_counts.numOverwrittenLoose; + ++m_counts.numTotalLoose; + } } } -- cgit v1.3.1 From 529dbb2cd52c6077b5d90c8d5ddac26de4b1ac97 Mon Sep 17 00:00:00 2001 From: AL <26797547+Al12rs@users.noreply.github.com> Date: Sat, 31 Oct 2020 18:31:42 +0100 Subject: handle case of find_if failing --- src/modinfodialogconflicts.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/modinfodialogconflicts.cpp') diff --git a/src/modinfodialogconflicts.cpp b/src/modinfodialogconflicts.cpp index 91a0d130..c52f2cb6 100644 --- a/src/modinfodialogconflicts.cpp +++ b/src/modinfodialogconflicts.cpp @@ -679,6 +679,12 @@ bool GeneralConflictsTab::update() [&currId](auto const& alt) { return currId == alt.first; }); + + if (currModAlt == alternatives.end()) { + log::error("Mod {} not found in the list of origins for file {}", m_tab->origin(), fileName); + continue; + } + bool currModFileArchive = currModAlt->second.first.size() > 0; m_overwrittenModel->add(createOverwrittenItem( -- cgit v1.3.1