From 0e2a00fca71ffd52406277d96b6b01a6fe63c08f Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 23 Oct 2005 20:18:07 +0000 Subject: [PATCH] fix another scrolling bug in the UI --- library/ui/gadgets.factor | 12 ++++++++++-- library/ui/hierarchy.factor | 3 +++ library/ui/scrolling.factor | 21 ++++++++++++++------- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/library/ui/gadgets.factor b/library/ui/gadgets.factor index fc287d4b09..9306a6816f 100644 --- a/library/ui/gadgets.factor +++ b/library/ui/gadgets.factor @@ -18,20 +18,28 @@ M: array rect-dim drop @{ 0 0 0 }@ ; : rect-extent ( rect -- loc ext ) rect-bounds over v+ ; +: 2rect-extent ( rect rect -- loc1 loc2 ext1 ext2 ) + [ rect-extent ] 2apply swapd ; + : |v-| ( vec vec -- vec ) v- [ 0 max ] map ; +: ( loc ext ) dupd swap |v-| ; + : >absolute ( rect -- rect ) rect-bounds >r origin get v+ r> ; : (rect-intersect) ( rect rect -- array array ) - [ rect-extent ] 2apply swapd vmin >r vmax r> ; + 2rect-extent vmin >r vmax r> ; : rect-intersect ( rect rect -- rect ) - (rect-intersect) dupd swap |v-| ; + (rect-intersect) ; : intersects? ( rect/point rect -- ? ) (rect-intersect) v- [ 0 <= ] all? ; +: rect-union ( rect rect -- rect ) + 2rect-extent vmax >r vmin r> ; + ! A gadget is a rectangle, a paint, a mapping of gestures to ! actions, and a reference to the gadget's parent. TUPLE: gadget diff --git a/library/ui/hierarchy.factor b/library/ui/hierarchy.factor index a27334b58f..0f2d90bd84 100644 --- a/library/ui/hierarchy.factor +++ b/library/ui/hierarchy.factor @@ -62,6 +62,9 @@ namespaces sequences vectors ; : relative ( g1 g2 -- g2-g1 ) screen-loc swap screen-loc v- ; +: relative-rect ( g1 g2 -- rect ) + [ relative ] keep rect-dim ; + : child? ( parent child -- ? ) parents memq? ; GENERIC: focusable-child* ( gadget -- gadget/t ) diff --git a/library/ui/scrolling.factor b/library/ui/scrolling.factor index ff6dce0716..a38838d998 100644 --- a/library/ui/scrolling.factor +++ b/library/ui/scrolling.factor @@ -44,15 +44,22 @@ M: viewport pref-dim gadget-child pref-dim ; 2dup over scroller-x update-slider over scroller-y update-slider ; -: (scroll-to) ( scroller gadget -- point ) - >r scroller-viewport gadget-child r> relative ; +: pop-follows ( scroller -- follows ) + dup scroller-follows f rot set-scroller-follows ; + +: (do-scroll) ( gadget viewport -- point ) + [ [ swap relative-rect ] keep rect-union ] keep + [ rect-extent v+ ] 2apply v- ; + +: do-scroll ( scroller -- delta ) + dup pop-follows dup [ + swap scroller-viewport (do-scroll) + ] [ + 2drop @{ 0 0 0 }@ + ] if ; : update-scroller ( scroller -- ) - dup dup scroller-follows dup [ - f pick set-scroller-follows (scroll-to) - ] [ - drop scroller-origin - ] if scroll ; + [ dup do-scroll ] keep scroller-origin v+ scroll ; : position-viewport ( viewport scroller -- ) scroller-origin vneg swap gadget-child set-rect-loc ;