diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index 326190158..499d22c60 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -120,13 +120,16 @@ void ThumbBrowserBase::selectPrev (int distance, bool enlarge) { if (!selected.empty ()) { std::vector::iterator front = std::find (fd.begin (), fd.end (), selected.front ()); std::vector::iterator back = std::find (fd.begin (), fd.end (), selected.back ()); + std::vector::iterator last = std::find (fd.begin (), fd.end (), lastClicked); if (front > back) std::swap(front, back); - // find next thumbnail at filtered distance before 'front' - for (; front >= fd.begin (); --front) { - if (!(*front)->filtered) { + std::vector::iterator& curr = last == front ? front : back; + + // find next thumbnail at filtered distance before current + for (; curr >= fd.begin (); --curr) { + if (!(*curr)->filtered) { if (distance-- == 0) { // clear current selection for (size_t i=0; ifiltered) { - (*front)->selected = true; - redrawNeeded (*front); - selected.push_back (*front); - } + if(enlarge) { + // reverse direction if distance is too large + if(front > back) + std::swap(front, back); - if (!enlarge) - break; + for (; front <= back; ++front) { + if (!(*front)->filtered) { + (*front)->selected = true; + redrawNeeded (*front); + selected.push_back (*front); + } + } + } + else { + (*curr)->selected = true; + redrawNeeded (*curr); + selected.push_back (*curr); } break; @@ -177,13 +189,16 @@ void ThumbBrowserBase::selectNext (int distance, bool enlarge) { if (!selected.empty ()) { std::vector::iterator front = std::find (fd.begin (), fd.end (), selected.front ()); std::vector::iterator back = std::find (fd.begin (), fd.end (), selected.back ()); + std::vector::iterator last = std::find (fd.begin (), fd.end (), lastClicked); if (front > back) std::swap(front, back); - // find next thumbnail at filtered distance after 'back' - for (; back < fd.end (); ++back) { - if (!(*back)->filtered) { + std::vector::iterator& curr = last == back ? back : front; + + // find next thumbnail at filtered distance after current + for (; curr < fd.end (); ++curr) { + if (!(*curr)->filtered) { if (distance-- == 0) { // clear current selection for (size_t i=0; i= front; --back) { - if (!(*back)->filtered) { - (*back)->selected = true; - redrawNeeded (*back); - selected.push_back (*back); + if(enlarge) { + // reverse direction if distance is too large + if(front > back) + std::swap(front, back); + + for (; front <= back; ++front) { + if (!(*front)->filtered) { + (*front)->selected = true; + redrawNeeded (*front); + selected.push_back (*front); + } } - - if (!enlarge) - break; } - - std::reverse(selected.begin (), selected.end ()); + else { + (*curr)->selected = true; + redrawNeeded (*curr); + selected.push_back (*curr); + } break; } @@ -245,13 +267,16 @@ void ThumbBrowserBase::selectFirst (bool enlarge) { scrollToEntry (h, v, internal.get_width (), internal.get_height (), *first); + ThumbBrowserEntryBase* lastEntry = lastClicked; + lastClicked = *first; + if(selected.empty ()) { (*first)->selected = true; redrawNeeded (*first); selected.push_back (*first); } else { - std::vector::iterator back = std::find (fd.begin (), fd.end (), selected.back ()); + std::vector::iterator back = std::find (fd.begin (), fd.end (), lastEntry ? lastEntry : selected.back ()); if (first > back) std::swap(first, back); @@ -307,13 +332,16 @@ void ThumbBrowserBase::selectLast (bool enlarge) { scrollToEntry (h, v, internal.get_width (), internal.get_height (), *last); + ThumbBrowserEntryBase* lastEntry = lastClicked; + lastClicked = *last; + if(selected.empty()) { (*last)->selected = true; redrawNeeded (*last); selected.push_back (*last); } else { - std::vector::iterator front = std::find (fd.begin (), fd.end (), selected.front ()); + std::vector::iterator front = std::find (fd.begin (), fd.end (), lastEntry ? lastEntry : selected.front ()); if (last < front) std::swap(last, front); @@ -673,6 +701,7 @@ void ThumbBrowserBase::buttonPressed (int x, int y, int button, GdkEventType typ selected.push_back (fd[i]); } } + lastClicked = fileDescr; #if PROTECT_VECTORS MYWRITERLOCK_RELEASE(l); #endif