From de71a4dee79df72a600d5c3270125b7bc6cbc360 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sun, 6 May 2018 01:36:47 -0400 Subject: [PATCH] Qt: general performance improvements, fix crash on switching playlists quickly in grid view, prevent initial loading of grid items from blocking --- ui/drivers/qt/flowlayout.cpp | 187 +++++++++++++---------- ui/drivers/qt/flowlayout.h | 48 +++--- ui/drivers/qt/ui_qt_load_core_window.cpp | 5 +- ui/drivers/qt/ui_qt_window.cpp | 158 ++++++++++++------- ui/drivers/ui_qt.h | 12 +- 5 files changed, 253 insertions(+), 157 deletions(-) diff --git a/ui/drivers/qt/flowlayout.cpp b/ui/drivers/qt/flowlayout.cpp index 0dd3a1f606..6719c13f5c 100644 --- a/ui/drivers/qt/flowlayout.cpp +++ b/ui/drivers/qt/flowlayout.cpp @@ -48,153 +48,184 @@ ** ****************************************************************************/ +/* Original work Copyright (C) 2016 The Qt Company Ltd. + * Modified work Copyright (C) 2018 - Brad Parker + */ #include #include "flowlayout.h" + FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing) - : QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing) + : QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing) { - setContentsMargins(margin, margin, margin, margin); + setContentsMargins(margin, margin, margin, margin); } FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing) - : m_hSpace(hSpacing), m_vSpace(vSpacing) + : m_hSpace(hSpacing), m_vSpace(vSpacing) { - setContentsMargins(margin, margin, margin, margin); + setContentsMargins(margin, margin, margin, margin); } FlowLayout::~FlowLayout() { - QLayoutItem *item; - while ((item = takeAt(0))) - delete item; + QLayoutItem *item; + + while ((item = takeAt(0))) + delete item; } void FlowLayout::addItem(QLayoutItem *item) { - itemList.append(item); + itemList.append(item); } int FlowLayout::horizontalSpacing() const { - if (m_hSpace >= 0) { - return m_hSpace; - } else { - return smartSpacing(QStyle::PM_LayoutHorizontalSpacing); - } + if (m_hSpace >= 0) + return m_hSpace; + else + return smartSpacing(QStyle::PM_LayoutHorizontalSpacing); } int FlowLayout::verticalSpacing() const { - if (m_vSpace >= 0) { - return m_vSpace; - } else { - return smartSpacing(QStyle::PM_LayoutVerticalSpacing); - } + if (m_vSpace >= 0) + return m_vSpace; + else + return smartSpacing(QStyle::PM_LayoutVerticalSpacing); } int FlowLayout::count() const { - return itemList.size(); + return itemList.size(); } -QLayoutItem *FlowLayout::itemAt(int index) const +QLayoutItem* FlowLayout::itemAt(int index) const { - return itemList.value(index); + return itemList.value(index); } -QLayoutItem *FlowLayout::takeAt(int index) +QLayoutItem* FlowLayout::takeAt(int index) { - if (index >= 0 && index < itemList.size()) - return itemList.takeAt(index); - else - return 0; + if (index >= 0 && index < itemList.size()) + return itemList.takeAt(index); + else + return NULL; } Qt::Orientations FlowLayout::expandingDirections() const { - return 0; + return 0; } bool FlowLayout::hasHeightForWidth() const { - return true; + return true; } int FlowLayout::heightForWidth(int width) const { - int height = doLayout(QRect(0, 0, width, 0), true); - return height; + int height = doLayout(QRect(0, 0, width, 0), true); + return height; } void FlowLayout::setGeometry(const QRect &rect) { - QLayout::setGeometry(rect); - doLayout(rect, false); + QLayout::setGeometry(rect); + doLayout(rect, false); } QSize FlowLayout::sizeHint() const { - return minimumSize(); + return minimumSize(); } QSize FlowLayout::minimumSize() const { - QSize size; - QLayoutItem *item; - foreach (item, itemList) - size = size.expandedTo(item->minimumSize()); + QSize size; + int i = 0; - size += QSize(2*margin(), 2*margin()); - return size; + if (itemList.isEmpty()) + return size; + + for (i = 0; i < itemList.count(); i++) + { + const QLayoutItem *item = itemList.at(i); + size = size.expandedTo(item->minimumSize()); + } + + size += QSize(2 * margin(), 2 * margin()); + return size; } int FlowLayout::doLayout(const QRect &rect, bool testOnly) const { - int left, top, right, bottom; - getContentsMargins(&left, &top, &right, &bottom); - QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom); - int x = effectiveRect.x(); - int y = effectiveRect.y(); - int lineHeight = 0; + QRect effectiveRect; + int left = 0, top = 0, right = 0, bottom = 0; + int x = 0; + int y = 0; + int lineHeight = 0; + int i = 0; - QLayoutItem *item; - foreach (item, itemList) { - QWidget *wid = item->widget(); - int spaceX = horizontalSpacing(); - if (spaceX == -1) - spaceX = wid->style()->layoutSpacing( - QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal); - int spaceY = verticalSpacing(); - if (spaceY == -1) - spaceY = wid->style()->layoutSpacing( - QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical); - int nextX = x + item->sizeHint().width() + spaceX; - if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) { - x = effectiveRect.x(); - y = y + lineHeight + spaceY; - nextX = x + item->sizeHint().width() + spaceX; - lineHeight = 0; - } + getContentsMargins(&left, &top, &right, &bottom); + effectiveRect = rect.adjusted(+left, +top, -right, -bottom); + x = effectiveRect.x(); + y = effectiveRect.y(); - if (!testOnly) - item->setGeometry(QRect(QPoint(x, y), item->sizeHint())); + if (itemList.isEmpty()) + return y + lineHeight - rect.y() + bottom; - x = nextX; - lineHeight = qMax(lineHeight, item->sizeHint().height()); - } - return y + lineHeight - rect.y() + bottom; + for (i = 0; i < itemList.count(); i++) + { + QLayoutItem *item = itemList.at(i); + const QWidget *wid = item->widget(); + int spaceX = horizontalSpacing(); + int spaceY = 0; + int nextX = 0; + + if (spaceX == -1) + spaceX = wid->style()->layoutSpacing( + QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal); + + spaceY = verticalSpacing(); + + if (spaceY == -1) + spaceY = wid->style()->layoutSpacing( + QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical); + + nextX = x + item->sizeHint().width() + spaceX; + + if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) + { + x = effectiveRect.x(); + y = y + lineHeight + spaceY; + nextX = x + item->sizeHint().width() + spaceX; + lineHeight = 0; + } + + if (!testOnly) + item->setGeometry(QRect(QPoint(x, y), item->sizeHint())); + + x = nextX; + lineHeight = qMax(lineHeight, item->sizeHint().height()); + } + + return y + lineHeight - rect.y() + bottom; } + int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const { - QObject *parent = this->parent(); - if (!parent) { - return -1; - } else if (parent->isWidgetType()) { - QWidget *pw = static_cast(parent); - return pw->style()->pixelMetric(pm, 0, pw); - } else { - return static_cast(parent)->spacing(); - } + const QObject *parentObj = parent(); + + if (!parentObj) + return -1; + else if (parentObj->isWidgetType()) + { + const QWidget *pw = static_cast(parentObj); + return pw->style()->pixelMetric(pm, 0, pw); + } + else + return static_cast(parentObj)->spacing(); } diff --git a/ui/drivers/qt/flowlayout.h b/ui/drivers/qt/flowlayout.h index 436ba5e4c6..282a43df94 100644 --- a/ui/drivers/qt/flowlayout.h +++ b/ui/drivers/qt/flowlayout.h @@ -48,7 +48,13 @@ ** ****************************************************************************/ -/* bparker: Removed C++11 override keyword from original source */ +/* Original work Copyright (C) 2016 The Qt Company Ltd. + * Modified work Copyright (C) 2018 - Brad Parker + */ + +/* bparker: Removed C++11 override keyword from original source + * Changed QList to QVector + */ #ifndef FLOWLAYOUT_H #define FLOWLAYOUT_H @@ -60,30 +66,30 @@ class FlowLayout : public QLayout { public: - explicit FlowLayout(QWidget *parent, int margin = -1, int hSpacing = -1, int vSpacing = -1); - explicit FlowLayout(int margin = -1, int hSpacing = -1, int vSpacing = -1); - ~FlowLayout(); + explicit FlowLayout(QWidget *parent, int margin = -1, int hSpacing = -1, int vSpacing = -1); + explicit FlowLayout(int margin = -1, int hSpacing = -1, int vSpacing = -1); + ~FlowLayout(); - void addItem(QLayoutItem *item); - int horizontalSpacing() const; - int verticalSpacing() const; - Qt::Orientations expandingDirections() const; - bool hasHeightForWidth() const; - int heightForWidth(int) const; - int count() const; - QLayoutItem *itemAt(int index) const; - QSize minimumSize() const; - void setGeometry(const QRect &rect); - QSize sizeHint() const; - QLayoutItem *takeAt(int index); + void addItem(QLayoutItem *item); + int horizontalSpacing() const; + int verticalSpacing() const; + Qt::Orientations expandingDirections() const; + bool hasHeightForWidth() const; + int heightForWidth(int) const; + int count() const; + QLayoutItem* itemAt(int index) const; + QSize minimumSize() const; + void setGeometry(const QRect &rect); + QSize sizeHint() const; + QLayoutItem* takeAt(int index); private: - int doLayout(const QRect &rect, bool testOnly) const; - int smartSpacing(QStyle::PixelMetric pm) const; + int doLayout(const QRect &rect, bool testOnly) const; + int smartSpacing(QStyle::PixelMetric pm) const; - QList itemList; - int m_hSpace; - int m_vSpace; + QVector itemList; + int m_hSpace; + int m_vSpace; }; #endif // FLOWLAYOUT_H diff --git a/ui/drivers/qt/ui_qt_load_core_window.cpp b/ui/drivers/qt/ui_qt_load_core_window.cpp index 65da0381fc..00f29f38de 100644 --- a/ui/drivers/qt/ui_qt_load_core_window.cpp +++ b/ui/drivers/qt/ui_qt_load_core_window.cpp @@ -266,8 +266,11 @@ void LoadCoreWindow::initCoreList(const QStringList &extensionFilters) if (rowsToHide.size() != m_table->rowCount()) { - foreach (const int &row, rowsToHide) + int i = 0; + + for (i = 0; i < rowsToHide.count() && rowsToHide.count() > 0; i++) { + const int &row = rowsToHide.at(i); m_table->setRowHidden(row, true); } } diff --git a/ui/drivers/qt/ui_qt_window.cpp b/ui/drivers/qt/ui_qt_window.cpp index b263402e9b..00da8a0ac6 100644 --- a/ui/drivers/qt/ui_qt_window.cpp +++ b/ui/drivers/qt/ui_qt_window.cpp @@ -200,7 +200,7 @@ void CoreInfoDialog::showCoreInfo() int row = 0; int rowCount = m_formLayout->rowCount(); int i = 0; - QList > infoList = m_mainwindow->getCoreInfo(); + QVector > infoList = m_mainwindow->getCoreInfo(); if (rowCount > 0) { @@ -526,6 +526,7 @@ MainWindow::MainWindow(QWidget *parent) : ,m_gridLayoutWidget(new QWidget()) ,m_zoomSlider(NULL) ,m_lastZoomSliderValue(0) + ,m_pendingItemUpdates() { settings_t *settings = config_get_ptr(); QDir playlistDir(settings->paths.directory_playlist); @@ -707,7 +708,7 @@ MainWindow::MainWindow(QWidget *parent) : qApp->processEvents(); QTimer::singleShot(0, this, SLOT(onBrowserStartClicked())); - for (i = 0; i < m_listWidget->count(); i++) + for (i = 0; i < m_listWidget->count() && m_listWidget->count() > 0; i++) { /* select the first non-hidden row */ if (!m_listWidget->isRowHidden(i)) @@ -737,22 +738,27 @@ MainWindow::~MainWindow() removeGridItems(); } +inline void MainWindow::calcGridItemSize(GridItem *item, int zoomValue) +{ + QMutexLocker lock(&item->mutex); + int newSize = 0; + + if (zoomValue < 50) + newSize = expScale(lerp(0, 49, 25, 49, zoomValue) / 50.0, 102, 256); + else + newSize = expScale(zoomValue / 100.0, 256, 1024); + + item->widget->setFixedSize(QSize(newSize, newSize)); +} + void MainWindow::onZoomValueChanged(int value) { - if (m_gridItems.count() == 0) - return; + int i = 0; - foreach(GridItem *item, m_gridItems) + for (i = 0; i < m_gridItems.count() && m_gridItems.count() > 0; i++) { - QMutexLocker lock(&item->mutex); - int newSize = 0; - - if (value < 50) - newSize = expScale(lerp(0, 49, 25, 49, value) / 50.0, 102, 256); - else - newSize = expScale(value / 100.0, 256, 1024); - - item->widget->setFixedSize(QSize(newSize, newSize)); + GridItem *item = m_gridItems.at(i); + calcGridItemSize(item, value); } m_lastZoomSliderValue = value; @@ -948,20 +954,17 @@ void MainWindow::onPlaylistWidgetContextMenuRequested(const QPoint&) menu->addAction(hideAction.data()); - if (m_listWidget->count() > 0) + for (j = 0; j < m_listWidget->count() && m_listWidget->count() > 0; j++) { - for (j = 0; j < m_listWidget->count(); j++) - { - QListWidgetItem *item = m_listWidget->item(j); - bool hidden = m_listWidget->isItemHidden(item); + QListWidgetItem *item = m_listWidget->item(j); + bool hidden = m_listWidget->isItemHidden(item); - if (hidden) - { - QAction *action = hiddenPlaylistsMenu->addAction(item->text()); - action->setProperty("row", j); - action->setProperty("core_path", item->data(Qt::UserRole).toString()); - foundHiddenPlaylist = true; - } + if (hidden) + { + QAction *action = hiddenPlaylistsMenu->addAction(item->text()); + action->setProperty("row", j); + action->setProperty("core_path", item->data(Qt::UserRole).toString()); + foundHiddenPlaylist = true; } } @@ -986,17 +989,28 @@ void MainWindow::onPlaylistWidgetContextMenuRequested(const QPoint&) core_info_get_list(&core_info_list); - for (i = 0; i < core_info_list->count; i++) + for (i = 0; i < core_info_list->count && core_info_list->count > 0; i++) { const core_info_t *core = &core_info_list->list[i]; coreList[core->core_name] = core; } - foreach (const QString &key, coreList.keys()) { - const core_info_t *core = coreList.value(key); - QAction *action = associateMenu->addAction(core->core_name); - action->setProperty("core_path", core->path); + QMapIterator coreListIterator(coreList); + + while (coreListIterator.hasNext()) + { + QString key; + const core_info_t *core = NULL; + QAction *action = NULL; + + coreListIterator.next(); + + key = coreListIterator.key(); + core = coreList.value(key); + action = associateMenu->addAction(core->core_name); + action->setProperty("core_path", core->path); + } } menu->addMenu(associateMenu.data()); @@ -1180,6 +1194,7 @@ void MainWindow::reloadPlaylists() QDir playlistDir(settings->paths.directory_playlist); QString currentPlaylistPath; QStringList hiddenPlaylists = m_settings->value("hidden_playlists").toStringList(); + int i = 0; currentItem = m_listWidget->currentItem(); @@ -1230,9 +1245,10 @@ void MainWindow::reloadPlaylists() if (hiddenPlaylists.contains(QFileInfo(settings->paths.path_content_video_history).fileName())) m_listWidget->setRowHidden(m_listWidget->row(videoPlaylistsItem), true); - foreach (QString file, m_playlistFiles) + for (i = 0; i < m_playlistFiles.count() && m_playlistFiles.count() > 0; i++) { QListWidgetItem *item = NULL; + const QString &file = m_playlistFiles.at(i); QString fileDisplayName = file; QString fileName = file; bool hasIcon = false; @@ -1270,7 +1286,6 @@ void MainWindow::reloadPlaylists() if (firstItem) { - int i = 0; bool found = false; for (i = 0; i < m_listWidget->count(); i++) @@ -1318,7 +1333,7 @@ void MainWindow::onGotLogMessage(const QString &msg) void MainWindow::onLaunchWithComboBoxIndexChanged(int) { - QList > infoList = getCoreInfo(); + QVector > infoList = getCoreInfo(); QString coreInfoText; QVariantMap coreMap = m_launchWithComboBox->currentData(Qt::UserRole).value(); CoreSelection coreSelection = static_cast(coreMap.value("core_selection").toInt()); @@ -1423,9 +1438,9 @@ void MainWindow::setTheme(Theme theme) } } -QList > MainWindow::getCoreInfo() +QVector > MainWindow::getCoreInfo() { - QList > infoList; + QVector > infoList; QHash currentCore = getSelectedCore(); core_info_list_t *core_info_list = NULL; const core_info_t *core_info = NULL; @@ -1850,7 +1865,7 @@ QHash MainWindow::getSelectedCore() } case CORE_SELECTION_PLAYLIST_DEFAULT: { - QList > cores; + QVector > cores; int i = 0; if (!contentItem || contentHash["db_name"].isEmpty()) @@ -1982,7 +1997,7 @@ void MainWindow::onRunClicked() } case CORE_SELECTION_PLAYLIST_DEFAULT: { - QList > cores = getPlaylistDefaultCores(); + QVector > cores = getPlaylistDefaultCores(); int i = 0; for (i = 0; i < cores.count(); i++) @@ -2047,13 +2062,13 @@ ViewOptionsDialog* MainWindow::viewOptionsDialog() return m_viewOptionsDialog; } -QList > MainWindow::getPlaylistDefaultCores() +QVector > MainWindow::getPlaylistDefaultCores() { settings_t *settings = config_get_ptr(); struct string_list *playlists = string_split(settings->arrays.playlist_names, ";"); struct string_list *cores = string_split(settings->arrays.playlist_cores, ";"); unsigned i = 0; - QList > coreList; + QVector > coreList; if (!playlists || !cores) { @@ -2164,7 +2179,7 @@ void MainWindow::setCoreActions() if (!hash["db_name"].isEmpty()) { - QList > defaultCores = getPlaylistDefaultCores(); + QVector > defaultCores = getPlaylistDefaultCores(); int i = 0; if (defaultCores.count() > 0) @@ -2406,6 +2421,7 @@ void MainWindow::onViewClosedDocksAboutToShow() QMenu *menu = qobject_cast(sender()); QList dockWidgets; bool found = false; + int i = 0; if (!menu) return; @@ -2420,8 +2436,10 @@ void MainWindow::onViewClosedDocksAboutToShow() return; } - foreach (QDockWidget *dock, dockWidgets) + for (i = 0; i < dockWidgets.count() && dockWidgets.count() > 0; i++) { + const QDockWidget *dock = dockWidgets.at(i); + if (!dock->isVisible()) { QAction *action = menu->addAction(dock->property("menu_text").toString(), this, SLOT(onShowHiddenDockWidgetAction())); @@ -2431,9 +2449,7 @@ void MainWindow::onViewClosedDocksAboutToShow() } if (!found) - { menu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NONE)); - } } void MainWindow::onShowHiddenDockWidgetAction() @@ -2826,6 +2842,7 @@ void MainWindow::removeGridItems() items.remove(); m_gridLayout->removeWidget(item->widget); + m_pendingItemUpdates.removeAll(item); delete item->widget; @@ -2854,13 +2871,39 @@ void MainWindow::onDeferredImageLoaded() if (!item->image.isNull()) { - item->label->setPixmap(QPixmap::fromImage(item->image)); - item->label->update(); + m_pendingItemUpdates.append(item); + QTimer::singleShot(0, this, SLOT(onPendingItemUpdates())); } item->mutex.unlock(); } +void MainWindow::onPendingItemUpdates() +{ + QMutableListIterator list(m_pendingItemUpdates); + + while (list.hasNext()) + { + GridItem *item = list.next(); + + if (!item) + continue; + + onUpdateGridItemPixmapFromImage(item); + + list.remove(); + } +} + +void MainWindow::onUpdateGridItemPixmapFromImage(GridItem *item) +{ + if (!item) + return; + + item->label->setPixmap(QPixmap::fromImage(item->image)); + item->label->update(); +} + void MainWindow::loadImageDeferred(GridItem *item, QString path) { connect(&item->imageWatcher, SIGNAL(finished()), this, SLOT(onDeferredImageLoaded()), Qt::QueuedConnection); @@ -2882,13 +2925,14 @@ GridItem* MainWindow::doDeferredImageLoad(GridItem *item, QString path) return item; } -void MainWindow::addPlaylistItemsToGrid(QString pathString) +void MainWindow::addPlaylistItemsToGrid(const QString &pathString) { - QList > items = getPlaylistItems(pathString); + QVector > items = getPlaylistItems(pathString); QScreen *screen = qApp->primaryScreen(); QSize screenSize = screen->size(); settings_t *settings = config_get_ptr(); int i = 0; + int zoomValue = m_zoomSlider->value(); for (i = 0; i < items.count(); i++) { @@ -2938,6 +2982,8 @@ void MainWindow::addPlaylistItemsToGrid(QString pathString) item->label = label; + calcGridItemSize(item, zoomValue); + item->widget->layout()->addWidget(label); newLabel = new QLabel(hash.value("label"), item->widget); @@ -2950,6 +2996,8 @@ void MainWindow::addPlaylistItemsToGrid(QString pathString) m_gridItems.append(item); loadImageDeferred(item, imagePath); + + qApp->processEvents(); } } @@ -2969,9 +3017,11 @@ void MainWindow::initContentGridLayout() { settings_t *settings = config_get_ptr(); QDir playlistDir(settings->paths.directory_playlist); + int i = 0; - foreach (QString playlist, m_playlistFiles) + for (i = 0; i < m_playlistFiles.count() && m_playlistFiles.count() > 0; i++) { + const QString &playlist = m_playlistFiles.at(i); addPlaylistItemsToGrid(playlistDir.absoluteFilePath(playlist)); } } @@ -3018,9 +3068,11 @@ void MainWindow::initContentTableWidget() { settings_t *settings = config_get_ptr(); QDir playlistDir(settings->paths.directory_playlist); + int i = 0; - foreach (QString playlist, m_playlistFiles) + for (i = 0; i < m_playlistFiles.count() && m_playlistFiles.count() > 0; i++) { + const QString &playlist = m_playlistFiles.at(i); addPlaylistItemsToTable(playlistDir.absoluteFilePath(playlist)); } } @@ -3047,10 +3099,10 @@ void MainWindow::initContentTableWidget() onSearchEnterPressed(); } -QList > MainWindow::getPlaylistItems(QString pathString) +QVector > MainWindow::getPlaylistItems(QString pathString) { QByteArray pathArray; - QList > items; + QVector > items; const char *pathData = NULL; playlist_t *playlist = NULL; unsigned playlistSize = 0; @@ -3118,7 +3170,7 @@ QList > MainWindow::getPlaylistItems(QString pathString) void MainWindow::addPlaylistItemsToTable(QString pathString) { - QList > items = getPlaylistItems(pathString); + QVector > items = getPlaylistItems(pathString); int i = 0; int oldRowCount = m_tableWidget->rowCount(); diff --git a/ui/drivers/ui_qt.h b/ui/drivers/ui_qt.h index 91099e6e65..5344e2e842 100644 --- a/ui/drivers/ui_qt.h +++ b/ui/drivers/ui_qt.h @@ -256,10 +256,10 @@ public: QToolButton* runPushButton(); QToolButton* stopPushButton(); QTabWidget* browserAndPlaylistTabWidget(); - QList > getPlaylistDefaultCores(); + QVector > getPlaylistDefaultCores(); ViewOptionsDialog* viewOptionsDialog(); QSettings* settings(); - QList > getCoreInfo(); + QVector > getCoreInfo(); void setTheme(Theme theme = THEME_SYSTEM_DEFAULT); Theme theme(); Theme getThemeFromString(QString themeString); @@ -315,7 +315,7 @@ private slots: void onSearchEnterPressed(); void onSearchLineEditEdited(const QString &text); void addPlaylistItemsToTable(QString path); - void addPlaylistItemsToGrid(QString path); + void addPlaylistItemsToGrid(const QString &path); void onContentItemDoubleClicked(QTableWidgetItem *item); void onCoreLoadWindowClosed(); void onTabWidgetIndexChanged(int index); @@ -328,6 +328,8 @@ private slots: void onDeferredImageLoaded(); void onZoomValueChanged(int value); void onContentGridInited(); + void onUpdateGridItemPixmapFromImage(GridItem *item); + void onPendingItemUpdates(); private: void setCurrentCoreLabel(); @@ -336,7 +338,8 @@ private: bool isContentLessCore(); void removeGridItems(); void loadImageDeferred(GridItem *item, QString path); - QList > getPlaylistItems(QString pathString); + void calcGridItemSize(GridItem *item, int zoomValue); + QVector > getPlaylistItems(QString pathString); LoadCoreWindow *m_loadCoreWindow; QTimer *m_timer; @@ -385,6 +388,7 @@ private: QWidget *m_gridLayoutWidget; QSlider *m_zoomSlider; int m_lastZoomSliderValue; + QList m_pendingItemUpdates; protected: void closeEvent(QCloseEvent *event);