]> gitweb.factorcode.org Git - factor.git/commitdiff
splitter control in the UI works, improving panes, various UI cleanups
authorSlava Pestov <slava@factorcode.org>
Sun, 26 Jun 2005 00:39:53 +0000 (00:39 +0000)
committerSlava Pestov <slava@factorcode.org>
Sun, 26 Jun 2005 00:39:53 +0000 (00:39 +0000)
14 files changed:
library/collections/lists.factor
library/collections/sequences.factor
library/math/matrices.factor
library/sdl/sdl-utils.factor
library/syntax/parse-numbers.factor
library/test/sequences.factor
library/ui/colors.factor [new file with mode: 0644]
library/ui/gadgets.factor
library/ui/init-world.factor
library/ui/panes.factor
library/ui/scrolling.factor
library/ui/splitters.factor
library/ui/tool-menus.factor
library/ui/world.factor

index 4c7321e1e144f84b59b85f2dbc1b8ca75789e2f8..853d0f649f6e60172d148df61e1172871fbd2e8a 100644 (file)
@@ -64,7 +64,7 @@ M: general-list contains? ( obj list -- ? )
     2dup contains? [ nip ] [ cons ] ifte ;
 
 M: general-list reverse ( list -- list )
-    [ ] swap [ swons ] each ;
+    [ ] [ swons ] reduce ;
 
 M: f map ( list quot -- list ) drop ;
 
index 0e18791a8017f55cd69343a8a41a33bc1f54ec7a..62ae725d551716a4e419fe8d7b76a60bb651c7f4 100644 (file)
@@ -32,6 +32,9 @@ G: each ( seq quot -- | quot: elt -- )
 : each-with ( obj seq quot -- | quot: obj elt -- )
     swap [ with ] each 2drop ; inline
 
+: reduce ( list identity quot -- value | quot: x y -- z )
+    swapd each ; inline
+
 G: tree-each ( obj quot -- | quot: elt -- )
     [ over ] [ type ] ; inline
 
@@ -44,6 +47,9 @@ G: map ( seq quot -- seq | quot: elt -- elt )
 : map-with ( obj list quot -- list | quot: obj elt -- elt )
     swap [ with rot ] map 2nip ; inline
 
+: accumulate ( list identity quot -- values | quot: x y -- z )
+    rot [ pick >r swap call r> ] map-with nip ; inline
+
 G: 2map ( seq seq quot -- seq | quot: elt elt -- elt )
     [ over ] [ type ] ; inline
 
index 6461708ce3bc9fc77ca8a69c7287d28d048c4c10..bc0256935ea80a1414a28ebb6c9eefc15386d650 100644 (file)
@@ -17,8 +17,11 @@ vectors ;
 : vmin ( v v -- v ) [ min ] 2map ;
 : vneg ( v -- v ) [ neg ] map ;
 
-: sum ( v -- n ) 0 swap [ + ] each ;
-: product 1 swap [ * ] each ;
+: sum ( v -- n ) 0 [ + ] reduce ;
+: product 1 [ * ] reduce ;
+
+: set-axis ( x y axis -- v )
+    2dup v* >r >r drop dup r> v* v- r> v+ ;
 
 ! Later, this will fixed when 2each works properly
 ! : v. ( v v -- x ) 0 swap [ conjugate * + ] 2each ;
index 560cefffb7fcc09f4afff495f6064be84058108f..456db2085b6c8704a8da1b9493fab5d968e5bcc7 100644 (file)
@@ -43,13 +43,6 @@ SYMBOL: surface
     [ set-rect-y ] keep
     [ set-rect-x ] keep ;
 
-: black [ 0   0   0   ] ;
-: gray  [ 128 128 128 ] ;
-: white [ 255 255 255 ] ;
-: red   [ 255 0   0   ] ;
-: green [ 0   255 0   ] ;
-: blue  [ 0   0   255 ] ;
-
 : with-pixels ( quot -- )
     width get [
         height get [
index 3d13500479e95d9959017f3a8a95322b5ac736f2..825fa91b27b51add16ba6edb0ec888b2f8203133 100644 (file)
@@ -20,7 +20,7 @@ M: object digit> not-a-number ;
     dup empty? [
         not-a-number
     ] [
-        0 swap [ digit> pick digit+ ] each nip
+        0 [ digit> pick digit+ ] reduce nip
     ] ifte ;
 
 : base> ( str base -- num )
index 894068bf1c44b54afb79c8c94e4fcb55dcb17ef9..123bc8afa3f858b2a0410aec504a29038c83047c 100644 (file)
@@ -1,5 +1,5 @@
 IN: temporary
-USING: lists sequences test vectors ;
+USING: lists math sequences test vectors ;
 
 [ [ 1 2 3 4 ] ] [ 1 5 <range> >list ] unit-test
 [ 3 ] [ 1 4 <range> length ] unit-test
@@ -14,3 +14,8 @@ USING: lists sequences test vectors ;
 [ "cba" ] [ 3 "abcdef" head-slice reverse ] unit-test
 
 [ 1 2 3 ] [ 1 2 3 3vector 3unseq ] unit-test
+
+[ 5040 ] [ [ 1 2 3 4 5 6 7 ] 1 [ * ] reduce ] unit-test
+
+[ [ 1 1 2 6 24 120 720 ] ]
+[ [ 1 2 3 4 5 6 7 ] 1 [ * ] accumilate ] unit-test
diff --git a/library/ui/colors.factor b/library/ui/colors.factor
new file mode 100644 (file)
index 0000000..9ba8bac
--- /dev/null
@@ -0,0 +1,8 @@
+IN: gadgets
+
+: black [ 0   0   0   ] ;
+: gray  [ 128 128 128 ] ;
+: white [ 255 255 255 ] ;
+: red   [ 255 0   0   ] ;
+: green [ 0   255 0   ] ;
+: blue  [ 0   0   255 ] ;
index 18dd30b3a104ff3155aff76ebaa0d1337c59fff6..8610a394a91d95f8617dc4f66f4b852baff21e38 100644 (file)
@@ -90,11 +90,3 @@ M: gadget layout*
 GENERIC: user-input* ( ch gadget -- ? )
 
 M: gadget user-input* 2drop t ;
-
-GENERIC: orientation ( gadget -- vector )
-
-: orient* ( x y axis -- v )
-    2dup v* >r >r drop dup r> v* v- r> v+ ;
-
-: orient ( x y gadget -- vec )
-    orientation orient* ;
index 9d27e0ee818e6b5215ccc9d31d45e7554395ad26..5b5b9ccda479ec0ae7be884d1bf34a1556a04ab2 100644 (file)
@@ -16,4 +16,10 @@ global [
     }} world get set-gadget-paint
     
     1024 768 world get resize-gadget
+    
+    <plain-gadget> world get add-gadget
+
+    <console> "Stack display goes here" <label> <y-splitter>
+    3/4 over set-splitter-split
+    world get add-gadget
 ] bind
index ff9919781d0a32e927414d8d618ce6dfa1e22c0e..2961195ac9907fbf6724102bfbdcd6d91971f065 100644 (file)
@@ -7,15 +7,20 @@ sequences io strings threads ;
 ! A pane is an area that can display text.
 
 ! output: pile
-! current: label
+! current: shelf
 ! input: editor
-TUPLE: pane output current input continuation ;
+TUPLE: pane output active current input continuation ;
 
 : add-output 2dup set-pane-output add-gadget ;
 : add-input 2dup set-pane-input add-gadget ;
 
-: <active-line> ( current input -- line )
-    <line-shelf> [ tuck add-gadget add-gadget ] keep ;
+: <active-line> ( input current -- line )
+    <line-shelf> [ add-gadget ] keep [ add-gadget ] keep ;
+
+: init-active-line ( pane -- )
+    dup pane-active [ unparent ] when*
+    [ dup pane-input swap pane-current <active-line> ] keep
+    2dup set-pane-active add-gadget ;
 
 : pane-paint ( pane -- )
     [[ "Monospaced" 12 ]] font set-paint-prop ;
@@ -43,22 +48,18 @@ TUPLE: pane output current input continuation ;
 C: pane ( -- pane )
     <line-pile> over set-delegate
     <line-pile> over add-output
-    "" <label> dup pick set-pane-current >r
-    "" <editor> dup pick set-pane-input r>
-    <active-line> over add-gadget
+    "" <label> over set-pane-current
+    "" <editor> over set-pane-input
+    dup init-active-line
     dup pane-paint
     dup pane-actions ;
 
-: add-line ( text pane -- )
-    >r <label> r> pane-output add-gadget ;
-
 : pane-write-1 ( text pane -- )
-    pane-current dup label-text rot append over set-label-text
-    relayout ;
+    >r <label> r> pane-current add-gadget ;
 
 : pane-terpri ( pane -- )
-    dup pane-current dup label-text rot add-line
-    "" over set-label-text relayout ;
+    dup pane-current over pane-output add-gadget
+    <line-shelf> over set-pane-current init-active-line ;
 
 : pane-write ( pane list -- )
     2dup car swap pane-write-1
@@ -81,12 +82,12 @@ M: pane stream-write-attr ( string style stream -- )
 M: pane stream-close ( stream -- ) drop ;
 
 : <console> ( -- pane )
-    <pane> dup [
-        [ clear  print-banner listener ] in-thread
-    ] with-stream ;
+    <pane> dup
+    [ [ clear  print-banner listener ] in-thread ] with-stream
+    <scroller> ;
 
 : console ( -- )
     #! Open an UI console window.
-    <console> <scroller> "Listener" <tile> world get [
+    <console> "Listener" <tile> world get [
         shape-size rect> 3/4 * >rect rot resize-gadget
     ] 2keep add-gadget ;
index 127079ac88776d7fd29f24b649004e02af52b86c..20b8863c4b80ac610823cc0ad0d585b78c05cf61 100644 (file)
@@ -78,7 +78,7 @@ TUPLE: slider viewport thumb vector ;
 
 : <thumb> ( -- thumb )
     <plain-gadget>
-    dup t reverse-video set-paint-prop
+    dup gray background set-paint-prop
     dup thumb-actions ;
 
 : add-thumb ( thumb slider -- )
index edc310ffc4a866f4313e60bee581d396b812d097..3f4c0ee1b428c4fbfd8056fad13c79b171b79eaa 100644 (file)
@@ -1,21 +1,33 @@
 ! Copyright (C) 2005 Slava Pestov.
 ! See http://factor.sf.net/license.txt for BSD license.
 IN: gadgets
-USING: generic kernel lists matrices namespaces sequences ;
+USING: generic kernel lists math matrices namespaces sequences ;
 
 TUPLE: divider splitter ;
 
-C: divider ( -- divider )
-    <plain-gadget> over set-delegate
-    dup t reverse-video set-paint-prop ;
-
 : divider-size { 8 8 0 } ;
 
 M: divider pref-size drop divider-size 3unseq drop ;
 
 TUPLE: splitter vector split ;
 
-M: splitter orientation splitter-vector ;
+: hand>split ( splitter -- n )
+    hand relative hand hand-click-rel v- divider-size 1/2 v*n v+ ;
+
+: divider-motion ( splitter -- )
+    dup hand>split
+    over shape-dim { 1 1 1 } vmax v/ over splitter-vector v.
+    0 max 1 min over set-splitter-split relayout ;
+
+: divider-actions ( thumb -- )
+    dup [ drop ] [ button-down 1 ] set-action
+    dup [ drop ] [ button-up 1 ] set-action
+    [ gadget-parent divider-motion ] [ drag 1 ] set-action ;
+
+C: divider ( -- divider )
+    <plain-gadget> over set-delegate
+    dup t reverse-video set-paint-prop
+    dup divider-actions ;
 
 C: splitter ( first second vector -- splitter )
     <empty-gadget> over set-delegate
@@ -26,16 +38,16 @@ C: splitter ( first second vector -- splitter )
     [ add-gadget ] keep
     1/2 over set-splitter-split ;
 
-: <x-splitter> { 1 0 0 } <splitter> ;
+: <x-splitter> { 0 1 0 } <splitter> ;
 
-: <y-splitter> { 0 1 0 } <splitter> ;
+: <y-splitter> { 1 0 0 } <splitter> ;
 
 M: splitter pref-size
     [
         gadget-children [ pref-dim ] map
-        dup { 0 0 0 } swap [ vmax ] each
-        swap { 0 0 0 } swap [ v+ ] each
-    ] keep orient 3unseq drop ;
+        dup { 0 0 0 } [ vmax ] reduce
+        swap { 0 0 0 } [ v+ ] reduce
+    ] keep splitter-vector set-axis 3unseq drop ;
 
 : splitter-part ( splitter -- vec )
     dup splitter-split swap shape-dim n*v divider-size 1/2 v*n v- ;
@@ -47,10 +59,22 @@ M: splitter pref-size
         dup shape-dim swap splitter-part v- ,
     ] make-list ;
 
+: packed-locs ( axis sizes gadget -- )
+    >r
+    { 0 0 0 } [ v+ ] accumulate
+    [ { 0 0 0 } swap rot set-axis ] map-with
+    r> gadget-children zip [ uncons set-gadget-loc ] each ;
+
+: packed-dims ( axis sizes gadget -- dims )
+    [
+        shape-dim swap [ >r 2dup r> rot set-axis ] map 2nip
+    ] keep gadget-children zip [ uncons set-gadget-dim ] each ;
+
 : layout-divider ( assoc -- )
     [ uncons set-gadget-dim ] each ;
 
+: packed-layout ( axis sizes gadgets -- )
+    3dup packed-locs packed-dims ;
+
 M: splitter layout* ( splitter -- )
-    [
-        dup splitter-layout [ nip ( { 0 0 0 } rot orient ) ] map-with
-    ] keep gadget-children zip layout-divider ;
+    dup splitter-vector over splitter-layout rot packed-layout ;
index 49f634f40aad84519d3b4138c263a8734b270229..20e3873a8b310421a0a4003aa1d7f09d1a66d266 100644 (file)
@@ -15,4 +15,4 @@ SYMBOL: root-menu
     [[ "Exit" [ f world get set-world-running? ] ]]
 ] root-menu set
 
-world get [ drop show-root-menu ] [ button-down 1 ] set-action
+world get [ drop show-root-menu ] [ button-down 1 ] set-action
index 68f41558d3c9e923945d793fd481404d06838682..4875cb8173765cd64c19661821c7a3dc724a329c 100644 (file)
@@ -11,11 +11,8 @@ threads sequences ;
 ! open at any one time.
 TUPLE: world running? hand menu ;
 
-: <world-box> ( -- box )
-    <plain-gadget> ;
-
 C: world ( -- world )
-    <world-box> over set-delegate
+    f <stack> over set-delegate
     t over set-world-running?
     dup <hand> over set-world-hand ;