diff --git a/rtdata/languages/default b/rtdata/languages/default index 3bcf84379..f29b64f03 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1249,6 +1249,8 @@ TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal TP_FLATFIELD_BT_VERTICAL;Vertical TP_FLATFIELD_CLIPCONTROL;Clip control TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. +TP_FLATFIELD_FILEDLGFILTERANY;Any files +TP_FLATFIELD_FILEDLGFILTERFF;Same format as current photo TP_FLATFIELD_LABEL;Flat-Field TP_GAMMA_CURV;Gamma TP_GAMMA_FREE;Free gamma diff --git a/rtgui/darkframe.cc b/rtgui/darkframe.cc index e980c0706..ee3975bf9 100644 --- a/rtgui/darkframe.cc +++ b/rtgui/darkframe.cc @@ -49,6 +49,26 @@ DarkFrame::DarkFrame () : FoldableToolPanel(this) dfautoconn = dfAuto->signal_toggled().connect ( sigc::mem_fun(*this, &DarkFrame::dfAutoChanged), true); dfFile = darkFrameFile->signal_file_set().connect ( sigc::mem_fun(*this, &DarkFrame::darkFrameChanged), true); btnReset->signal_clicked().connect( sigc::mem_fun(*this, &DarkFrame::darkFrameReset), true ); + + // Set filename filters + b_filter_asCurrent = false; + Gtk::FileFilter *filter_any = Gtk::manage(new Gtk::FileFilter); + filter_any->add_pattern("*"); + filter_any->set_name(M("TP_FLATFIELD_FILEDLGFILTERANY")); + darkFrameFile->add_filter (*filter_any); + + // filters for all supported non-raw extensions + for (size_t i=0; iadd_pattern("*." + options.parseExtensions[i]); + filter_df->add_pattern("*." + options.parseExtensions[i].uppercase()); + filter_df->set_name(options.parseExtensions[i].uppercase()); + darkFrameFile->add_filter (*filter_df); + //printf("adding filter %s \n",options.parseExtensions[i].uppercase().c_str()); + } + } } void DarkFrame::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) @@ -84,6 +104,42 @@ void DarkFrame::read(const rtengine::procparams::ProcParams* pp, const ParamsEdi dfautoconn.block(false); enableListener (); + + // Add filter with the current file extension if the current file is raw + if (dfp && !batchMode){ + + if (b_filter_asCurrent){ + //First, remove last filter_asCurrent if it was set for a raw file + std::vector filters = darkFrameFile->list_filters(); + darkFrameFile->remove_filter(**(filters.end()-1)); + b_filter_asCurrent = false; + } + + Glib::ustring fname = Glib::path_get_basename(dfp->GetCurrentImageFilePath()); + Glib::ustring filetype; + + if (fname!=""){ + // get image filetype, set filter to the same as current image's filetype + std::string::size_type idx; + idx = fname.rfind('.'); + if(idx != std::string::npos){ + filetype = fname.substr(idx+1); + israw = filetype.uppercase()!="JPG" && filetype.uppercase()!="JPEG" && filetype.uppercase()!="PNG" && filetype.uppercase()!="TIF" && filetype.uppercase()!="TIFF"; + + //exclude non-raw + if (israw) + { + b_filter_asCurrent = true; + Gtk::FileFilter *filter_asCurrent = Gtk::manage(new Gtk::FileFilter); + filter_asCurrent->add_pattern("*." + filetype); + filter_asCurrent->set_name(M("TP_FLATFIELD_FILEDLGFILTERFF") + " (" + filetype + ")"); + darkFrameFile->add_filter (*filter_asCurrent); + darkFrameFile->set_filter (*filter_asCurrent); + } + } + } + } + } void DarkFrame::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) diff --git a/rtgui/darkframe.h b/rtgui/darkframe.h index 96d5f2cc1..85f614260 100755 --- a/rtgui/darkframe.h +++ b/rtgui/darkframe.h @@ -28,6 +28,7 @@ class DFProvider { public: virtual rtengine::RawImage* getDF() = 0; + virtual Glib::ustring GetCurrentImageFilePath() {}; // add other info here }; @@ -46,6 +47,8 @@ protected: bool lastDFauto; DFProvider *dfp; sigc::connection dfautoconn, dfFile; + bool b_filter_asCurrent; + bool israw; public: diff --git a/rtgui/flatfield.cc b/rtgui/flatfield.cc index 407025615..a9b8678c6 100755 --- a/rtgui/flatfield.cc +++ b/rtgui/flatfield.cc @@ -76,6 +76,26 @@ FlatField::FlatField () : FoldableToolPanel(this) flatFieldAutoSelectconn = flatFieldAutoSelect->signal_toggled().connect ( sigc::mem_fun(*this, &FlatField::flatFieldAutoSelectChanged), true); flatFieldBlurTypeconn = flatFieldBlurType->signal_changed().connect( sigc::mem_fun(*this, &FlatField::flatFieldBlurTypeChanged) ); lastShortcutPath = ""; + + // Set filename filters + b_filter_asCurrent = false; + Gtk::FileFilter *filter_any = Gtk::manage(new Gtk::FileFilter); + filter_any->add_pattern("*"); + filter_any->set_name(M("TP_FLATFIELD_FILEDLGFILTERANY")); + flatFieldFile->add_filter (*filter_any); + + // filters for all supported non-raw extensions + for (size_t i=0; iadd_pattern("*." + options.parseExtensions[i]); + filter_ff->add_pattern("*." + options.parseExtensions[i].uppercase()); + filter_ff->set_name(options.parseExtensions[i].uppercase()); + flatFieldFile->add_filter (*filter_ff); + //printf("adding filter %s \n",options.parseExtensions[i].uppercase().c_str()); + } + } } void FlatField::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) @@ -134,6 +154,42 @@ void FlatField::read(const rtengine::procparams::ProcParams* pp, const ParamsEdi flatFieldAutoSelectconn.block (false); flatFieldBlurTypeconn.block (false); enableListener (); + + // Add filter with the current file extension if the current file is raw + if (ffp && !batchMode){ + + if (b_filter_asCurrent){ + //First, remove last filter_asCurrent if it was set for a raw file + std::vector filters = flatFieldFile->list_filters(); + flatFieldFile->remove_filter(**(filters.end()-1)); + b_filter_asCurrent = false; + } + + Glib::ustring fname = Glib::path_get_basename(ffp->GetCurrentImageFilePath()); + Glib::ustring filetype; + + if (fname!=""){ + // get image filetype, set filter to the same as current image's filetype + std::string::size_type idx; + idx = fname.rfind('.'); + if(idx != std::string::npos){ + filetype = fname.substr(idx+1); + //exclude non-raw + israw = filetype.uppercase()!="JPG" && filetype.uppercase()!="JPEG" && filetype.uppercase()!="PNG" && filetype.uppercase()!="TIF" && filetype.uppercase()!="TIFF"; + + if (israw) + { + b_filter_asCurrent = true; //prevent re-adding this filter on every pp3 file read + Gtk::FileFilter *filter_asCurrent = Gtk::manage(new Gtk::FileFilter); + filter_asCurrent->add_pattern("*." + filetype); + filter_asCurrent->set_name(M("TP_FLATFIELD_FILEDLGFILTERFF") + " (" + filetype + ")"); + flatFieldFile->add_filter (*filter_asCurrent); + flatFieldFile->set_filter (*filter_asCurrent); + } + } + } + } + } void FlatField::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) diff --git a/rtgui/flatfield.h b/rtgui/flatfield.h index 1fc3a1fb7..c03afaca5 100755 --- a/rtgui/flatfield.h +++ b/rtgui/flatfield.h @@ -30,6 +30,7 @@ class FFProvider { public: virtual ~FFProvider() {} virtual rtengine::RawImage* getFF() = 0; + virtual Glib::ustring GetCurrentImageFilePath() {}; // add other info here }; @@ -52,7 +53,9 @@ protected: bool lastFFAutoClipCtrl; FFProvider *ffp; sigc::connection flatFieldFileconn, flatFieldAutoSelectconn, flatFieldBlurTypeconn; - Glib::ustring lastShortcutPath; + Glib::ustring lastShortcutPath; + bool b_filter_asCurrent; + bool israw; public: diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 4036417cf..67f25ab27 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -518,6 +518,15 @@ rtengine::RawImage* ToolPanelCoordinator::getFF() } return NULL; } + +Glib::ustring ToolPanelCoordinator::GetCurrentImageFilePath() +{ + if (!ipc){ + return ""; + } + return ipc->getInitialImage()->getFileName(); +} + void ToolPanelCoordinator::straightenRequested () { if (!ipc) diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 22aa35a92..cb0adcfdf 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -242,6 +242,7 @@ class ToolPanelCoordinator : public ToolPanelListener, //FFProvider interface rtengine::RawImage* getFF(); + Glib::ustring GetCurrentImageFilePath(); // rotatelistener interface void straightenRequested ();