summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/modinfodialog.ui11
-rw-r--r--src/modinfodialogconflicts.cpp96
-rw-r--r--src/modinfodialogconflicts.h37
3 files changed, 130 insertions, 14 deletions
diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui
index 9fa60e40..269aebe3 100644
--- a/src/modinfodialog.ui
+++ b/src/modinfodialog.ui
@@ -566,7 +566,7 @@ text-align: left;</string>
<widget class="QLineEdit" name="overwriteLineEdit"/>
</item>
<item>
- <widget class="QLCDNumber" name="overwriteCount">
+ <widget class="LCDNumber" name="overwriteCount">
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
@@ -635,7 +635,7 @@ text-align: left;</string>
<widget class="QLineEdit" name="overwrittenLineEdit"/>
</item>
<item>
- <widget class="QLCDNumber" name="overwrittenCount">
+ <widget class="LCDNumber" name="overwrittenCount">
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
@@ -701,7 +701,7 @@ text-align: left;</string>
<widget class="QLineEdit" name="noConflictLineEdit"/>
</item>
<item>
- <widget class="QLCDNumber" name="noConflictCount">
+ <widget class="LCDNumber" name="noConflictCount">
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
@@ -1411,6 +1411,11 @@ p, li { white-space: pre-wrap; }
<header>texteditor.h</header>
</customwidget>
<customwidget>
+ <class>LCDNumber</class>
+ <extends>QLCDNumber</extends>
+ <header>lcdnumber.h</header>
+ </customwidget>
+ <customwidget>
<class>HTMLEditor</class>
<extends>QTextEdit</extends>
<header>texteditor.h</header>
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("<table cellspacing=\"5\">"
+ "<tr><th>Type</th><th>%1</th><th>Total</th><th>Percent</th></tr>"
+ "<tr><td>Loose files:&emsp;</td>"
+ "<td align=right>%2</td><td align=right>%3</td><td align=right>%4%</td></tr>"
+ "<tr><td>Archive files:&emsp;</td>"
+ "<td align=right>%5</td><td align=right>%6</td><td align=right>%7%</td></tr>"
+ "<tr><td>Combined:&emsp;</td>"
+ "<td align=right>%8</td><td align=right>%9</td><td align=right>%10%</td></tr>"
+ "</table>");
+
+ 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<QAbstractProxyModel*>(ui->overwriteTree->model());
diff --git a/src/modinfodialogconflicts.h b/src/modinfodialogconflicts.h
index 945f464d..d840c0dd 100644
--- a/src/modinfodialogconflicts.h
+++ b/src/modinfodialogconflicts.h
@@ -51,6 +51,39 @@ private:
FilterWidget m_filterOverwritten;
FilterWidget m_filterNoConflicts;
+ struct GeneralConflictNumbers
+ {
+ int numTotalFiles = 0;
+ int numTotalLoose = 0;
+ int numTotalArchive = 0;
+ int numNonConflicting = 0;
+ int numNonConflictingLoose = 0;
+ int numNonConflictingArchive = 0;
+ int numOverwrite = 0;
+ int numOverwriteLoose = 0;
+ int numOverwriteArchive = 0;
+ int numOverwritten = 0;
+ int numOverwrittenLoose = 0;
+ 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;
+ };
+ };
+
+ GeneralConflictNumbers m_counts;
+
ConflictItem createOverwriteItem(
MOShared::FileIndex index, bool archive,
QString fileName, QString relativeName,
@@ -64,6 +97,8 @@ private:
MOShared::FileIndex index, int fileOrigin, bool archive,
QString fileName, QString relativeName);
+ void updateUICounters();
+
void onOverwriteActivated(const QModelIndex& index);
void onOverwrittenActivated(const QModelIndex& index);
};
@@ -141,6 +176,8 @@ private:
GeneralConflictsTab m_general;
AdvancedConflictsTab m_advanced;
+
+
Actions createMenuActions(QTreeView* tree);
std::vector<QAction*> createGotoActions(const ConflictItem* item);
};