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 <filterpanel.h>
20 #include <multilangmgr.h>
23 using namespace rtengine
;
25 FilterPanel::FilterPanel () : listener (NULL
) {
29 enabled
= Gtk::manage (new Gtk::CheckButton ("Enable Metadata Filters"));
30 pack_start (*enabled
, Gtk::PACK_SHRINK
, 2);
31 pack_start (*Gtk::manage(new Gtk::HSeparator ()), Gtk::PACK_SHRINK
, 2);
33 enaFNumber
= Gtk::manage (new Gtk::CheckButton (M("EXIFFILTER_APERTURE")+":"));
34 Gtk::VBox
* fnvb
= Gtk::manage(new Gtk::VBox ());
35 Gtk::HBox
* fnhb
= Gtk::manage(new Gtk::HBox ());
36 fnvb
->pack_start (*enaFNumber
, Gtk::PACK_SHRINK
, 0);
37 fnumberFrom
= Gtk::manage(new Gtk::Entry ());
38 fnumberTo
= Gtk::manage(new Gtk::Entry ());
39 fnhb
->pack_start (*fnumberFrom
, true, true, 2);
40 fnhb
->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4);
41 fnhb
->pack_start (*fnumberTo
, true, true, 2);
42 fnvb
->pack_start (*fnhb
, Gtk::PACK_SHRINK
, 0);
43 pack_start (*fnvb
, Gtk::PACK_SHRINK
, 4);
45 enaShutter
= Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_SHUTTER")+":"));
46 Gtk::VBox
* svb
= Gtk::manage(new Gtk::VBox ());
47 Gtk::HBox
* shb
= Gtk::manage(new Gtk::HBox ());
48 svb
->pack_start (*enaShutter
, Gtk::PACK_SHRINK
, 0);
49 shutterFrom
= Gtk::manage(new Gtk::Entry ());
50 shutterTo
= Gtk::manage(new Gtk::Entry ());
51 shb
->pack_start (*shutterFrom
, true, true, 2);
52 shb
->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4);
53 shb
->pack_start (*shutterTo
, true, true, 2);
54 svb
->pack_start (*shb
, Gtk::PACK_SHRINK
, 0);
55 pack_start (*svb
, Gtk::PACK_SHRINK
, 4);
57 enaISO
= Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_ISO")+":"));
58 Gtk::VBox
* ivb
= Gtk::manage(new Gtk::VBox ());
59 Gtk::HBox
* ihb
= Gtk::manage(new Gtk::HBox ());
60 ivb
->pack_start (*enaISO
, Gtk::PACK_SHRINK
, 0);
61 isoFrom
= Gtk::manage(new Gtk::Entry ());
62 isoTo
= Gtk::manage(new Gtk::Entry ());
63 ihb
->pack_start (*isoFrom
, true, true, 2);
64 ihb
->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4);
65 ihb
->pack_start (*isoTo
, true, true, 2);
66 ivb
->pack_start (*ihb
, Gtk::PACK_SHRINK
, 0);
67 pack_start (*ivb
, Gtk::PACK_SHRINK
, 4);
69 enaFocalLen
= Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_FOCALLEN")+":"));
70 Gtk::VBox
* fvb
= Gtk::manage(new Gtk::VBox ());
71 Gtk::HBox
* fhb
= Gtk::manage(new Gtk::HBox ());
72 fvb
->pack_start (*enaFocalLen
, Gtk::PACK_SHRINK
, 0);
73 focalFrom
= Gtk::manage(new Gtk::Entry ());
74 focalTo
= Gtk::manage(new Gtk::Entry ());
75 fhb
->pack_start (*focalFrom
, true, true, 2);
76 fhb
->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4);
77 fhb
->pack_start (*focalTo
, true, true, 2);
78 fvb
->pack_start (*fhb
, Gtk::PACK_SHRINK
, 0);
79 pack_start (*fvb
, Gtk::PACK_SHRINK
, 4);
81 enaCamera
= Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_CAMERA")+":"));
82 Gtk::VBox
* cvb
= Gtk::manage(new Gtk::VBox ());
83 cvb
->pack_start (*enaCamera
, Gtk::PACK_SHRINK
, 0);
84 camera
= Gtk::manage(new Gtk::ListViewText (1, false, Gtk::SELECTION_MULTIPLE
));
85 camera
->set_headers_visible (false);
86 Gtk::ScrolledWindow
* scamera
= Gtk::manage(new Gtk::ScrolledWindow());
87 scamera
->set_policy(Gtk::POLICY_AUTOMATIC
, Gtk::POLICY_ALWAYS
);
88 scamera
->add(*camera
);
89 cvb
->pack_start (*scamera
, Gtk::PACK_SHRINK
, 0);
90 pack_start (*cvb
, Gtk::PACK_SHRINK
, 4);
92 enaLens
= Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_LENS")+":"));
93 Gtk::VBox
* lvb
= Gtk::manage(new Gtk::VBox ());
94 lvb
->pack_start (*enaLens
, Gtk::PACK_SHRINK
, 0);
95 lens
= Gtk::manage(new Gtk::ListViewText (1, false, Gtk::SELECTION_MULTIPLE
));
96 lens
->set_headers_visible (false);
97 Gtk::ScrolledWindow
* slens
= Gtk::manage(new Gtk::ScrolledWindow());
98 slens
->set_policy(Gtk::POLICY_AUTOMATIC
, Gtk::POLICY_ALWAYS
);
100 lvb
->pack_start (*slens
, Gtk::PACK_SHRINK
, 0);
101 pack_start (*lvb
, Gtk::PACK_SHRINK
, 4);
104 sChange
[conns
++] = fnumberFrom
->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged
));
105 sChange
[conns
++] = fnumberTo
->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged
));
106 sChange
[conns
++] = shutterFrom
->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged
));
107 sChange
[conns
++] = shutterTo
->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged
));
108 sChange
[conns
++] = isoFrom
->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged
));
109 sChange
[conns
++] = isoTo
->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged
));
110 sChange
[conns
++] = focalFrom
->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged
));
111 sChange
[conns
++] = focalTo
->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged
));
112 sChange
[conns
++] = camera
->get_selection()->signal_changed().connect(sigc::mem_fun(*this, &FilterPanel::valueChanged
));
113 sChange
[conns
++] = lens
->get_selection()->signal_changed().connect(sigc::mem_fun(*this, &FilterPanel::valueChanged
));
114 sChange
[conns
++] = enaFNumber
->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged
) );
115 sChange
[conns
++] = enaShutter
->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged
) );
116 sChange
[conns
++] = enaFocalLen
->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged
) );
117 sChange
[conns
++] = enaISO
->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged
) );
118 sChange
[conns
++] = enaCamera
->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged
) );
119 sChange
[conns
++] = enaLens
->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged
) );
120 sChange
[conns
++] = enabled
->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged
) );
122 set_size_request (0, -1);
127 void FilterPanel::setFilter (ExifFilterSettings
& defefs
) {
131 for (int i
=0; i
<conns
; i
++)
132 sChange
[i
].block (true);
134 // enaFNumber->set_active (curefs.filterFNumber);
135 fnumberFrom
->set_text (ImageMetaData::apertureToString (curefs
.fnumberFrom
));
136 fnumberTo
->set_text (ImageMetaData::apertureToString (curefs
.fnumberTo
));
138 // enaShutter->set_active (curefs.filterShutter);
139 shutterFrom
->set_text (ImageMetaData::shutterToString (curefs
.shutterFrom
));
140 shutterTo
->set_text (ImageMetaData::shutterToString (curefs
.shutterTo
));
142 // enaISO->set_active (curefs.filterISO);
143 isoFrom
->set_text (Glib::ustring::format (curefs
.isoFrom
));
144 isoTo
->set_text (Glib::ustring::format (curefs
.isoTo
));
146 // enaFocalLen->set_active (curefs.filterFocalLen);
147 focalFrom
->set_text (Glib::ustring::format (curefs
.focalFrom
));
148 focalTo
->set_text (Glib::ustring::format (curefs
.focalTo
));
150 // enaCamera->set_active (curefs.filterCamera);
151 Glib::RefPtr
<Gtk::TreeSelection
> cselection
= camera
->get_selection ();
153 for (std::set
<std::string
>::iterator i
= defefs
.cameras
.begin(); i
!=defefs
.cameras
.end(); i
++, j
++) {
154 camera
->append_text (*i
);
155 if (curefs
.cameras
.count (*i
)>0)
156 cselection
->select (camera
->get_model()->children()[j
]);
159 // enaLens->set_active (curefs.filterLens);
160 Glib::RefPtr
<Gtk::TreeSelection
> lselection
= lens
->get_selection ();
162 for (std::set
<std::string
>::iterator i
= defefs
.lenses
.begin(); i
!=defefs
.lenses
.end(); i
++, j
++) {
163 lens
->append_text (*i
);
164 if (curefs
.lenses
.count (*i
)>0)
165 lselection
->select (lens
->get_model()->children()[j
]);
168 for (int i
=0; i
<conns
; i
++)
169 sChange
[i
].block (false);
172 bool FilterPanel::isEnabled () {
174 return enabled
->get_active () && is_sensitive();
177 ExifFilterSettings
FilterPanel::getFilter () {
179 ExifFilterSettings efs
;
180 efs
.fnumberFrom
= atof (fnumberFrom
->get_text().c_str());
181 efs
.fnumberTo
= atof (fnumberTo
->get_text().c_str());
182 efs
.focalFrom
= atof (focalFrom
->get_text().c_str());
183 efs
.focalTo
= atof (focalTo
->get_text().c_str());
184 efs
.isoFrom
= atoi (isoFrom
->get_text().c_str());
185 efs
.isoTo
= atoi (isoTo
->get_text().c_str());
186 efs
.shutterFrom
= ImageMetaData::shutterFromString (shutterFrom
->get_text());
187 efs
.shutterTo
= ImageMetaData::shutterFromString (shutterTo
->get_text());
189 efs
.filterFNumber
= enaFNumber
->get_active ();
190 efs
.filterShutter
= enaShutter
->get_active ();
191 efs
.filterFocalLen
= enaFocalLen
->get_active ();
192 efs
.filterISO
= enaISO
->get_active ();
193 efs
.filterCamera
= enaCamera
->get_active ();
194 efs
.filterLens
= enaLens
->get_active ();
196 std::vector
<int> sel
= camera
->get_selected ();
197 for (int i
=0; i
<sel
.size(); i
++)
198 efs
.cameras
.insert (camera
->get_text (sel
[i
]));
199 sel
= lens
->get_selected ();
200 for (int i
=0; i
<sel
.size(); i
++)
201 efs
.lenses
.insert (lens
->get_text (sel
[i
]));
206 void FilterPanel::valueChanged () {
209 listener
->exifFilterChanged ();