From 7a71a9eb9e1f1c8e0681038105a6bb8ba888077b Mon Sep 17 00:00:00 2001 From: Krzysztof Starecki Date: Sun, 30 Dec 2018 15:16:06 +0100 Subject: Fix a bug where downloadlist context actions run multiple times --- src/mainwindow.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.h b/src/mainwindow.h index d19cd6a4..93f2ed5f 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -246,7 +246,7 @@ private: bool populateMenuCategories(QMenu *menu, int targetID); - void updateDownloadListDelegate(); + void initDownloadList(); // remove invalid category-references from mods void fixCategories(); -- cgit v1.3.1 From c11ff7e2db09514304cef35a650aa3fbef27dd16 Mon Sep 17 00:00:00 2001 From: Krzysztof Starecki Date: Sun, 30 Dec 2018 22:13:15 +0100 Subject: Add icon for incomplete download info, add download progress delegate --- src/downloadlist.cpp | 5 +++++ src/downloadlist.h | 1 - src/downloadlistwidget.cpp | 26 ++++++++++++++++++++++++++ src/downloadlistwidget.h | 18 ++++++++++++++++++ src/downloadmanager.cpp | 6 +++--- src/mainwindow.cpp | 7 ++++--- src/mainwindow.h | 2 +- 7 files changed, 57 insertions(+), 8 deletions(-) (limited to 'src/mainwindow.h') diff --git a/src/downloadlist.cpp b/src/downloadlist.cpp index d78e97f9..09f6968c 100644 --- a/src/downloadlist.cpp +++ b/src/downloadlist.cpp @@ -21,6 +21,7 @@ along with Mod Organizer. If not, see . #include "downloadmanager.h" #include #include +#include #include @@ -147,6 +148,10 @@ QVariant DownloadList::data(const QModelIndex &index, int role) const } return text; } + } else if (role == Qt::DecorationRole && index.column() == COL_NAME) { + if (!pendingDownload && m_Manager->getState(index.row()) >= DownloadManager::STATE_READY + && m_Manager->isInfoIncomplete(index.row())) + return QIcon(":/MO/gui/warning_16"); } else if (role == Qt::TextAlignmentRole) { if (index.column() == COL_SIZE) return Qt::AlignVCenter | Qt::AlignRight; diff --git a/src/downloadlist.h b/src/downloadlist.h index d7764763..3b33fc40 100644 --- a/src/downloadlist.h +++ b/src/downloadlist.h @@ -23,7 +23,6 @@ along with Mod Organizer. If not, see . #include #include - class DownloadManager; diff --git a/src/downloadlistwidget.cpp b/src/downloadlistwidget.cpp index 9cf8e097..6a85c317 100644 --- a/src/downloadlistwidget.cpp +++ b/src/downloadlistwidget.cpp @@ -17,13 +17,39 @@ You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ +#include "downloadlist.h" #include "downloadlistwidget.h" #include #include #include #include #include +#include +void DownloadProgressDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + QModelIndex sourceIndex = m_SortProxy->mapToSource(index); + if (sourceIndex.column() == DownloadList::COL_STATUS && sourceIndex.row() < m_Manager->numTotalDownloads() + && m_Manager->getState(sourceIndex.row()) == DownloadManager::STATE_DOWNLOADING) { + bool pendingDownload = sourceIndex.row() >= m_Manager->numTotalDownloads(); + QStyleOptionProgressBar progressBarOption; + progressBarOption.state = QStyle::State_Enabled; + progressBarOption.direction = QApplication::layoutDirection(); + progressBarOption.rect = option.rect; + progressBarOption.fontMetrics = QApplication::fontMetrics(); + progressBarOption.minimum = 0; + progressBarOption.maximum = 100; + progressBarOption.textAlignment = Qt::AlignCenter; + progressBarOption.textVisible = true; + progressBarOption.progress = m_Manager->getProgress(sourceIndex.row()).first; + progressBarOption.text = m_Manager->getProgress(sourceIndex.row()).second; + + QApplication::style()->drawControl(QStyle::CE_ProgressBar, + &progressBarOption, painter); + } else { + QStyledItemDelegate::paint(painter, option, index); + } +} DownloadListWidget::DownloadListWidget(QWidget *parent) : QTreeView(parent) diff --git a/src/downloadlistwidget.h b/src/downloadlistwidget.h index 0c17de87..c19e4473 100644 --- a/src/downloadlistwidget.h +++ b/src/downloadlistwidget.h @@ -21,11 +21,14 @@ along with Mod Organizer. If not, see . #define DOWNLOADLISTWIDGET_H #include "downloadmanager.h" +#include "downloadlistsortproxy.h" #include #include #include #include #include +#include + namespace Ui { class DownloadListWidget; @@ -33,6 +36,21 @@ namespace Ui { class DownloadManager; +class DownloadProgressDelegate : public QStyledItemDelegate +{ + Q_OBJECT + +public: + DownloadProgressDelegate(DownloadManager *manager, DownloadListSortProxy *sortProxy, QWidget *parent = 0) : QStyledItemDelegate(parent), m_Manager(manager), m_SortProxy(sortProxy) {} + + void paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index) const override; + +private: + DownloadManager *m_Manager; + DownloadListSortProxy *m_SortProxy; +}; + class DownloadListWidget : public QTreeView { Q_OBJECT diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index 9f07b030..b94b5864 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -64,7 +64,7 @@ DownloadManager::DownloadInfo *DownloadManager::DownloadInfo::createNew(const Mo info->m_DownloadID = s_NextDownloadID++; info->m_StartTime.start(); info->m_PreResumeSize = 0LL; - info->m_Progress = std::make_pair(0, " 0.0 Bytes/s "); + info->m_Progress = std::make_pair(0, "0.0 B/s "); info->m_ResumePos = 0; info->m_FileInfo = new ModRepositoryFileInfo(*fileInfo); info->m_Urls = URLs; @@ -1338,7 +1338,7 @@ void DownloadManager::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) QString unit; if (speed < 1000) { - unit = "Bytes/s"; + unit = "B/s"; } else if (speed < 1000*1024) { speed /= 1024; @@ -1349,7 +1349,7 @@ void DownloadManager::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) unit = "MB/s"; } - info->m_Progress.second = QString::fromLatin1("%1% - %2 %3").arg(info->m_Progress.first).arg(speed, 8, 'f', 1,' ').arg(unit, -8, ' '); + info->m_Progress.second = QString::fromLatin1("%1% - %2 %3").arg(info->m_Progress.first).arg(QString::number(speed, 'f', 1)).arg(unit); TaskProgressManager::instance().updateProgress(info->m_TaskProgressId, bytesReceived, bytesTotal); emit update(index); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index b2876e33..4f60ae16 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -319,6 +319,7 @@ MainWindow::MainWindow(QSettings &initSettings //ui->bsaList->setLocalMoveOnly(true); + initDownloadView(); bool pluginListAdjusted = registerWidgetState(ui->espList->objectName(), ui->espList->header(), "plugin_list_state"); registerWidgetState(ui->dataTree->objectName(), ui->dataTree->header()); registerWidgetState(ui->downloadView->objectName(), @@ -340,8 +341,6 @@ MainWindow::MainWindow(QSettings &initSettings ui->openFolderMenu->setMenu(openFolderMenu()); - initDownloadList(); - ui->savegameList->installEventFilter(this); ui->savegameList->setMouseTracking(true); @@ -5145,15 +5144,17 @@ void MainWindow::on_actionEndorseMO_triggered() } -void MainWindow::initDownloadList() +void MainWindow::initDownloadView() { DownloadListSortProxy *sortProxy = new DownloadListSortProxy(m_OrganizerCore.downloadManager(), ui->downloadView); sortProxy->setSourceModel(new DownloadList(m_OrganizerCore.downloadManager(), ui->downloadView)); connect(ui->downloadFilterEdit, SIGNAL(textChanged(QString)), sortProxy, SLOT(updateFilter(QString))); connect(ui->downloadFilterEdit, SIGNAL(textChanged(QString)), this, SLOT(downloadFilterChanged(QString))); + ui->downloadView->setObjectName("downloadView"); ui->downloadView->setModel(sortProxy); ui->downloadView->setManager(m_OrganizerCore.downloadManager()); + ui->downloadView->setItemDelegate(new DownloadProgressDelegate(m_OrganizerCore.downloadManager(), sortProxy, ui->downloadView)); ui->downloadView->setUniformRowHeights(true); ui->downloadView->header()->setStretchLastSection(false); ui->downloadView->header()->setSectionResizeMode(QHeaderView::Interactive); diff --git a/src/mainwindow.h b/src/mainwindow.h index 93f2ed5f..13a66a8e 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -246,7 +246,7 @@ private: bool populateMenuCategories(QMenu *menu, int targetID); - void initDownloadList(); + void initDownloadView(); // remove invalid category-references from mods void fixCategories(); -- cgit v1.3.1 From 03823a433a27bb5f9a94973c47e1408dd83cc5c0 Mon Sep 17 00:00:00 2001 From: Krzysztof Starecki Date: Mon, 31 Dec 2018 02:15:47 +0100 Subject: Add qss styling options for progress bar and compact mode widgets --- src/downloadlist.cpp | 13 +++---------- src/downloadlistwidget.cpp | 30 ++++++++++++++++-------------- src/mainwindow.cpp | 13 +++++++++++++ src/mainwindow.h | 1 + 4 files changed, 33 insertions(+), 24 deletions(-) (limited to 'src/mainwindow.h') diff --git a/src/downloadlist.cpp b/src/downloadlist.cpp index 09f6968c..6d79b0f5 100644 --- a/src/downloadlist.cpp +++ b/src/downloadlist.cpp @@ -98,8 +98,6 @@ QVariant DownloadList::data(const QModelIndex &index, int role) const switch (m_Manager->getState(index.row())) { case DownloadManager::STATE_STARTED: return tr("Started"); - case DownloadManager::STATE_DOWNLOADING: - return m_Manager->getProgress(index.row()).second; case DownloadManager::STATE_CANCELING: return tr("Canceling"); case DownloadManager::STATE_PAUSING: @@ -153,15 +151,10 @@ QVariant DownloadList::data(const QModelIndex &index, int role) const && m_Manager->isInfoIncomplete(index.row())) return QIcon(":/MO/gui/warning_16"); } else if (role == Qt::TextAlignmentRole) { - if (index.column() == COL_SIZE) - return Qt::AlignVCenter | Qt::AlignRight; - else + if (index.column() == COL_NAME) return Qt::AlignVCenter | Qt::AlignLeft; - } else if (role == Qt::SizeHintRole) { - QSize temp = m_FontMetrics.size(Qt::TextSingleLine, data(index, Qt::DisplayRole).toString()); - temp.rwidth() += 20; - temp.rheight() += 12; - return temp; + else + return Qt::AlignVCenter | Qt::AlignRight; } return QVariant(); } diff --git a/src/downloadlistwidget.cpp b/src/downloadlistwidget.cpp index 6a85c317..e908faf3 100644 --- a/src/downloadlistwidget.cpp +++ b/src/downloadlistwidget.cpp @@ -32,20 +32,22 @@ void DownloadProgressDelegate::paint(QPainter *painter, const QStyleOptionViewIt if (sourceIndex.column() == DownloadList::COL_STATUS && sourceIndex.row() < m_Manager->numTotalDownloads() && m_Manager->getState(sourceIndex.row()) == DownloadManager::STATE_DOWNLOADING) { bool pendingDownload = sourceIndex.row() >= m_Manager->numTotalDownloads(); - QStyleOptionProgressBar progressBarOption; - progressBarOption.state = QStyle::State_Enabled; - progressBarOption.direction = QApplication::layoutDirection(); - progressBarOption.rect = option.rect; - progressBarOption.fontMetrics = QApplication::fontMetrics(); - progressBarOption.minimum = 0; - progressBarOption.maximum = 100; - progressBarOption.textAlignment = Qt::AlignCenter; - progressBarOption.textVisible = true; - progressBarOption.progress = m_Manager->getProgress(sourceIndex.row()).first; - progressBarOption.text = m_Manager->getProgress(sourceIndex.row()).second; - - QApplication::style()->drawControl(QStyle::CE_ProgressBar, - &progressBarOption, painter); + QProgressBar progressBarOption; + progressBarOption.setProperty("compact", option.widget->property("compact")); + progressBarOption.setMinimum(0); + progressBarOption.setMaximum(100); + progressBarOption.setAlignment(Qt::AlignCenter); + progressBarOption.resize(option.rect.width(), option.rect.height()); + progressBarOption.setValue(m_Manager->getProgress(sourceIndex.row()).first); + progressBarOption.setFormat(m_Manager->getProgress(sourceIndex.row()).second); + + // paint the background with default delegate first to preserve table cell styling + QStyledItemDelegate::paint(painter, option, index); + + painter->save(); + painter->translate(option.rect.topLeft()); + progressBarOption.render(painter); + painter->restore(); } else { QStyledItemDelegate::paint(painter, option, index); } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 4f60ae16..328c0b2d 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -4655,6 +4655,8 @@ void MainWindow::on_actionSettings_triggered() NexusInterface::instance(&m_PluginContainer)->setNMMVersion(settings.getNMMVersion()); + updateDownloadView(); + m_OrganizerCore.updateVFSParams(settings.logLevel(), settings.crashDumpsType(), settings.executablesBlacklist()); m_OrganizerCore.cycleDiagnostics(); } @@ -4709,6 +4711,7 @@ void MainWindow::languageChange(const QString &newLanguage) createHelpWidget(); + updateDownloadView(); updateProblemsButton(); ui->listOptionsBtn->setMenu(modListContextMenu()); @@ -5160,6 +5163,7 @@ void MainWindow::initDownloadView() ui->downloadView->header()->setSectionResizeMode(QHeaderView::Interactive); ui->downloadView->header()->setSectionResizeMode(0, QHeaderView::Stretch); ui->downloadView->sortByColumn(1, Qt::DescendingOrder); + updateDownloadView(); connect(ui->downloadView, SIGNAL(installDownload(int)), &m_OrganizerCore, SLOT(installDownload(int))); connect(ui->downloadView, SIGNAL(queryInfo(int)), m_OrganizerCore.downloadManager(), SLOT(queryInfo(int))); @@ -5173,6 +5177,15 @@ void MainWindow::initDownloadView() connect(ui->downloadView, SIGNAL(resumeDownload(int)), this, SLOT(resumeDownload(int))); } +void MainWindow::updateDownloadView() +{ + if (m_OrganizerCore.settings().compactDownloads()) + ui->downloadView->setProperty("compact", true); + else + ui->downloadView->setProperty("compact", false); + ui->downloadView->style()->unpolish(ui->downloadView); + ui->downloadView->style()->polish(ui->downloadView); +} void MainWindow::modDetailsUpdated(bool) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 13a66a8e..a419b797 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -247,6 +247,7 @@ private: bool populateMenuCategories(QMenu *menu, int targetID); void initDownloadView(); + void updateDownloadView(); // remove invalid category-references from mods void fixCategories(); -- cgit v1.3.1