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);
|
||||
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) {
|
||||
int dest = 1;
|
||||
|
@ -207,6 +207,8 @@ void ThumbBrowserBase::selectNext (int distance, bool enlarge) {
|
||||
break;
|
||||
}
|
||||
|
||||
std::reverse(selected.begin (), selected.end ());
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -222,6 +224,132 @@ void ThumbBrowserBase::selectNext (int distance, bool enlarge) {
|
||||
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) {
|
||||
|
||||
inW = w;
|
||||
|
@ -80,6 +80,8 @@ class ThumbBrowserBase : public Gtk::VBox {
|
||||
|
||||
void selectPrev (int distance, bool enlarge);
|
||||
void selectNext (int distance, bool enlarge);
|
||||
void selectFirst (bool enlarge);
|
||||
void selectLast (bool enlarge);
|
||||
|
||||
protected:
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user