From 106ed49baecc60dbdf4844ed684df750e5caf3aa Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sat, 26 Dec 2020 20:58:06 -0500 Subject: removed setUpdateDelay(false) calls, it's the default FilterWidget for downloads tab --- src/CMakeLists.txt | 1 - src/createinstancedialogpages.cpp | 1 - src/downloadlist.cpp | 80 ++++++++++++++++++++++++- src/downloadlist.h | 2 + src/downloadlistsortproxy.cpp | 122 -------------------------------------- src/downloadlistsortproxy.h | 58 ------------------ src/downloadlistwidget.cpp | 18 +++++- src/downloadlistwidget.h | 9 +-- src/downloadstab.cpp | 31 ++++------ src/downloadstab.h | 4 +- src/instancemanagerdialog.cpp | 1 - src/mainwindow.cpp | 1 - src/mainwindow.ui | 2 +- src/modinfodialogconflicts.cpp | 6 +- src/modinfodialogimages.cpp | 1 - src/modinfodialogtextfiles.cpp | 1 - 16 files changed, 116 insertions(+), 222 deletions(-) delete mode 100644 src/downloadlistsortproxy.cpp delete mode 100644 src/downloadlistsortproxy.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fdbe8e38..ce58f7c2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -63,7 +63,6 @@ add_filter(NAME src/dialogs GROUPS add_filter(NAME src/downloads GROUPS downloadlist - downloadlistsortproxy downloadlistwidget downloadmanager ) diff --git a/src/createinstancedialogpages.cpp b/src/createinstancedialogpages.cpp index a40338dd..c337ba86 100644 --- a/src/createinstancedialogpages.cpp +++ b/src/createinstancedialogpages.cpp @@ -247,7 +247,6 @@ GamePage::GamePage(CreateInstanceDialog& dlg) fillList(); m_filter.setEdit(ui->gamesFilter); - m_filter.setUpdateDelay(0); QObject::connect(&m_filter, &FilterWidget::changed, [&]{ fillList(); }); QObject::connect(ui->showAllGames, &QCheckBox::clicked, [&]{ fillList(); }); diff --git a/src/downloadlist.cpp b/src/downloadlist.cpp index 99347a79..3cfc1fea 100644 --- a/src/downloadlist.cpp +++ b/src/downloadlist.cpp @@ -41,9 +41,14 @@ void DownloadList::setMetaDisplay(bool metaDisplay) } -int DownloadList::rowCount(const QModelIndex&) const +int DownloadList::rowCount(const QModelIndex& parent) const { - return m_Manager->numTotalDownloads() + m_Manager->numPendingDownloads(); + if (!parent.isValid()) { + // root item + return m_Manager->numTotalDownloads() + m_Manager->numPendingDownloads(); + } else { + return 0; + } } @@ -203,3 +208,74 @@ void DownloadList::update(int row) else log::error("invalid row {} in download list, update failed", row); } + +bool DownloadList::lessThan(const QModelIndex &left, const QModelIndex &right) +{ + int leftIndex = left.row(); + int rightIndex = right.row(); + if ((leftIndex < m_Manager->numTotalDownloads()) + && (rightIndex < m_Manager->numTotalDownloads())) { + if (left.column() == DownloadList::COL_NAME) { + return m_Manager->getFileName(left.row()).compare(m_Manager->getFileName(right.row()), Qt::CaseInsensitive) < 0; + } else if (left.column() == DownloadList::COL_MODNAME) { + QString leftName, rightName; + + if (!m_Manager->isInfoIncomplete(left.row())) { + const MOBase::ModRepositoryFileInfo *info = m_Manager->getFileInfo(left.row()); + leftName = info->modName; + } + + if (!m_Manager->isInfoIncomplete(right.row())) { + const MOBase::ModRepositoryFileInfo *info = m_Manager->getFileInfo(right.row()); + rightName = info->modName; + } + + return leftName.compare(rightName, Qt::CaseInsensitive) < 0; + } else if (left.column() == DownloadList::COL_VERSION) { + MOBase::VersionInfo versionLeft, versionRight; + + if (!m_Manager->isInfoIncomplete(left.row())) { + const MOBase::ModRepositoryFileInfo *info = m_Manager->getFileInfo(left.row()); + versionLeft = info->version; + } + + if (!m_Manager->isInfoIncomplete(right.row())) { + const MOBase::ModRepositoryFileInfo *info = m_Manager->getFileInfo(right.row()); + versionRight = info->version; + } + + return versionLeft < versionRight; + } else if (left.column() == DownloadList::COL_ID) { + int leftID=0, rightID=0; + + if (!m_Manager->isInfoIncomplete(left.row())) { + const MOBase::ModRepositoryFileInfo *info = m_Manager->getFileInfo(left.row()); + leftID = info->modID; + } + + if (!m_Manager->isInfoIncomplete(right.row())) { + const MOBase::ModRepositoryFileInfo *info = m_Manager->getFileInfo(right.row()); + rightID = info->modID; + } + + return leftID < rightID; + } else if (left.column() == DownloadList::COL_STATUS) { + DownloadManager::DownloadState leftState = m_Manager->getState(left.row()); + DownloadManager::DownloadState rightState = m_Manager->getState(right.row()); + if (leftState == rightState) + return m_Manager->getFileTime(left.row()) < m_Manager->getFileTime(right.row()); + else + return leftState > rightState; + } else if (left.column() == DownloadList::COL_SIZE) { + return m_Manager->getFileSize(left.row()) < m_Manager->getFileSize(right.row()); + } else if (left.column() == DownloadList::COL_FILETIME) { + return m_Manager->getFileTime(left.row()) < m_Manager->getFileTime(right.row()); + } else if (left.column() == DownloadList::COL_SOURCEGAME) { + return m_Manager->getDisplayGameName(left.row()) < m_Manager->getDisplayGameName(right.row()); + } else { + return leftIndex < rightIndex; + } + } else { + return leftIndex < rightIndex; + } +} diff --git a/src/downloadlist.h b/src/downloadlist.h index eb2bbc55..c40bbac5 100644 --- a/src/downloadlist.h +++ b/src/downloadlist.h @@ -85,6 +85,8 @@ public: **/ virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + bool lessThan(const QModelIndex &left, const QModelIndex &right); + public slots: /** diff --git a/src/downloadlistsortproxy.cpp b/src/downloadlistsortproxy.cpp deleted file mode 100644 index 6209a721..00000000 --- a/src/downloadlistsortproxy.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* -Copyright (C) 2012 Sebastian Herbord. All rights reserved. - -This file is part of Mod Organizer. - -Mod Organizer is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Mod Organizer is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Mod Organizer. If not, see . -*/ - -#include "downloadlistsortproxy.h" -#include "downloadlist.h" -#include "downloadmanager.h" -#include "settings.h" - -DownloadListSortProxy::DownloadListSortProxy(const DownloadManager *manager, QObject *parent) - : QSortFilterProxyModel(parent), m_Manager(manager), m_CurrentFilter() -{ -} - -void DownloadListSortProxy::updateFilter(const QString &filter) -{ - m_CurrentFilter = filter; - invalidateFilter(); -} - - -bool DownloadListSortProxy::lessThan(const QModelIndex &left, - const QModelIndex &right) const -{ - int leftIndex = left.row(); - int rightIndex = right.row(); - if ((leftIndex < m_Manager->numTotalDownloads()) - && (rightIndex < m_Manager->numTotalDownloads())) { - if (left.column() == DownloadList::COL_NAME) { - return m_Manager->getFileName(left.row()).compare(m_Manager->getFileName(right.row()), Qt::CaseInsensitive) < 0; - } else if (left.column() == DownloadList::COL_MODNAME) { - QString leftName, rightName; - - if (!m_Manager->isInfoIncomplete(left.row())) { - const MOBase::ModRepositoryFileInfo *info = m_Manager->getFileInfo(left.row()); - leftName = info->modName; - } - - if (!m_Manager->isInfoIncomplete(right.row())) { - const MOBase::ModRepositoryFileInfo *info = m_Manager->getFileInfo(right.row()); - rightName = info->modName; - } - - return leftName.compare(rightName, Qt::CaseInsensitive) < 0; - } else if (left.column() == DownloadList::COL_VERSION) { - MOBase::VersionInfo versionLeft, versionRight; - - if (!m_Manager->isInfoIncomplete(left.row())) { - const MOBase::ModRepositoryFileInfo *info = m_Manager->getFileInfo(left.row()); - versionLeft = info->version; - } - - if (!m_Manager->isInfoIncomplete(right.row())) { - const MOBase::ModRepositoryFileInfo *info = m_Manager->getFileInfo(right.row()); - versionRight = info->version; - } - - return versionLeft < versionRight; - } else if (left.column() == DownloadList::COL_ID) { - int leftID=0, rightID=0; - - if (!m_Manager->isInfoIncomplete(left.row())) { - const MOBase::ModRepositoryFileInfo *info = m_Manager->getFileInfo(left.row()); - leftID = info->modID; - } - - if (!m_Manager->isInfoIncomplete(right.row())) { - const MOBase::ModRepositoryFileInfo *info = m_Manager->getFileInfo(right.row()); - rightID = info->modID; - } - - return leftID < rightID; - } else if (left.column() == DownloadList::COL_STATUS) { - DownloadManager::DownloadState leftState = m_Manager->getState(left.row()); - DownloadManager::DownloadState rightState = m_Manager->getState(right.row()); - if (leftState == rightState) - return m_Manager->getFileTime(left.row()) < m_Manager->getFileTime(right.row()); - else - return leftState > rightState; - } else if (left.column() == DownloadList::COL_SIZE) { - return m_Manager->getFileSize(left.row()) < m_Manager->getFileSize(right.row()); - } else if (left.column() == DownloadList::COL_FILETIME) { - return m_Manager->getFileTime(left.row()) < m_Manager->getFileTime(right.row()); - } else if (left.column() == DownloadList::COL_SOURCEGAME) { - return m_Manager->getDisplayGameName(left.row()) < m_Manager->getDisplayGameName(right.row()); - } else { - return leftIndex < rightIndex; - } - } else { - return leftIndex < rightIndex; - } -} - - -bool DownloadListSortProxy::filterAcceptsRow(int sourceRow, const QModelIndex&) const -{ - if (m_CurrentFilter.length() == 0) { - return true; - } else if (sourceRow < m_Manager->numTotalDownloads()) { - QString displayedName = Settings::instance().interface().metaDownloads() - ? m_Manager->getDisplayName(sourceRow) - : m_Manager->getFileName(sourceRow); - return displayedName.contains(m_CurrentFilter, Qt::CaseInsensitive); - } else { - return false; - } -} diff --git a/src/downloadlistsortproxy.h b/src/downloadlistsortproxy.h deleted file mode 100644 index 59f46179..00000000 --- a/src/downloadlistsortproxy.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -Copyright (C) 2012 Sebastian Herbord. All rights reserved. - -This file is part of Mod Organizer. - -Mod Organizer is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Mod Organizer is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Mod Organizer. If not, see . -*/ - -#ifndef DOWNLOADLISTSORTPROXY_H -#define DOWNLOADLISTSORTPROXY_H - - -#include - - -class DownloadManager; - - -class DownloadListSortProxy : public QSortFilterProxyModel -{ - Q_OBJECT -public: - - explicit DownloadListSortProxy(const DownloadManager *manager, QObject *parent = 0); - -public slots: - - void updateFilter(const QString &filter); - -protected: - - bool lessThan(const QModelIndex &left, const QModelIndex &right) const; - bool filterAcceptsRow(int sourceRow, const QModelIndex &source_parent) const; - -signals: - -public slots: - -private: - - const DownloadManager *m_Manager; - QString m_CurrentFilter; - - -}; - -#endif // DOWNLOADLISTSORTPROXY_H diff --git a/src/downloadlistwidget.cpp b/src/downloadlistwidget.cpp index 1bb13779..ad9ea63a 100644 --- a/src/downloadlistwidget.cpp +++ b/src/downloadlistwidget.cpp @@ -32,9 +32,23 @@ along with Mod Organizer. If not, see . using namespace MOBase; -void DownloadProgressDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +DownloadProgressDelegate::DownloadProgressDelegate( + DownloadManager* manager, DownloadListWidget* list) + : QStyledItemDelegate(list), m_Manager(manager), m_List(list) { - QModelIndex sourceIndex = m_SortProxy->mapToSource(index); +} + +void DownloadProgressDelegate::paint( + QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + QModelIndex sourceIndex; + + if (auto* proxy=dynamic_cast(m_List->model())) { + sourceIndex = proxy->mapToSource(index); + } else { + sourceIndex = index; + } + bool pendingDownload = (sourceIndex.row() >= m_Manager->numTotalDownloads()); if (sourceIndex.column() == DownloadList::COL_STATUS && !pendingDownload && m_Manager->getState(sourceIndex.row()) == DownloadManager::STATE_DOWNLOADING) { diff --git a/src/downloadlistwidget.h b/src/downloadlistwidget.h index 784bd275..64e1a6e8 100644 --- a/src/downloadlistwidget.h +++ b/src/downloadlistwidget.h @@ -22,7 +22,6 @@ along with Mod Organizer. If not, see . #include "downloadmanager.h" #include "downloadlist.h" -#include "downloadlistsortproxy.h" #include #include #include @@ -36,19 +35,21 @@ namespace Ui { class DownloadListWidget; } +class DownloadListWidget; + class DownloadProgressDelegate : public QStyledItemDelegate { Q_OBJECT public: - DownloadProgressDelegate(DownloadManager *manager, DownloadListSortProxy *sortProxy, QWidget *parent = 0) : QStyledItemDelegate(parent), m_Manager(manager), m_SortProxy(sortProxy) {} + DownloadProgressDelegate(DownloadManager* manager, DownloadListWidget* list); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; private: - DownloadManager *m_Manager; - DownloadListSortProxy *m_SortProxy; + DownloadManager* m_Manager; + DownloadListWidget* m_List; }; class DownloadListHeader : public QHeaderView diff --git a/src/downloadstab.cpp b/src/downloadstab.cpp index a1a5a474..f5258724 100644 --- a/src/downloadstab.cpp +++ b/src/downloadstab.cpp @@ -1,6 +1,5 @@ #include "downloadstab.h" #include "downloadlist.h" -#include "downloadlistsortproxy.h" #include "downloadlistwidget.h" #include "organizercore.h" #include "ui_mainwindow.h" @@ -13,20 +12,19 @@ DownloadsTab::DownloadsTab(OrganizerCore& core, Ui::MainWindow* mwui) DownloadList *sourceModel = new DownloadList( m_core.downloadManager(), ui.list); - DownloadListSortProxy *sortProxy = new DownloadListSortProxy( - m_core.downloadManager(), ui.list); - - sortProxy->setSourceModel(sourceModel); - connect(ui.filter, SIGNAL(textChanged(QString)), sortProxy, SLOT(updateFilter(QString))); - connect(ui.filter, SIGNAL(textChanged(QString)), this, SLOT(downloadFilterChanged(QString))); - - ui.list->setSourceModel(sourceModel); - ui.list->setModel(sortProxy); + ui.list->setModel(sourceModel); ui.list->setManager(m_core.downloadManager()); ui.list->setItemDelegate(new DownloadProgressDelegate( - m_core.downloadManager(), sortProxy, ui.list)); + m_core.downloadManager(), ui.list)); + update(); + m_filter.setEdit(ui.filter); + m_filter.setList(ui.list); + m_filter.setSortPredicate([sourceModel](auto&& left, auto&& right) { + return sourceModel->lessThan(left, right); + }); + connect(ui.refresh, &QPushButton::clicked, [&]{ refresh(); }); connect(ui.list, SIGNAL(installDownload(int)), &m_core, SLOT(installDownload(int))); connect(ui.list, SIGNAL(queryInfo(int)), m_core.downloadManager(), SLOT(queryInfo(int))); @@ -39,7 +37,7 @@ DownloadsTab::DownloadsTab(OrganizerCore& core, Ui::MainWindow* mwui) connect(ui.list, SIGNAL(restoreDownload(int)), m_core.downloadManager(), SLOT(restoreDownload(int))); connect(ui.list, SIGNAL(cancelDownload(int)), m_core.downloadManager(), SLOT(cancelDownload(int))); connect(ui.list, SIGNAL(pauseDownload(int)), m_core.downloadManager(), SLOT(pauseDownload(int))); - connect(ui.list, SIGNAL(resumeDownload(int)), this, SLOT(resumeDownload(int))); + connect(ui.list, &DownloadListWidget::resumeDownload, [&](int i){ resumeDownload(i); }); } void DownloadsTab::update() @@ -77,12 +75,3 @@ void DownloadsTab::resumeDownload(int downloadIndex) m_core.downloadManager()->resumeDownload(downloadIndex); }); } - -void DownloadsTab::downloadFilterChanged(const QString &filter) -{ - if (!filter.isEmpty()) { - ui.list->setStyleSheet("QTreeView { border: 2px ridge #f00; }"); - } else { - ui.list->setStyleSheet(""); - } -} diff --git a/src/downloadstab.h b/src/downloadstab.h index 3ccdf5f4..ac0cf0e2 100644 --- a/src/downloadstab.h +++ b/src/downloadstab.h @@ -1,6 +1,8 @@ #ifndef MODORGANIZER_DOWNLOADTAB_INCLUDED #define MODORGANIZER_DOWNLOADTAB_INCLUDED +#include + namespace Ui { class MainWindow; } class OrganizerCore; class DownloadListWidget; @@ -25,9 +27,9 @@ private: OrganizerCore& m_core; DownloadsTabUi ui; + MOBase::FilterWidget m_filter; void refresh(); - void downloadFilterChanged(const QString &filter); void resumeDownload(int downloadIndex); }; diff --git a/src/instancemanagerdialog.cpp b/src/instancemanagerdialog.cpp index 00dc57f7..ecc08c1f 100644 --- a/src/instancemanagerdialog.cpp +++ b/src/instancemanagerdialog.cpp @@ -158,7 +158,6 @@ InstanceManagerDialog::InstanceManagerDialog( m_filter.setEdit(ui->filter); m_filter.setList(ui->list); - m_filter.setUpdateDelay(false); m_filter.setFilteredBorder(false); updateInstances(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 8777c4ac..5ddc489c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -54,7 +54,6 @@ along with Mod Organizer. If not, see . #include "downloadlistwidget.h" #include "messagedialog.h" #include "installationmanager.h" -#include "downloadlistsortproxy.h" #include "motddialog.h" #include "filedialogmemory.h" #include "tutorialmanager.h" diff --git a/src/mainwindow.ui b/src/mainwindow.ui index dbc6013d..692246fd 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1361,7 +1361,7 @@ p, li { white-space: pre-wrap; } - + Filter the list of downloads. diff --git a/src/modinfodialogconflicts.cpp b/src/modinfodialogconflicts.cpp index cf7f6340..1bfb3218 100644 --- a/src/modinfodialogconflicts.cpp +++ b/src/modinfodialogconflicts.cpp @@ -560,17 +560,14 @@ GeneralConflictsTab::GeneralConflictsTab( m_filterOverwrite.setEdit(ui->overwriteLineEdit); m_filterOverwrite.setList(ui->overwriteTree); m_filterOverwrite.setUseSourceSort(true); - m_filterOverwrite.setUpdateDelay(false); m_filterOverwritten.setEdit(ui->overwrittenLineEdit); m_filterOverwritten.setList(ui->overwrittenTree); m_filterOverwritten.setUseSourceSort(true); - m_filterOverwritten.setUpdateDelay(false); m_filterNoConflicts.setEdit(ui->noConflictLineEdit); m_filterNoConflicts.setList(ui->noConflictTree); m_filterNoConflicts.setUseSourceSort(true); - m_filterNoConflicts.setUpdateDelay(false); QObject::connect( ui->overwriteTree, &QTreeView::doubleClicked, @@ -644,7 +641,7 @@ bool GeneralConflictsTab::update() bool archive = false; const int fileOrigin = file->getOrigin(archive); - + ++m_counts.numTotalFiles; const auto& alternatives = file->getAlternatives(); @@ -895,7 +892,6 @@ AdvancedConflictsTab::AdvancedConflictsTab( m_filter.setEdit(ui->conflictsAdvancedFilter); m_filter.setList(ui->conflictsAdvancedList); m_filter.setUseSourceSort(true); - m_filter.setUpdateDelay(false); // left-elide the overwrites column so that the nearest are visible ui->conflictsAdvancedList->setItemDelegateForColumn( diff --git a/src/modinfodialogimages.cpp b/src/modinfodialogimages.cpp index e27e9686..8a22045e 100644 --- a/src/modinfodialogimages.cpp +++ b/src/modinfodialogimages.cpp @@ -63,7 +63,6 @@ ImagesTab::ImagesTab(ModInfoDialogTabContext cx) : ui->imagesShowDDS->setEnabled(m_ddsAvailable); m_filter.setEdit(ui->imagesFilter); - m_filter.setUpdateDelay(false); connect(&m_filter, &FilterWidget::changed, [&]{ onFilterChanged(); }); connect(ui->imagesExplore, &QAbstractButton::clicked, [&]{ onExplore(); }); diff --git a/src/modinfodialogtextfiles.cpp b/src/modinfodialogtextfiles.cpp index 26ca3eb8..564c2cf7 100644 --- a/src/modinfodialogtextfiles.cpp +++ b/src/modinfodialogtextfiles.cpp @@ -118,7 +118,6 @@ GenericFilesTab::GenericFilesTab( m_filter.setEdit(filter); m_filter.setList(m_list); - m_filter.setUpdateDelay(false); QObject::connect( m_list->selectionModel(), &QItemSelectionModel::currentRowChanged, -- cgit v1.3.1