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:
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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]));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user