diff --git a/src/app/ui/file_list.cpp b/src/app/ui/file_list.cpp index c631356bf..8f9389021 100644 --- a/src/app/ui/file_list.cpp +++ b/src/app/ui/file_list.cpp @@ -624,6 +624,15 @@ void FileList::onCurrentFolderChanged() void FileList::onMonitoringTick() { + auto start = base::current_tick(); + while (!m_generateThumbnailsForTheseItems.empty() && + // No more than 200ms launching thumbnail generators + base::current_tick() - start < 200) { + auto fi = m_generateThumbnailsForTheseItems.front(); + m_generateThumbnailsForTheseItems.pop_front(); + ThumbnailGenerator::instance()->generateThumbnail(fi); + } + if (ThumbnailGenerator::instance()->checkWorkers()) invalidate(); } @@ -842,8 +851,13 @@ void FileList::selectIndex(int index) void FileList::generateThumbnailForFileItem(IFileItem* fi) { - if (fi && animation() == ANI_NONE) - ThumbnailGenerator::instance()->generateThumbnail(fi); + if (fi && animation() == ANI_NONE) { + auto it = std::find(m_generateThumbnailsForTheseItems.begin(), + m_generateThumbnailsForTheseItems.end(), fi); + if (it != m_generateThumbnailsForTheseItems.end()) + m_generateThumbnailsForTheseItems.erase(it); + m_generateThumbnailsForTheseItems.push_front(fi); + } } void FileList::delayThumbnailGenerationForSelectedItem() diff --git a/src/app/ui/file_list.h b/src/app/ui/file_list.h index 62dda528a..54a8d860d 100644 --- a/src/app/ui/file_list.h +++ b/src/app/ui/file_list.h @@ -17,6 +17,7 @@ #include "ui/timer.h" #include "ui/widget.h" +#include #include #include @@ -123,6 +124,10 @@ namespace app { // thumbnail to generate when the m_generateThumbnailTimer ticks. IFileItem* m_itemToGenerateThumbnail; + // List of thumbnails to generate in the next m_monitoringTimer in + // a isIconView() + std::deque m_generateThumbnailsForTheseItems; + // True if this listbox accepts selecting multiple items at the // same time. bool m_multiselect;