Filter by file type, on behalf of Michael Ezra; see issue #376
This commit is contained in:
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -53,6 +53,7 @@ class CacheImageData {
|
||||
unsigned iso;
|
||||
Glib::ustring lens;
|
||||
Glib::ustring camera;
|
||||
Glib::ustring filetype;
|
||||
|
||||
// additional info on raw images
|
||||
int rotate;
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -25,6 +25,7 @@
|
||||
class ExifFilterSettings {
|
||||
|
||||
public:
|
||||
std::set<std::string> filetypes;
|
||||
std::set<std::string> cameras;
|
||||
std::set<std::string> lenses;
|
||||
double fnumberFrom;
|
||||
@@ -42,6 +43,7 @@ class ExifFilterSettings {
|
||||
bool filterISO;
|
||||
bool filterCamera;
|
||||
bool filterLens;
|
||||
bool filterFiletype;
|
||||
|
||||
ExifFilterSettings ();
|
||||
void clear ();
|
||||
|
@@ -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<FileBrowserEntry*> tbe) {
|
||||
|
@@ -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++;
|
||||
|
@@ -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,6 +130,7 @@ 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);
|
||||
|
||||
@@ -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<Gtk::TreeSelection> ftselection = filetype->get_selection ();
|
||||
|
||||
// enaCamera->set_active (curefs.filterCamera);
|
||||
Glib::RefPtr<Gtk::TreeSelection> 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<std::string>::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<int> sel = camera->get_selected ();
|
||||
for (int i=0; i<sel.size(); i++)
|
||||
@@ -230,6 +263,9 @@ ExifFilterSettings FilterPanel::getFilter () {
|
||||
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]));
|
||||
|
||||
return efs;
|
||||
}
|
||||
|
@@ -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];
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user