diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2020-07-21 18:13:42 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-21 18:13:42 -0400 |
| commit | 2c082d6a3ba74e458c479a32341c6f6666164868 (patch) | |
| tree | 2be9444f384a7a91a80d3179992f0b8a11b3c53c /src | |
| parent | 80645bacc14a9f35011561c448cd028a26b727dd (diff) | |
| parent | a965a9dc41c50988c7d3629fdc5965c20053937d (diff) | |
Merge pull request #1161 from isanae/2.3rc2-fixes
2.3rc2 fixes (wip)
Diffstat (limited to 'src')
| -rw-r--r-- | src/aboutdialog.ui | 5 | ||||
| -rw-r--r-- | src/mainwindow.cpp | 76 | ||||
| -rw-r--r-- | src/mainwindow.h | 3 | ||||
| -rw-r--r-- | src/modinfodialogconflictsmodels.cpp | 72 | ||||
| -rw-r--r-- | src/modinfodialogconflictsmodels.h | 3 |
5 files changed, 112 insertions, 47 deletions
diff --git a/src/aboutdialog.ui b/src/aboutdialog.ui index e34d36f9..88cc96e3 100644 --- a/src/aboutdialog.ui +++ b/src/aboutdialog.ui @@ -397,6 +397,11 @@ </item>
<item>
<property name="text">
+ <string notr="true">Hakan "Nyks45" Albayrak (Turkish)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
<string>...and all other contributors!</string>
</property>
<property name="toolTip">
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index dfe0fbde..55e0a593 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3309,6 +3309,29 @@ void MainWindow::visitWebPage_clicked() } } +void MainWindow::visitNexusOrWebPage(const QModelIndex& idx) +{ + int row_idx = idx.data(Qt::UserRole + 1).toInt(); + + ModInfo::Ptr info = ModInfo::getByIndex(row_idx); + if (!info) { + log::error("mod {} not found", row_idx); + return; + } + + int modID = info->getNexusID(); + QString gameName = info->getGameName(); + const auto url = info->parseCustomURL(); + + if (modID > 0) { + linkClicked(NexusInterface::instance(&m_PluginContainer)->getModURL(modID, gameName)); + } else if (url.isValid()) { + linkClicked(url.toString()); + } else { + log::error("mod '{}' has no valid link", info->name()); + } +} + void MainWindow::visitNexusOrWebPage_clicked() { QItemSelectionModel* selection = ui->modList->selectionModel(); if (selection->hasSelection() && selection->selectedRows().count() > 1) { @@ -3320,43 +3343,14 @@ void MainWindow::visitNexusOrWebPage_clicked() { return; } } - int row_idx; - ModInfo::Ptr info; - QString gameName; for (QModelIndex idx : selection->selectedRows()) { - row_idx = idx.data(Qt::UserRole + 1).toInt(); - info = ModInfo::getByIndex(row_idx); - int modID = info->getNexusID(); - gameName = info->getGameName(); - const auto url = info->parseCustomURL(); - if (modID > 0) { - linkClicked(NexusInterface::instance(&m_PluginContainer)->getModURL(modID, gameName)); - } - else if (url.isValid()) { - linkClicked(url.toString()); - } - else { - log::error("mod '{}' has no valid link", info->name()); - } + visitNexusOrWebPage(idx); } } else { - int modID = m_OrganizerCore.modList()->data(m_OrganizerCore.modList()->index(m_ContextRow, 0), Qt::UserRole).toInt(); - QString gameName = m_OrganizerCore.modList()->data(m_OrganizerCore.modList()->index(m_ContextRow, 0), Qt::UserRole + 4).toString(); - if (modID > 0) { - linkClicked(NexusInterface::instance(&m_PluginContainer)->getModURL(modID, gameName)); - } - else { - ModInfo::Ptr info = ModInfo::getByIndex(m_ContextRow); - const auto url = info->parseCustomURL(); - if (url.isValid()) { - linkClicked(url.toString()); - } - else { - MessageDialog::showMessage(tr("No valid Web Page for this mod"), this); - } - } + QModelIndex idx = m_OrganizerCore.modList()->index(m_ContextRow, 0); + visitNexusOrWebPage(idx); } } @@ -3865,7 +3859,10 @@ void MainWindow::on_modList_doubleClicked(const QModelIndex &index) if (modifiers.testFlag(Qt::ControlModifier)) { try { m_ContextRow = m_ModListSortProxy->mapToSource(index).row(); - openExplorer_clicked(); + + ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); + shell::Explore(modInfo->absolutePath()); + // workaround to cancel the editor that might have opened because of // selection-click ui->modList->closePersistentEditor(index); @@ -3877,7 +3874,8 @@ void MainWindow::on_modList_doubleClicked(const QModelIndex &index) else if (modifiers.testFlag(Qt::ShiftModifier)) { try { m_ContextRow = m_ModListSortProxy->mapToSource(index).row(); - visitNexusOrWebPage_clicked(); + QModelIndex idx = m_OrganizerCore.modList()->index(m_ContextRow, 0); + visitNexusOrWebPage(idx); ui->modList->closePersistentEditor(index); } catch (const std::exception & e) { @@ -6220,6 +6218,16 @@ void MainWindow::on_showHiddenBox_toggled(bool checked) void MainWindow::on_bossButton_clicked() { + const auto r = QMessageBox::question( + this, tr("Sorting plugins"), + tr("Are you sure you want to sort your plugins list?"), + QMessageBox::Yes | QMessageBox::No); + + if (r != QMessageBox::Yes) { + return; + } + + m_OrganizerCore.savePluginList(); setEnabled(false); diff --git a/src/mainwindow.h b/src/mainwindow.h index 60f22770..814e0363 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -251,7 +251,7 @@ private: void fixCategories(); bool extractProgress(QProgressDialog &extractProgress, int percentage, std::string fileName); - + // Performs checks, sets the m_NumberOfProblems and signals checkForProblemsDone(). void checkForProblemsImpl(); @@ -498,6 +498,7 @@ private slots: ModListSortProxy::FilterMode mode, ModListSortProxy::SeparatorsMode sep); void displayModInformation(const QString &modName, ModInfoTabIDs tabID); + void visitNexusOrWebPage(const QModelIndex& idx); void modRenamed(const QString &oldName, const QString &newName); void modRemoved(const QString &fileName); diff --git a/src/modinfodialogconflictsmodels.cpp b/src/modinfodialogconflictsmodels.cpp index e8ad19ad..17fdef90 100644 --- a/src/modinfodialogconflictsmodels.cpp +++ b/src/modinfodialogconflictsmodels.cpp @@ -96,6 +96,7 @@ ConflictListModel::ConflictListModel(QTreeView* tree, std::vector<Column> column void ConflictListModel::clear() { + beginResetModel(); m_items.clear(); endResetModel(); } @@ -129,16 +130,39 @@ int ConflictListModel::columnCount(const QModelIndex&) const return static_cast<int>(m_columns.size()); } -QVariant ConflictListModel::data(const QModelIndex& index, int role) const +const ConflictItem* ConflictListModel::itemFromIndex( + const QModelIndex& index) const { - if (role == Qt::DisplayRole || role == Qt::FontRole) { - const auto row = index.row(); - if (row < 0) { - return {}; + const auto row = index.row(); + if (row < 0) { + return nullptr; + } + + const auto i = static_cast<std::size_t>(row); + if (i >= m_items.size()) { + return nullptr; + } + + return &m_items[i]; +} + +QModelIndex ConflictListModel::indexFromItem( + const ConflictItem* item, int col) +{ + for (std::size_t i=0; i<m_items.size(); ++i) { + if (&m_items[i] == item) { + return createIndex(static_cast<int>(i), col); } + } + + return {}; +} - const auto i = static_cast<std::size_t>(row); - if (i >= m_items.size()) { +QVariant ConflictListModel::data(const QModelIndex& index, int role) const +{ + if (role == Qt::DisplayRole || role == Qt::FontRole) { + const ConflictItem* item = itemFromIndex(index); + if (!item) { return {}; } @@ -152,12 +176,10 @@ QVariant ConflictListModel::data(const QModelIndex& index, int role) const return {}; } - const auto& item = m_items[i]; - if (role == Qt::DisplayRole) { - return (item.*m_columns[c].getText)(); + return (item->*m_columns[c].getText)(); } else if (role == Qt::FontRole) { - if (item.isArchive()) { + if (item->isArchive()) { QFont f = m_tree->font(); f.setItalic(true); return f; @@ -191,7 +213,31 @@ void ConflictListModel::sort(int colIndex, Qt::SortOrder order) m_sortColumn = colIndex; m_sortOrder = order; + emit layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); + + const auto oldList = persistentIndexList(); + std::vector<std::pair<const ConflictItem*, int>> oldItems; + + const auto itemCount = oldList.size(); + oldItems.reserve(static_cast<std::size_t>(itemCount)); + + for (int i=0; i<itemCount; ++i) { + const QModelIndex& index = oldList[i]; + oldItems.push_back({itemFromIndex(index), index.column()}); + } + doSort(); + + QModelIndexList newList; + newList.reserve(itemCount); + + for (int i=0; i<itemCount; ++i) { + const auto& pair = oldItems[static_cast<std::size_t>(i)]; + newList.append(indexFromItem(pair.first, pair.second)); + } + + changePersistentIndexList(oldList, newList); + emit layoutChanged({}, QAbstractItemModel::VerticalSortHint); } @@ -202,8 +248,10 @@ void ConflictListModel::add(ConflictItem item) void ConflictListModel::finished() { + beginResetModel(); endResetModel(); - doSort(); + + sort(m_sortColumn, m_sortOrder); } const ConflictItem* ConflictListModel::getItem(std::size_t row) const diff --git a/src/modinfodialogconflictsmodels.h b/src/modinfodialogconflictsmodels.h index a37e85c8..e12460b1 100644 --- a/src/modinfodialogconflictsmodels.h +++ b/src/modinfodialogconflictsmodels.h @@ -78,6 +78,9 @@ private: int m_sortColumn; Qt::SortOrder m_sortOrder; + const ConflictItem* itemFromIndex(const QModelIndex& index) const; + QModelIndex indexFromItem(const ConflictItem* item, int col); + void doSort(); }; |
