Keyboard navigation in File Browser - Home and End shortcuts (issue 1919, on behalf of Adam Reichold)
This commit is contained in:
parent
01414d0550
commit
84ee2bc18a
@ -986,6 +986,14 @@ bool FileBrowser::keyPressed (GdkEventKey* event) {
|
|||||||
selectNext (numOfCols, shift);
|
selectNext (numOfCols, shift);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (event->keyval==GDK_Home) {
|
||||||
|
selectFirst (shift);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (event->keyval==GDK_End) {
|
||||||
|
selectLast (shift);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
else if (event->keyval==GDK_F5) {
|
else if (event->keyval==GDK_F5) {
|
||||||
int dest = 1;
|
int dest = 1;
|
||||||
|
@ -121,12 +121,12 @@ void ThumbBrowserBase::selectPrev (int distance, bool enlarge) {
|
|||||||
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 ());
|
||||||
|
|
||||||
if(front > back)
|
if (front > back)
|
||||||
std::swap(front, back);
|
std::swap(front, back);
|
||||||
|
|
||||||
// find next thumbnail at filtered distance before 'front'
|
// find next thumbnail at filtered distance before 'front'
|
||||||
for (; front >= fd.begin (); --front) {
|
for (; front >= fd.begin (); --front) {
|
||||||
if(!(*front)->filtered) {
|
if (!(*front)->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) {
|
||||||
@ -139,14 +139,14 @@ void ThumbBrowserBase::selectPrev (int distance, bool enlarge) {
|
|||||||
scrollToEntry (h, v, internal.get_width (), internal.get_height (), *front);
|
scrollToEntry (h, v, internal.get_width (), internal.get_height (), *front);
|
||||||
|
|
||||||
// either enlarge current selection or set new selection
|
// either enlarge current selection or set new selection
|
||||||
for(; front <= back; ++front) {
|
for (; front <= back; ++front) {
|
||||||
if(!(*front)->filtered) {
|
if (!(*front)->filtered) {
|
||||||
(*front)->selected = true;
|
(*front)->selected = true;
|
||||||
redrawNeeded (*front);
|
redrawNeeded (*front);
|
||||||
selected.push_back (*front);
|
selected.push_back (*front);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!enlarge)
|
if (!enlarge)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,12 +178,12 @@ void ThumbBrowserBase::selectNext (int distance, bool enlarge) {
|
|||||||
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 ());
|
||||||
|
|
||||||
if(front > back)
|
if (front > back)
|
||||||
std::swap(front, back);
|
std::swap(front, back);
|
||||||
|
|
||||||
// find next thumbnail at filtered distance after 'back'
|
// find next thumbnail at filtered distance after 'back'
|
||||||
for (; back < fd.end (); ++back) {
|
for (; back < fd.end (); ++back) {
|
||||||
if(!(*back)->filtered) {
|
if (!(*back)->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) {
|
||||||
@ -196,17 +196,19 @@ void ThumbBrowserBase::selectNext (int distance, bool enlarge) {
|
|||||||
scrollToEntry (h, v, internal.get_width (), internal.get_height (), *back);
|
scrollToEntry (h, v, internal.get_width (), internal.get_height (), *back);
|
||||||
|
|
||||||
// either enlarge current selection or set new selection
|
// either enlarge current selection or set new selection
|
||||||
for(; back >= front; --back) {
|
for (; back >= front; --back) {
|
||||||
if(!(*back)->filtered) {
|
if (!(*back)->filtered) {
|
||||||
(*back)->selected = true;
|
(*back)->selected = true;
|
||||||
redrawNeeded (*back);
|
redrawNeeded (*back);
|
||||||
selected.push_back (*back);
|
selected.push_back (*back);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!enlarge)
|
if (!enlarge)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::reverse(selected.begin (), selected.end ());
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,6 +224,132 @@ void ThumbBrowserBase::selectNext (int distance, bool enlarge) {
|
|||||||
setScrollPosition (h, v);
|
setScrollPosition (h, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ThumbBrowserBase::selectFirst (bool enlarge) {
|
||||||
|
double h, v;
|
||||||
|
getScrollPosition (h, v);
|
||||||
|
|
||||||
|
{
|
||||||
|
#if PROTECT_VECTORS
|
||||||
|
MYWRITERLOCK(l, entryRW);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!fd.empty ()) {
|
||||||
|
// find first unfiltered entry
|
||||||
|
std::vector<ThumbBrowserEntryBase*>::iterator first = fd.begin ();
|
||||||
|
|
||||||
|
for (; first < fd.end (); ++first) {
|
||||||
|
if (!(*first)->filtered) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollToEntry (h, v, internal.get_width (), internal.get_height (), *first);
|
||||||
|
|
||||||
|
if(selected.empty ()) {
|
||||||
|
(*first)->selected = true;
|
||||||
|
redrawNeeded (*first);
|
||||||
|
selected.push_back (*first);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::vector<ThumbBrowserEntryBase*>::iterator back = std::find (fd.begin (), fd.end (), selected.back ());
|
||||||
|
|
||||||
|
if (first > back)
|
||||||
|
std::swap(first, back);
|
||||||
|
|
||||||
|
// clear current selection
|
||||||
|
for (size_t i=0; i<selected.size (); ++i) {
|
||||||
|
selected[i]->selected = false;
|
||||||
|
redrawNeeded (selected[i]);
|
||||||
|
}
|
||||||
|
selected.clear ();
|
||||||
|
|
||||||
|
// either enlarge current selection or set new selection
|
||||||
|
for (; first <= back; ++first) {
|
||||||
|
if (!(*first)->filtered) {
|
||||||
|
(*first)->selected = true;
|
||||||
|
redrawNeeded (*first);
|
||||||
|
selected.push_back (*first);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!enlarge)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if PROTECT_VECTORS
|
||||||
|
MYWRITERLOCK_RELEASE(l);
|
||||||
|
#endif
|
||||||
|
selectionChanged ();
|
||||||
|
}
|
||||||
|
|
||||||
|
setScrollPosition (h, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThumbBrowserBase::selectLast (bool enlarge) {
|
||||||
|
double h, v;
|
||||||
|
getScrollPosition (h, v);
|
||||||
|
|
||||||
|
{
|
||||||
|
#if PROTECT_VECTORS
|
||||||
|
MYWRITERLOCK(l, entryRW);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!fd.empty ()) {
|
||||||
|
// find last unfiltered entry
|
||||||
|
std::vector<ThumbBrowserEntryBase*>::iterator last = fd.end () - 1;
|
||||||
|
|
||||||
|
for (; last >= fd.begin (); --last) {
|
||||||
|
if (!(*last)->filtered) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollToEntry (h, v, internal.get_width (), internal.get_height (), *last);
|
||||||
|
|
||||||
|
if(selected.empty()) {
|
||||||
|
(*last)->selected = true;
|
||||||
|
redrawNeeded (*last);
|
||||||
|
selected.push_back (*last);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::vector<ThumbBrowserEntryBase*>::iterator front = std::find (fd.begin (), fd.end (), selected.front ());
|
||||||
|
|
||||||
|
if (last < front)
|
||||||
|
std::swap(last, front);
|
||||||
|
|
||||||
|
// clear current selection
|
||||||
|
for (size_t i=0; i<selected.size (); ++i) {
|
||||||
|
selected[i]->selected = false;
|
||||||
|
redrawNeeded (selected[i]);
|
||||||
|
}
|
||||||
|
selected.clear ();
|
||||||
|
|
||||||
|
// either enlarge current selection or set new selection
|
||||||
|
for (; front <= last; --last) {
|
||||||
|
if (!(*last)->filtered) {
|
||||||
|
(*last)->selected = true;
|
||||||
|
redrawNeeded (*last);
|
||||||
|
selected.push_back (*last);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!enlarge)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::reverse(selected.begin (), selected.end ());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if PROTECT_VECTORS
|
||||||
|
MYWRITERLOCK_RELEASE(l);
|
||||||
|
#endif
|
||||||
|
selectionChanged ();
|
||||||
|
}
|
||||||
|
|
||||||
|
setScrollPosition (h, v);
|
||||||
|
}
|
||||||
|
|
||||||
void ThumbBrowserBase::resizeThumbnailArea (int w, int h) {
|
void ThumbBrowserBase::resizeThumbnailArea (int w, int h) {
|
||||||
|
|
||||||
inW = w;
|
inW = w;
|
||||||
|
@ -78,8 +78,10 @@ class ThumbBrowserBase : public Gtk::VBox {
|
|||||||
void scroll (int direction);
|
void scroll (int direction);
|
||||||
void scrollPage (int direction);
|
void scrollPage (int direction);
|
||||||
|
|
||||||
void selectPrev(int distance, bool enlarge);
|
void selectPrev (int distance, bool enlarge);
|
||||||
void selectNext(int distance, bool enlarge);
|
void selectNext (int distance, bool enlarge);
|
||||||
|
void selectFirst (bool enlarge);
|
||||||
|
void selectLast (bool enlarge);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user