File browser filter: Exposure Compensation (see issue 1003)

In order to use this new filter with previously browsed thumbnails there are 2 options:
Option 1. Global fix: clear cache/data folder

Option 2. Local Fix: select thumbs, right click, Cache /Clear from cache - partial
   reload folder in file browser
This commit is contained in:
michael
2011-12-06 19:33:37 -05:00
parent ec09b877b2
commit 18a91f0ca0
13 changed files with 85 additions and 26 deletions

View File

@@ -30,6 +30,7 @@ EDITWINDOW_TITLE;Image Edit
EXIFFILTER_APERTURE;Aperture
EXIFFILTER_CAMERA;Camera
EXIFFILTER_DIALOGLABEL;Exif Filter
EXIFFILTER_EXPOSURECOMPENSATION;Exposure Compensation (EV)
EXIFFILTER_FILETYPE;File Type
EXIFFILTER_FOCALLEN;Focal Length
EXIFFILTER_ISO;ISO

View File

@@ -338,15 +338,21 @@ std::string ImageMetaData::shutterToString (double shutter) {
return buffer;
}
std::string ImageMetaData::expcompToString (double expcomp) {
std::string ImageMetaData::expcompToString (double expcomp, bool maskZeroexpcomp) {
char buffer[256];
if (maskZeroexpcomp==true){
if (expcomp!=0.0){
sprintf (buffer, "%0.1f", expcomp);
sprintf (buffer, "%0.2f", expcomp);
return buffer;
}
else
return "";
}
else{
sprintf (buffer, "%0.2f", expcomp);
return buffer;
}
}
double ImageMetaData::shutterFromString (std::string s) {

View File

@@ -93,7 +93,7 @@ namespace rtengine {
/** Functions to convert between floating point and string representation of shutter and aperture */
static double shutterFromString (std::string shutter);
/** Functions to convert between floating point and string representation of exposure compensation */
static std::string expcompToString (double expcomp);
static std::string expcompToString (double expcomp, bool maskZeroexpcomp);
/** Reads metadata from file.
* @param fname is the name of the file

View File

@@ -69,6 +69,7 @@ int CacheImageData::load (const Glib::ustring& fname) {
if (keyFile.has_key ("ExifInfo", "Shutter")) shutter = keyFile.get_double ("ExifInfo", "Shutter");
if (keyFile.has_key ("ExifInfo", "FocalLen")) focalLen = keyFile.get_double ("ExifInfo", "FocalLen");
if (keyFile.has_key ("ExifInfo", "ISO")) iso = keyFile.get_integer ("ExifInfo", "ISO");
if (keyFile.has_key ("ExifInfo", "ExpComp")) expcomp = keyFile.get_string ("ExifInfo", "ExpComp");
}
if (keyFile.has_key ("ExifInfo", "Lens")) lens = keyFile.get_string ("ExifInfo", "Lens");
if (keyFile.has_key ("ExifInfo", "Camera")) camera = keyFile.get_string ("ExifInfo", "Camera");
@@ -126,6 +127,7 @@ int CacheImageData::save (const Glib::ustring& fname) {
keyFile.set_double ("ExifInfo", "Shutter", shutter);
keyFile.set_double ("ExifInfo", "FocalLen", focalLen);
keyFile.set_integer ("ExifInfo", "ISO", iso);
keyFile.set_string ("ExifInfo", "ExpComp", expcomp);
}
keyFile.set_string ("ExifInfo", "Lens", lens);
keyFile.set_string ("ExifInfo", "Camera", camera);

View File

@@ -54,6 +54,7 @@ class CacheImageData {
Glib::ustring lens;
Glib::ustring camera;
Glib::ustring filetype;
Glib::ustring expcomp;
// additional info on raw images
int rotate;

View File

@@ -681,11 +681,11 @@ void EditorPanel::info_toggled () {
M("QINFO_ISO"), idata->getISOSpeed(),
idata->getFocalLen());
expcomp = Glib::ustring(idata->expcompToString(idata->getExpComp()));
expcomp = Glib::ustring(idata->expcompToString(idata->getExpComp(),true)); // maskZeroexpcomp
if (expcomp!=""){
infoString2 = Glib::ustring::compose("%1 <span size=\"large\">%2</span><span size=\"small\">EV</span>",
infoString2,
Glib::ustring(idata->expcompToString(idata->getExpComp())));
expcomp /*Glib::ustring(idata->expcompToString(idata->getExpComp()))*/);
}
infoString3 = Glib::ustring::compose ("<span size=\"small\">%1</span><span>%2</span>",

View File

@@ -34,12 +34,14 @@ void ExifFilterSettings::clear () {
focalTo = 0;
lenses.clear ();
cameras.clear ();
expcomp.clear ();
filetypes.clear ();
filterFNumber = false;
filterShutter = false;
filterFocalLen = false;
filterISO = false;
filterExpComp = false;
filterCamera = false;
filterLens = false;
filterFiletype = false;

View File

@@ -28,6 +28,7 @@ class ExifFilterSettings {
std::set<std::string> filetypes;
std::set<std::string> cameras;
std::set<std::string> lenses;
std::set<std::string> expcomp;
double fnumberFrom;
double fnumberTo;
double shutterFrom;
@@ -41,6 +42,7 @@ class ExifFilterSettings {
bool filterShutter;
bool filterFocalLen;
bool filterISO;
bool filterExpComp;
bool filterCamera;
bool filterLens;
bool filterFiletype;

View File

@@ -824,13 +824,15 @@ bool FileBrowser::checkFilter (ThumbBrowserEntryBase* entryb) { // true -> entry
if (!cfs->exifValid)
return (!filter.exifFilter.filterCamera || filter.exifFilter.cameras.count(cfs->camera)>0)
&& (!filter.exifFilter.filterLens || filter.exifFilter.lenses.count(cfs->lens)>0)
&& (!filter.exifFilter.filterFiletype || filter.exifFilter.filetypes.count(cfs->filetype)>0);
&& (!filter.exifFilter.filterFiletype || filter.exifFilter.filetypes.count(cfs->filetype)>0)
&& (!filter.exifFilter.filterExpComp || filter.exifFilter.expcomp.count(cfs->expcomp)>0);
return
(!filter.exifFilter.filterShutter || (rtengine::ImageMetaData::shutterFromString(rtengine::ImageMetaData::shutterToString(cfs->shutter)) >= filter.exifFilter.shutterFrom-tol2 && rtengine::ImageMetaData::shutterFromString(rtengine::ImageMetaData::shutterToString(cfs->shutter)) <= filter.exifFilter.shutterTo+tol2))
&& (!filter.exifFilter.filterFNumber || (rtengine::ImageMetaData::apertureFromString(rtengine::ImageMetaData::apertureToString(cfs->fnumber)) >= filter.exifFilter.fnumberFrom-tol2 && rtengine::ImageMetaData::apertureFromString(rtengine::ImageMetaData::apertureToString(cfs->fnumber)) <= filter.exifFilter.fnumberTo+tol2))
&& (!filter.exifFilter.filterFocalLen || (cfs->focalLen >= filter.exifFilter.focalFrom-tol && cfs->focalLen <= filter.exifFilter.focalTo+tol))
&& (!filter.exifFilter.filterISO || (cfs->iso >= filter.exifFilter.isoFrom && cfs->iso <= filter.exifFilter.isoTo))
&& (!filter.exifFilter.filterExpComp || filter.exifFilter.expcomp.count(cfs->expcomp)>0)
&& (!filter.exifFilter.filterCamera || filter.exifFilter.cameras.count(cfs->camera)>0)
&& (!filter.exifFilter.filterLens || filter.exifFilter.lenses.count(cfs->lens)>0)
&& (!filter.exifFilter.filterFiletype || filter.exifFilter.filetypes.count(cfs->filetype)>0);

View File

@@ -600,6 +600,7 @@ void FileCatalog::previewReadyUI (int dir_id, FileBrowserEntry* fdn) {
dirEFS.filetypes.insert (cfs->filetype);
dirEFS.cameras.insert (cfs->camera);
dirEFS.lenses.insert (cfs->lens);
dirEFS.expcomp.insert (cfs->expcomp);
previewsLoaded++;
g_idle_add (refreshProgressBarUI, this);

View File

@@ -78,6 +78,17 @@ FilterPanel::FilterPanel () : listener (NULL) {
fvb->pack_start (*fhb, Gtk::PACK_SHRINK, 0);
pack_start (*fvb, Gtk::PACK_SHRINK, 4);
enaExpComp = Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_EXPOSURECOMPENSATION")+":"));
Gtk::VBox* evb = Gtk::manage(new Gtk::VBox ());
evb->pack_start (*enaExpComp, Gtk::PACK_SHRINK, 0);
expcomp = Gtk::manage(new Gtk::ListViewText (1, false, Gtk::SELECTION_MULTIPLE));
expcomp->set_headers_visible (false);
Gtk::ScrolledWindow* sexpcomp = Gtk::manage(new Gtk::ScrolledWindow());
sexpcomp->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS);
sexpcomp->add(*expcomp);
evb->pack_start (*sexpcomp, Gtk::PACK_SHRINK, 0);
pack_start (*evb, Gtk::PACK_SHRINK, 4);
enaCamera = Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_CAMERA")+":"));
Gtk::VBox* cvb = Gtk::manage(new Gtk::VBox ());
cvb->pack_start (*enaCamera, Gtk::PACK_SHRINK, 0);
@@ -120,6 +131,7 @@ FilterPanel::FilterPanel () : listener (NULL) {
sChange[conns++] = isoTo->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged));
sChange[conns++] = focalFrom->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged));
sChange[conns++] = focalTo->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged));
sChange[conns++] = expcomp->get_selection()->signal_changed().connect(sigc::mem_fun(*this, &FilterPanel::valueChanged));
sChange[conns++] = filetype->get_selection()->signal_changed().connect(sigc::mem_fun(*this, &FilterPanel::valueChanged));
sChange[conns++] = camera->get_selection()->signal_changed().connect(sigc::mem_fun(*this, &FilterPanel::valueChanged));
sChange[conns++] = lens->get_selection()->signal_changed().connect(sigc::mem_fun(*this, &FilterPanel::valueChanged));
@@ -127,6 +139,7 @@ FilterPanel::FilterPanel () : listener (NULL) {
sChange[conns++] = enaShutter->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged) );
sChange[conns++] = enaFocalLen->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged) );
sChange[conns++] = enaISO->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged) );
sChange[conns++] = enaExpComp->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged) );
sChange[conns++] = enaCamera->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged) );
sChange[conns++] = enaLens->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged) );
sChange[conns++] = enabled->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged) );
@@ -167,6 +180,9 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) {
focalTo->set_text (Glib::ustring::format (defefs.focalTo));
curefs.focalTo = defefs.focalTo;
// enaCompExp->set_active (curefs.filterExpComp);
Glib::RefPtr<Gtk::TreeSelection> eselection = expcomp->get_selection ();
// enaFiletype->set_active (curefs.filterFiletype);
Glib::RefPtr<Gtk::TreeSelection> ftselection = filetype->get_selection ();
@@ -176,6 +192,14 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) {
// enaLens->set_active (curefs.filterLens);
Glib::RefPtr<Gtk::TreeSelection> lselection = lens->get_selection ();
if( updateLists ){
expcomp->clear_items();
curefs.expcomp.clear();
for (std::set<std::string>::iterator i = defefs.expcomp.begin(); i!=defefs.expcomp.end(); i++) {
expcomp->append_text (*i);
curefs.expcomp.insert(*i);
}
eselection->select_all();
lens->clear_items();
curefs.lenses.clear();
for (std::set<std::string>::iterator i = defefs.lenses.begin(); i!=defefs.lenses.end(); i++) {
@@ -200,6 +224,14 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) {
}
ftselection->select_all();
}else{
for( Gtk::TreeModel::Children::iterator iter = expcomp->get_model()->children().begin(); iter != expcomp->get_model()->children().end();iter++){
Glib::ustring v;
iter->get_value(0,v);
if( defefs.expcomp.find( v ) != defefs.expcomp.end() )
eselection->select( iter );
else
eselection->unselect( iter );
}
for( Gtk::TreeModel::Children::iterator iter = lens->get_model()->children().begin(); iter != lens->get_model()->children().end();iter++){
Glib::ustring v;
iter->get_value(0,v);
@@ -253,6 +285,7 @@ ExifFilterSettings FilterPanel::getFilter () {
efs.filterShutter = enaShutter->get_active ();
efs.filterFocalLen = enaFocalLen->get_active ();
efs.filterISO = enaISO->get_active ();
efs.filterExpComp = enaExpComp->get_active ();
efs.filterCamera = enaCamera->get_active ();
efs.filterLens = enaLens->get_active ();
efs.filterFiletype = enaFiletype->get_active ();
@@ -260,9 +293,15 @@ ExifFilterSettings FilterPanel::getFilter () {
std::vector<int> sel = camera->get_selected ();
for (int i=0; i<sel.size(); i++)
efs.cameras.insert (camera->get_text (sel[i]));
sel = expcomp->get_selected ();
for (int i=0; i<sel.size(); i++)
efs.expcomp.insert (expcomp->get_text (sel[i]));
sel = lens->get_selected ();
for (int i=0; i<sel.size(); i++)
efs.lenses.insert (lens->get_text (sel[i]));
sel = filetype->get_selected ();
for (int i=0; i<sel.size(); i++)
efs.filetypes.insert (filetype->get_text (sel[i]));

View File

@@ -34,6 +34,7 @@ class FilterPanel : public Gtk::VBox {
Gtk::ListViewText* filetype;
Gtk::ListViewText* camera;
Gtk::ListViewText* lens;
Gtk::ListViewText* expcomp;
Gtk::Entry* fnumberFrom;
Gtk::Entry* fnumberTo;
Gtk::Entry* shutterFrom;
@@ -47,12 +48,13 @@ class FilterPanel : public Gtk::VBox {
Gtk::CheckButton* enaShutter;
Gtk::CheckButton* enaFocalLen;
Gtk::CheckButton* enaISO;
Gtk::CheckButton* enaExpComp;
Gtk::CheckButton* enaCamera;
Gtk::CheckButton* enaLens;
Gtk::CheckButton* enaFiletype;
int conns;
sigc::connection sChange[20];
sigc::connection sChange[22];
ExifFilterSettings curefs;
FilterPanelListener* listener;

View File

@@ -548,6 +548,7 @@ int Thumbnail::infoFromImage (const Glib::ustring& fname, rtengine::RawMetaDataL
cfs.fnumber = idata->getFNumber ();
cfs.focalLen = idata->getFocalLen ();
cfs.iso = idata->getISOSpeed ();
cfs.expcomp = idata->expcompToString (idata->getExpComp(), false); // do not mask Zero expcomp
cfs.year = 1900 + idata->getDateTime().tm_year;
cfs.month = idata->getDateTime().tm_mon + 1;
cfs.day = idata->getDateTime().tm_mday;