Proper check for rawzor libraries.
[rawtherapee-fixes.git] / rtgui / batchqueuepanel.cc
blob1742fec9b20ea89fe962e8ec1011f8cfebde98e0
1 /*
2 * This file is part of RawTherapee.
4 * Copyright (c) 2004-2010 Gabor Horvath <hgabor@rawtherapee.com>
6 * RawTherapee is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * RawTherapee is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
19 #include <batchqueuepanel.h>
20 #include <options.h>
21 #include <preferences.h>
22 #include <multilangmgr.h>
23 #include <rtwindow.h>
24 #include "config.h"
26 BatchQueuePanel::BatchQueuePanel () {
28 batchQueue = new BatchQueue();
30 // construct batch queue panel with the extra "start" and "stop" button
31 Gtk::VBox* batchQueueButtonBox = Gtk::manage (new Gtk::VBox);
32 start = Gtk::manage (new Gtk::ToggleButton (M("FILEBROWSER_STARTPROCESSING")));
33 stop = Gtk::manage (new Gtk::ToggleButton (M("FILEBROWSER_STOPPROCESSING")));
34 autoStart = Gtk::manage (new Gtk::CheckButton ("Auto start"));
35 start->set_tooltip_text (M("FILEBROWSER_STARTPROCESSINGHINT"));
36 stop->set_tooltip_text (M("FILEBROWSER_STOPPROCESSINGHINT"));
37 autoStart->set_tooltip_text ("Start processing automatically when a new job arrives");
38 start->set_active (false);
39 stop->set_active (true);
40 autoStart->set_active (options.procQueueEnabled);
42 start->set_image (*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-media-play"), Gtk::ICON_SIZE_BUTTON)));
43 startConnection = start->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::startBatchProc));
44 stop->set_image (*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-media-stop"), Gtk::ICON_SIZE_BUTTON)));
45 stopConnection = stop->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::stopBatchProc));
46 batchQueueButtonBox->pack_start (*start, Gtk::PACK_SHRINK, 4);
47 batchQueueButtonBox->pack_start (*stop, Gtk::PACK_SHRINK, 4);
48 batchQueueButtonBox->pack_start (*autoStart, Gtk::PACK_SHRINK, 4);
50 // Output directory selection
51 fdir = Gtk::manage (new Gtk::Frame (M("PREFERENCES_OUTDIR")));
52 Gtk::VBox* odvb = Gtk::manage (new Gtk::VBox ());
53 odvb->set_border_width (4);
54 Gtk::HBox* hb2 = Gtk::manage (new Gtk::HBox ());
55 useTemplate = Gtk::manage (new Gtk::RadioButton (M("PREFERENCES_OUTDIRTEMPLATE")+":"));
56 hb2->pack_start (*useTemplate, Gtk::PACK_SHRINK,4);
57 outdirTemplate = Gtk::manage (new Gtk::Entry ());
58 hb2->pack_start (*outdirTemplate);
59 odvb->pack_start (*hb2, Gtk::PACK_SHRINK, 4);
60 outdirTemplate->set_tooltip_markup (M("PREFERENCES_OUTDIRTEMPLATEHINT"));
61 useTemplate->set_tooltip_markup (M("PREFERENCES_OUTDIRTEMPLATEHINT"));
62 Gtk::HBox* hb3 = Gtk::manage (new Gtk::HBox ());
63 useFolder = Gtk::manage (new Gtk::RadioButton (M("PREFERENCES_OUTDIRFOLDER")+":"));
64 hb3->pack_start (*useFolder, Gtk::PACK_SHRINK,4);
65 outdirFolder = Gtk::manage (new Gtk::FileChooserButton (M("PREFERENCES_OUTDIRFOLDER"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER));
66 hb3->pack_start (*outdirFolder);
67 odvb->pack_start (*hb3, Gtk::PACK_SHRINK, 4);
68 outdirFolder->set_tooltip_markup (M("PREFERENCES_OUTDIRFOLDERHINT"));
69 useFolder->set_tooltip_markup (M("PREFERENCES_OUTDIRFOLDERHINT"));
70 Gtk::RadioButton::Group g = useTemplate->get_group();
71 useFolder->set_group (g);
72 fdir->add (*odvb);
74 // Output file format selection
75 fformat = Gtk::manage (new Gtk::Frame (M("PREFERENCES_FILEFORMAT")));
76 saveFormatPanel = Gtk::manage (new SaveFormatPanel ());
77 fformat->add (*saveFormatPanel);
79 saveFormatPanel->init (options.saveFormat);
80 outdirTemplate->set_text (options.savePathTemplate);
81 if (Glib::file_test (options.savePathFolder, Glib::FILE_TEST_IS_DIR))
82 outdirFolder->set_filename (options.savePathFolder);
83 useTemplate->set_active (options.saveUsePathTemplate);
84 useFolder->set_active (!options.saveUsePathTemplate);
86 // setup signal handlers
87 outdirTemplate->signal_changed().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions));
88 outdirFolder->signal_current_folder_changed().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions));
89 useTemplate->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions));
90 useFolder->signal_toggled().connect (sigc::mem_fun(*this, &BatchQueuePanel::saveOptions));
91 saveFormatPanel->setListener (this);
93 // setup button bar
94 topBox = Gtk::manage (new Gtk::HBox ());
95 pack_start (*topBox, Gtk::PACK_SHRINK);
97 topBox->pack_start (*batchQueueButtonBox, Gtk::PACK_SHRINK, 4);
98 topBox->pack_start (*fdir);
99 topBox->pack_start (*fformat, Gtk::PACK_SHRINK, 4);
101 // add middle browser area
102 Gtk::HBox* hBox = Gtk::manage (new Gtk::HBox ());
103 pack_start (*batchQueue);
105 // lower box with thumbnail zoom
106 bottomBox = Gtk::manage (new Gtk::HBox ());
107 pack_start (*bottomBox, Gtk::PACK_SHRINK);
109 // change thumbnail arrangement button
110 hAlignIcon = new Gtk::Image (GET_DATA_PATH(argv0)+"/images/horizontals.png");
111 vAlignIcon = new Gtk::Image (GET_DATA_PATH(argv0)+"/images/verticals.png");
112 hAlignIcon->show ();
113 vAlignIcon->show ();
114 chAlign = Gtk::manage (new Gtk::Button ());
115 chAlign->show ();
116 bottomBox->pack_end (*chAlign, Gtk::PACK_SHRINK);
117 chAlign->set_image (*hAlignIcon);
118 chAlign->set_relief (Gtk::RELIEF_NONE);
119 chAlign->signal_pressed().connect (sigc::mem_fun(*this, &BatchQueuePanel::arrangementButtonPressed));
120 chAlign->set_tooltip_text (M("FILEBROWSER_ARRANGEMENTHINT"));
121 bottomBox->pack_end (*Gtk::manage (new Gtk::VSeparator), Gtk::PACK_SHRINK, 4);
122 if (options.fbArrangement==1)
123 chAlign->set_image (*vAlignIcon);
124 else
125 chAlign->set_image (*hAlignIcon);
126 arrangementButtonPressed ();
128 // thumbnail zoom
129 Gtk::HBox* zoomBox = Gtk::manage (new Gtk::HBox ());
130 zoomBox->pack_start (*Gtk::manage (new Gtk::VSeparator), Gtk::PACK_SHRINK, 4);
131 Gtk::Label* zoomLabel = Gtk::manage (new Gtk::Label (Glib::ustring("<b>")+M("FILEBROWSER_THUMBSIZE")+":</b>"));
132 zoomLabel->set_use_markup (true);
133 zoomBox->pack_start (*zoomLabel, Gtk::PACK_SHRINK, 4);
134 zoomInButton = Gtk::manage (new Gtk::Button ());
135 zoomInButton->set_image (*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-zoom-in"), Gtk::ICON_SIZE_SMALL_TOOLBAR)));
136 zoomInButton->signal_pressed().connect (sigc::mem_fun(*batchQueue, &BatchQueue::zoomIn));
137 zoomInButton->set_relief (Gtk::RELIEF_NONE);
138 zoomInButton->set_tooltip_text (M("FILEBROWSER_ZOOMINHINT"));
139 zoomBox->pack_end (*zoomInButton, Gtk::PACK_SHRINK);
140 zoomOutButton = Gtk::manage (new Gtk::Button ());
141 zoomOutButton->set_image (*Gtk::manage (new Gtk::Image (Gtk::StockID("gtk-zoom-out"), Gtk::ICON_SIZE_SMALL_TOOLBAR)));
142 zoomOutButton->signal_pressed().connect (sigc::mem_fun(*batchQueue, &BatchQueue::zoomOut));
143 zoomOutButton->set_relief (Gtk::RELIEF_NONE);
144 zoomOutButton->set_tooltip_text (M("FILEBROWSER_ZOOMOUTHINT"));
145 zoomBox->pack_end (*zoomOutButton, Gtk::PACK_SHRINK);
146 bottomBox->pack_end (*zoomBox, Gtk::PACK_SHRINK);
149 batchQueue->setBatchQueueListener (this);
151 show_all ();
154 void BatchQueuePanel::arrangementButtonPressed () {
156 if (chAlign->get_image()==hAlignIcon) {
157 chAlign->set_image (*vAlignIcon);
158 batchQueue->setArrangement (BatchQueue::TB_Vertical);
160 else {
161 chAlign->set_image (*hAlignIcon);
162 batchQueue->setArrangement (BatchQueue::TB_Horizontal);
166 void BatchQueuePanel::queueSizeChanged (int qsize) {
168 // TODO: write it somewhere
171 void BatchQueuePanel::imageProcessingReady (Glib::ustring fname) {
173 parent->imageDeveloped (fname);
176 void BatchQueuePanel::startBatchProc () {
178 stopConnection.block (true);
179 startConnection.block (true);
180 stop->set_active (false);
181 start->set_active (true);
182 stopConnection.block (false);
183 startConnection.block (false);
185 if (batchQueue->hasJobs()) {
186 fdir->set_sensitive (false);
187 fformat->set_sensitive (false);
188 batchQueue->startProcessing ();
190 else
191 stopBatchProc ();
194 void BatchQueuePanel::stopBatchProc () {
196 stopConnection.block (true);
197 startConnection.block (true);
198 stop->set_active (true);
199 start->set_active (false);
200 stopConnection.block (false);
201 startConnection.block (false);
204 void BatchQueuePanel::addBatchQueueJob (BatchQueueEntry* bqe, bool head) {
206 batchQueue->addEntry (bqe, head);
208 if (stop->get_active () && autoStart->get_active ())
209 startBatchProc ();
212 void BatchQueuePanel::queueEmpty () {
214 stopBatchProc ();
215 fdir->set_sensitive (true);
216 fformat->set_sensitive (true);
219 bool BatchQueuePanel::canStartNext () {
221 if (start->get_active ())
222 return true;
223 else {
224 fdir->set_sensitive (true);
225 fformat->set_sensitive (true);
226 return false;
230 void BatchQueuePanel::saveOptions () {
232 options.saveFormat = saveFormatPanel->getFormat ();
233 options.savePathTemplate = outdirTemplate->get_text();
234 options.savePathFolder = outdirFolder->get_filename();
235 options.saveUsePathTemplate = useTemplate->get_active();
236 options.procQueueEnabled = autoStart->get_active ();
239 void BatchQueuePanel::formatChanged () {
241 saveOptions ();