diff --git a/rtdata/images/Dark/actions/trash-hide-deleted.png b/rtdata/images/Dark/actions/trash-hide-deleted.png
new file mode 100644
index 000000000..59137cf35
Binary files /dev/null and b/rtdata/images/Dark/actions/trash-hide-deleted.png differ
diff --git a/rtdata/images/Light/actions/trash-hide-deleted.png b/rtdata/images/Light/actions/trash-hide-deleted.png
new file mode 100644
index 000000000..95aaecdba
Binary files /dev/null and b/rtdata/images/Light/actions/trash-hide-deleted.png differ
diff --git a/rtdata/languages/default b/rtdata/languages/default
index 4b575131c..6ca934fe9 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -170,6 +170,7 @@ FILEBROWSER_SHOWDIRHINT;Clear all filters.\nShortcut: d
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_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/filebrowser.cc b/rtgui/filebrowser.cc
index ea83fca40..e8edc4fb2 100755
--- a/rtgui/filebrowser.cc
+++ b/rtgui/filebrowser.cc
@@ -443,6 +443,9 @@ void FileBrowser::addEntry_ (FileBrowserEntry* entry) {
initEntry (entry);
}
redraw ();
+
+ // newly added item might have been already trashed in a previous session
+ trash_changed().emit();
}
FileBrowserEntry* FileBrowser::delEntry (const Glib::ustring& fname) {
diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc
index f850e0f49..188f14658 100644
--- a/rtgui/filecatalog.cc
+++ b/rtgui/filecatalog.cc
@@ -272,13 +272,24 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) :
iTrashEmpty = new RTImage("trash-show-empty.png") ;
iTrashFull = new RTImage("trash-show-full.png") ;
- bTrash = Gtk::manage( new Gtk::ToggleButton () );
+ bTrash = Gtk::manage( new Gtk::ToggleButton () );
bTrash->set_image (*iTrashEmpty);
bTrash->set_relief (Gtk::RELIEF_NONE);
bTrash->set_tooltip_markup (M("FILEBROWSER_SHOWTRASHHINT"));
bCateg[17] = bTrash->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bTrash, true));
bTrash->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false);
+
+ iNotTrash = new RTImage("trash-hide-deleted.png") ;
+
+ bNotTrash = Gtk::manage( new Gtk::ToggleButton () );
+ bNotTrash->set_image (*iNotTrash);
+ bNotTrash->set_relief (Gtk::RELIEF_NONE);
+ bNotTrash->set_tooltip_markup (M("FILEBROWSER_SHOWNOTTRASHHINT"));
+ 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);
+
buttonBar->pack_start (*bTrash, Gtk::PACK_SHRINK);
+ buttonBar->pack_start (*bNotTrash, Gtk::PACK_SHRINK);
buttonBar->pack_start (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK);
fileBrowser->trash_changed().connect( sigc::mem_fun(*this, &FileCatalog::trashChanged) );
@@ -300,6 +311,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) :
// 15 - bRecentlySaved[0]
// 16 - bRecentlySaved[1]
// 17 - bTrash
+ // 18 - bNotTrash
categoryButtons[0] = bFilterClear;
categoryButtons[1] = bUnRanked;
@@ -309,6 +321,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) :
for (int i=0; i<2; i++){ categoryButtons[i+13] = bEdited[i];}
for (int i=0; i<2; i++){ categoryButtons[i+15] = bRecentlySaved[i];}
categoryButtons[17] = bTrash;
+ categoryButtons[18] = bNotTrash;
exifInfo = Gtk::manage(new Gtk::ToggleButton ());
exifInfo->set_image (*Gtk::manage(new RTImage ("info.png")));
@@ -547,7 +560,7 @@ void FileCatalog::enableTabMode(bool enable) {
redrawAll();
}
-
+
void FileCatalog::_refreshProgressBar () {
// In tab mode, no progress bar at all
// Also mention that this progress bar only measures the FIRST pass (quick thumbnails)
@@ -589,11 +602,11 @@ int refreshProgressBarUI (void* data) {
(static_cast(data))->_refreshProgressBar ();
return 0;
}
-
-void FileCatalog::filterApplied() {
- g_idle_add (refreshProgressBarUI, this);
-}
-
+
+void FileCatalog::filterApplied() {
+ g_idle_add (refreshProgressBarUI, this);
+}
+
void FileCatalog::previewReady (int dir_id, FileBrowserEntry* fdn) {
@@ -1104,8 +1117,11 @@ void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b, bool isMouseClick
// The event is process here, we can clear modifierKey now, it'll be set again on the next even
modifierKey = 0;
- for (int i=0; i<18; i++)
- bCateg[i].block (true);
+ const int numCateg = sizeof(bCateg) / sizeof(bCateg[0]);
+ const int numButtons = sizeof(categoryButtons) / sizeof(categoryButtons[0]);
+
+ for (int i=0; iget_active()) {
if (i>0 && i<17) {
toggled_stars_count ++;
@@ -1133,8 +1149,14 @@ 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))) {
+ categoryButtons[0]->set_active (true);
+ for (int i=1; iset_active (false);
+ }
// if we're deselecting the only star still active
- if (toggled_stars_count == 1 && (buttons & (1 << toggled_button))) {
+ else if (toggled_stars_count == 1 && (buttons & (1 << toggled_button))) {
// activate clear-filters
categoryButtons[0]->set_active (true);
// deactivate the toggled filter
@@ -1147,11 +1169,11 @@ void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b, bool isMouseClick
}
else {
// activate the toggled filter, deactivate the rest
- for (int i=0; i<18; i++)
+ for (int i=0; iset_active (i==toggled_button);
}
}
- //modifier key allowed only for stars and color labels
+ //modifier key allowed only for stars and color labels...
else if (toggled_button>0 && toggled_button<17) {
if (control_down) {
//control is pressed
@@ -1199,6 +1221,11 @@ 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 ());
+ }
bool active_now, active_before;
@@ -1261,7 +1288,7 @@ void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b, bool isMouseClick
fileBrowser->setScrollPosition (hScrollPos[lastScrollPos], vScrollPos[lastScrollPos]);
}
- for (int i=0; i<18; i++)
+ for (int i=0; iget_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();
/*
* filter is setup in 2 steps
* Step 1: handle individual filters
*/
- filter.showRanked[0] = bFilterClear->get_active() || bUnRanked->get_active () || bTrash->get_active () ||
+ filter.showRanked[0] = bFilterClear->get_active() || bUnRanked->get_active () || bTrash->get_active () || nonTrashedActive ||
anyCLabelFilterActive || anyEditedFilterActive || anyRecentlySavedFilterActive;
- filter.showCLabeled[0] = bFilterClear->get_active() || bUnCLabeled->get_active () || bTrash->get_active () ||
+ filter.showCLabeled[0] = bFilterClear->get_active() || bUnCLabeled->get_active () || bTrash->get_active () || nonTrashedActive ||
anyRankFilterActive || anyEditedFilterActive || anyRecentlySavedFilterActive;
for (int i=1; i<=5; i++){
- filter.showRanked[i] = bFilterClear->get_active() || bRank[i-1]->get_active () || bTrash->get_active () ||
+ filter.showRanked[i] = bFilterClear->get_active() || bRank[i-1]->get_active () || bTrash->get_active () || nonTrashedActive ||
anyCLabelFilterActive || anyEditedFilterActive || anyRecentlySavedFilterActive;
- filter.showCLabeled[i] = bFilterClear->get_active() || bCLabel[i-1]->get_active () || bTrash->get_active () ||
+ filter.showCLabeled[i] = bFilterClear->get_active() || bCLabel[i-1]->get_active () || bTrash->get_active () || nonTrashedActive ||
anyRankFilterActive || anyEditedFilterActive || anyRecentlySavedFilterActive;
}
for (int i=0; i<2; i++){
- filter.showEdited[i] = bFilterClear->get_active() || bEdited[i]->get_active () || bTrash->get_active () ||
+ filter.showEdited[i] = bFilterClear->get_active() || bEdited[i]->get_active () || bTrash->get_active () || nonTrashedActive ||
anyRankFilterActive || anyCLabelFilterActive || anyRecentlySavedFilterActive;
- filter.showRecentlySaved[i] = bFilterClear->get_active() || bRecentlySaved[i]->get_active () || bTrash->get_active () ||
+ filter.showRecentlySaved[i] = bFilterClear->get_active() || bRecentlySaved[i]->get_active () || bTrash->get_active () || nonTrashedActive ||
anyRankFilterActive || anyCLabelFilterActive || anyEditedFilterActive;
}
if( options.rtSettings.verbose ){
@@ -1318,7 +1346,8 @@ BrowserFilter FileCatalog::getFilter () {
(anyRankFilterActive && anyRecentlySavedFilterActive ) ||
(anyCLabelFilterActive && anyEditedFilterActive ) ||
(anyCLabelFilterActive && anyRecentlySavedFilterActive ) ||
- (anyEditedFilterActive && anyRecentlySavedFilterActive)){
+ (anyEditedFilterActive && anyRecentlySavedFilterActive) ||
+ (nonTrashedActive && (anyRankFilterActive || anyCLabelFilterActive || anyEditedFilterActive || anyRecentlySavedFilterActive))){
filter.multiselect = true;
filter.showRanked[0] = anyRankFilterActive?bUnRanked->get_active ():true;
@@ -1343,7 +1372,7 @@ BrowserFilter FileCatalog::getFilter () {
}
- filter.showTrash = bFilterClear->get_active() || bTrash->get_active ();
+ filter.showTrash = bTrash->get_active () || !bNotTrash->get_active ();
filter.showNotTrash = !bTrash->get_active ();
if (!filterPanel)
filter.exifFilterEnabled = false;
diff --git a/rtgui/filecatalog.h b/rtgui/filecatalog.h
index b2ba9d691..a8b4d954f 100644
--- a/rtgui/filecatalog.h
+++ b/rtgui/filecatalog.h
@@ -105,16 +105,17 @@ class FileCatalog : public Gtk::VBox,
Gtk::ToggleButton* bEdited[2];
Gtk::ToggleButton* bRecentlySaved[2];
Gtk::ToggleButton* bTrash;
- Gtk::ToggleButton* categoryButtons[18];
+ Gtk::ToggleButton* bNotTrash;
+ Gtk::ToggleButton* categoryButtons[19];
Gtk::ToggleButton* exifInfo;
- sigc::connection bCateg[18];
+ sigc::connection bCateg[19];
Gtk::Image* iFilterClear, *igFilterClear;
Gtk::Image* iranked[5], *igranked[5], *iUnRanked, *igUnRanked;
Gtk::Image* iCLabeled[5], *igCLabeled[5], *iUnCLabeled, *igUnCLabeled;
Gtk::Image* iEdited[2], *igEdited[2];
Gtk::Image* iRecentlySaved[2], *igRecentlySaved[2];
Gtk::Image *iTrashEmpty, *iTrashFull;
- //Gtk::Image *iRightArrow_red, *iRightArrow;
+ Gtk::Image *iNotTrash;
Gtk::Image *iRefreshWhite, *iRefreshRed;
Gtk::Image *iLeftPanel_1_Show, *iLeftPanel_1_Hide, *iRightPanel_1_Show, *iRightPanel_1_Hide;
Gtk::Image *iQueryClear;
diff --git a/tools/source_icons/scalable/trash-hide-deleted.file b/tools/source_icons/scalable/trash-hide-deleted.file
new file mode 100644
index 000000000..660b4fffa
--- /dev/null
+++ b/tools/source_icons/scalable/trash-hide-deleted.file
@@ -0,0 +1 @@
+trash-hide-deleted.png,w22,actions
diff --git a/tools/source_icons/scalable/trash-hide-deleted.svg b/tools/source_icons/scalable/trash-hide-deleted.svg
new file mode 100644
index 000000000..8272d1c77
--- /dev/null
+++ b/tools/source_icons/scalable/trash-hide-deleted.svg
@@ -0,0 +1,182 @@
+
+
+
+