diff options
| author | Al <26797547+Al12rs@users.noreply.github.com> | 2020-10-31 11:53:23 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-31 11:53:23 -0700 |
| commit | f507305ffbeba74e9ea0fe6f286af0f8907264e7 (patch) | |
| tree | 6882dc6cd3770541613a464d23dd3acce02334ee | |
| parent | a57cb6bb718ba571a3f99ab08c1b15f06d49a9c3 (diff) | |
| parent | 529dbb2cd52c6077b5d90c8d5ddac26de4b1ac97 (diff) | |
Merge pull request #1274 from ModOrganizer2/conflicts_conter_tooltip
Add advanced counters as tooltip to general conflicts tab.
| -rw-r--r-- | src/modinfodialog.ui | 11 | ||||
| -rw-r--r-- | src/modinfodialogconflicts.cpp | 119 | ||||
| -rw-r--r-- | src/modinfodialogconflicts.h | 24 |
3 files changed, 140 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 feb20e65..377a5638 100644 --- a/src/modinfodialogconflicts.cpp +++ b/src/modinfodialogconflicts.cpp @@ -599,6 +599,8 @@ GeneralConflictsTab::GeneralConflictsTab( void GeneralConflictsTab::clear() { + m_counts.clear(); + m_overwriteModel->clear(); m_overwrittenModel->clear(); m_noConflictModel->clear(); @@ -632,10 +634,6 @@ bool GeneralConflictsTab::update() { clear(); - int numNonConflicting = 0; - int numOverwrite = 0; - int numOverwritten = 0; - if (m_tab->origin() != nullptr) { const auto rootPath = m_tab->mod().absolutePath(); @@ -646,29 +644,68 @@ 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; + if (archive) { + ++m_counts.numOverwriteArchive; + } + else { + ++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; + if (archive) { + ++m_counts.numNonConflictingArchive; + } + else { + ++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; + }); + + 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( file->getIndex(), fileOrigin, archive, std::move(fileName), std::move(relativeName))); - ++numOverwritten; + ++m_counts.numOverwritten; + if (currModFileArchive) { + ++m_counts.numOverwrittenArchive; + ++m_counts.numTotalArchive; + } + else { + ++m_counts.numOverwrittenLoose; + ++m_counts.numTotalLoose; + } } } @@ -677,11 +714,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( @@ -729,6 +764,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: </td>" + "<td align=right>%2</td><td align=right>%3</td><td align=right>%4%</td></tr>" + "<tr><td>Archive files: </td>" + "<td align=right>%5</td><td align=right>%6</td><td align=right>%7%</td></tr>" + "<tr><td>Combined: </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..db195e3d 100644 --- a/src/modinfodialogconflicts.h +++ b/src/modinfodialogconflicts.h @@ -51,6 +51,28 @@ 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() { + *this = {}; + }; + }; + + GeneralConflictNumbers m_counts; + ConflictItem createOverwriteItem( MOShared::FileIndex index, bool archive, QString fileName, QString relativeName, @@ -64,6 +86,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); }; |
