From ee766b71b83dd9377300da829a821d488bfe39e7 Mon Sep 17 00:00:00 2001 From: Adam Reichold Date: Sun, 8 Nov 2015 12:24:48 +0100 Subject: [PATCH] Add a button to filter the original files to the file browser. --- rtdata/languages/default | 1 + rtgui/browserfilter.cc | 8 ++++---- rtgui/browserfilter.h | 1 + rtgui/filebrowser.cc | 4 ++-- rtgui/filecatalog.cc | 43 ++++++++++++++++++++++++++++------------ rtgui/filecatalog.h | 5 +++-- 6 files changed, 41 insertions(+), 21 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index 84586340e..dbcb29a6a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -171,6 +171,7 @@ FILEBROWSER_SHOWEDITEDHINT;Show edited images.\nShortcut: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Show not edited images.\nShortcut: 6 FILEBROWSER_SHOWEXIFINFO;Show Exif info.\n\nShortcuts:\ni - Multiple Editor Tabs Mode,\nAlt-i - Single Editor Tab Mode. FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. +FILEBROWSER_SHOWORIGINALHINT;Show only the original images. FILEBROWSER_SHOWRANK1HINT;Show images ranked as 1-star.\nShortcut: 1 FILEBROWSER_SHOWRANK2HINT;Show images ranked as 2-star.\nShortcut: 2 FILEBROWSER_SHOWRANK3HINT;Show images ranked as 3-star.\nShortcut: 3 diff --git a/rtgui/browserfilter.cc b/rtgui/browserfilter.cc index f7d1038ed..6fa663aa3 100644 --- a/rtgui/browserfilter.cc +++ b/rtgui/browserfilter.cc @@ -18,11 +18,11 @@ */ #include "browserfilter.h" -BrowserFilter::BrowserFilter () : exifFilterEnabled (false) +BrowserFilter::BrowserFilter () : exifFilterEnabled (false), + showTrash (true), + showNotTrash (true), + showOriginal (false) { - - showTrash = true; - for (int i = 0; i < 6; i++) { showRanked[i] = true; showCLabeled[i] = true; diff --git a/rtgui/browserfilter.h b/rtgui/browserfilter.h index 6cfa3be62..8880a364d 100644 --- a/rtgui/browserfilter.h +++ b/rtgui/browserfilter.h @@ -30,6 +30,7 @@ public: bool showCLabeled[6]; bool showTrash; bool showNotTrash; + bool showOriginal; bool showEdited[2]; bool showRecentlySaved[2]; bool multiselect; diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index 5e1dd734e..7d921b328 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -1461,7 +1461,7 @@ void FileBrowser::applyFilter (const BrowserFilter& filter) MYWRITERLOCK(l, entryRW); // Don't make this a writer lock! HOMBRE: Why? 'selected' is modified here #endif - if (true/* TODO: filterOriginal */) { + if (filter.showOriginal) { findOriginalEntries(fd); } @@ -1495,7 +1495,7 @@ bool FileBrowser::checkFilter (ThumbBrowserEntryBase* entryb) // true -> entry FileBrowserEntry* entry = static_cast(entryb); - if (true/* TODO: filterOriginal */ && entry->getOriginal() != NULL) { + if (filter.showOriginal && entry->getOriginal() != NULL) { return false; } diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index d40b7d720..92ce120c2 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -294,8 +294,16 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : bCateg[18] = bNotTrash->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bNotTrash, true)); bNotTrash->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event), false); + bOriginal = Gtk::manage( new Gtk::ToggleButton () ); + bOriginal->set_label ("O"); // TODO: Add icon... + bOriginal->set_tooltip_markup (M("FILEBROWSER_SHOWORIGINALHINT")); + bOriginal->set_relief (Gtk::RELIEF_NONE); + bCateg[19] = bOriginal->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bOriginal, true)); + bOriginal->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event), false); + buttonBar->pack_start (*bTrash, Gtk::PACK_SHRINK); buttonBar->pack_start (*bNotTrash, Gtk::PACK_SHRINK); + buttonBar->pack_start (*bOriginal, Gtk::PACK_SHRINK); buttonBar->pack_start (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK); fileBrowser->trash_changed().connect( sigc::mem_fun(*this, &FileCatalog::trashChanged) ); @@ -318,6 +326,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : // 16 - bRecentlySaved[1] // 17 - bTrash // 18 - bNotTrash + // 19 - bOriginal categoryButtons[0] = bFilterClear; categoryButtons[1] = bUnRanked; @@ -342,6 +351,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : categoryButtons[17] = bTrash; categoryButtons[18] = bNotTrash; + categoryButtons[19] = bOriginal; exifInfo = Gtk::manage(new Gtk::ToggleButton ()); exifInfo->set_image (*Gtk::manage(new RTImage ("info.png"))); @@ -1351,8 +1361,8 @@ void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b, bool isMouseClick // if no modifier key is pressed, if (!(control_down || shift_down)) { - // if we're deselecting non-trashed - if (toggled_button == 18 && (buttons & (1 << toggled_button))) { + // if we're deselecting non-trashed or original + if (toggled_button >= 18 && toggled_button <= 19 && (buttons & (1 << toggled_button))) { categoryButtons[0]->set_active (true); for (int i = 1; i < numButtons; i++) { @@ -1445,9 +1455,15 @@ void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b, bool isMouseClick //if more than one star & color label is selected, do nothing } } - // ...or non-trashed with Control modifier - else if (toggled_button == 18 && control_down) { - bNotTrash->set_active (!bNotTrash->get_active ()); + // ...or non-trashed or original with Control modifier + else if (toggled_button >= 18 && toggled_button <= 19 && control_down) { + Gtk::ToggleButton* categoryButton = categoryButtons[toggled_button]; + categoryButton->set_active (!categoryButton->get_active ()); + + // If it was the first or last one, we reset the clear filter. + if (buttons == 1 || buttons == (1 << toggled_button)) { + bFilterClear->set_active (!categoryButton->get_active ()); + } } bool active_now, active_before; @@ -1554,30 +1570,30 @@ BrowserFilter FileCatalog::getFilter () bool anyCLabelFilterActive = bUnCLabeled->get_active () || bCLabel[0]->get_active () || bCLabel[1]->get_active () || bCLabel[2]->get_active () || bCLabel[3]->get_active () || bCLabel[4]->get_active (); bool anyEditedFilterActive = bEdited[0]->get_active() || bEdited[1]->get_active(); bool anyRecentlySavedFilterActive = bRecentlySaved[0]->get_active() || bRecentlySaved[1]->get_active(); - const bool nonTrashedActive = bNotTrash->get_active(); + const bool anySupplementaryActive = bNotTrash->get_active() || bOriginal->get_active(); /* * filter is setup in 2 steps * Step 1: handle individual filters */ - filter.showRanked[0] = bFilterClear->get_active() || bUnRanked->get_active () || bTrash->get_active () || nonTrashedActive || + filter.showRanked[0] = bFilterClear->get_active() || bUnRanked->get_active () || bTrash->get_active () || anySupplementaryActive || anyCLabelFilterActive || anyEditedFilterActive || anyRecentlySavedFilterActive; - filter.showCLabeled[0] = bFilterClear->get_active() || bUnCLabeled->get_active () || bTrash->get_active () || nonTrashedActive || + filter.showCLabeled[0] = bFilterClear->get_active() || bUnCLabeled->get_active () || bTrash->get_active () || anySupplementaryActive || anyRankFilterActive || anyEditedFilterActive || anyRecentlySavedFilterActive; for (int i = 1; i <= 5; i++) { - filter.showRanked[i] = bFilterClear->get_active() || bRank[i - 1]->get_active () || bTrash->get_active () || nonTrashedActive || + filter.showRanked[i] = bFilterClear->get_active() || bRank[i - 1]->get_active () || bTrash->get_active () || anySupplementaryActive || anyCLabelFilterActive || anyEditedFilterActive || anyRecentlySavedFilterActive; - filter.showCLabeled[i] = bFilterClear->get_active() || bCLabel[i - 1]->get_active () || bTrash->get_active () || nonTrashedActive || + filter.showCLabeled[i] = bFilterClear->get_active() || bCLabel[i - 1]->get_active () || bTrash->get_active () || anySupplementaryActive || anyRankFilterActive || anyEditedFilterActive || anyRecentlySavedFilterActive; } for (int i = 0; i < 2; i++) { - filter.showEdited[i] = bFilterClear->get_active() || bEdited[i]->get_active () || bTrash->get_active () || nonTrashedActive || + filter.showEdited[i] = bFilterClear->get_active() || bEdited[i]->get_active () || bTrash->get_active () || anySupplementaryActive || anyRankFilterActive || anyCLabelFilterActive || anyRecentlySavedFilterActive; - filter.showRecentlySaved[i] = bFilterClear->get_active() || bRecentlySaved[i]->get_active () || bTrash->get_active () || nonTrashedActive || + filter.showRecentlySaved[i] = bFilterClear->get_active() || bRecentlySaved[i]->get_active () || bTrash->get_active () || anySupplementaryActive || anyRankFilterActive || anyCLabelFilterActive || anyEditedFilterActive; } @@ -1615,7 +1631,7 @@ BrowserFilter FileCatalog::getFilter () (anyCLabelFilterActive && anyEditedFilterActive ) || (anyCLabelFilterActive && anyRecentlySavedFilterActive ) || (anyEditedFilterActive && anyRecentlySavedFilterActive) || - (nonTrashedActive && (anyRankFilterActive || anyCLabelFilterActive || anyEditedFilterActive || anyRecentlySavedFilterActive))) { + (anySupplementaryActive && (anyRankFilterActive || anyCLabelFilterActive || anyEditedFilterActive || anyRecentlySavedFilterActive))) { filter.multiselect = true; filter.showRanked[0] = anyRankFilterActive ? bUnRanked->get_active () : true; @@ -1657,6 +1673,7 @@ BrowserFilter FileCatalog::getFilter () filter.showTrash = bTrash->get_active () || !bNotTrash->get_active (); filter.showNotTrash = !bTrash->get_active (); + filter.showOriginal = bOriginal->get_active(); if (!filterPanel) { filter.exifFilterEnabled = false; diff --git a/rtgui/filecatalog.h b/rtgui/filecatalog.h index 377a6b0da..eda0ff81a 100644 --- a/rtgui/filecatalog.h +++ b/rtgui/filecatalog.h @@ -108,9 +108,10 @@ private: Gtk::ToggleButton* bRecentlySaved[2]; Gtk::ToggleButton* bTrash; Gtk::ToggleButton* bNotTrash; - Gtk::ToggleButton* categoryButtons[19]; + Gtk::ToggleButton* bOriginal; + Gtk::ToggleButton* categoryButtons[20]; Gtk::ToggleButton* exifInfo; - sigc::connection bCateg[19]; + sigc::connection bCateg[20]; Gtk::Image* iFilterClear, *igFilterClear; Gtk::Image* iranked[5], *igranked[5], *iUnRanked, *igUnRanked; Gtk::Image* iCLabeled[5], *igCLabeled[5], *iUnCLabeled, *igUnCLabeled;