]> gitweb.factorcode.org Git - factor.git/commitdiff
missing file; scrollbar work
authorSlava Pestov <slava@factorcode.org>
Sat, 27 Aug 2005 03:06:56 +0000 (03:06 +0000)
committerSlava Pestov <slava@factorcode.org>
Sat, 27 Aug 2005 03:06:56 +0000 (03:06 +0000)
library/generic/early-generic.factor [new file with mode: 0644]
library/ui/scrolling.factor
library/ui/sliders.factor

diff --git a/library/generic/early-generic.factor b/library/generic/early-generic.factor
new file mode 100644 (file)
index 0000000..fd421ba
--- /dev/null
@@ -0,0 +1,14 @@
+! Copyright (C) 2004, 2005 Slava Pestov.
+! See http://factor.sf.net/license.txt for BSD license.
+IN: generic
+USING: kernel kernel-internals ;
+
+DEFER: standard-combination
+
+DEFER: math-combination
+
+: delegate ( object -- delegate )
+    dup tuple? [ 3 slot ] [ drop f ] ifte ; inline
+
+: set-delegate ( delegate tuple -- )
+    dup tuple? [ 3 set-slot ] [ drop drop ] ifte ; inline
index e72997e0cf1307f6aaae0b628926ad678b4d4a4f..f8800500935058d77785779400a9ce32fa2e2c61 100644 (file)
@@ -44,7 +44,7 @@ M: viewport focusable-child* ( viewport -- gadget )
     dup rect-dim pick slider-vector v. pick set-slider-page
     dup viewport-dim over rect-dim vmax pick slider-vector v. pick set-slider-max
     scroller-viewport dup viewport-origin over fix-scroll vneg pick slider-vector v. pick set-slider-value
-    2drop ;
+    drop slider-elevator relayout ;
 
 : update-sliders ( scroller -- )
     dup
@@ -52,6 +52,7 @@ M: viewport focusable-child* ( viewport -- gadget )
     dup scroller-y swap update-slider ;
 
 : scroll ( origin scroller -- )
+    dup update-sliders
     scroller-viewport
     [ [ fix-scroll ] keep set-viewport-origin ] keep relayout ;
 
index 0def5a231ad82e0f1083c01b13faa4d935e9340e..7ef3afadea7e548e584d30cb5c9b233a67bc4283 100644 (file)
@@ -14,6 +14,17 @@ TUPLE: slider vector elevator thumb value max page ;
 
 : find-slider [ slider? ] find-parent ;
 
+: slider-scale ( slider -- n )
+    #! A scaling factor such that if x is a slider co-ordinate,
+    #! x*n is the screen position of the thumb, and conversely
+    #! for x/n. The '1 max' calls avoid division by zero.
+    dup slider-elevator rect-dim over slider-vector v. 1 max
+    swap slider-max 1 max / ;
+
+: slider>screen slider-scale * ;
+
+: screen>slider slider-scale / ;
+
 : elevator-click ( elevator pos -- )
     2drop ;
 
@@ -39,13 +50,11 @@ C: elevator ( -- elevator )
     <plain-gadget> over set-delegate
     dup elevator-theme dup elevator-actions ;
 
-: >thumb ( n slider -- n )
-    [ slider-max 1 max / ] keep
-    dup slider-elevator rect-dim swap slider-vector v. * ;
-
-: thumb-loc ( slider -- loc ) dup slider-value swap >thumb ;
+: thumb-loc ( slider -- loc )
+    dup slider-value swap slider>screen ;
 
-: thumb-dim ( slider -- h ) dup slider-page swap >thumb ;
+: thumb-dim ( slider -- h )
+    dup slider-page swap slider>screen ;
 
 : thumb-min { 12 12 0 } ;