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 | %1 | Total | Percent |
"
+ "| 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