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:
parent
4a765cc91f
commit
cc6cbe8347
@ -249,21 +249,14 @@ 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) {
|
||||||
Gtk::MessageDialog msgd (queueErrorMessage, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true);
|
Gtk::MessageDialog msgd (queueErrorMessage, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true);
|
||||||
@ -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 ()
|
||||||
|
@ -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 ();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user