diff options
-rw-r--r-- | dw/fltkviewport.cc | 34 | ||||
-rw-r--r-- | dw/fltkviewport.hh | 6 | ||||
-rw-r--r-- | dw/types.hh | 2 |
3 files changed, 36 insertions, 6 deletions
diff --git a/dw/fltkviewport.cc b/dw/fltkviewport.cc index e9169495..fc9a0bed 100644 --- a/dw/fltkviewport.cc +++ b/dw/fltkviewport.cc @@ -74,6 +74,10 @@ FltkViewport::FltkViewport (int X, int Y, int W, int H, const char *label): horScrolling = verScrolling = dragScrolling = 0; scrollbarPageMode = false; pageOverlap = 50; + pageScrolling = core::NONE_CMD; + + pageScrollDelay = 0.300; + pageScrollInterval = 0.100; gadgetOrientation[0] = GADGET_HORIZONTAL; gadgetOrientation[1] = GADGET_HORIZONTAL; @@ -296,11 +300,19 @@ int FltkViewport::handle (int event) case FL_PUSH: if (vscrollbar->visible() && Fl::event_inside(vscrollbar)) { if (scrollbarPageMode ^ (bool) Fl::event_shift()) { - if (Fl::event_button() == FL_LEFT_MOUSE) { - scroll(core::SCREEN_DOWN_CMD); - return 1; - } else if (Fl::event_button() == FL_RIGHT_MOUSE) { - scroll(core::SCREEN_UP_CMD); + if (Fl::event_button() == FL_LEFT_MOUSE) + pageScrolling = core::SCREEN_DOWN_CMD; + else if (Fl::event_button() == FL_RIGHT_MOUSE) + pageScrolling = core::SCREEN_UP_CMD; + else + pageScrolling = core::NONE_CMD; + + if (pageScrolling != core::NONE_CMD) { + scroll(pageScrolling); + /* Repeat until released */ + if (!Fl::has_timeout(repeatPageScroll, this)) + Fl::add_timeout(pageScrollDelay, repeatPageScroll, this); + return 1; } } @@ -363,6 +375,7 @@ int FltkViewport::handle (int event) break; case FL_RELEASE: + Fl::remove_timeout(repeatPageScroll); Fl::remove_timeout(selectionScroll); if (Fl::event_button() == FL_MIDDLE_MOUSE) { setCursor (core::style::CURSOR_DEFAULT); @@ -547,6 +560,17 @@ void FltkViewport::selectionScroll (void *data) Fl::repeat_timeout(0.025, selectionScroll, data); } +void FltkViewport::repeatPageScroll () +{ + scroll(pageScrolling); + Fl::repeat_timeout(pageScrollInterval, repeatPageScroll, this); +} + +void FltkViewport::repeatPageScroll (void *data) +{ + ((FltkViewport *)data)->repeatPageScroll (); +} + void FltkViewport::setScrollbarOnLeft (bool enable) { scrollbarOnLeft = enable ? 1 : 0; diff --git a/dw/fltkviewport.hh b/dw/fltkviewport.hh index 2cff42d3..0948e2f2 100644 --- a/dw/fltkviewport.hh +++ b/dw/fltkviewport.hh @@ -46,6 +46,9 @@ private: int horScrolling, verScrolling; bool scrollbarPageMode; int pageOverlap; + enum dw::core::ScrollCommand pageScrolling; + float pageScrollInterval; + float pageScrollDelay; Fl_Scrollbar *vscrollbar, *hscrollbar; @@ -65,6 +68,9 @@ private: void selectionScroll(); static void selectionScroll(void *vport); + void repeatPageScroll (); + static void repeatPageScroll (void *data); + void updateCanvasWidgets (int oldScrollX, int oldScrollY); static void draw_area (void *data, int x, int y, int w, int h); diff --git a/dw/types.hh b/dw/types.hh index 877593fe..eabf5ce7 100644 --- a/dw/types.hh +++ b/dw/types.hh @@ -34,7 +34,7 @@ enum VPosition enum ScrollCommand {SCREEN_UP_CMD, SCREEN_DOWN_CMD, SCREEN_LEFT_CMD, SCREEN_RIGHT_CMD, LINE_UP_CMD, LINE_DOWN_CMD, - LEFT_CMD, RIGHT_CMD, TOP_CMD, BOTTOM_CMD}; + LEFT_CMD, RIGHT_CMD, TOP_CMD, BOTTOM_CMD, NONE_CMD}; /* * Different "layers" may be highlighted in a widget. |