Filter by file type, on behalf of Michael Ezra; see issue #376

This commit is contained in:
Oliver Duis
2010-12-05 21:42:52 +01:00
parent 819f013533
commit f41c5f68cc
13 changed files with 66 additions and 4 deletions

View File

@@ -35,6 +35,7 @@
!EXIFFILTER_FOCALLEN;Focal Length !EXIFFILTER_FOCALLEN;Focal Length
!EXIFFILTER_ISO;ISO !EXIFFILTER_ISO;ISO
!EXIFFILTER_LENS;Lens !EXIFFILTER_LENS;Lens
!EXIFFILTER_FILETYPE;File Type
!EXIFFILTER_METADATAFILTER;Enable Metadata Filters !EXIFFILTER_METADATAFILTER;Enable Metadata Filters
!EXIFFILTER_SHUTTER;Shutter !EXIFFILTER_SHUTTER;Shutter
!EXIFPANEL_ADDEDIT;Add/Edit !EXIFPANEL_ADDEDIT;Add/Edit

View File

@@ -64,6 +64,7 @@ TP_HLREC_COLOR;Colour Propagation
!EXIFFILTER_FOCALLEN;Focal Length !EXIFFILTER_FOCALLEN;Focal Length
!EXIFFILTER_ISO;ISO !EXIFFILTER_ISO;ISO
!EXIFFILTER_LENS;Lens !EXIFFILTER_LENS;Lens
!EXIFFILTER_FILETYPE;File Type
!EXIFFILTER_METADATAFILTER;Enable Metadata Filters !EXIFFILTER_METADATAFILTER;Enable Metadata Filters
!EXIFFILTER_SHUTTER;Shutter !EXIFFILTER_SHUTTER;Shutter
!EXIFPANEL_ADDEDIT;Add/Edit !EXIFPANEL_ADDEDIT;Add/Edit

View File

@@ -35,6 +35,7 @@
!EXIFFILTER_FOCALLEN;Focal Length !EXIFFILTER_FOCALLEN;Focal Length
!EXIFFILTER_ISO;ISO !EXIFFILTER_ISO;ISO
!EXIFFILTER_LENS;Lens !EXIFFILTER_LENS;Lens
!EXIFFILTER_FILETYPE;File Type
!EXIFFILTER_METADATAFILTER;Enable Metadata Filters !EXIFFILTER_METADATAFILTER;Enable Metadata Filters
!EXIFFILTER_SHUTTER;Shutter !EXIFFILTER_SHUTTER;Shutter
!EXIFPANEL_ADDEDIT;Add/Edit !EXIFPANEL_ADDEDIT;Add/Edit

View File

@@ -28,6 +28,7 @@ EXIFFILTER_DIALOGLABEL;Exif Filter
EXIFFILTER_FOCALLEN;Focal Length EXIFFILTER_FOCALLEN;Focal Length
EXIFFILTER_ISO;ISO EXIFFILTER_ISO;ISO
EXIFFILTER_LENS;Lens EXIFFILTER_LENS;Lens
EXIFFILTER_FILETYPE;File Type
EXIFFILTER_METADATAFILTER;Enable Metadata Filters EXIFFILTER_METADATAFILTER;Enable Metadata Filters
EXIFFILTER_SHUTTER;Shutter EXIFFILTER_SHUTTER;Shutter
EXIFPANEL_ADDEDIT;Add/Edit EXIFPANEL_ADDEDIT;Add/Edit

View File

@@ -72,6 +72,11 @@ int CacheImageData::load (const Glib::ustring& fname) {
if (keyFile.has_key ("ExifInfo", "Camera")) camera = keyFile.get_string ("ExifInfo", "Camera"); if (keyFile.has_key ("ExifInfo", "Camera")) camera = keyFile.get_string ("ExifInfo", "Camera");
} }
if (keyFile.has_group ("FileInfo")) {
if (keyFile.has_key ("FileInfo", "Filetype")) filetype = keyFile.get_string ("FileInfo", "Filetype");
}
if (format==FT_Raw && keyFile.has_group ("ExtraRawInfo")) { if (format==FT_Raw && keyFile.has_group ("ExtraRawInfo")) {
if (keyFile.has_key ("ExtraRawInfo", "ThumbImageType")) thumbImgType = keyFile.get_integer ("ExtraRawInfo", "ThumbImageType"); if (keyFile.has_key ("ExtraRawInfo", "ThumbImageType")) thumbImgType = keyFile.get_integer ("ExtraRawInfo", "ThumbImageType");
if (keyFile.has_key ("ExtraRawInfo", "ThumbImageOffset")) thumbOffset = keyFile.get_integer ("ExtraRawInfo", "ThumbImageOffset"); if (keyFile.has_key ("ExtraRawInfo", "ThumbImageOffset")) thumbOffset = keyFile.get_integer ("ExtraRawInfo", "ThumbImageOffset");
@@ -120,6 +125,7 @@ int CacheImageData::save (const Glib::ustring& fname) {
} }
keyFile.set_string ("ExifInfo", "Lens", lens); keyFile.set_string ("ExifInfo", "Lens", lens);
keyFile.set_string ("ExifInfo", "Camera", camera); keyFile.set_string ("ExifInfo", "Camera", camera);
keyFile.set_string ("FileInfo", "Filetype", filetype);
if (format==FT_Raw) { if (format==FT_Raw) {
keyFile.set_integer ("ExtraRawInfo", "ThumbImageType", thumbImgType); keyFile.set_integer ("ExtraRawInfo", "ThumbImageType", thumbImgType);

View File

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

View File

@@ -34,6 +34,7 @@ void ExifFilterSettings::clear () {
focalTo = 0; focalTo = 0;
lenses.clear (); lenses.clear ();
cameras.clear (); cameras.clear ();
filetypes.clear ();
filterFNumber = false; filterFNumber = false;
filterShutter = false; filterShutter = false;
@@ -41,4 +42,5 @@ void ExifFilterSettings::clear () {
filterISO = false; filterISO = false;
filterCamera = false; filterCamera = false;
filterLens = false; filterLens = false;
filterFiletype = false;
} }

View File

@@ -25,6 +25,7 @@
class ExifFilterSettings { class ExifFilterSettings {
public: public:
std::set<std::string> filetypes;
std::set<std::string> cameras; std::set<std::string> cameras;
std::set<std::string> lenses; std::set<std::string> lenses;
double fnumberFrom; double fnumberFrom;
@@ -42,6 +43,7 @@ class ExifFilterSettings {
bool filterISO; bool filterISO;
bool filterCamera; bool filterCamera;
bool filterLens; bool filterLens;
bool filterFiletype;
ExifFilterSettings (); ExifFilterSettings ();
void clear (); void clear ();

View File

@@ -488,7 +488,8 @@ bool FileBrowser::checkFilter (ThumbBrowserEntryBase* entryb) { // true -> entry
if (!cfs->exifValid) if (!cfs->exifValid)
return (!filter.exifFilter.filterCamera || filter.exifFilter.cameras.count(cfs->camera)>0) return (!filter.exifFilter.filterCamera || filter.exifFilter.cameras.count(cfs->camera)>0)
&& (!filter.exifFilter.filterLens || filter.exifFilter.lenses.count(cfs->lens)>0); && (!filter.exifFilter.filterLens || filter.exifFilter.lenses.count(cfs->lens)>0)
&& (!filter.exifFilter.filterFiletype || filter.exifFilter.filetypes.count(cfs->filetype)>0);
return 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.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))
@@ -496,7 +497,8 @@ bool FileBrowser::checkFilter (ThumbBrowserEntryBase* entryb) { // true -> entry
&& (!filter.exifFilter.filterFocalLen || (cfs->focalLen >= filter.exifFilter.focalFrom-tol && cfs->focalLen <= filter.exifFilter.focalTo+tol)) && (!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.filterISO || (cfs->iso >= filter.exifFilter.isoFrom && cfs->iso <= filter.exifFilter.isoTo))
&& (!filter.exifFilter.filterCamera || filter.exifFilter.cameras.count(cfs->camera)>0) && (!filter.exifFilter.filterCamera || filter.exifFilter.cameras.count(cfs->camera)>0)
&& (!filter.exifFilter.filterLens || filter.exifFilter.lenses.count(cfs->lens)>0); && (!filter.exifFilter.filterLens || filter.exifFilter.lenses.count(cfs->lens)>0)
&& (!filter.exifFilter.filterFiletype || filter.exifFilter.filetypes.count(cfs->filetype)>0);
} }
void FileBrowser::toTrashRequested (std::vector<FileBrowserEntry*> tbe) { void FileBrowser::toTrashRequested (std::vector<FileBrowserEntry*> tbe) {

View File

@@ -354,6 +354,7 @@ void FileCatalog::_previewReady (int dir_id, FileBrowserEntry* fdn) {
if (cfs->focalLen > dirEFS.focalTo) if (cfs->focalLen > dirEFS.focalTo)
dirEFS.focalTo = cfs->focalLen; dirEFS.focalTo = cfs->focalLen;
} }
dirEFS.filetypes.insert (cfs->filetype);
dirEFS.cameras.insert (cfs->camera); dirEFS.cameras.insert (cfs->camera);
dirEFS.lenses.insert (cfs->lens); dirEFS.lenses.insert (cfs->lens);
previewsLoaded++; previewsLoaded++;

View File

@@ -100,6 +100,17 @@ FilterPanel::FilterPanel () : listener (NULL) {
lvb->pack_start (*slens, Gtk::PACK_SHRINK, 0); lvb->pack_start (*slens, Gtk::PACK_SHRINK, 0);
pack_start (*lvb, Gtk::PACK_SHRINK, 4); pack_start (*lvb, Gtk::PACK_SHRINK, 4);
enaFiletype = Gtk::manage(new Gtk::CheckButton(M("EXIFFILTER_FILETYPE")+":"));
Gtk::VBox* ftvb = Gtk::manage(new Gtk::VBox ());
ftvb->pack_start (*enaFiletype, Gtk::PACK_SHRINK, 0);
filetype = Gtk::manage(new Gtk::ListViewText (1, false, Gtk::SELECTION_MULTIPLE));
filetype->set_headers_visible (false);
Gtk::ScrolledWindow* sfiletype = Gtk::manage(new Gtk::ScrolledWindow());
sfiletype->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS);
sfiletype->add(*filetype);
ftvb->pack_start (*sfiletype, Gtk::PACK_SHRINK, 0);
pack_start (*ftvb, Gtk::PACK_SHRINK, 4);
conns = 0; conns = 0;
sChange[conns++] = fnumberFrom->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged)); sChange[conns++] = fnumberFrom->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged));
sChange[conns++] = fnumberTo->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged)); sChange[conns++] = fnumberTo->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged));
@@ -109,6 +120,7 @@ FilterPanel::FilterPanel () : listener (NULL) {
sChange[conns++] = isoTo->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged)); 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++] = focalFrom->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged));
sChange[conns++] = focalTo->signal_changed().connect (sigc::mem_fun(*this, &FilterPanel::valueChanged)); sChange[conns++] = focalTo->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++] = 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)); sChange[conns++] = lens->get_selection()->signal_changed().connect(sigc::mem_fun(*this, &FilterPanel::valueChanged));
sChange[conns++] = enaFNumber->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged) ); sChange[conns++] = enaFNumber->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged) );
@@ -118,7 +130,8 @@ FilterPanel::FilterPanel () : listener (NULL) {
sChange[conns++] = enaCamera->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++] = enaLens->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged) );
sChange[conns++] = enabled->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged) ); sChange[conns++] = enabled->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged) );
sChange[conns++] = enaFiletype->signal_toggled().connect( sigc::mem_fun(*this, &FilterPanel::valueChanged) );
set_size_request (0, -1); set_size_request (0, -1);
show_all (); show_all ();
@@ -154,6 +167,9 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) {
focalTo->set_text (Glib::ustring::format (defefs.focalTo)); focalTo->set_text (Glib::ustring::format (defefs.focalTo));
curefs.focalTo = defefs.focalTo; curefs.focalTo = defefs.focalTo;
// enaFiletype->set_active (curefs.filterFiletype);
Glib::RefPtr<Gtk::TreeSelection> ftselection = filetype->get_selection ();
// enaCamera->set_active (curefs.filterCamera); // enaCamera->set_active (curefs.filterCamera);
Glib::RefPtr<Gtk::TreeSelection> cselection = camera->get_selection (); Glib::RefPtr<Gtk::TreeSelection> cselection = camera->get_selection ();
@@ -175,6 +191,14 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) {
curefs.cameras.insert(*i); curefs.cameras.insert(*i);
} }
cselection->select_all(); cselection->select_all();
filetype->clear_items();
curefs.filetypes.clear();
for (std::set<std::string>::iterator i = defefs.filetypes.begin(); i!=defefs.filetypes.end(); i++) {
filetype->append_text(*i);
curefs.filetypes.insert(*i);
}
ftselection->select_all();
}else{ }else{
for( Gtk::TreeModel::Children::iterator iter = lens->get_model()->children().begin(); iter != lens->get_model()->children().end();iter++){ for( Gtk::TreeModel::Children::iterator iter = lens->get_model()->children().begin(); iter != lens->get_model()->children().end();iter++){
Glib::ustring v; Glib::ustring v;
@@ -192,6 +216,14 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) {
else else
cselection->unselect(iter); cselection->unselect(iter);
} }
for( Gtk::TreeModel::Children::iterator iter = filetype->get_model()->children().begin(); iter != filetype->get_model()->children().end();iter++){
Glib::ustring v;
iter->get_value(0,v);
if( defefs.filetypes.find( v ) != defefs.filetypes.end() )
ftselection->select(iter);
else
ftselection->unselect(iter);
}
} }
curefs = defefs; curefs = defefs;
@@ -223,6 +255,7 @@ ExifFilterSettings FilterPanel::getFilter () {
efs.filterISO = enaISO->get_active (); efs.filterISO = enaISO->get_active ();
efs.filterCamera = enaCamera->get_active (); efs.filterCamera = enaCamera->get_active ();
efs.filterLens = enaLens->get_active (); efs.filterLens = enaLens->get_active ();
efs.filterFiletype = enaFiletype->get_active ();
std::vector<int> sel = camera->get_selected (); std::vector<int> sel = camera->get_selected ();
for (int i=0; i<sel.size(); i++) for (int i=0; i<sel.size(); i++)
@@ -230,6 +263,9 @@ ExifFilterSettings FilterPanel::getFilter () {
sel = lens->get_selected (); sel = lens->get_selected ();
for (int i=0; i<sel.size(); i++) for (int i=0; i<sel.size(); i++)
efs.lenses.insert (lens->get_text (sel[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]));
return efs; return efs;
} }

View File

@@ -31,6 +31,7 @@ class FilterPanelListener {
class FilterPanel : public Gtk::VBox { class FilterPanel : public Gtk::VBox {
protected: protected:
Gtk::ListViewText* filetype;
Gtk::ListViewText* camera; Gtk::ListViewText* camera;
Gtk::ListViewText* lens; Gtk::ListViewText* lens;
Gtk::Entry* fnumberFrom; Gtk::Entry* fnumberFrom;
@@ -48,6 +49,7 @@ class FilterPanel : public Gtk::VBox {
Gtk::CheckButton* enaISO; Gtk::CheckButton* enaISO;
Gtk::CheckButton* enaCamera; Gtk::CheckButton* enaCamera;
Gtk::CheckButton* enaLens; Gtk::CheckButton* enaLens;
Gtk::CheckButton* enaFiletype;
int conns; int conns;
sigc::connection sChange[20]; sigc::connection sChange[20];

View File

@@ -310,7 +310,7 @@ void Thumbnail::generateExifDateTimeStrings () {
if (!cfs.exifValid) if (!cfs.exifValid)
return; return;
exifString = Glib::ustring::compose ("f/%1 %2s %3%4 %5mm", Glib::ustring(rtengine::ImageData::apertureToString(cfs.fnumber)), Glib::ustring(rtengine::ImageData::shutterToString(cfs.shutter)), M("QINFO_ISO"), cfs.iso, cfs.focalLen); exifString = Glib::ustring::compose ("f/%1 %2s %3%4 %5mm", Glib::ustring(rtengine::ImageData::apertureToString(cfs.fnumber)), Glib::ustring(rtengine::ImageData::shutterToString(cfs.shutter)), M("QINFO_ISO"), cfs.iso, cfs.focalLen);
std::string dateFormat = options.dateFormat; std::string dateFormat = options.dateFormat;
std::ostringstream ostr; std::ostringstream ostr;
@@ -384,6 +384,12 @@ void Thumbnail::infoFromImage (const Glib::ustring& fname, rtengine::RawMetaData
cfs.lens = "Unknown"; cfs.lens = "Unknown";
cfs.camera = "Unknown"; cfs.camera = "Unknown";
} }
// get image filetype
std::string::size_type idx;
idx = fname.rfind('.');
if(idx != std::string::npos){cfs.filetype = fname.substr(idx+1);}
else {cfs.filetype="";}
delete idata; delete idata;
} }