1 /*
2  *  This file is part of RawTherapee.
3  *
4  *  Copyright (c) 2004-2010 Gabor Horvath <hgabor@rawtherapee.com>
5  *
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.
10  *
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.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with RawTherapee.  If not, see <https://www.gnu.org/licenses/>.
18  */
19 #include "partialpastedlg.h"
20 #include "multilangmgr.h"
21 #include "paramsedited.h"
22 #include "guiutils.h"
23 
PartialPasteDlg(const Glib::ustring & title,Gtk::Window * parent)24 PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* parent)
25     : Gtk::Dialog (title, *parent, true)
26 {
27     set_default_size(700, 600);
28 
29     everything  = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EVERYTHING")));
30     everything  ->set_name("PartialPasteHeader");
31 
32     basic       = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_BASICGROUP")));
33     basic       ->set_name("PartialPasteHeader");
34     detail      = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DETAILGROUP")));
35     detail      ->set_name("PartialPasteHeader");
36     color       = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COLORGROUP")));
37     color       ->set_name("PartialPasteHeader");
38     lens        = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LENSGROUP")));
39     lens        ->set_name("PartialPasteHeader");
40     composition = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COMPOSITIONGROUP")));
41     composition ->set_name("PartialPasteHeader");
42     meta        = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_METAGROUP")));
43     meta        ->set_name("PartialPasteHeader");
44     raw         = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWGROUP")));
45     raw         ->set_name("PartialPasteHeader");
46     advanced    = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ADVANCEDGROUP")));
47     advanced    ->set_name("PartialPasteHeader");
48 
49     // Basic Settings:
50     wb          = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_WHITEBALANCE")));
51     exposure    = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXPOSURE")));
52     sh          = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHADOWSHIGHLIGHTS")));
53     epd         = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EPD")));
54     fattal      = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_TM_FATTAL")));
55     pcvignette  = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PCVIGNETTE")));
56     gradient    = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_GRADIENT")));
57     labcurve    = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LABCURVE")));
58 
59     // Detail Settings:
60     sharpen     = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHARPENING")));
61     localcontrast = Gtk::manage(new Gtk::CheckButton(M("PARTIALPASTE_LOCALCONTRAST")));
62     sharpenedge = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHARPENEDGE")));
63     sharpenmicro = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHARPENMICRO")));
64     impden      = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_IMPULSEDENOISE")));
65     dirpyrden   = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYRDENOISE")));
66     defringe    = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DEFRINGE")));
67     dirpyreq    = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYREQUALIZER")));
68     dehaze = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DEHAZE")) );
69 
70     // Advanced Settings:
71     retinex     = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RETINEX")));
72     colorappearance = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COLORAPP")));
73     wavelet     = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EQUALIZER")));
74 
75     // Color-Related Settings
76     icm         = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ICMSETTINGS")));
77     vibrance    = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_VIBRANCE")));
78     chmixer     = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CHANNELMIXER")));
79     blackwhite  = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CHANNELMIXERBW")));
80     hsveq       = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_HSVEQUALIZER")));
81     filmSimulation = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FILMSIMULATION")) );
82     softlight = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SOFTLIGHT")) );
83     rgbcurves   = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RGBCURVES")));
84     colortoning = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COLORTONING")));
85 
86     // Lens-Related Settings
87     distortion  = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DISTORTION")));
88     cacorr      = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CACORRECTION")));
89     vignetting  = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_VIGNETTING")));
90     lcp         = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LENSPROFILE")));
91 
92     // Composition Settings:
93     coarserot    = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COARSETRANS")));
94     finerot      = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ROTATION")));
95     crop         = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CROP")));
96     resize       = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RESIZE")));
97     prsharpening = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PRSHARPENING")));
98     perspective  = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PERSPECTIVE")));
99     commonTrans  = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COMMONTRANSFORMPARAMS")));
100 
101     // Metadata:
102     metadata = Gtk::manage(new Gtk::CheckButton(M("PARTIALPASTE_METADATA")));
103     exifch      = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXIFCHANGES")));
104     iptc        = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_IPTCINFO")));
105 
106     // Raw Settings:
107     raw_method          = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DMETHOD")));
108     raw_imagenum        = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_IMAGENUM")));
109     raw_border          = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_BORDER")));
110     raw_pixelshift      = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_PIXELSHIFT")));
111     raw_ccSteps         = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_FALSECOLOR")));
112     raw_dcb_iterations  = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DCBITERATIONS")));
113     raw_dcb_enhance     = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DCBENHANCE")));
114     raw_lmmse_iterations = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_LMMSEITERATIONS")));
115     //---
116     raw_linenoise       = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_LINEDENOISE")));
117     raw_greenthresh     = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_GREENEQUIL")));
118     raw_hotpix_filt     = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_HOTPIXFILT")));
119     raw_deadpix_filt    = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_DEADPIXFILT")));
120     raw_pdaf_lines_filter = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_PDAFLINESFILTER")));
121     //---
122     raw_expos           = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_LINEAR")));
123     raw_black           = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_BLACK")));
124     //---
125     df_file             = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DARKFRAMEFILE")));
126     df_AutoSelect       = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DARKFRAMEAUTOSELECT")));
127     //---
128     ff_file             = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDFILE")));
129     ff_AutoSelect       = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDAUTOSELECT")));
130     ff_BlurType         = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDBLURTYPE")));
131     ff_BlurRadius       = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDBLURRADIUS")));
132     ff_ClipControl      = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FLATFIELDCLIPCONTROL")));
133     //---
134     raw_ca_autocorrect  = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_AUTO")));
135     raw_caredblue       = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_CAREDBLUE")));
136     raw_ca_avoid_colourshift = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT")));
137     //---
138     filmNegative        = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FILMNEGATIVE")) );
139     //---
140     captureSharpening   = Gtk::manage (new Gtk::CheckButton (M("TP_PDSHARPENING_LABEL")) );
141 
142     Gtk::VBox* vboxes[8];
143     Gtk::HSeparator* hseps[8];
144 
145     for (int i = 0; i < 8; i++) {
146         vboxes[i] = Gtk::manage (new Gtk::VBox ());
147         vboxes[i]->set_name("PartialPasteGroupContainer");
148         hseps[i] = Gtk::manage (new Gtk::HSeparator ());
149         hseps[i]->set_name("PartialPasteHeaderSep");
150     }
151 
152     //BASIC
153     vboxes[0]->pack_start (*basic, Gtk::PACK_SHRINK, 2);
154     vboxes[0]->pack_start (*hseps[0], Gtk::PACK_SHRINK, 2);
155     vboxes[0]->pack_start (*wb, Gtk::PACK_SHRINK, 2);
156     vboxes[0]->pack_start (*exposure, Gtk::PACK_SHRINK, 2);
157     vboxes[0]->pack_start (*sh, Gtk::PACK_SHRINK, 2);
158     vboxes[0]->pack_start (*epd, Gtk::PACK_SHRINK, 2);
159     vboxes[0]->pack_start (*fattal, Gtk::PACK_SHRINK, 2);
160     vboxes[0]->pack_start (*pcvignette, Gtk::PACK_SHRINK, 2);
161     vboxes[0]->pack_start (*gradient, Gtk::PACK_SHRINK, 2);
162     vboxes[0]->pack_start (*labcurve, Gtk::PACK_SHRINK, 2);
163 
164     //DETAIL
165     vboxes[1]->pack_start (*detail, Gtk::PACK_SHRINK, 2);
166     vboxes[1]->pack_start (*hseps[1], Gtk::PACK_SHRINK, 2);
167     vboxes[1]->pack_start (*sharpen, Gtk::PACK_SHRINK, 2);
168     vboxes[1]->pack_start (*localcontrast, Gtk::PACK_SHRINK, 2);
169     vboxes[1]->pack_start (*sharpenedge, Gtk::PACK_SHRINK, 2);
170     vboxes[1]->pack_start (*sharpenmicro, Gtk::PACK_SHRINK, 2);
171     vboxes[1]->pack_start (*impden, Gtk::PACK_SHRINK, 2);
172     vboxes[1]->pack_start (*dirpyrden, Gtk::PACK_SHRINK, 2);
173     vboxes[1]->pack_start (*defringe, Gtk::PACK_SHRINK, 2);
174     vboxes[1]->pack_start (*dirpyreq, Gtk::PACK_SHRINK, 2);
175     vboxes[1]->pack_start (*dehaze, Gtk::PACK_SHRINK, 2);
176 
177     //COLOR
178     vboxes[2]->pack_start (*color, Gtk::PACK_SHRINK, 2);
179     vboxes[2]->pack_start (*hseps[2], Gtk::PACK_SHRINK, 2);
180     vboxes[2]->pack_start (*icm, Gtk::PACK_SHRINK, 2);
181     vboxes[2]->pack_start (*vibrance, Gtk::PACK_SHRINK, 2);
182     vboxes[2]->pack_start (*chmixer, Gtk::PACK_SHRINK, 2);
183     vboxes[2]->pack_start (*blackwhite, Gtk::PACK_SHRINK, 2);
184     vboxes[2]->pack_start (*hsveq, Gtk::PACK_SHRINK, 2);
185     vboxes[2]->pack_start (*filmSimulation, Gtk::PACK_SHRINK, 2);
186     vboxes[2]->pack_start (*softlight, Gtk::PACK_SHRINK, 2);
187     vboxes[2]->pack_start (*rgbcurves, Gtk::PACK_SHRINK, 2);
188     vboxes[2]->pack_start (*colortoning, Gtk::PACK_SHRINK, 2);
189 
190     //LENS
191     vboxes[3]->pack_start (*lens, Gtk::PACK_SHRINK, 2);
192     vboxes[3]->pack_start (*hseps[3], Gtk::PACK_SHRINK, 2);
193     vboxes[3]->pack_start (*distortion, Gtk::PACK_SHRINK, 2);
194     vboxes[3]->pack_start (*cacorr, Gtk::PACK_SHRINK, 2);
195     vboxes[3]->pack_start (*vignetting, Gtk::PACK_SHRINK, 2);
196     vboxes[3]->pack_start (*lcp, Gtk::PACK_SHRINK, 2);
197 
198     //COMPOSITION
199     vboxes[4]->pack_start (*composition, Gtk::PACK_SHRINK, 2);
200     vboxes[4]->pack_start (*hseps[4], Gtk::PACK_SHRINK, 2);
201     vboxes[4]->pack_start (*coarserot, Gtk::PACK_SHRINK, 2);
202     vboxes[4]->pack_start (*finerot, Gtk::PACK_SHRINK, 2);
203     vboxes[4]->pack_start (*crop, Gtk::PACK_SHRINK, 2);
204     vboxes[4]->pack_start (*resize, Gtk::PACK_SHRINK, 2);
205     vboxes[4]->pack_start (*prsharpening, Gtk::PACK_SHRINK, 2);
206     vboxes[4]->pack_start (*perspective, Gtk::PACK_SHRINK, 2);
207     vboxes[4]->pack_start (*commonTrans, Gtk::PACK_SHRINK, 2);
208 
209     //ADVANCED
210     vboxes[5]->pack_start (*advanced, Gtk::PACK_SHRINK, 2);
211     vboxes[5]->pack_start (*hseps[5], Gtk::PACK_SHRINK, 2);
212     vboxes[5]->pack_start (*retinex, Gtk::PACK_SHRINK, 2);
213     vboxes[5]->pack_start (*colorappearance, Gtk::PACK_SHRINK, 2);
214     vboxes[5]->pack_start (*wavelet, Gtk::PACK_SHRINK, 2);
215 
216     //META
217     vboxes[6]->pack_start (*meta, Gtk::PACK_SHRINK, 2);
218     vboxes[6]->pack_start (*hseps[6], Gtk::PACK_SHRINK, 2);
219     vboxes[6]->pack_start(*metadata, Gtk::PACK_SHRINK, 2);
220     vboxes[6]->pack_start (*exifch, Gtk::PACK_SHRINK, 2);
221     vboxes[6]->pack_start (*iptc, Gtk::PACK_SHRINK, 2);
222 
223     //RAW
224     vboxes[7]->pack_start (*raw, Gtk::PACK_SHRINK, 2);
225     vboxes[7]->pack_start (*hseps[7], Gtk::PACK_SHRINK, 2);
226     vboxes[7]->pack_start (*raw_method, Gtk::PACK_SHRINK, 2);
227     vboxes[7]->pack_start (*raw_border, Gtk::PACK_SHRINK, 2);
228     vboxes[7]->pack_start (*raw_imagenum, Gtk::PACK_SHRINK, 2);
229     vboxes[7]->pack_start (*raw_pixelshift, Gtk::PACK_SHRINK, 2);
230     vboxes[7]->pack_start (*raw_ccSteps, Gtk::PACK_SHRINK, 2);
231     vboxes[7]->pack_start (*raw_dcb_iterations, Gtk::PACK_SHRINK, 2);
232     vboxes[7]->pack_start (*raw_dcb_enhance, Gtk::PACK_SHRINK, 2);
233     vboxes[7]->pack_start (*raw_lmmse_iterations, Gtk::PACK_SHRINK, 2);
234     vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0);
235     vboxes[7]->pack_start (*raw_linenoise, Gtk::PACK_SHRINK, 2);
236     vboxes[7]->pack_start (*raw_greenthresh, Gtk::PACK_SHRINK, 2);
237     vboxes[7]->pack_start (*raw_hotpix_filt, Gtk::PACK_SHRINK, 2);
238     vboxes[7]->pack_start (*raw_deadpix_filt, Gtk::PACK_SHRINK, 2);
239     vboxes[7]->pack_start (*raw_pdaf_lines_filter, Gtk::PACK_SHRINK, 2);
240     vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0);
241     vboxes[7]->pack_start (*raw_expos, Gtk::PACK_SHRINK, 2);
242     vboxes[7]->pack_start (*raw_black, Gtk::PACK_SHRINK, 2);
243     vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0);
244     vboxes[7]->pack_start (*df_file, Gtk::PACK_SHRINK, 2);
245     vboxes[7]->pack_start (*df_AutoSelect, Gtk::PACK_SHRINK, 2);
246     vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0);
247     vboxes[7]->pack_start (*ff_file, Gtk::PACK_SHRINK, 2);
248     vboxes[7]->pack_start (*ff_AutoSelect, Gtk::PACK_SHRINK, 2);
249     vboxes[7]->pack_start (*ff_BlurType, Gtk::PACK_SHRINK, 2);
250     vboxes[7]->pack_start (*ff_BlurRadius, Gtk::PACK_SHRINK, 2);
251     vboxes[7]->pack_start (*ff_ClipControl, Gtk::PACK_SHRINK, 2);
252     vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0);
253     vboxes[7]->pack_start (*raw_ca_autocorrect, Gtk::PACK_SHRINK, 2);
254     vboxes[7]->pack_start (*raw_caredblue, Gtk::PACK_SHRINK, 2);
255     vboxes[7]->pack_start (*raw_ca_avoid_colourshift, Gtk::PACK_SHRINK, 2);
256     vboxes[7]->pack_start (*Gtk::manage (new Gtk::HSeparator ()), Gtk::PACK_SHRINK, 0);
257     vboxes[7]->pack_start (*filmNegative, Gtk::PACK_SHRINK, 2);
258     vboxes[7]->pack_start (*captureSharpening, Gtk::PACK_SHRINK, 2);
259 
260     Gtk::VBox* vbCol1 = Gtk::manage (new Gtk::VBox ());
261     Gtk::VBox* vbCol2 = Gtk::manage (new Gtk::VBox ());
262     Gtk::VBox* vbCol3 = Gtk::manage (new Gtk::VBox ());
263 
264     for (int i = 0; i < 3; i++) {
265         vbCol1->pack_start (*vboxes[i], Gtk::PACK_SHRINK, 2);
266     }
267 
268     for (int i = 3; i < 7; i++) {
269         vbCol2->pack_start (*vboxes[i], Gtk::PACK_SHRINK, 2);
270     }
271 
272     for (int i = 7; i < 8; i++) {
273         vbCol3->pack_start (*vboxes[i], Gtk::PACK_SHRINK, 2);
274     }
275 
276     Gtk::VBox* vbtop = Gtk::manage (new Gtk::VBox ());
277     vbtop->pack_start (*everything, Gtk::PACK_SHRINK, 2);
278 
279     Gtk::Dialog::get_content_area()->pack_start (*vbtop, Gtk::PACK_SHRINK, 2);
280 
281     Gtk::HBox* hbmain = Gtk::manage (new Gtk::HBox ());
282     hbmain->pack_start (*vbCol1);
283     Gtk::VSeparator *vsep1 = Gtk::manage (new Gtk::VSeparator ());
284     setExpandAlignProperties(vsep1, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL);
285     hbmain->pack_start (*vsep1);
286     hbmain->pack_start (*vbCol2);
287     Gtk::VSeparator *vsep2 = Gtk::manage (new Gtk::VSeparator ());
288     setExpandAlignProperties(vsep2, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL);
289     hbmain->pack_start (*vsep2);
290     hbmain->pack_start (*vbCol3);
291 
292     scrolledwindow = Gtk::manage ( new Gtk::ScrolledWindow() );
293     scrolledwindow->set_name("PartialPaste");
294     scrolledwindow->set_can_focus(true);
295     scrolledwindow->set_shadow_type(Gtk::SHADOW_NONE);
296     scrolledwindow->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
297     scrolledwindow->property_window_placement().set_value(Gtk::CORNER_TOP_LEFT);
298 
299     scrolledwindow->add(*hbmain);
300 
301     Gtk::Dialog::get_content_area()->pack_start (*scrolledwindow, Gtk::PACK_EXPAND_WIDGET, 2);
302 
303     hbmain->show();
304     scrolledwindow->show ();
305 
306     // This can be improved
307     // there is currently no binding of subsettings to CheckButton 'everything' for its inconsistent status
308     everythingConn  = everything->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::everythingToggled));
309     basicConn       = basic->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::basicToggled));
310     detailConn      = detail->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::detailToggled));
311     colorConn       = color->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::colorToggled));
312     lensConn        = lens->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::lensToggled));
313     compositionConn = composition->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::compositionToggled));
314     metaConn        = meta->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::metaToggled));
315     rawConn         = raw->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::rawToggled));
316     advancedConn    = advanced->signal_toggled().connect (sigc::mem_fun(*this, &PartialPasteDlg::advancedToggled));
317 
318     // Basic Settings
319     wbConn          = wb->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
320     exposureConn    = exposure->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
321     shConn          = sh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
322     epdConn         = epd->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
323     fattalConn      = fattal->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
324     pcvignetteConn  = pcvignette->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
325     gradientConn    = gradient->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
326     labcurveConn    = labcurve->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
327 
328     // Detail Settings:
329     sharpenConn     = sharpen->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true));
330     localcontrastConn = localcontrast->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true));
331     gradsharpenConn = sharpenedge->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true));
332     microcontrastConn = sharpenmicro->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true));
333     impdenConn      = impden->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true));
334     dirpyrdenConn   = dirpyrden->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true));
335     defringeConn    = defringe->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true));
336     dirpyreqConn    = dirpyreq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true));
337     dehazeConn    = dehaze->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true));
338 
339     // Advanced Settings:
340     retinexConn     = retinex->signal_toggled().connect (sigc::bind (sigc::mem_fun(*advanced, &Gtk::CheckButton::set_inconsistent), true));
341     colorappearanceConn = colorappearance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*advanced, &Gtk::CheckButton::set_inconsistent), true));
342     waveletConn = wavelet->signal_toggled().connect (sigc::bind (sigc::mem_fun(*advanced, &Gtk::CheckButton::set_inconsistent), true));
343 
344     // Color-related Settings:
345     icmConn         = icm->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true));
346     vibranceConn    = vibrance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true));
347     chmixerConn     = chmixer->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true));
348     chmixerbwConn   = blackwhite->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true));
349     hsveqConn       = hsveq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true));
350     filmSimulationConn = filmSimulation->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true));
351     softlightConn = softlight->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true));
352     rgbcurvesConn   = rgbcurves->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true));
353     colortoningConn = colortoning->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true));
354 
355     // Lens-Related Settings:
356     distortionConn  = distortion->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true));
357     cacorrConn      = cacorr->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true));
358     vignettingConn  = vignetting->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true));
359     lcpConn         = lcp->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true));
360 
361     // Composition Settings:
362     coarserotConn   = coarserot->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true));
363     finerotConn     = finerot->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true));
364     cropConn        = crop->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true));
365     resizeConn      = resize->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true));
366     prsharpeningConn = prsharpening->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true));
367     perspectiveConn = perspective->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true));
368     commonTransConn = commonTrans->signal_toggled().connect (sigc::bind (sigc::mem_fun(*composition, &Gtk::CheckButton::set_inconsistent), true));
369 
370     // Metadata:
371     metadataConn = metadata->signal_toggled().connect(sigc::bind (sigc::mem_fun(*meta, &Gtk::CheckButton::set_inconsistent), true));
372     exifchConn      = exifch->signal_toggled().connect (sigc::bind (sigc::mem_fun(*meta, &Gtk::CheckButton::set_inconsistent), true));
373     iptcConn        = iptc->signal_toggled().connect (sigc::bind (sigc::mem_fun(*meta, &Gtk::CheckButton::set_inconsistent), true));
374 
375     // Raw Settings:
376     raw_methodConn          = raw_method->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
377     raw_borderConn          = raw_border->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
378     raw_imagenumConn        = raw_imagenum->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
379     raw_pixelshiftConn      = raw_pixelshift->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
380     raw_ccStepsConn         = raw_ccSteps->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
381     raw_dcb_iterationsConn  = raw_dcb_iterations->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
382     raw_dcb_enhanceConn     = raw_dcb_enhance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
383     raw_lmmse_iterationsConn  = raw_lmmse_iterations->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
384     //---
385     raw_linenoiseConn       = raw_linenoise->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
386     raw_greenthreshConn     = raw_greenthresh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
387     raw_hotpix_filtConn     = raw_hotpix_filt->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
388     raw_deadpix_filtConn    = raw_deadpix_filt->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
389     raw_pdaf_lines_filterConn = raw_pdaf_lines_filter->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
390     //---
391     raw_exposConn           = raw_expos->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
392     raw_blackConn           = raw_black->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
393     //---
394     df_fileConn             = df_file->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
395     df_AutoSelectConn       = df_AutoSelect->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
396     //---
397     ff_fileConn             = ff_file->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
398     ff_AutoSelectConn       = ff_AutoSelect->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
399     ff_BlurTypeConn         = ff_BlurType->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
400     ff_BlurRadiusConn       = ff_BlurRadius->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
401     ff_ClipControlConn      = ff_ClipControl->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
402     //---
403     raw_ca_autocorrectConn  = raw_ca_autocorrect->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
404     raw_caredblueConn       = raw_caredblue->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
405     raw_ca_avoid_colourshiftconn = raw_ca_avoid_colourshift->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
406     //---
407     filmNegativeConn        = filmNegative->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
408     //---
409     captureSharpeningConn   = captureSharpening->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
410 
411     add_button (M("GENERAL_OK"), Gtk::RESPONSE_OK);
412     add_button (M("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL);
413     set_response_sensitive (Gtk::RESPONSE_OK);
414     set_default_response (Gtk::RESPONSE_OK);
415     show_all_children ();
416 }
417 
everythingToggled()418 void PartialPasteDlg::everythingToggled ()
419 {
420 
421     ConnectionBlocker basicBlocker(basicConn);
422     ConnectionBlocker detailBlocker(detailConn);
423     ConnectionBlocker colorBlocker(colorConn);
424     ConnectionBlocker lensBlocker(lensConn);
425     ConnectionBlocker compositionBlocker(compositionConn);
426     ConnectionBlocker metaBlocker(metaConn);
427     ConnectionBlocker rawBlocker(rawConn);
428     ConnectionBlocker advancedBlocker(advancedConn);
429 
430     everything->set_inconsistent (false);
431 
432     //toggle group headings
433     basic->set_active(everything->get_active());
434     detail->set_active(everything->get_active());
435     color->set_active(everything->get_active());
436     lens->set_active(everything->get_active());
437     composition->set_active(everything->get_active());
438     meta->set_active(everything->get_active());
439     raw->set_active(everything->get_active());
440     advanced->set_active(everything->get_active());
441 
442     //toggle group children
443     PartialPasteDlg::basicToggled ();
444     PartialPasteDlg::detailToggled ();
445     PartialPasteDlg::colorToggled ();
446     PartialPasteDlg::lensToggled ();
447     PartialPasteDlg::compositionToggled ();
448     PartialPasteDlg::metaToggled ();
449     PartialPasteDlg::rawToggled ();
450     PartialPasteDlg::advancedToggled ();
451 }
452 
rawToggled()453 void PartialPasteDlg::rawToggled ()
454 {
455 
456     ConnectionBlocker raw_methodBlocker(raw_methodConn);
457     ConnectionBlocker raw_borderBlocker(raw_borderConn);
458     ConnectionBlocker raw_imagenumBlocker(raw_imagenumConn);
459     ConnectionBlocker raw_pixelshiftBlocker(raw_pixelshiftConn);
460     ConnectionBlocker raw_ccStepsBlocker(raw_ccStepsConn);
461     ConnectionBlocker raw_dcb_iterationsBlocker(raw_dcb_iterationsConn);
462     ConnectionBlocker raw_dcb_enhanceBlocker(raw_dcb_enhanceConn);
463     ConnectionBlocker raw_lmmse_iterationsBlocker(raw_lmmse_iterationsConn);
464     ConnectionBlocker raw_linenoiseBlocker(raw_linenoiseConn);
465     ConnectionBlocker raw_greenthreshBlocker(raw_greenthreshConn);
466     ConnectionBlocker raw_hotpix_filtBlocker(raw_hotpix_filtConn);
467     ConnectionBlocker raw_deadpix_filtBlocker(raw_deadpix_filtConn);
468     ConnectionBlocker raw_pdaf_lines_filterBlocker(raw_pdaf_lines_filterConn);
469     ConnectionBlocker raw_exposBlocker(raw_exposConn);
470     ConnectionBlocker raw_blackBlocker(raw_blackConn);
471     ConnectionBlocker df_fileBlocker(df_fileConn);
472     ConnectionBlocker df_AutoSelectBlocker(df_AutoSelectConn);
473     ConnectionBlocker ff_fileBlocker(ff_fileConn);
474     ConnectionBlocker ff_AutoSelectBlocker(ff_AutoSelectConn);
475     ConnectionBlocker ff_BlurTypeBlocker(ff_BlurTypeConn);
476     ConnectionBlocker ff_BlurRadiusBlocker(ff_BlurRadiusConn);
477     ConnectionBlocker ff_ClipControlBlocker(ff_ClipControlConn);
478     ConnectionBlocker raw_ca_autocorrectBlocker(raw_ca_autocorrectConn);
479     ConnectionBlocker raw_caredblueBlocker(raw_caredblueConn);
480     ConnectionBlocker raw_ca_avoid_colourshiftBlocker(raw_ca_avoid_colourshiftconn);
481     ConnectionBlocker filmNegativeBlocker(filmNegativeConn);
482     ConnectionBlocker captureSharpeningBlocker(captureSharpeningConn);
483 
484     raw->set_inconsistent (false);
485 
486     raw_method->set_active (raw->get_active ());
487     raw_border->set_active (raw->get_active ());
488     raw_imagenum->set_active (raw->get_active ());
489     raw_pixelshift->set_active (raw->get_active ());
490     raw_ccSteps->set_active (raw->get_active ());
491     raw_dcb_iterations->set_active (raw->get_active ());
492     raw_dcb_enhance->set_active (raw->get_active ());
493     raw_lmmse_iterations->set_active (raw->get_active ());
494     raw_linenoise->set_active (raw->get_active ());
495     raw_greenthresh->set_active (raw->get_active ());
496     raw_hotpix_filt->set_active (raw->get_active ());
497     raw_deadpix_filt->set_active (raw->get_active ());
498     raw_pdaf_lines_filter->set_active (raw->get_active ());
499     raw_expos->set_active (raw->get_active ());
500     raw_black->set_active (raw->get_active ());
501     df_file->set_active (raw->get_active ());
502     df_AutoSelect->set_active (raw->get_active ());
503     ff_file->set_active (raw->get_active ());
504     ff_AutoSelect->set_active (raw->get_active ());
505     ff_BlurType->set_active (raw->get_active ());
506     ff_BlurRadius->set_active (raw->get_active ());
507     ff_ClipControl->set_active (raw->get_active ());
508     raw_ca_autocorrect->set_active (raw->get_active ());
509     raw_caredblue->set_active (raw->get_active ());
510     raw_ca_avoid_colourshift->set_active (raw->get_active ());
511     filmNegative->set_active (raw->get_active());
512     captureSharpening->set_active (raw->get_active());
513 }
514 
basicToggled()515 void PartialPasteDlg::basicToggled ()
516 {
517 
518     ConnectionBlocker wbBlocker(wbConn);
519     ConnectionBlocker exposureBlocker(exposureConn);
520     ConnectionBlocker shBlocker(shConn);
521     ConnectionBlocker epdBlocker(epdConn);
522     ConnectionBlocker fattalBlocker(fattalConn);
523     ConnectionBlocker pcvignetteBlocker(pcvignetteConn);
524     ConnectionBlocker gradientBlocker(gradientConn);
525     ConnectionBlocker labcurveBlocker(labcurveConn);
526 
527     basic->set_inconsistent (false);
528 
529     wb->set_active (basic->get_active ());
530     exposure->set_active (basic->get_active ());
531     sh->set_active (basic->get_active ());
532     epd->set_active (basic->get_active ());
533     fattal->set_active (basic->get_active ());
534     pcvignette->set_active (basic->get_active ());
535     gradient->set_active (basic->get_active ());
536     labcurve->set_active (basic->get_active ());
537 }
538 
detailToggled()539 void PartialPasteDlg::detailToggled ()
540 {
541 
542     ConnectionBlocker sharpenBlocker(sharpenConn);
543     ConnectionBlocker localcontrastBlocker(localcontrastConn);
544     ConnectionBlocker gradsharpenBlocker(gradsharpenConn);
545     ConnectionBlocker microcontrastBlocker(microcontrastConn);
546     ConnectionBlocker impdenBlocker(impdenConn);
547     ConnectionBlocker dirpyrdenBlocker(dirpyrdenConn);
548     ConnectionBlocker defringeBlocker(defringeConn);
549     ConnectionBlocker dirpyreqBlocker(dirpyreqConn);
550     ConnectionBlocker dehazeBlocker(dehazeConn);
551 
552     detail->set_inconsistent (false);
553 
554     sharpen->set_active (detail->get_active ());
555     localcontrast->set_active(detail->get_active());
556     sharpenedge->set_active (detail->get_active ());
557     sharpenmicro->set_active (detail->get_active ());
558     impden->set_active (detail->get_active ());
559     dirpyrden->set_active (detail->get_active ());
560     defringe->set_active (detail->get_active ());
561     dirpyreq->set_active (detail->get_active ());
562     dehaze->set_active (detail->get_active ());
563 }
564 
advancedToggled()565 void PartialPasteDlg::advancedToggled ()
566 {
567 
568     ConnectionBlocker retinexBlocker(retinexConn);
569     ConnectionBlocker colorappearanceBlocker(colorappearanceConn);
570     ConnectionBlocker waveletBlocker(waveletConn);
571 
572     advanced->set_inconsistent (false);
573 
574     retinex->set_active (advanced->get_active ());
575     colorappearance->set_active (advanced->get_active ());
576     wavelet->set_active (advanced->get_active ());
577 }
578 
colorToggled()579 void PartialPasteDlg::colorToggled ()
580 {
581 
582     ConnectionBlocker icmBlocker(icmConn);
583     ConnectionBlocker vibranceBlocker(vibranceConn);
584     ConnectionBlocker chmixerBlocker(chmixerConn);
585     ConnectionBlocker chmixerbwBlocker(chmixerbwConn);
586     ConnectionBlocker hsveqBlocker(hsveqConn);
587     ConnectionBlocker filmSimulationBlocker(filmSimulationConn);
588     ConnectionBlocker softlightBlocker(softlightConn);
589     ConnectionBlocker rgbcurvesBlocker(rgbcurvesConn);
590     ConnectionBlocker colortoningBlocker(colortoningConn);
591 
592     color->set_inconsistent (false);
593 
594     icm->set_active (color->get_active ());
595     vibrance->set_active (color->get_active ());
596     chmixer->set_active (color->get_active ());
597     blackwhite->set_active (color->get_active ());
598     hsveq->set_active (color->get_active ());
599     filmSimulation->set_active (color->get_active ());
600     softlight->set_active (color->get_active ());
601     rgbcurves->set_active (color->get_active ());
602     colortoning->set_active(color->get_active ());
603 }
604 
lensToggled()605 void PartialPasteDlg::lensToggled ()
606 {
607 
608     ConnectionBlocker distortionBlocker(distortionConn);
609     ConnectionBlocker cacorrBlocker(cacorrConn);
610     ConnectionBlocker vignettingBlocker(vignettingConn);
611     ConnectionBlocker lcpBlocker(lcpConn);
612 
613     lens->set_inconsistent (false);
614 
615     distortion->set_active (lens->get_active ());
616     cacorr->set_active (lens->get_active ());
617     vignetting->set_active (lens->get_active ());
618     lcp->set_active (lens->get_active ());
619 }
620 
compositionToggled()621 void PartialPasteDlg::compositionToggled ()
622 {
623 
624     ConnectionBlocker coarserotBlocker(coarserotConn);
625     ConnectionBlocker finerotBlocker(finerotConn);
626     ConnectionBlocker cropBlocker(cropConn);
627     ConnectionBlocker resizeBlocker(resizeConn);
628     ConnectionBlocker prsharpeningBlocker(prsharpeningConn);
629     ConnectionBlocker perspectiveBlocker(perspectiveConn);
630     ConnectionBlocker commonTransBlocker(commonTransConn);
631 
632     composition->set_inconsistent (false);
633 
634     coarserot->set_active (composition->get_active ());
635     finerot->set_active (composition->get_active ());
636     crop->set_active (composition->get_active ());
637     resize->set_active (composition->get_active ());
638     prsharpening->set_active (composition->get_active ());
639     perspective->set_active (composition->get_active ());
640     commonTrans->set_active (composition->get_active ());
641 }
642 
metaToggled()643 void PartialPasteDlg::metaToggled ()
644 {
645 
646     ConnectionBlocker metadataBlocker(metadataConn);
647     ConnectionBlocker exifchBlocker(exifchConn);
648     ConnectionBlocker iptcBlocker(iptcConn);
649 
650     meta->set_inconsistent (false);
651 
652     metadata->set_active(meta->get_active());
653     exifch->set_active (meta->get_active ());
654     iptc->set_active (meta->get_active ());
655 }
656 
657 
658 /*
659  * Copies the selected items from the source ProcParams+ParamsEdited(optional)
660  * to the destination ProcParams.
661  */
applyPaste(rtengine::procparams::ProcParams * dstPP,ParamsEdited * dstPE,const rtengine::procparams::ProcParams * srcPP,const ParamsEdited * srcPE)662 void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, ParamsEdited* dstPE, const rtengine::procparams::ProcParams* srcPP, const ParamsEdited* srcPE)
663 {
664 
665     ParamsEdited falsePE;  // falsePE is a workaround to set a group of ParamsEdited to false
666     ParamsEdited filterPE(true); // Contains the initial information about the loaded values
667 
668     if (srcPE) {
669         filterPE = *srcPE;
670     }
671 
672     // the general section is always ignored, whichever operation we use the PartialPaste for
673     filterPE.general = falsePE.general;
674 
675     // Now we filter out the filter depending on the checked items
676     if (!wb->get_active ()) {
677         filterPE.wb         = falsePE.wb;
678     }
679 
680     if (!exposure->get_active ()) {
681         filterPE.toneCurve  = falsePE.toneCurve;
682     }
683 
684     if (!localcontrast->get_active()) {
685         filterPE.localContrast = falsePE.localContrast;
686     }
687 
688     if (!sh->get_active ()) {
689         filterPE.sh         = falsePE.sh;
690     }
691 
692     if (!epd->get_active ()) {
693         filterPE.epd        = falsePE.epd;
694     }
695 
696     if (!fattal->get_active ()) {
697         filterPE.fattal     = falsePE.fattal;
698     }
699 
700     if (!retinex->get_active ()) {
701         filterPE.retinex        = falsePE.retinex;
702     }
703 
704     if (!pcvignette->get_active ()) {
705         filterPE.pcvignette = falsePE.pcvignette;
706     }
707 
708     if (!gradient->get_active ()) {
709         filterPE.gradient   = falsePE.gradient;
710     }
711 
712     if (!labcurve->get_active ()) {
713         filterPE.labCurve   = falsePE.labCurve;
714     }
715 
716     if (!colorappearance->get_active ()) {
717         filterPE.colorappearance = falsePE.colorappearance;
718     }
719 
720     if (!sharpen->get_active ()) {
721         filterPE.sharpening      = falsePE.sharpening;
722     }
723 
724     if (!sharpenedge->get_active ()) {
725         filterPE.sharpenEdge     = falsePE.sharpenEdge;
726     }
727 
728     if (!sharpenmicro->get_active()) {
729         filterPE.sharpenMicro    = falsePE.sharpenMicro;
730     }
731 
732     if (!impden->get_active ()) {
733         filterPE.impulseDenoise  = falsePE.impulseDenoise;
734     }
735 
736     if (!dirpyreq->get_active ()) {
737         filterPE.dirpyrequalizer = falsePE.dirpyrequalizer;
738     }
739 
740     if (!defringe->get_active ()) {
741         filterPE.defringe        = falsePE.defringe;
742     }
743 
744     if (!dirpyrden->get_active ()) {
745         filterPE.dirpyrDenoise   = falsePE.dirpyrDenoise;
746     }
747 
748     if (!wavelet->get_active ()) {
749         filterPE.wavelet = falsePE.wavelet;
750     }
751 
752     if (!icm->get_active ()) {
753         filterPE.icm          = falsePE.icm;
754     }
755 
756     if (!vibrance->get_active ()) {
757         filterPE.vibrance     = falsePE.vibrance;
758     }
759 
760     if (!chmixer->get_active ()) {
761         filterPE.chmixer      = falsePE.chmixer;
762     }
763 
764     if (!blackwhite->get_active ()) {
765         filterPE.blackwhite   = falsePE.blackwhite;
766     }
767 
768     if (!hsveq->get_active ()) {
769         filterPE.hsvequalizer = falsePE.hsvequalizer;
770     }
771 
772     if (!filmSimulation->get_active ()) {
773         filterPE.filmSimulation  = falsePE.filmSimulation;
774     }
775 
776     if (!softlight->get_active ()) {
777         filterPE.softlight = falsePE.softlight;
778     }
779 
780     if (!dehaze->get_active ()) {
781         filterPE.dehaze = falsePE.dehaze;
782     }
783 
784     if (!rgbcurves->get_active ()) {
785         filterPE.rgbCurves    = falsePE.rgbCurves;
786     }
787 
788     if (!colortoning->get_active ()) {
789         filterPE.colorToning  = falsePE.colorToning;
790     }
791 
792     if (!distortion->get_active ()) {
793         filterPE.distortion   = falsePE.distortion;
794     }
795 
796     if (!cacorr->get_active ()) {
797         filterPE.cacorrection = falsePE.cacorrection;
798     }
799 
800     if (!vignetting->get_active ()) {
801         filterPE.vignetting   = falsePE.vignetting;
802     }
803 
804     if (!lcp->get_active ()) {
805         filterPE.lensProf     = falsePE.lensProf;
806     }
807 
808     if (!coarserot->get_active ()) {
809         filterPE.coarse      = falsePE.coarse;
810     }
811 
812     if (!finerot->get_active ()) {
813         filterPE.rotate      = falsePE.rotate;
814     }
815 
816     if (!crop->get_active ()) {
817         filterPE.crop        = falsePE.crop;
818     }
819 
820     if (!resize->get_active ()) {
821         filterPE.resize      = falsePE.resize;
822     }
823 
824     if (!prsharpening->get_active ()) {
825         filterPE.prsharpening      = falsePE.prsharpening;
826     }
827 
828     if (!perspective->get_active ()) {
829         filterPE.perspective = falsePE.perspective;
830     }
831 
832     if (!commonTrans->get_active ()) {
833         filterPE.commonTrans = falsePE.commonTrans;
834     }
835 
836     if (!metadata->get_active()) {
837         filterPE.metadata = falsePE.metadata;
838     }
839 
840     if (!exifch->get_active ()) {
841         filterPE.exif = falsePE.exif;
842     }
843 
844     if (!iptc->get_active ()) {
845         filterPE.iptc = falsePE.iptc;
846     }
847 
848     if (!raw_method->get_active ()) {
849         filterPE.raw.bayersensor.method   = falsePE.raw.bayersensor.method;
850         filterPE.raw.bayersensor.dualDemosaicAutoContrast = falsePE.raw.bayersensor.dualDemosaicAutoContrast;
851         filterPE.raw.bayersensor.dualDemosaicContrast = falsePE.raw.bayersensor.dualDemosaicContrast;
852         filterPE.raw.xtranssensor.method  = falsePE.raw.xtranssensor.method;
853         filterPE.raw.xtranssensor.dualDemosaicAutoContrast = falsePE.raw.xtranssensor.dualDemosaicAutoContrast;
854         filterPE.raw.xtranssensor.dualDemosaicContrast = falsePE.raw.xtranssensor.dualDemosaicContrast;
855     }
856 
857     if (!raw_border->get_active ()) {
858         filterPE.raw.bayersensor.border = falsePE.raw.bayersensor.border;
859         filterPE.raw.xtranssensor.border = falsePE.raw.xtranssensor.border;
860     }
861 
862     if (!raw_imagenum->get_active ()) {
863         filterPE.raw.bayersensor.imageNum = falsePE.raw.bayersensor.imageNum;
864     }
865 
866     if (!raw_ccSteps->get_active ()) {
867         filterPE.raw.bayersensor.ccSteps  = falsePE.raw.bayersensor.ccSteps;
868         filterPE.raw.xtranssensor.ccSteps = falsePE.raw.xtranssensor.ccSteps;
869     }
870 
871     if (!raw_dcb_iterations->get_active ()) {
872         filterPE.raw.bayersensor.dcbIterations   = falsePE.raw.bayersensor.dcbIterations;
873     }
874 
875     if (!raw_dcb_enhance->get_active ()) {
876         filterPE.raw.bayersensor.dcbEnhance      = falsePE.raw.bayersensor.dcbEnhance;
877     }
878 
879     //if (!raw_all_enhance->get_active ())     filterPE.raw.bayersensor.allEnhance      = falsePE.raw.bayersensor.allEnhance;
880     if (!raw_lmmse_iterations->get_active ()) {
881         filterPE.raw.bayersensor.lmmseIterations = falsePE.raw.bayersensor.lmmseIterations;
882     }
883 
884     if (!raw_black->get_active ()) {
885         filterPE.raw.bayersensor.exBlack0        = falsePE.raw.bayersensor.exBlack0;
886         filterPE.raw.bayersensor.exBlack1        = falsePE.raw.bayersensor.exBlack1;
887         filterPE.raw.bayersensor.exBlack2        = falsePE.raw.bayersensor.exBlack2;
888         filterPE.raw.bayersensor.exBlack3        = falsePE.raw.bayersensor.exBlack3;
889         filterPE.raw.bayersensor.exTwoGreen      = falsePE.raw.bayersensor.exTwoGreen;
890         filterPE.raw.xtranssensor.exBlackRed     = falsePE.raw.xtranssensor.exBlackRed;
891         filterPE.raw.xtranssensor.exBlackGreen   = falsePE.raw.xtranssensor.exBlackGreen;
892         filterPE.raw.xtranssensor.exBlackBlue    = falsePE.raw.xtranssensor.exBlackBlue;
893     }
894 
895     if (!raw_pixelshift->get_active ()) {
896         filterPE.raw.bayersensor.pixelShiftBlur                   = falsePE.raw.bayersensor.pixelShiftBlur;
897         filterPE.raw.bayersensor.pixelShiftEperIso                = falsePE.raw.bayersensor.pixelShiftEperIso;
898         filterPE.raw.bayersensor.pixelShiftEqualBright            = falsePE.raw.bayersensor.pixelShiftEqualBright;
899         filterPE.raw.bayersensor.pixelShiftEqualBrightChannel     = falsePE.raw.bayersensor.pixelShiftEqualBrightChannel;
900         filterPE.raw.bayersensor.pixelShiftGreen                  = falsePE.raw.bayersensor.pixelShiftGreen;
901         filterPE.raw.bayersensor.pixelShiftHoleFill               = falsePE.raw.bayersensor.pixelShiftHoleFill;
902         filterPE.raw.bayersensor.pixelShiftDemosaicMethod         = falsePE.raw.bayersensor.pixelShiftDemosaicMethod;
903         filterPE.raw.bayersensor.pixelShiftMedian                 = falsePE.raw.bayersensor.pixelShiftMedian;
904         filterPE.raw.bayersensor.pixelShiftMotionCorrectionMethod = falsePE.raw.bayersensor.pixelShiftMotionCorrectionMethod;
905         filterPE.raw.bayersensor.pixelShiftNonGreenCross          = falsePE.raw.bayersensor.pixelShiftNonGreenCross;
906         filterPE.raw.bayersensor.pixelShiftSigma                  = falsePE.raw.bayersensor.pixelShiftSigma;
907         filterPE.raw.bayersensor.pixelShiftSmooth                 = falsePE.raw.bayersensor.pixelShiftSmooth;
908         filterPE.raw.bayersensor.pixelShiftShowMotion             = falsePE.raw.bayersensor.pixelShiftShowMotion;
909         filterPE.raw.bayersensor.pixelShiftShowMotionMaskOnly     = falsePE.raw.bayersensor.pixelShiftShowMotionMaskOnly;
910     }
911 
912     if (!raw_linenoise->get_active ()) {
913         filterPE.raw.bayersensor.linenoise       = falsePE.raw.bayersensor.linenoise;
914         filterPE.raw.bayersensor.linenoiseDirection = falsePE.raw.bayersensor.linenoiseDirection;
915     }
916 
917     if (!raw_greenthresh->get_active ()) {
918         filterPE.raw.bayersensor.greenEq         = falsePE.raw.bayersensor.greenEq;
919     }
920 
921     if (!raw_expos->get_active ()) {
922         filterPE.raw.exPos              = falsePE.raw.exPos;
923     }
924 
925     if (!raw_ca_autocorrect->get_active ()) {
926         filterPE.raw.ca_autocorrect       = falsePE.raw.ca_autocorrect;
927         filterPE.raw.caautoiterations       = falsePE.raw.caautoiterations;
928     }
929 
930     if (!raw_caredblue->get_active ()) {
931         filterPE.raw.cared              = falsePE.raw.cared;
932         filterPE.raw.cablue             = falsePE.raw.cablue;
933     }
934 
935     if (!raw_ca_avoid_colourshift->get_active ()) {
936         filterPE.raw.ca_avoidcolourshift = falsePE.raw.ca_avoidcolourshift;
937     }
938 
939     if (!raw_hotpix_filt->get_active ())     {
940         filterPE.raw.hotPixelFilter     = falsePE.raw.hotPixelFilter;
941     }
942 
943     if (!raw_deadpix_filt->get_active ())    {
944         filterPE.raw.deadPixelFilter    = falsePE.raw.deadPixelFilter;
945     }
946 
947     if (!raw_deadpix_filt->get_active () && !raw_hotpix_filt->get_active ()) {
948         filterPE.raw.hotdeadpix_thresh = falsePE.raw.hotdeadpix_thresh;
949     }
950 
951     if (!raw_pdaf_lines_filter->get_active ())    {
952         filterPE.raw.bayersensor.pdafLinesFilter = falsePE.raw.bayersensor.pdafLinesFilter;
953     }
954 
955     if (!df_file->get_active ()) {
956         filterPE.raw.darkFrame          = falsePE.raw.darkFrame;
957     }
958 
959     if (!df_AutoSelect->get_active ()) {
960         filterPE.raw.df_autoselect             = falsePE.raw.df_autoselect;
961     }
962 
963     if (!ff_file->get_active ()) {
964         filterPE.raw.ff_file            = falsePE.raw.ff_file;
965     }
966 
967     if (!ff_AutoSelect->get_active ()) {
968         filterPE.raw.ff_AutoSelect      = falsePE.raw.ff_AutoSelect;
969     }
970 
971     if (!ff_BlurRadius->get_active ()) {
972         filterPE.raw.ff_BlurRadius      = falsePE.raw.ff_BlurRadius;
973     }
974 
975     if (!ff_BlurType->get_active ()) {
976         filterPE.raw.ff_BlurType        = falsePE.raw.ff_BlurType;
977     }
978 
979     if (!ff_ClipControl->get_active ()) {
980         filterPE.raw.ff_clipControl     = falsePE.raw.ff_clipControl;
981         filterPE.raw.ff_AutoClipControl = falsePE.raw.ff_AutoClipControl;
982     }
983 
984     if (!filmNegative->get_active ()) {
985         filterPE.filmNegative.enabled   = falsePE.filmNegative.enabled;
986         filterPE.filmNegative.redRatio   = falsePE.filmNegative.redRatio;
987         filterPE.filmNegative.greenExp  = falsePE.filmNegative.greenExp;
988         filterPE.filmNegative.blueRatio   = falsePE.filmNegative.blueRatio;
989     }
990 
991     if (!captureSharpening->get_active ()) {
992         filterPE.pdsharpening.enabled   = falsePE.pdsharpening.enabled;
993         filterPE.pdsharpening.contrast   = falsePE.pdsharpening.contrast;
994         filterPE.pdsharpening.autoContrast   = falsePE.pdsharpening.autoContrast;
995         filterPE.pdsharpening.autoRadius   = falsePE.pdsharpening.autoRadius;
996         filterPE.pdsharpening.deconvradius   = falsePE.pdsharpening.deconvradius;
997         filterPE.pdsharpening.deconvradiusOffset   = falsePE.pdsharpening.deconvradiusOffset;
998         filterPE.pdsharpening.deconviter   = falsePE.pdsharpening.deconviter;
999         filterPE.pdsharpening.deconvitercheck   = falsePE.pdsharpening.deconvitercheck;
1000     }
1001 
1002     if (dstPE) {
1003         *dstPE = filterPE;
1004     }
1005 
1006     // Apply the filter!
1007     filterPE.combine(*dstPP, *srcPP, true);
1008 }
1009