Keyboard shortcuts in File Browser - improments to Shift + Arrow keys (issue 1919, on behalf of Adam Reichold)

This commit is contained in:
michael
2013-07-12 11:45:27 -04:00
parent f7b0dc429c
commit 5cdfcb8656

View File

@@ -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