Fix some corner cases in thumb selection, #5393

This commit is contained in:
Ingo Weyrich 2019-07-30 14:44:18 +02:00
parent 6b868a8d4d
commit f85de946e6
2 changed files with 27 additions and 18 deletions

View File

@ -783,16 +783,20 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m)
{ {
MYWRITERLOCK(l, entryRW); MYWRITERLOCK(l, entryRW);
selected.clear (); selected.clear();
for (size_t i = 0; i < fd.size(); i++) for (size_t i = 0; i < fd.size(); ++i) {
if (checkFilter (fd[i])) { if (checkFilter(fd[i])) {
fd[i]->selected = true; fd[i]->selected = true;
selected.push_back (fd[i]); selected.push_back(fd[i]);
}
}
if (!anchor && !selected.empty()) {
anchor = selected[0];
} }
} }
queue_draw (); queue_draw ();
notifySelectionListener (); notifySelectionListener();
} else if( m == copyTo) { } else if( m == copyTo) {
tbl->copyMoveRequested (mselected, false); tbl->copyMoveRequested (mselected, false);
} }
@ -1438,12 +1442,12 @@ void FileBrowser::applyFilter (const BrowserFilter& filter)
} }
for (size_t i = 0; i < fd.size(); i++) { for (size_t i = 0; i < fd.size(); i++) {
if (checkFilter (fd[i])) { if (checkFilter(fd[i])) {
numFiltered++; numFiltered++;
} else if (fd[i]->selected ) { } else if (fd[i]->selected) {
fd[i]->selected = false; fd[i]->selected = false;
std::vector<ThumbBrowserEntryBase*>::iterator j = std::find (selected.begin(), selected.end(), fd[i]); std::vector<ThumbBrowserEntryBase*>::iterator j = std::find(selected.begin(), selected.end(), fd[i]);
selected.erase (j); selected.erase(j);
if (lastClicked == fd[i]) { if (lastClicked == fd[i]) {
lastClicked = nullptr; lastClicked = nullptr;
@ -1452,6 +1456,9 @@ void FileBrowser::applyFilter (const BrowserFilter& filter)
selchanged = true; selchanged = true;
} }
} }
if (selected.empty() || (anchor && std::find(selected.begin(), selected.end(), anchor) == selected.end())) {
anchor = nullptr;
}
} }
if (selchanged) { if (selchanged) {

View File

@ -172,16 +172,18 @@ void ThumbBrowserBase::selectSingle (ThumbBrowserEntryBase* clicked)
void ThumbBrowserBase::selectRange (ThumbBrowserEntryBase* clicked, bool additional) void ThumbBrowserBase::selectRange (ThumbBrowserEntryBase* clicked, bool additional)
{ {
if (selected.empty() && !anchor) { if (!anchor) {
addToSelection(clicked, selected);
anchor = clicked; anchor = clicked;
if (selected.empty()) {
addToSelection(clicked, selected);
return; return;
} }
}
if (!additional || !lastClicked) { if (!additional || !lastClicked) {
// Extend the current range w.r.t to first selected entry. // Extend the current range w.r.t to first selected entry.
ThumbIterator back = std::find(fd.begin(), fd.end(), clicked); ThumbIterator back = std::find(fd.begin(), fd.end(), clicked);
ThumbIterator front = std::find(fd.begin(), fd.end(), anchor); ThumbIterator front = anchor == clicked ? back : std::find(fd.begin(), fd.end(), anchor);
if (front > back) { if (front > back) {
std::swap(front, back); std::swap(front, back);
@ -195,7 +197,7 @@ void ThumbBrowserBase::selectRange (ThumbBrowserEntryBase* clicked, bool additio
} else { } else {
// Add an additional range w.r.t. the last clicked entry. // Add an additional range w.r.t. the last clicked entry.
ThumbIterator last = std::find(fd.begin(), fd.end(), lastClicked); ThumbIterator last = std::find(fd.begin(), fd.end(), lastClicked);
ThumbIterator current = std::find (fd.begin(), fd.end(), clicked); ThumbIterator current = std::find(fd.begin(), fd.end(), clicked);
if (last > current) { if (last > current) {
std::swap(last, current); std::swap(last, current);
@ -209,12 +211,12 @@ void ThumbBrowserBase::selectRange (ThumbBrowserEntryBase* clicked, bool additio
void ThumbBrowserBase::selectSet (ThumbBrowserEntryBase* clicked) void ThumbBrowserBase::selectSet (ThumbBrowserEntryBase* clicked)
{ {
const ThumbIterator iterator = std::find (selected.begin (), selected.end (), clicked); const ThumbIterator iterator = std::find(selected.begin(), selected.end(), clicked);
if (iterator != selected.end ()) { if (iterator != selected.end()) {
removeFromSelection (iterator, selected); removeFromSelection(iterator, selected);
} else { } else {
addToSelection (clicked, selected); addToSelection(clicked, selected);
} }
anchor = clicked; anchor = clicked;
} }