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>
21 #include <preferences.h>
22 #include <multilangmgr.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
);
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);
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");
114 chAlign
= Gtk::manage (new Gtk::Button ());
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
);
125 chAlign
->set_image (*hAlignIcon
);
126 arrangementButtonPressed ();
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);
154 void BatchQueuePanel::arrangementButtonPressed () {
156 if (chAlign
->get_image()==hAlignIcon
) {
157 chAlign
->set_image (*vAlignIcon
);
158 batchQueue
->setArrangement (BatchQueue::TB_Vertical
);
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 ();
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 ())
212 void BatchQueuePanel::queueEmpty () {
215 fdir
->set_sensitive (true);
216 fformat
->set_sensitive (true);
219 bool BatchQueuePanel::canStartNext () {
221 if (start
->get_active ())
224 fdir
->set_sensitive (true);
225 fformat
->set_sensitive (true);
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 () {