Qt: fix file browser downloads button not scrolling correctly on first click

This commit is contained in:
Brad Parker 2018-09-01 21:24:59 -04:00
parent 4f4b1c182f
commit a86454d30c
2 changed files with 51 additions and 3 deletions

View File

@ -336,6 +336,7 @@ MainWindow::MainWindow(QWidget *parent) :
,m_downloadedThumbnails(0) ,m_downloadedThumbnails(0)
,m_failedThumbnails(0) ,m_failedThumbnails(0)
,m_playlistThumbnailDownloadWasCanceled(false) ,m_playlistThumbnailDownloadWasCanceled(false)
,m_pendingDirScrollPath()
{ {
settings_t *settings = config_get_ptr(); settings_t *settings = config_get_ptr();
QDir playlistDir(settings->paths.directory_playlist); QDir playlistDir(settings->paths.directory_playlist);
@ -557,6 +558,11 @@ MainWindow::MainWindow(QWidget *parent) :
connect(viewTypeListAction, SIGNAL(triggered()), this, SLOT(onListViewClicked())); connect(viewTypeListAction, SIGNAL(triggered()), this, SLOT(onListViewClicked()));
connect(m_gridLayoutWidget, SIGNAL(filesDropped(QStringList)), this, SLOT(onPlaylistFilesDropped(QStringList))); connect(m_gridLayoutWidget, SIGNAL(filesDropped(QStringList)), this, SLOT(onPlaylistFilesDropped(QStringList)));
connect(m_gridLayoutWidget, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(onFileDropWidgetContextMenuRequested(const QPoint&))); connect(m_gridLayoutWidget, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(onFileDropWidgetContextMenuRequested(const QPoint&)));
connect(m_dirModel, SIGNAL(directoryLoaded(const QString&)), this, SLOT(onFileSystemDirLoaded(const QString&)));
/* must use queued connection */
connect(this, SIGNAL(scrollToDownloads(QString)), this, SLOT(onDownloadScroll(QString)), Qt::QueuedConnection);
connect(this, SIGNAL(scrollToDownloadsAgain(QString)), this, SLOT(onDownloadScrollAgain(QString)), Qt::QueuedConnection);
connect(m_playlistThumbnailDownloadProgressDialog, SIGNAL(canceled()), m_playlistThumbnailDownloadProgressDialog, SLOT(cancel())); connect(m_playlistThumbnailDownloadProgressDialog, SIGNAL(canceled()), m_playlistThumbnailDownloadProgressDialog, SLOT(cancel()));
connect(m_playlistThumbnailDownloadProgressDialog, SIGNAL(canceled()), this, SLOT(onPlaylistThumbnailDownloadCanceled())); connect(m_playlistThumbnailDownloadProgressDialog, SIGNAL(canceled()), this, SLOT(onPlaylistThumbnailDownloadCanceled()));
@ -633,6 +639,19 @@ MainWindow::~MainWindow()
removeGridItems(); removeGridItems();
} }
void MainWindow::onFileSystemDirLoaded(const QString &path)
{
if (path.isEmpty() || m_pendingDirScrollPath.isEmpty())
return;
if (QDir(path) == QDir(m_pendingDirScrollPath))
{
m_pendingDirScrollPath = QString();
emit scrollToDownloads(path);
}
}
QVector<QPair<QString, QString> > MainWindow::getPlaylists() QVector<QPair<QString, QString> > MainWindow::getPlaylists()
{ {
QVector<QPair<QString, QString> > playlists; QVector<QPair<QString, QString> > playlists;
@ -2542,10 +2561,33 @@ void MainWindow::onBrowserDownloadsClicked()
{ {
settings_t *settings = config_get_ptr(); settings_t *settings = config_get_ptr();
QDir dir(settings->paths.directory_core_assets); QDir dir(settings->paths.directory_core_assets);
QString path = dir.absolutePath();
QModelIndex index;
m_dirTree->setCurrentIndex(m_dirModel->index(dir.absolutePath())); m_pendingDirScrollPath = path;
/* for some reason, scrollTo only seems to work right when the button is clicked twice (only tested on Linux) */
m_dirTree->scrollTo(m_dirTree->currentIndex(), QAbstractItemView::PositionAtTop); index = m_dirModel->index(path);
m_dirTree->setCurrentIndex(index);
onDownloadScroll(path);
}
void MainWindow::onDownloadScroll(QString path)
{
QModelIndex index = m_dirModel->index(path);
m_dirTree->scrollTo(index, QAbstractItemView::PositionAtTop);
m_dirTree->expand(index);
/* FIXME: Find a way to make this unnecessary */
emit scrollToDownloadsAgain(path);
}
void MainWindow::onDownloadScrollAgain(QString path)
{
QModelIndex index = m_dirModel->index(path);
m_dirTree->scrollTo(index, QAbstractItemView::PositionAtTop);
m_dirTree->expand(index);
} }
void MainWindow::onBrowserUpClicked() void MainWindow::onBrowserUpClicked()

View File

@ -305,6 +305,8 @@ signals:
void itemChanged(); void itemChanged();
void gridItemChanged(QString title); void gridItemChanged(QString title);
void gotThumbnailDownload(QString system, QString title); void gotThumbnailDownload(QString system, QString title);
void scrollToDownloads(QString path);
void scrollToDownloadsAgain(QString path);
public slots: public slots:
void onBrowserDownloadsClicked(); void onBrowserDownloadsClicked();
@ -387,6 +389,9 @@ private slots:
void onContributorsClicked(); void onContributorsClicked();
void onItemChanged(); void onItemChanged();
void onGridItemChanged(QString title); void onGridItemChanged(QString title);
void onFileSystemDirLoaded(const QString &path);
void onDownloadScroll(QString path);
void onDownloadScrollAgain(QString path);
int onExtractArchive(QString path, QString extractionDir, QString tempExtension, retro_task_callback_t cb); int onExtractArchive(QString path, QString extractionDir, QString tempExtension, retro_task_callback_t cb);
void onUpdateNetworkError(QNetworkReply::NetworkError code); void onUpdateNetworkError(QNetworkReply::NetworkError code);
@ -514,6 +519,7 @@ private:
unsigned m_downloadedThumbnails; unsigned m_downloadedThumbnails;
unsigned m_failedThumbnails; unsigned m_failedThumbnails;
bool m_playlistThumbnailDownloadWasCanceled; bool m_playlistThumbnailDownloadWasCanceled;
QString m_pendingDirScrollPath;
protected: protected:
void closeEvent(QCloseEvent *event); void closeEvent(QCloseEvent *event);