diff --git a/rtdata/images/refresh_red.png b/rtdata/images/refresh_red.png new file mode 100644 index 000000000..a1d99ee41 Binary files /dev/null and b/rtdata/images/refresh_red.png differ diff --git a/rtdata/images/refresh_white.png b/rtdata/images/refresh_white.png new file mode 100644 index 000000000..20b0809ae Binary files /dev/null and b/rtdata/images/refresh_white.png differ diff --git a/rtdata/images/unrated.png b/rtdata/images/unrated.png index ff75cc7c9..b5420202e 100644 Binary files a/rtdata/images/unrated.png and b/rtdata/images/unrated.png differ diff --git a/rtdata/images/x_10.png b/rtdata/images/x_10.png new file mode 100644 index 000000000..1d9182ae8 Binary files /dev/null and b/rtdata/images/x_10.png differ diff --git a/rtdata/languages/default b/rtdata/languages/default index b1baa76d5..7d5ff0026 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -59,7 +59,10 @@ FILEBROWSER_ARRANGEMENTHINT;Change between vertical/horizontal alignment of thum FILEBROWSER_AUTODARKFRAME;Auto dark frame FILEBROWSER_AUTOFLATFIELD;Auto flat field FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path -FILEBROWSER_BROWSEPATHHINT;Type path to browse (Ctrl-o set focus,Ctrl-Enter to browse in File Browser);\nPath shortcuts: ~ - user's home directory, ! - user's pictures directory +FILEBROWSER_BROWSEPATHHINT;Type path to browse\nCtrl-o set focus\nEnter, Ctrl-Enter (in File Browser) to browse;\nPath shortcuts:\n ~ - user's home directory\n ! - user's pictures directory +FILEBROWSER_QUERYBUTTONHINT;Clear the Find query +FILEBROWSER_QUERYHINT;Type a part of filename to search by \nCtrl-f set focus (in File Browser);\nEnter to find +FILEBROWSER_QUERYLABEL; Find: FILEBROWSER_CACHE;Cache FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial @@ -121,7 +124,7 @@ FILEBROWSER_SHOWCOLORLABEL2HINT;Show images labeled Yelow Alt-2 FILEBROWSER_SHOWCOLORLABEL3HINT;Show images labeled Green Alt-3 FILEBROWSER_SHOWCOLORLABEL4HINT;Show images labeled Blue Alt-4 FILEBROWSER_SHOWCOLORLABEL5HINT;Show images labeled Purple Alt-5 -FILEBROWSER_SHOWDIRHINT;Show all images in the directory (clear all filters) D +FILEBROWSER_SHOWDIRHINT;Clear all filters D FILEBROWSER_SHOWEXIFINFO;Show EXIF info i FILEBROWSER_SHOWQUEUEHINT;Show content of the processing queue FILEBROWSER_SHOWRANK1HINT;Show images ranked as 1 star 1 @@ -568,6 +571,7 @@ PREFERENCES_EDITORCMDLINE;Other command line PREFERENCES_EDITORLAYOUT;Editor Layout PREFERENCES_EXTERNALEDITOR;External editor PREFERENCES_FBROWSEROPTS;File Browser Options +PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar (de-select for low res display) PREFERENCES_FILEFORMAT;File format PREFERENCES_FLATFIELD;Flat Field PREFERENCES_FLATFIELDFOUND;Found diff --git a/rtgui/browserfilter.h b/rtgui/browserfilter.h index 7106ce374..6867f65da 100644 --- a/rtgui/browserfilter.h +++ b/rtgui/browserfilter.h @@ -20,6 +20,7 @@ #define _BROWSERFILTER_ #include +#include class BrowserFilter { @@ -29,7 +30,10 @@ class BrowserFilter { bool showTrash; bool showNotTrash; bool showEdited[2]; - + + Glib::ustring queryString; + Glib::ustring queryFileName; + bool exifFilterEnabled; ExifFilterSettings exifFilter; diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index c8ff91e79..93bc2f702 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -693,6 +693,19 @@ bool FileBrowser::checkFilter (ThumbBrowserEntryBase* entryb) { // true -> entry if (filter.showRanked[entry->thumbnail->getRank()]==false || filter.showCLabeled[entry->thumbnail->getColorLabel()]==false || (entry->thumbnail->getStage()==1 && !filter.showTrash) || (entry->thumbnail->getStage()==0 && !filter.showNotTrash)) return false; + // return false is query is not satisfied + if (filter.queryFileName.size()>0){ + // check if image's FileName contains queryFileName (case insensitive) + // TODO should we provide case-sensitive search option via preferences? + Glib::ustring FileName; + FileName = Glib::path_get_basename (entry->thumbnail->getFileName()); + FileName = FileName.uppercase(); + //printf("FileBrowser::checkFilter FileName = '%s'; find() result= %i \n",FileName.c_str(), FileName.find(filter.queryFileName.uppercase())); + + if (FileName.find(filter.queryFileName.uppercase())==-1) + return false; + } + // check exif filter const CacheImageData* cfs = entry->thumbnail->getCacheImageData(); double tol = 0.01; diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index 65a5df987..e38e2593c 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -69,6 +69,51 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : emptyT->show (); trashButtonBox->show (); + //initialize hbToolBar1 + Gtk::HBox* hbToolBar1 = Gtk::manage(new Gtk::HBox ()); + + //setup BrowsePath + iRefreshWhite = new Gtk::Image(argv0+"/images/refresh_white.png"); + iRefreshRed = new Gtk::Image(argv0+"/images/refresh_red.png"); + + BrowsePath = Gtk::manage(new Gtk::Entry ()); + BrowsePath->set_width_chars (50); + BrowsePath->set_tooltip_markup (M("FILEBROWSER_BROWSEPATHHINT")); + Gtk::HBox* hbBrowsePath = Gtk::manage(new Gtk::HBox ()); + buttonBrowsePath = Gtk::manage(new Gtk::Button ()); + buttonBrowsePath->set_image (*iRefreshWhite); + buttonBrowsePath->set_tooltip_markup (M("FILEBROWSER_BROWSEPATHBUTTONHINT")); + buttonBrowsePath->set_relief (Gtk::RELIEF_NONE); + buttonBrowsePath->signal_clicked().connect( sigc::mem_fun(*this, &FileCatalog::buttonBrowsePathPressed) ); + hbBrowsePath->pack_start (*BrowsePath, Gtk::PACK_EXPAND_WIDGET,0); + hbBrowsePath->pack_start (*buttonBrowsePath,Gtk::PACK_SHRINK, 0); + hbToolBar1->pack_start (*hbBrowsePath, Gtk::PACK_EXPAND_WIDGET,0); + + BrowsePath->signal_activate().connect (sigc::mem_fun(*this, &FileCatalog::buttonBrowsePathPressed)); //respond to the Enter key + + //setup Query + iQueryClear = new Gtk::Image(argv0+"/images/x_10.png"); + Gtk::Label* labelQuery = Gtk::manage(new Gtk::Label(M("FILEBROWSER_QUERYLABEL"))); + Query = Gtk::manage(new Gtk::Entry ()); // cannot use Gtk::manage here as FileCatalog::getFilter will fail on Query->get_text() + Query->set_text(""); + Query->set_width_chars (20); // TODO !!! add this value to options? + Query->set_tooltip_markup (M("FILEBROWSER_QUERYHINT")); + Gtk::HBox* hbQuery = Gtk::manage(new Gtk::HBox ()); + buttonQueryClear = Gtk::manage(new Gtk::Button ()); + buttonQueryClear->set_image (*iQueryClear); + buttonQueryClear->set_tooltip_markup (M("FILEBROWSER_QUERYBUTTONHINT")); + buttonQueryClear->set_relief (Gtk::RELIEF_NONE); + buttonQueryClear->signal_clicked().connect( sigc::mem_fun(*this, &FileCatalog::buttonQueryClearPressed) ); + hbQuery->pack_start (*labelQuery,Gtk::PACK_SHRINK, 0); + hbQuery->pack_start (*Query,Gtk::PACK_SHRINK, 0); + hbQuery->pack_start (*buttonQueryClear,Gtk::PACK_SHRINK, 0); + hbToolBar1->pack_start (*hbQuery, Gtk::PACK_SHRINK,0); + + Query->signal_activate().connect (sigc::mem_fun(*this, &FileCatalog::executeQuery)); //respond to the Enter key + + // if NOT a single row toolbar + if (!options.FileBrowserToolbarSingleRow) pack_start (*hbToolBar1, Gtk::PACK_SHRINK,0); + // setup button bar buttonBar = Gtk::manage( new Gtk::HBox () ); pack_start (*buttonBar, Gtk::PACK_SHRINK); @@ -220,33 +265,14 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : zoomOutButton->set_tooltip_markup (M("FILEBROWSER_ZOOMOUTHINT")); zoomBox->pack_end (*zoomOutButton, Gtk::PACK_SHRINK); - // add default panel - hBox = Gtk::manage( new Gtk::HBox () ); - hBox->show (); - hBox->pack_end (*fileBrowser); - fileBrowser->applyFilter (getFilter()); - pack_start (*hBox); - buttonBar->pack_start (*zoomBox, Gtk::PACK_SHRINK); - - // add browserPath buttonBar->pack_start (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK); - iRightArrow = new Gtk::Image(argv0+"/images/right.png"); - iRightArrow_red = new Gtk::Image(argv0+"/images/right_red.png"); + //iRightArrow = new Gtk::Image(argv0+"/images/right.png"); + //iRightArrow_red = new Gtk::Image(argv0+"/images/right_red.png"); - BrowsePath = new Gtk::Entry (); - BrowsePath->set_width_chars (50); // !!! add this value to options - BrowsePath->set_tooltip_markup (M("FILEBROWSER_BROWSEPATHHINT")); - Gtk::HBox* hbBrowsePath = new Gtk::HBox (); - buttonBrowsePath = new Gtk::Button (); - buttonBrowsePath->set_image (*iRightArrow); - buttonBrowsePath->set_tooltip_markup (M("FILEBROWSER_BROWSEPATHBUTTONHINT")); - buttonBrowsePath->set_relief (Gtk::RELIEF_NONE); - hbBrowsePath->pack_start (*BrowsePath); - hbBrowsePath->pack_start (*buttonBrowsePath,Gtk::PACK_SHRINK, 4); - buttonBar->pack_start (*hbBrowsePath, Gtk::PACK_EXPAND_WIDGET,4); - buttonBrowsePath->signal_clicked().connect( sigc::mem_fun(*this, &FileCatalog::buttonBrowsePathPressed) ); + // if it IS a single row toolbar + if (options.FileBrowserToolbarSingleRow) buttonBar->pack_start (*hbToolBar1, Gtk::PACK_EXPAND_WIDGET,0); tbRightPanel_1 = new Gtk::ToggleButton (); iRightPanel_1_Show = new Gtk::Image(argv0+"/images/panel_to_left.png"); @@ -264,6 +290,14 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : buttonBar->pack_end (*toolBar, Gtk::PACK_SHRINK); buttonBar->pack_end (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK, 4); + // add default panel + hBox = Gtk::manage( new Gtk::HBox () ); + hBox->show (); + hBox->pack_end (*fileBrowser); + fileBrowser->applyFilter (getFilter()); // warning: can call this only after all objects used in getFilter (e.g. Query) are instantiated + //printf("FileCatalog::FileCatalog fileBrowser->applyFilter (getFilter())\n"); + pack_start (*hBox); + enabled = true; lastScrollPos = 0; @@ -287,6 +321,13 @@ FileCatalog::~FileCatalog(){ } delete iTrashEmpty; delete iTrashFull; + delete iRefreshWhite; + delete iRefreshRed; + delete iQueryClear; + delete iLeftPanel_1_Show; + delete iLeftPanel_1_Hide; + delete iRightPanel_1_Show; + delete iRightPanel_1_Hide; } bool FileCatalog::capture_event(GdkEventButton* event){ @@ -366,8 +407,9 @@ void FileCatalog::dirSelected (const Glib::ustring& dirname, const Glib::ustring addAndOpenFile (openfile); selectedDirectory = dir->get_parse_name(); + //printf("FileCatalog::dirSelected selectedDirectory = %s\n",selectedDirectory.c_str()); BrowsePath->set_text (selectedDirectory); - buttonBrowsePath->set_image (*iRightArrow); + buttonBrowsePath->set_image (*iRefreshWhite); fileNameList = getFileList (); for (unsigned int i=0; iisEnabled (); } + + //TODO add support for more query options. e.g by date, iso, f-number, etc + //TODO could use date:;iso: etc + // default will be filename + + /* // this is for safe execution if getFilter is called before Query object is instantiated + Glib::ustring tempQuery; + tempQuery=""; + if (Query) tempQuery = Query->get_text(); + */ + filter.queryString = Query->get_text(); // full query string from Query Entry + filter.queryFileName = Query->get_text(); // for now Query is only by file name + return filter; } void FileCatalog::filterChanged () { - + //TODO !!! there is too many repetitive and unnecessary executions of + // " fileBrowser->applyFilter (getFilter()); " throughout the code + // this needs further analysis and cleanup fileBrowser->applyFilter (getFilter()); _refreshProgressBar(); } @@ -1192,6 +1249,20 @@ void FileCatalog::trashChanged () { bTrash->set_image(*iTrashFull); } } +void FileCatalog::buttonQueryClearPressed () { + Query->set_text(""); + FileCatalog::executeQuery (); +} + +void FileCatalog::executeQuery(){ + // if BrowsePath text was changed, do a full browse; + // otherwise filter only + + if (BrowsePath->get_text()!=selectedDirectory) + buttonBrowsePathPressed (); + else + FileCatalog::filterChanged (); +} void FileCatalog::buttonBrowsePathPressed () { Glib::ustring BrowsePathValue = BrowsePath->get_text(); @@ -1222,7 +1293,7 @@ void FileCatalog::buttonBrowsePathPressed () { } else // error, likely path not found: show red arrow - buttonBrowsePath->set_image (*iRightArrow_red); + buttonBrowsePath->set_image (*iRefreshRed); } void FileCatalog::tbLeftPanel_1_visible (bool visible){ @@ -1394,6 +1465,12 @@ bool FileCatalog::handleShortcutKey (GdkEventKey* event) { BrowsePath->grab_focus(); return true; } + case GDK_f: + if (!alt){ + Query->select_region(0, Query->get_text_length()); + Query->grab_focus(); + return true; + } } } diff --git a/rtgui/filecatalog.h b/rtgui/filecatalog.h index 36c90eb4a..e0a007377 100644 --- a/rtgui/filecatalog.h +++ b/rtgui/filecatalog.h @@ -90,12 +90,17 @@ class FileCatalog : public Gtk::VBox, Gtk::Image* iranked[5], *igranked[5]; Gtk::Image* iCLabeled[5], *igCLabeled[5]; Gtk::Image *iTrashEmpty, *iTrashFull; - Gtk::Image *iRightArrow_red, *iRightArrow; + //Gtk::Image *iRightArrow_red, *iRightArrow; + Gtk::Image *iRefreshWhite, *iRefreshRed; Gtk::Image *iLeftPanel_1_Show, *iLeftPanel_1_Hide, *iRightPanel_1_Show, *iRightPanel_1_Hide; + Gtk::Image *iQueryClear; + Gtk::Entry* BrowsePath; Gtk::Button* buttonBrowsePath; - sigc::connection BrowsePathconn; + Gtk::Entry* Query; + Gtk::Button* buttonQueryClear; + double hScrollPos[14]; double vScrollPos[14]; int lastScrollPos; @@ -195,6 +200,8 @@ class FileCatalog : public Gtk::VBox, void zoomOut (); void buttonBrowsePathPressed (); + void buttonQueryClearPressed (); + void executeQuery (); void tbLeftPanel_1_toggled (); void tbLeftPanel_1_visible (bool visible); diff --git a/rtgui/options.cc b/rtgui/options.cc index bfe76e4cb..d399c7076 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -138,6 +138,7 @@ void Options::setDefaults () { tunnelMetaData = false; histogramPosition = 2; showProfileSelector = true; + FileBrowserToolbarSingleRow = true; cutOverlayBrush = std::vector (4); cutOverlayBrush[3] = 0.667; // :-p @@ -355,6 +356,7 @@ if (keyFile.has_group ("GUI")) { if (keyFile.has_key ("GUI", "CutOverlayBrush")) cutOverlayBrush = keyFile.get_double_list ("GUI", "CutOverlayBrush"); if (keyFile.has_key ("GUI", "HistogramPosition")) histogramPosition = keyFile.get_integer ("GUI", "HistogramPosition"); if (keyFile.has_key ("GUI", "ShowProfileSelector")) showProfileSelector = keyFile.get_boolean ("GUI", "ShowProfileSelector"); + if (keyFile.has_key ("GUI", "FileBrowserToolbarSingleRow")) FileBrowserToolbarSingleRow = keyFile.get_boolean ("GUI", "FileBrowserToolbarSingleRow"); } @@ -506,6 +508,7 @@ int Options::saveToFile (Glib::ustring fname) { keyFile.set_double_list ("GUI", "CutOverlayBrush", cutOverlayBrush); keyFile.set_integer ("GUI", "HistogramPosition", histogramPosition); keyFile.set_boolean ("GUI", "ShowProfileSelector", showProfileSelector); + keyFile.set_boolean ("GUI", "FileBrowserToolbarSingleRow", FileBrowserToolbarSingleRow); //Glib::ArrayHandle crvopen = crvOpen; //keyFile.set_integer_list ("GUI", "CurvePanelsExpanded", crvopen); diff --git a/rtgui/options.h b/rtgui/options.h index 15a16a6c9..bf8767a6a 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -146,6 +146,7 @@ class Options { bool tunnelMetaData; // Pass through IPTC and XMP unchanged int histogramPosition; // 0=disabled, 1=left pane, 2=right pane bool showProfileSelector; + bool FileBrowserToolbarSingleRow; Options (); diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 22e2c4ce4..a1a44fc5a 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -433,6 +433,11 @@ Gtk::Widget* Preferences::getGeneralPanel () { hbworkflow2->pack_start (*ckbShowProfileSelector, Gtk::PACK_SHRINK, 4); vbworkflow->pack_start (*hbworkflow2, Gtk::PACK_SHRINK, 4); + Gtk::HBox* hbworkflow3 = Gtk::manage( new Gtk::HBox () ); + ckbFileBrowserToolbarSingleRow = Gtk::manage( new Gtk::CheckButton (M("PREFERENCES_FILEBROWSERTOOLBARSINGLEROW")) ); + hbworkflow3->pack_start (*ckbFileBrowserToolbarSingleRow, Gtk::PACK_SHRINK, 4); + vbworkflow->pack_start (*hbworkflow3, Gtk::PACK_SHRINK, 0); + fworklflow->add (*vbworkflow); mvbsd->pack_start (*fworklflow, Gtk::PACK_SHRINK, 4); @@ -973,6 +978,7 @@ void Preferences::storePreferences () { moptions.histogramPosition = ckbHistogramPositionLeft->get_active() ? 1 : 2; moptions.showProfileSelector = ckbShowProfileSelector->get_active(); + moptions.FileBrowserToolbarSingleRow = ckbFileBrowserToolbarSingleRow->get_active(); moptions.overwriteOutputFile = chOverwriteOutputFile->get_active (); // Sounds @@ -1077,7 +1083,7 @@ void Preferences::fillPreferences () { ckbHistogramPositionLeft->set_active(moptions.histogramPosition==1); ckbShowProfileSelector->set_active(moptions.showProfileSelector); - + ckbFileBrowserToolbarSingleRow->set_active(moptions.FileBrowserToolbarSingleRow); //darkFrameDir->set_filename( moptions.rtSettings.darkFramesPath ); //updateDFinfos(); diff --git a/rtgui/preferences.h b/rtgui/preferences.h index 41054fd34..503996e7f 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -122,6 +122,7 @@ class Preferences : public Gtk::Dialog { Gtk::CheckButton* ckbHistogramPositionLeft; Gtk::CheckButton* ckbShowProfileSelector; + Gtk::CheckButton* ckbFileBrowserToolbarSingleRow; Options moptions;