diff options
author | corvid <corvid@lavabit.com> | 2012-12-23 20:05:01 +0000 |
---|---|---|
committer | corvid <corvid@lavabit.com> | 2012-12-23 20:05:01 +0000 |
commit | 205403d0e8a053abf6b3c9786a62c28dfc9d8bc3 (patch) | |
tree | 527a7a018395d831ca721fe6dfecc21421f856a6 /dw/fltkviewbase.cc | |
parent | 203d29dd1c472cf4ca1025c288db7a60144833fd (diff) |
when tabbing among view's children, scroll to them
Diffstat (limited to 'dw/fltkviewbase.cc')
-rw-r--r-- | dw/fltkviewbase.cc | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/dw/fltkviewbase.cc b/dw/fltkviewbase.cc index feab0ad7..02cccb2d 100644 --- a/dw/fltkviewbase.cc +++ b/dw/fltkviewbase.cc @@ -296,10 +296,34 @@ int FltkViewBase::handle (int event) focused_child = fl_oldfocus; return 0; case FL_KEYBOARD: - if (Fl::event_key() == FL_Tab && this == Fl::focus()) { - for (int i = 0; i < children(); i++) { - if (child(i)->take_focus()) - return 1; + if (Fl::event_key() == FL_Tab) { + int i, ret = 0; + + if (this == Fl::focus()) { + // if we have focus, give it to a child + for (i = 0; i < children(); i++) + if (child(i)->take_focus()) { + ret = 1; + break; + } + } else { + // tabbing between children; which got focus? + if (!(ret = Fl_Group::handle (event))) + return 0; + for (i = 0; i < children(); i++) + if (child(i) == Fl::focus()) + break; + } + if (ret) { + if (i < children()) { + Fl_Widget *c = child(i); + + theLayout->scrollTo(core::HPOS_INTO_VIEW, core::VPOS_INTO_VIEW, + translateViewXToCanvasX(c->x()), + translateViewYToCanvasY(c->y()), + c->w(), c->h()); + } + return 1; } } break; |