diff options
| -rw-r--r-- | src/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/createinstancedialogpages.cpp | 1 | ||||
| -rw-r--r-- | src/downloadlist.cpp | 80 | ||||
| -rw-r--r-- | src/downloadlist.h | 2 | ||||
| -rw-r--r-- | src/downloadlistsortproxy.cpp | 122 | ||||
| -rw-r--r-- | src/downloadlistsortproxy.h | 58 | ||||
| -rw-r--r-- | src/downloadlistwidget.cpp | 18 | ||||
| -rw-r--r-- | src/downloadlistwidget.h | 9 | ||||
| -rw-r--r-- | src/downloadstab.cpp | 31 | ||||
| -rw-r--r-- | src/downloadstab.h | 4 | ||||
| -rw-r--r-- | src/instancemanagerdialog.cpp | 1 | ||||
| -rw-r--r-- | src/mainwindow.cpp | 1 | ||||
| -rw-r--r-- | src/mainwindow.ui | 2 | ||||
| -rw-r--r-- | src/modinfodialogconflicts.cpp | 6 | ||||
| -rw-r--r-- | src/modinfodialogimages.cpp | 1 | ||||
| -rw-r--r-- | src/modinfodialogtextfiles.cpp | 1 |
16 files changed, 116 insertions, 222 deletions
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 <http://www.gnu.org/licenses/>.
-*/
-
-#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 <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef DOWNLOADLISTSORTPROXY_H
-#define DOWNLOADLISTSORTPROXY_H
-
-
-#include <QSortFilterProxyModel>
-
-
-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 <http://www.gnu.org/licenses/>. 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<QSortFilterProxyModel*>(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 <http://www.gnu.org/licenses/>. #include "downloadmanager.h"
#include "downloadlist.h"
-#include "downloadlistsortproxy.h"
#include <QWidget>
#include <QItemDelegate>
#include <QLabel>
@@ -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 <filterwidget.h> + 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 <http://www.gnu.org/licenses/>. #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; } </spacer> </item> <item> - <widget class="MOBase::LineEditClear" name="downloadFilterEdit"> + <widget class="QLineEdit" name="downloadFilterEdit"> <property name="toolTip"> <string>Filter the list of downloads.</string> </property> 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, |
