From f41c5f68cc35428398b50586502a3302d995de20 Mon Sep 17 00:00:00 2001 From: Oliver Duis Date: Sun, 5 Dec 2010 21:42:52 +0100 Subject: [PATCH] Filter by file type, on behalf of Michael Ezra; see issue #376 --- rtdata/languages/English | 1 + rtdata/languages/English (UK) | 1 + rtdata/languages/English (US) | 1 + rtdata/languages/default | 1 + rtgui/cacheimagedata.cc | 6 ++++++ rtgui/cacheimagedata.h | 1 + rtgui/exiffiltersettings.cc | 2 ++ rtgui/exiffiltersettings.h | 2 ++ rtgui/filebrowser.cc | 6 ++++-- rtgui/filecatalog.cc | 1 + rtgui/filterpanel.cc | 38 ++++++++++++++++++++++++++++++++++- rtgui/filterpanel.h | 2 ++ rtgui/thumbnail.cc | 8 +++++++- 13 files changed, 66 insertions(+), 4 deletions(-) diff --git a/rtdata/languages/English b/rtdata/languages/English index 35c9fd5e6..3d64d0d98 100644 --- a/rtdata/languages/English +++ b/rtdata/languages/English @@ -35,6 +35,7 @@ !EXIFFILTER_FOCALLEN;Focal Length !EXIFFILTER_ISO;ISO !EXIFFILTER_LENS;Lens +!EXIFFILTER_FILETYPE;File Type !EXIFFILTER_METADATAFILTER;Enable Metadata Filters !EXIFFILTER_SHUTTER;Shutter !EXIFPANEL_ADDEDIT;Add/Edit diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index eefbe17e9..28abc902e 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -64,6 +64,7 @@ TP_HLREC_COLOR;Colour Propagation !EXIFFILTER_FOCALLEN;Focal Length !EXIFFILTER_ISO;ISO !EXIFFILTER_LENS;Lens +!EXIFFILTER_FILETYPE;File Type !EXIFFILTER_METADATAFILTER;Enable Metadata Filters !EXIFFILTER_SHUTTER;Shutter !EXIFPANEL_ADDEDIT;Add/Edit diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 3860e33bb..34987983a 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -35,6 +35,7 @@ !EXIFFILTER_FOCALLEN;Focal Length !EXIFFILTER_ISO;ISO !EXIFFILTER_LENS;Lens +!EXIFFILTER_FILETYPE;File Type !EXIFFILTER_METADATAFILTER;Enable Metadata Filters !EXIFFILTER_SHUTTER;Shutter !EXIFPANEL_ADDEDIT;Add/Edit diff --git a/rtdata/languages/default b/rtdata/languages/default index b3595779e..080f26d89 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -28,6 +28,7 @@ EXIFFILTER_DIALOGLABEL;Exif Filter EXIFFILTER_FOCALLEN;Focal Length EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Lens +EXIFFILTER_FILETYPE;File Type EXIFFILTER_METADATAFILTER;Enable Metadata Filters EXIFFILTER_SHUTTER;Shutter EXIFPANEL_ADDEDIT;Add/Edit diff --git a/rtgui/cacheimagedata.cc b/rtgui/cacheimagedata.cc index 01871780d..29e196106 100644 --- a/rtgui/cacheimagedata.cc +++ b/rtgui/cacheimagedata.cc @@ -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_group ("FileInfo")) { + if (keyFile.has_key ("FileInfo", "Filetype")) filetype = keyFile.get_string ("FileInfo", "Filetype"); + } + + 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", "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", "Camera", camera); + keyFile.set_string ("FileInfo", "Filetype", filetype); if (format==FT_Raw) { keyFile.set_integer ("ExtraRawInfo", "ThumbImageType", thumbImgType); diff --git a/rtgui/cacheimagedata.h b/rtgui/cacheimagedata.h index e843c39a5..a1143b51a 100644 --- a/rtgui/cacheimagedata.h +++ b/rtgui/cacheimagedata.h @@ -53,6 +53,7 @@ class CacheImageData { unsigned iso; Glib::ustring lens; Glib::ustring camera; + Glib::ustring filetype; // additional info on raw images int rotate; diff --git a/rtgui/exiffiltersettings.cc b/rtgui/exiffiltersettings.cc index d0cb43be5..d519d0c1a 100644 --- a/rtgui/exiffiltersettings.cc +++ b/rtgui/exiffiltersettings.cc @@ -34,6 +34,7 @@ void ExifFilterSettings::clear () { focalTo = 0; lenses.clear (); cameras.clear (); + filetypes.clear (); filterFNumber = false; filterShutter = false; @@ -41,4 +42,5 @@ void ExifFilterSettings::clear () { filterISO = false; filterCamera = false; filterLens = false; + filterFiletype = false; } diff --git a/rtgui/exiffiltersettings.h b/rtgui/exiffiltersettings.h index 8d8a32fe1..9cd123663 100644 --- a/rtgui/exiffiltersettings.h +++ b/rtgui/exiffiltersettings.h @@ -25,6 +25,7 @@ class ExifFilterSettings { public: + std::set filetypes; std::set cameras; std::set lenses; double fnumberFrom; @@ -42,6 +43,7 @@ class ExifFilterSettings { bool filterISO; bool filterCamera; bool filterLens; + bool filterFiletype; ExifFilterSettings (); void clear (); diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index de0821571..0f4034203 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -488,7 +488,8 @@ 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.filterLens || filter.exifFilter.lenses.count(cfs->lens)>0) + && (!filter.exifFilter.filterFiletype || filter.exifFilter.filetypes.count(cfs->filetype)>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)) @@ -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.filterISO || (cfs->iso >= filter.exifFilter.isoFrom && cfs->iso <= filter.exifFilter.isoTo)) && (!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 tbe) { diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index f837e595d..7f737d364 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -354,6 +354,7 @@ void FileCatalog::_previewReady (int dir_id, FileBrowserEntry* fdn) { if (cfs->focalLen > dirEFS.focalTo) dirEFS.focalTo = cfs->focalLen; } + dirEFS.filetypes.insert (cfs->filetype); dirEFS.cameras.insert (cfs->camera); dirEFS.lenses.insert (cfs->lens); previewsLoaded++; diff --git a/rtgui/filterpanel.cc b/rtgui/filterpanel.cc index 516f2c3be..57b768ab6 100644 --- a/rtgui/filterpanel.cc +++ b/rtgui/filterpanel.cc @@ -100,6 +100,17 @@ FilterPanel::FilterPanel () : listener (NULL) { lvb->pack_start (*slens, Gtk::PACK_SHRINK, 0); 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; sChange[conns++] = fnumberFrom->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++] = focalFrom->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++] = lens->get_selection()->signal_changed().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++] = enaLens->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); show_all (); @@ -154,6 +167,9 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) { focalTo->set_text (Glib::ustring::format (defefs.focalTo)); curefs.focalTo = defefs.focalTo; +// enaFiletype->set_active (curefs.filterFiletype); + Glib::RefPtr ftselection = filetype->get_selection (); + // enaCamera->set_active (curefs.filterCamera); Glib::RefPtr cselection = camera->get_selection (); @@ -175,6 +191,14 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) { curefs.cameras.insert(*i); } cselection->select_all(); + + filetype->clear_items(); + curefs.filetypes.clear(); + for (std::set::iterator i = defefs.filetypes.begin(); i!=defefs.filetypes.end(); i++) { + filetype->append_text(*i); + curefs.filetypes.insert(*i); + } + ftselection->select_all(); }else{ for( Gtk::TreeModel::Children::iterator iter = lens->get_model()->children().begin(); iter != lens->get_model()->children().end();iter++){ Glib::ustring v; @@ -192,6 +216,14 @@ void FilterPanel::setFilter (ExifFilterSettings& defefs, bool updateLists) { else 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; @@ -223,6 +255,7 @@ ExifFilterSettings FilterPanel::getFilter () { efs.filterISO = enaISO->get_active (); efs.filterCamera = enaCamera->get_active (); efs.filterLens = enaLens->get_active (); + efs.filterFiletype = enaFiletype->get_active (); std::vector sel = camera->get_selected (); for (int i=0; iget_selected (); for (int i=0; iget_text (sel[i])); + sel = filetype->get_selected (); + for (int i=0; iget_text (sel[i])); return efs; } diff --git a/rtgui/filterpanel.h b/rtgui/filterpanel.h index d7f6553c9..cd29abeda 100644 --- a/rtgui/filterpanel.h +++ b/rtgui/filterpanel.h @@ -31,6 +31,7 @@ class FilterPanelListener { class FilterPanel : public Gtk::VBox { protected: + Gtk::ListViewText* filetype; Gtk::ListViewText* camera; Gtk::ListViewText* lens; Gtk::Entry* fnumberFrom; @@ -48,6 +49,7 @@ class FilterPanel : public Gtk::VBox { Gtk::CheckButton* enaISO; Gtk::CheckButton* enaCamera; Gtk::CheckButton* enaLens; + Gtk::CheckButton* enaFiletype; int conns; sigc::connection sChange[20]; diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 5bf35242e..8d1d54e68 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -310,7 +310,7 @@ void Thumbnail::generateExifDateTimeStrings () { if (!cfs.exifValid) 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::ostringstream ostr; @@ -384,6 +384,12 @@ void Thumbnail::infoFromImage (const Glib::ustring& fname, rtengine::RawMetaData cfs.lens = "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; }