Keyboard shortcuts in File Browser - improments to Shift + Arrow keys (issue 1919, on behalf of Adam Reichold)
This commit is contained in:
@@ -120,13 +120,16 @@ void ThumbBrowserBase::selectPrev (int distance, bool enlarge) {
|
|||||||
if (!selected.empty ()) {
|
if (!selected.empty ()) {
|
||||||
std::vector<ThumbBrowserEntryBase*>::iterator front = std::find (fd.begin (), fd.end (), selected.front ());
|
std::vector<ThumbBrowserEntryBase*>::iterator front = std::find (fd.begin (), fd.end (), selected.front ());
|
||||||
std::vector<ThumbBrowserEntryBase*>::iterator back = std::find (fd.begin (), fd.end (), selected.back ());
|
std::vector<ThumbBrowserEntryBase*>::iterator back = std::find (fd.begin (), fd.end (), selected.back ());
|
||||||
|
std::vector<ThumbBrowserEntryBase*>::iterator last = std::find (fd.begin (), fd.end (), lastClicked);
|
||||||
|
|
||||||
if (front > back)
|
if (front > back)
|
||||||
std::swap(front, back);
|
std::swap(front, back);
|
||||||
|
|
||||||
// find next thumbnail at filtered distance before 'front'
|
std::vector<ThumbBrowserEntryBase*>::iterator& curr = last == front ? front : back;
|
||||||
for (; front >= fd.begin (); --front) {
|
|
||||||
if (!(*front)->filtered) {
|
// find next thumbnail at filtered distance before current
|
||||||
|
for (; curr >= fd.begin (); --curr) {
|
||||||
|
if (!(*curr)->filtered) {
|
||||||
if (distance-- == 0) {
|
if (distance-- == 0) {
|
||||||
// clear current selection
|
// clear current selection
|
||||||
for (size_t i=0; i<selected.size (); ++i) {
|
for (size_t i=0; i<selected.size (); ++i) {
|
||||||
@@ -135,19 +138,28 @@ void ThumbBrowserBase::selectPrev (int distance, bool enlarge) {
|
|||||||
}
|
}
|
||||||
selected.clear ();
|
selected.clear ();
|
||||||
|
|
||||||
// make sure the newly selected thumbnail is visible
|
// make sure the newly selected thumbnail is visible and make it current
|
||||||
scrollToEntry (h, v, internal.get_width (), internal.get_height (), *front);
|
scrollToEntry (h, v, internal.get_width (), internal.get_height (), *curr);
|
||||||
|
lastClicked = *curr;
|
||||||
|
|
||||||
// either enlarge current selection or set new selection
|
// either enlarge current selection or set new selection
|
||||||
for (; front <= back; ++front) {
|
if(enlarge) {
|
||||||
if (!(*front)->filtered) {
|
// reverse direction if distance is too large
|
||||||
(*front)->selected = true;
|
if(front > back)
|
||||||
redrawNeeded (*front);
|
std::swap(front, back);
|
||||||
selected.push_back (*front);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!enlarge)
|
for (; front <= back; ++front) {
|
||||||
break;
|
if (!(*front)->filtered) {
|
||||||
|
(*front)->selected = true;
|
||||||
|
redrawNeeded (*front);
|
||||||
|
selected.push_back (*front);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
(*curr)->selected = true;
|
||||||
|
redrawNeeded (*curr);
|
||||||
|
selected.push_back (*curr);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -177,13 +189,16 @@ void ThumbBrowserBase::selectNext (int distance, bool enlarge) {
|
|||||||
if (!selected.empty ()) {
|
if (!selected.empty ()) {
|
||||||
std::vector<ThumbBrowserEntryBase*>::iterator front = std::find (fd.begin (), fd.end (), selected.front ());
|
std::vector<ThumbBrowserEntryBase*>::iterator front = std::find (fd.begin (), fd.end (), selected.front ());
|
||||||
std::vector<ThumbBrowserEntryBase*>::iterator back = std::find (fd.begin (), fd.end (), selected.back ());
|
std::vector<ThumbBrowserEntryBase*>::iterator back = std::find (fd.begin (), fd.end (), selected.back ());
|
||||||
|
std::vector<ThumbBrowserEntryBase*>::iterator last = std::find (fd.begin (), fd.end (), lastClicked);
|
||||||
|
|
||||||
if (front > back)
|
if (front > back)
|
||||||
std::swap(front, back);
|
std::swap(front, back);
|
||||||
|
|
||||||
// find next thumbnail at filtered distance after 'back'
|
std::vector<ThumbBrowserEntryBase*>::iterator& curr = last == back ? back : front;
|
||||||
for (; back < fd.end (); ++back) {
|
|
||||||
if (!(*back)->filtered) {
|
// find next thumbnail at filtered distance after current
|
||||||
|
for (; curr < fd.end (); ++curr) {
|
||||||
|
if (!(*curr)->filtered) {
|
||||||
if (distance-- == 0) {
|
if (distance-- == 0) {
|
||||||
// clear current selection
|
// clear current selection
|
||||||
for (size_t i=0; i<selected.size (); ++i) {
|
for (size_t i=0; i<selected.size (); ++i) {
|
||||||
@@ -192,22 +207,29 @@ void ThumbBrowserBase::selectNext (int distance, bool enlarge) {
|
|||||||
}
|
}
|
||||||
selected.clear ();
|
selected.clear ();
|
||||||
|
|
||||||
// make sure the newly selected thumbnail is visible
|
// make sure the newly selected thumbnail is visible and make it current
|
||||||
scrollToEntry (h, v, internal.get_width (), internal.get_height (), *back);
|
scrollToEntry (h, v, internal.get_width (), internal.get_height (), *curr);
|
||||||
|
lastClicked = *curr;
|
||||||
|
|
||||||
// either enlarge current selection or set new selection
|
// either enlarge current selection or set new selection
|
||||||
for (; back >= front; --back) {
|
if(enlarge) {
|
||||||
if (!(*back)->filtered) {
|
// reverse direction if distance is too large
|
||||||
(*back)->selected = true;
|
if(front > back)
|
||||||
redrawNeeded (*back);
|
std::swap(front, back);
|
||||||
selected.push_back (*back);
|
|
||||||
|
for (; front <= back; ++front) {
|
||||||
|
if (!(*front)->filtered) {
|
||||||
|
(*front)->selected = true;
|
||||||
|
redrawNeeded (*front);
|
||||||
|
selected.push_back (*front);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!enlarge)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
std::reverse(selected.begin (), selected.end ());
|
(*curr)->selected = true;
|
||||||
|
redrawNeeded (*curr);
|
||||||
|
selected.push_back (*curr);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -245,13 +267,16 @@ void ThumbBrowserBase::selectFirst (bool enlarge) {
|
|||||||
|
|
||||||
scrollToEntry (h, v, internal.get_width (), internal.get_height (), *first);
|
scrollToEntry (h, v, internal.get_width (), internal.get_height (), *first);
|
||||||
|
|
||||||
|
ThumbBrowserEntryBase* lastEntry = lastClicked;
|
||||||
|
lastClicked = *first;
|
||||||
|
|
||||||
if(selected.empty ()) {
|
if(selected.empty ()) {
|
||||||
(*first)->selected = true;
|
(*first)->selected = true;
|
||||||
redrawNeeded (*first);
|
redrawNeeded (*first);
|
||||||
selected.push_back (*first);
|
selected.push_back (*first);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::vector<ThumbBrowserEntryBase*>::iterator back = std::find (fd.begin (), fd.end (), selected.back ());
|
std::vector<ThumbBrowserEntryBase*>::iterator back = std::find (fd.begin (), fd.end (), lastEntry ? lastEntry : selected.back ());
|
||||||
|
|
||||||
if (first > back)
|
if (first > back)
|
||||||
std::swap(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);
|
scrollToEntry (h, v, internal.get_width (), internal.get_height (), *last);
|
||||||
|
|
||||||
|
ThumbBrowserEntryBase* lastEntry = lastClicked;
|
||||||
|
lastClicked = *last;
|
||||||
|
|
||||||
if(selected.empty()) {
|
if(selected.empty()) {
|
||||||
(*last)->selected = true;
|
(*last)->selected = true;
|
||||||
redrawNeeded (*last);
|
redrawNeeded (*last);
|
||||||
selected.push_back (*last);
|
selected.push_back (*last);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::vector<ThumbBrowserEntryBase*>::iterator front = std::find (fd.begin (), fd.end (), selected.front ());
|
std::vector<ThumbBrowserEntryBase*>::iterator front = std::find (fd.begin (), fd.end (), lastEntry ? lastEntry : selected.front ());
|
||||||
|
|
||||||
if (last < front)
|
if (last < front)
|
||||||
std::swap(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]);
|
selected.push_back (fd[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
lastClicked = fileDescr;
|
||||||
#if PROTECT_VECTORS
|
#if PROTECT_VECTORS
|
||||||
MYWRITERLOCK_RELEASE(l);
|
MYWRITERLOCK_RELEASE(l);
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user