From 732bbf1a554dd2e218b8947f70d9abf083cb0c16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Tue, 1 Jan 2019 17:55:36 +0100 Subject: [PATCH] Convert `BatchQueue::cancelItems()` to functional `IdleRegister::add()` --- rtgui/batchqueue.cc | 50 ++++++++++++++++++++++++++++++++++---------- rtgui/batchqueue.h | 15 +++++++++---- rtgui/filecatalog.cc | 2 +- 3 files changed, 51 insertions(+), 16 deletions(-) diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index a995797f3..f6c598df7 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -86,6 +86,17 @@ BatchQueue::BatchQueue (FileCatalog* aFileCatalog) : processing(nullptr), fileCa BatchQueue::~BatchQueue () { + std::set removable_bqes; + + mutex_removable_batch_queue_entries.lock(); + removable_batch_queue_entries.swap(removable_bqes); + mutex_removable_batch_queue_entries.unlock(); + + for (const auto entry : removable_bqes) { + ::g_remove(entry->savedParamsFile.c_str()); + delete entry; + } + idle_register.destroy(); MYWRITERLOCK(l, entryRW); @@ -395,6 +406,8 @@ Glib::ustring BatchQueue::getTempFilenameForParams( const Glib::ustring &filenam void BatchQueue::cancelItems (const std::vector& items) { + std::set removable_bqes; + { MYWRITERLOCK(l, entryRW); @@ -417,14 +430,7 @@ void BatchQueue::cancelItems (const std::vector& items) if (entry->thumbnail) entry->thumbnail->imageRemovedFromQueue (); - const auto func = - [](BatchQueueEntry* bqe) -> bool - { - ::g_remove(bqe->savedParamsFile.c_str()); - return false; - }; - - idle_register.add(func, entry, true); + removable_bqes.insert(entry); } for (const auto entry : fd) @@ -434,6 +440,30 @@ void BatchQueue::cancelItems (const std::vector& items) selected.clear (); } + if (!removable_bqes.empty()) { + mutex_removable_batch_queue_entries.lock(); + removable_batch_queue_entries.insert(removable_bqes.begin(), removable_bqes.end()); + mutex_removable_batch_queue_entries.unlock(); + + idle_register.add( + [this]() -> bool + { + std::set removable_bqes; + + mutex_removable_batch_queue_entries.lock(); + removable_batch_queue_entries.swap(removable_bqes); + mutex_removable_batch_queue_entries.unlock(); + + for (const auto entry : removable_bqes) { + ::g_remove(entry->savedParamsFile.c_str()); + delete entry; + } + + return false; + } + ); + } + saveBatchQueue (); redraw (); @@ -940,9 +970,7 @@ Glib::ustring BatchQueue::autoCompleteFileName (const Glib::ustring& fileName, c void BatchQueue::buttonPressed (LWButton* button, int actionCode, void* actionData) { - - std::vector bqe; - bqe.push_back (static_cast(actionData)); + const std::vector bqe = {static_cast(actionData)}; if (actionCode == 10) { // cancel cancelItems (bqe); diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h index c05ca54fe..7751ec176 100644 --- a/rtgui/batchqueue.h +++ b/rtgui/batchqueue.h @@ -18,12 +18,16 @@ #ifndef _BATCHQUEUE_ #define _BATCHQUEUE_ +#include + #include -#include "threadutils.h" -#include "batchqueueentry.h" + #include "../rtengine/rtengine.h" -#include "options.h" + +#include "batchqueueentry.h" #include "lwbuttonset.h" +#include "options.h" +#include "threadutils.h" #include "thumbbrowserbase.h" class BatchQueueListener @@ -85,7 +89,7 @@ public: static Glib::ustring calcAutoFileNameBase (const Glib::ustring& origFileName, int sequence = 0); static int calcMaxThumbnailHeight(); -protected: +private: int getMaxThumbnailHeight() const override; void saveThumbnailHeight (int height) override; int getThumbnailHeight () override; @@ -111,6 +115,9 @@ protected: BatchQueueListener* listener; + std::set removable_batch_queue_entries; + MyMutex mutex_removable_batch_queue_entries; + IdleRegister idle_register; }; diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index aebd0f990..5ebac5e12 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -930,7 +930,7 @@ void FileCatalog::filterApplied() void FileCatalog::openRequested(const std::vector& tmb) { - for (auto thumb : tmb) { + for (const auto thumb : tmb) { thumb->increaseRef(); }