Distinguish between "desired" and "reported" batch queue state

This allows the switch to both reflect the state of the queue and
function as an input widget.
This commit is contained in:
George Hilliard 2018-11-01 00:47:06 -05:00
parent 4a765cc91f
commit cc6cbe8347
2 changed files with 41 additions and 36 deletions

View File

@ -249,20 +249,13 @@ void BatchQueuePanel::queueSizeChanged(int qsize, bool queueRunning, bool queueE
{ {
updateTab (qsize); updateTab (qsize);
if (qsize == 0 || (qsize == 1 && queueRunning)) { setGuiFromBatchState(queueRunning, qsize);
qStartStop->set_sensitive(false);
} else {
qStartStop->set_sensitive(true);
}
if (!queueRunning) { if (!queueRunning && qsize == 0 && queueShouldRun) {
stopBatchProc (); // There was work, but it is all done now.
fdir->set_sensitive (true); queueShouldRun = false;
fformat->set_sensitive (true);
if (qsize == 0) { SoundManager::playSoundAsync(options.sndBatchQueueDone);
SoundManager::playSoundAsync(options.sndBatchQueueDone);
}
} }
if (queueError) { if (queueError) {
@ -273,8 +266,7 @@ void BatchQueuePanel::queueSizeChanged(int qsize, bool queueRunning, bool queueE
void BatchQueuePanel::startOrStopBatchProc() void BatchQueuePanel::startOrStopBatchProc()
{ {
bool state = qStartStop->get_state(); if (qStartStop->get_state()) {
if (state) {
startBatchProc(); startBatchProc();
} else { } else {
stopBatchProc(); stopBatchProc();
@ -283,22 +275,17 @@ void BatchQueuePanel::startOrStopBatchProc()
void BatchQueuePanel::startBatchProc () void BatchQueuePanel::startBatchProc ()
{ {
// Update switch when queue started programmatically
qStartStopConn.block (true);
qStartStop->set_active(true);
qStartStopState = true;
qStartStopConn.block (false);
if (batchQueue->hasJobs()) { if (batchQueue->hasJobs()) {
fdir->set_sensitive (false); // Update the *desired* state of the queue, then launch it. The switch
fformat->set_sensitive (false); // state is not updated here; it is changed by the queueSizeChanged()
if (batchQueue->getEntries().size() == 1) { // callback in response to the *reported* state.
qStartStop->set_sensitive(false); queueShouldRun = true;
}
// Don't need an update callback from the queue to know it is started:
setGuiFromBatchState(true, batchQueue->getEntries().size());
saveOptions(); saveOptions();
batchQueue->startProcessing (); batchQueue->startProcessing ();
} else {
stopBatchProc ();
} }
updateTab (batchQueue->getEntries().size()); updateTab (batchQueue->getEntries().size());
@ -306,20 +293,37 @@ void BatchQueuePanel::startBatchProc ()
void BatchQueuePanel::stopBatchProc () void BatchQueuePanel::stopBatchProc ()
{ {
// Update switch when queue started programmatically // There is nothing much to do here except set the desired state, which the
qStartStopConn.block (true); // background queue thread must check. It will notify queueSizeChanged()
qStartStop->set_active(false); // when it stops.
qStartStopState = false; queueShouldRun = false;
qStartStopConn.block (false);
updateTab (batchQueue->getEntries().size()); updateTab (batchQueue->getEntries().size());
} }
void BatchQueuePanel::setGuiFromBatchState(bool queueRunning, int qsize)
{
// Change the GUI state in response to the reported queue state
if (qsize == 0 || (qsize == 1 && queueRunning)) {
qStartStop->set_sensitive(false);
} else {
qStartStop->set_sensitive(true);
}
qStartStopConn.block(true);
qStartStop->set_active(queueRunning);
qStartStopConn.block(false);
fdir->set_sensitive (!queueRunning);
fformat->set_sensitive (!queueRunning);
}
void BatchQueuePanel::addBatchQueueJobs(const std::vector<BatchQueueEntry*>& entries, bool head) void BatchQueuePanel::addBatchQueueJobs(const std::vector<BatchQueueEntry*>& entries, bool head)
{ {
batchQueue->addEntries(entries, head); batchQueue->addEntries(entries, head);
if (!qStartStop->get_active() && qAutoStart->get_active()) { if (!qStartStop->get_active() && qAutoStart->get_active()) {
// Auto-start as if the user had pressed the qStartStop switch
startBatchProc (); startBatchProc ();
} }
} }
@ -354,9 +358,9 @@ bool BatchQueuePanel::handleShortcutKey (GdkEventKey* event)
bool BatchQueuePanel::canStartNext () bool BatchQueuePanel::canStartNext ()
{ {
// This function is called from the background BatchQueue thread. // This function is called from the background BatchQueue thread. It
// It cannot call UI functions, so grab the stored state of qStartStop. // cannot call UI functions; we keep the desired state in an atomic.
return qStartStopState; return queueShouldRun;
} }
void BatchQueuePanel::pathFolderButtonPressed () void BatchQueuePanel::pathFolderButtonPressed ()

View File

@ -53,7 +53,7 @@ class BatchQueuePanel : public Gtk::VBox,
Gtk::HBox* bottomBox; Gtk::HBox* bottomBox;
Gtk::HBox* topBox; Gtk::HBox* topBox;
std::atomic<bool> qStartStopState; std::atomic<bool> queueShouldRun;
IdleRegister idle_register; IdleRegister idle_register;
@ -76,6 +76,7 @@ private:
void startBatchProc (); void startBatchProc ();
void stopBatchProc (); void stopBatchProc ();
void startOrStopBatchProc(); void startOrStopBatchProc();
void setGuiFromBatchState(bool queueRunning, int qsize);
void pathFolderChanged (); void pathFolderChanged ();
void pathFolderButtonPressed (); void pathFolderButtonPressed ();