Copy-edit some methods of the batch queue to test usage of C++11's auto variables and lambda functions.

This commit is contained in:
Adam Reichold
2015-12-06 17:44:38 +01:00
parent a727460f77
commit b85e9c623f
2 changed files with 93 additions and 104 deletions

View File

@@ -21,6 +21,7 @@
#include <cstring>
#include "../rtengine/rt_math.h"
#include <functional>
#include <iomanip>
#include <sstream>
#include <string>
@@ -37,13 +38,13 @@
using namespace std;
using namespace rtengine;
BatchQueue::BatchQueue (FileCatalog* aFileCatalog) : processing(NULL), fileCatalog(aFileCatalog), sequence(0), listener(NULL)
BatchQueue::BatchQueue (FileCatalog* aFileCatalog) : processing(NULL), fileCatalog(aFileCatalog), sequence(0), listener(NULL),
pmenu (new Gtk::Menu ())
{
location = THLOC_BATCHQUEUE;
int p = 0;
pmenu = new Gtk::Menu ();
pmenu->attach (*Gtk::manage(open = new Gtk::MenuItem (M("FILEBROWSER_POPUPOPENINEDITOR"))), 0, 1, p, p + 1);
p++;
@@ -79,9 +80,9 @@ BatchQueue::BatchQueue (FileCatalog* aFileCatalog) : processing(NULL), fileCatal
cancel->add_accelerator ("activate", pmenu->get_accel_group(), GDK_Delete, (Gdk::ModifierType)0, Gtk::ACCEL_VISIBLE);
open->signal_activate().connect(sigc::mem_fun(*this, &BatchQueue::openLastSelectedItemInEditor));
cancel->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &BatchQueue::cancelItems), &selected));
head->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &BatchQueue::headItems), &selected));
tail->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &BatchQueue::tailItems), &selected));
cancel->signal_activate().connect (std::bind (&BatchQueue::cancelItems, this, selected));
head->signal_activate().connect (std::bind (&BatchQueue::headItems, this, selected));
tail->signal_activate().connect (std::bind (&BatchQueue::tailItems, this, selected));
selall->signal_activate().connect (sigc::mem_fun(*this, &BatchQueue::selectAll));
setArrangement (ThumbBrowserBase::TB_Vertical);
@@ -99,20 +100,18 @@ BatchQueue::~BatchQueue ()
}
fd.clear ();
delete pmenu;
}
void BatchQueue::resizeLoadedQueue()
{
// TODO: Check for Linux
#if PROTECT_VECTORS
MYWRITERLOCK(l, entryRW);
#endif
for (size_t i = 0; i < fd.size(); i++) {
fd.at(i)->resize(getThumbnailHeight());
}
const auto height = getThumbnailHeight ();
for (const auto entry : fd)
entry->resize(height);
}
// Reduce the max size of a thumb, since thumb is processed synchronously on adding to queue
@@ -161,72 +160,63 @@ bool BatchQueue::keyPressed (GdkEventKey* event)
openLastSelectedItemInEditor();
return true;
} else if (event->keyval == GDK_Home) {
headItems (&selected);
headItems (selected);
return true;
} else if (event->keyval == GDK_End) {
tailItems (&selected);
tailItems (selected);
return true;
} else if (event->keyval == GDK_Delete) {
cancelItems (&selected);
cancelItems (selected);
return true;
}
return false;
}
void BatchQueue::addEntries ( std::vector<BatchQueueEntry*> &entries, bool head, bool save)
void BatchQueue::addEntries (const std::vector<BatchQueueEntry*>& entries, bool head, bool save)
{
{
// TODO: Check for Linux
#if PROTECT_VECTORS
MYWRITERLOCK(l, entryRW);
#endif
for( std::vector<BatchQueueEntry*>::iterator entry = entries.begin(); entry != entries.end(); entry++ ) {
(*entry)->setParent (this);
for (const auto entry : entries) {
// BatchQueueButtonSet HAVE TO be added before resizing to take them into account
BatchQueueButtonSet* bqbs = new BatchQueueButtonSet (*entry);
entry->setParent (this);
// BatchQueueButtonSet have to be added before resizing to take them into account
const auto bqbs = new BatchQueueButtonSet (entry);
bqbs->setButtonListener (this);
(*entry)->addButtonSet (bqbs);
entry->addButtonSet (bqbs);
(*entry)->resize (getThumbnailHeight()); // batch queue might have smaller, restricted size
Glib::ustring tempFile = getTempFilenameForParams( (*entry)->filename );
// batch queue might have smaller, restricted size
entry->resize (getThumbnailHeight());
// recovery save
if( !(*entry)->params.save( tempFile ) ) {
(*entry)->savedParamsFile = tempFile;
}
const auto tempFile = getTempFilenameForParams (entry->filename);
(*entry)->selected = false;
if (!entry->params.save (tempFile))
entry->savedParamsFile = tempFile;
if (!head) {
fd.push_back (*entry);
} else {
std::vector<ThumbBrowserEntryBase*>::iterator pos;
entry->selected = false;
for (pos = fd.begin(); pos != fd.end(); pos++)
if (!(*pos)->processing) {
fd.insert (pos, *entry);
break;
}
// insert either at the end, or before the first non-processing entry
auto pos = fd.end ();
if (pos == fd.end()) {
fd.push_back (*entry);
}
}
if (head)
pos = std::find_if (fd.begin (), fd.end (), [] (const ThumbBrowserEntryBase* fdEntry) { return !fdEntry->processing; });
if ((*entry)->thumbnail) {
(*entry)->thumbnail->imageEnqueued ();
}
fd.insert (pos, entry);
if (entry->thumbnail)
entry->thumbnail->imageEnqueued ();
}
}
if (save) {
saveBatchQueue( );
}
if (save)
saveBatchQueue ();
redraw();
redraw ();
notifyListener (false);
}
@@ -509,107 +499,106 @@ int cancelItemUI (void* data)
return 0;
}
void BatchQueue::cancelItems (std::vector<ThumbBrowserEntryBase*>* items)
void BatchQueue::cancelItems (const std::vector<ThumbBrowserEntryBase*>& items)
{
{
// TODO: Check for Linux
#if PROTECT_VECTORS
MYWRITERLOCK(l, entryRW);
#endif
for (size_t i = 0; i < items->size(); i++) {
BatchQueueEntry* entry = (BatchQueueEntry*)(*items)[i];
for (const auto item : items) {
if (entry->processing) {
const auto entry = static_cast<BatchQueueEntry*> (item);
if (entry->processing)
continue;
}
std::vector<ThumbBrowserEntryBase*>::iterator pos = std::find (fd.begin(), fd.end(), entry);
const auto pos = std::find (fd.begin (), fd.end (), entry);
if (pos != fd.end()) {
fd.erase (pos);
rtengine::ProcessingJob::destroy (entry->job);
if (pos == fd.end ())
continue;
if (entry->thumbnail) {
entry->thumbnail->imageRemovedFromQueue ();
}
fd.erase (pos);
g_idle_add (cancelItemUI, entry);
}
rtengine::ProcessingJob::destroy (entry->job);
if (entry->thumbnail)
entry->thumbnail->imageRemovedFromQueue ();
g_idle_add (cancelItemUI, entry);
}
for (size_t i = 0; i < fd.size(); i++) {
fd[i]->selected = false;
}
for (const auto entry : fd)
entry->selected = false;
lastClicked = NULL;
lastClicked = nullptr;
selected.clear ();
}
saveBatchQueue( );
saveBatchQueue ();
redraw ();
notifyListener (false);
}
void BatchQueue::headItems (std::vector<ThumbBrowserEntryBase*>* items)
void BatchQueue::headItems (const std::vector<ThumbBrowserEntryBase*>& items)
{
{
// TODO: Check for Linux
#if PROTECT_VECTORS
MYWRITERLOCK(l, entryRW);
#endif
for (auto item = items.rbegin(); item != items.rend(); ++item) {
for (int i = items->size() - 1; i >= 0; i--) {
BatchQueueEntry* entry = (BatchQueueEntry*)(*items)[i];
const auto entry = static_cast<BatchQueueEntry*> (*item);
if (entry->processing) {
if (entry->processing)
continue;
}
std::vector<ThumbBrowserEntryBase*>::iterator pos = std::find (fd.begin(), fd.end(), entry);
const auto pos = std::find (fd.begin (), fd.end (), entry);
if (pos != fd.end() && pos != fd.begin()) {
fd.erase (pos);
if (pos == fd.end () || pos == fd.begin ())
continue;
// find the first item that is not under processing
for (pos = fd.begin(); pos != fd.end(); pos++)
if (!(*pos)->processing) {
fd.insert (pos, entry);
break;
}
}
fd.erase (pos);
// find the first item that is not under processing
const auto newPos = std::find_if (fd.begin (), fd.end (), [] (const ThumbBrowserEntryBase* fdEntry) { return !fdEntry->processing; });
fd.insert (newPos, entry);
}
}
saveBatchQueue( );
saveBatchQueue ();
redraw ();
}
void BatchQueue::tailItems (std::vector<ThumbBrowserEntryBase*>* items)
void BatchQueue::tailItems (const std::vector<ThumbBrowserEntryBase*>& items)
{
{
// TODO: Check for Linux
#if PROTECT_VECTORS
MYWRITERLOCK(l, entryRW);
#endif
for (size_t i = 0; i < items->size(); i++) {
BatchQueueEntry* entry = (BatchQueueEntry*)(*items)[i];
for (const auto item : items) {
if (entry->processing) {
const auto entry = static_cast<BatchQueueEntry*> (item);
if (entry->processing)
continue;
}
std::vector<ThumbBrowserEntryBase*>::iterator pos = std::find (fd.begin(), fd.end(), entry);
const auto pos = std::find (fd.begin (), fd.end (), entry);
if (pos != fd.end()) {
fd.erase (pos);
fd.push_back (entry);
}
if (pos == fd.end ())
continue;
fd.erase (pos);
fd.push_back (entry);
}
}
saveBatchQueue( );
saveBatchQueue ();
redraw ();
}
@@ -1034,11 +1023,11 @@ void BatchQueue::buttonPressed (LWButton* button, int actionCode, void* actionDa
bqe.push_back (static_cast<BatchQueueEntry*>(actionData));
if (actionCode == 10) { // cancel
cancelItems (&bqe);
cancelItems (bqe);
} else if (actionCode == 8) { // to head
headItems (&bqe);
headItems (bqe);
} else if (actionCode == 9) { // to tail
tailItems (&bqe);
tailItems (bqe);
}
}

View File

@@ -57,7 +57,7 @@ protected:
Gtk::ImageMenuItem* tail;
Gtk::MenuItem* selall;
Gtk::MenuItem* open;
Gtk::Menu* pmenu;
std::unique_ptr<Gtk::Menu> pmenu;
Glib::RefPtr<Gtk::AccelGroup> pmaccelgroup;
@@ -72,10 +72,10 @@ public:
BatchQueue (FileCatalog* aFileCatalog);
~BatchQueue ();
void addEntries (std::vector<BatchQueueEntry*> &entries, bool head = false, bool save = true);
void cancelItems (std::vector<ThumbBrowserEntryBase*>* items);
void headItems (std::vector<ThumbBrowserEntryBase*>* items);
void tailItems (std::vector<ThumbBrowserEntryBase*>* items);
void addEntries (const std::vector<BatchQueueEntry*>& entries, bool head = false, bool save = true);
void cancelItems (const std::vector<ThumbBrowserEntryBase*>& items);
void headItems (const std::vector<ThumbBrowserEntryBase *>& items);
void tailItems (const std::vector<ThumbBrowserEntryBase *>& items);
void selectAll ();
void openItemInEditor(ThumbBrowserEntryBase* item);
void openLastSelectedItemInEditor();