From 86d600a8b357ae9aada09e80c4f1d0ddce79fae2 Mon Sep 17 00:00:00 2001 From: Michael Ezra Date: Wed, 22 Jun 2011 17:23:08 -0400 Subject: [PATCH] New feature: search by filename and file browser toolbar optimization (issue 788) This patch adds "Find" entry box to the toolbar to perform case-insensitive search by part of image filename. Also, there is a new option in preferences to display File Browser toolbar as single row or not. This also solves issue with lower resolution displays. --- rtdata/images/refresh_red.png | Bin 0 -> 2863 bytes rtdata/images/refresh_white.png | Bin 0 -> 3624 bytes rtdata/images/unrated.png | Bin 3196 -> 3180 bytes rtdata/images/x_10.png | Bin 0 -> 3012 bytes rtdata/languages/default | 8 +- rtgui/browserfilter.h | 6 +- rtgui/filebrowser.cc | 13 ++++ rtgui/filecatalog.cc | 129 +++++++++++++++++++++++++------- rtgui/filecatalog.h | 11 ++- rtgui/options.cc | 3 + rtgui/options.h | 1 + rtgui/preferences.cc | 8 +- rtgui/preferences.h | 1 + 13 files changed, 148 insertions(+), 32 deletions(-) create mode 100644 rtdata/images/refresh_red.png create mode 100644 rtdata/images/refresh_white.png create mode 100644 rtdata/images/x_10.png diff --git a/rtdata/images/refresh_red.png b/rtdata/images/refresh_red.png new file mode 100644 index 0000000000000000000000000000000000000000..a1d99ee41341239bdba30a8ba65bf85e901b3a2f GIT binary patch literal 2863 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 RD0aFJ(ACn{ELFF8_CH)tKQ90P literal 0 HcmV?d00001 diff --git a/rtdata/images/unrated.png b/rtdata/images/unrated.png index ff75cc7c9e386f028eb9e2cbb665fdd4a09e813b..b5420202e369b68d858c74f2461113dec85554bd 100644 GIT binary patch delta 439 zcmV;o0Z9J*80;9ZzzTntNklG*w>%JA<3t@cueKcO#&zjlsT(IP=27G^y z5wpKJH~s2gd&8PJcDS;jHXCv;W_0=W(CL+TOYe>03zrZA%FA9LZuTw*YdwDD`__({ zn3QXCme{TS{V{*>XQv;f8KI@6mFk8|^QTuoa$x;+GADm20I3`uj@KI=8^6!eqQlgi z=Zt3WQ2rb{nYxJ%pb8;6)0c-QZr^>-RxU5lp{^~qhfqqTDPuBUXxpr{UKc`a3*gGk zw43_+(e4Y@pV{47?Ipl^_0YBL##s97$gPz#Lx~Rnor5o7u0Aeue%3;fQX-{f)K+};2H delta 455 zcmaDO@ke6A0j~Pxo-U3d6}K2>F{b`wICJLAzuw;7HUp z2ZFO_&;DaJG&EGRva-rlRaO1Z_+{T+Umu&voP4row{AV!nqS&iY-eYefBg9I1-KP z>%FqS?PFqOWMuZs`+n}uo8Y$~Rd=p$XSjQFH-oZPFvHE4?r*$vzF!8a0a^_Vn7+Q= zdTV+5TbP0l+XkKX9BaN diff --git a/rtdata/images/x_10.png b/rtdata/images/x_10.png new file mode 100644 index 0000000000000000000000000000000000000000..1d9182ae84f7504e2fb73db59d946f11dddca1c0 GIT binary patch literal 3012 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 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;