]> gitweb.factorcode.org Git - factor.git/commitdiff
Add support for column filling and alignment to table gadgets
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Mon, 5 Jan 2009 23:31:21 +0000 (17:31 -0600)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Mon, 5 Jan 2009 23:31:21 +0000 (17:31 -0600)
Finish profiler tool's methods tab

basis/ui/gadgets/search-tables/search-tables.factor
basis/ui/gadgets/tables/tables.factor
basis/ui/tools/profiler/profiler.factor

index 508d01dc12b7ef4cc7faaee0ccb8f5f35974b6b6..5ac7f6bdae0c15d83b70741c757275f268421361 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov
+! Copyright (C) 2008, 2009 Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel delegate fry sequences
 models models.search models.delay calendar locals
@@ -28,7 +28,9 @@ TUPLE: search-table < track table field ;
 ! We don't want to delegate all slots, just a few setters
 PROTOCOL: table-protocol
 renderer>> (>>renderer)
-selected-value>> (>>selected-value) ;
+filled-column>> (>>filled-column)
+selected-value>> (>>selected-value)
+column-alignment>> (>>column-alignment) ;
 
 CONSULT: table-protocol search-table table>> ;
 
index 5c247672400a000afc447008684fc64ebf2d3c81..a705b5b2ef5ee7149d6f65785181842de71f6195 100644 (file)
@@ -1,6 +1,6 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays colors fry io.styles kernel locals math
+USING: accessors arrays colors fry io.styles kernel math
 math.geometry.rect math.order math.vectors namespaces opengl
 sequences ui.gadgets ui.gadgets.scrollers ui.gadgets.status-bar
 ui.gadgets.worlds ui.gestures ui.render models math.ranges sequences
@@ -15,11 +15,12 @@ SINGLETON: trivial-renderer
 M: trivial-renderer row-columns drop ;
 
 TUPLE: table < gadget
-    renderer column-widths total-width
-    font text-color selection-color mouse-color
-    selected-index selected-value
-    mouse-index
-    focused? ;
+renderer filled-column column-alignment
+column-widths total-width
+font text-color selection-color mouse-color
+selected-index selected-value
+mouse-index
+focused? ;
 
 : <table> ( rows -- table )
     table new-gadget
@@ -31,6 +32,8 @@ TUPLE: table < gadget
         black >>mouse-color
         black >>text-color ;
 
+<PRIVATE
+
 : line-height ( table -- n )
     font>> open-font "" string-height ;
 
@@ -39,21 +42,36 @@ CONSTANT: table-gap 5
 : table-rows ( table -- rows )
     [ control-value ] [ renderer>> ] bi '[ _ row-columns ] map ;
 
-: column-widths ( font rows -- total widths )
+: column-offsets ( table -- xs )
+    0 [ table-gap + + ] accumulate nip ;
+
+: (compute-column-widths) ( font rows -- total widths )
     [ drop 0 { } ] [
-        tuck [ first length 0 <repetition> ] 2dip [
-            [ string-width ] with map vmax
-        ] with each
-        0 [ table-gap + + ] accumulate
-        [ table-gap - ] dip
+        tuck [ first length 0 <repetition> ] 2dip
+        [ [ string-width ] with map vmax ] with each
+        [ [ sum ] [ length 1 [-] table-gap * ] bi + ] keep
     ] if-empty ;
 
+: compute-column-widths ( table -- total-width column-widths )
+    [ font>> open-font ] [ table-rows ] bi (compute-column-widths) ;
+
 : update-cached-widths ( table -- )
-    dup
-    [ font>> open-font ] [ table-rows ] bi column-widths
-    [ >>total-width ] [ >>column-widths ] bi* drop ;
+    dup compute-column-widths
+    [ >>total-width ] [ >>column-widths ] bi*
+    drop ;
+
+: filled-column-width ( table -- n )
+    [ dim>> first ] [ total-width>> ] bi [-] ;
+
+: update-filled-column ( table -- )
+    [ filled-column-width ]
+    [ filled-column>> ]
+    [ column-widths>> ] tri
+    2dup empty? not and
+    [ [ + ] change-nth ] [ 3drop ] if ;
 
-M: table layout* update-cached-widths ;
+M: table layout*
+    [ update-cached-widths ] [ update-filled-column ] bi ;
 
 : row-rect ( table row -- rect )
     [ [ line-height ] dip * 0 swap 2array ]
@@ -97,25 +115,39 @@ M: table layout* update-cached-widths ;
         y>row
     ] keep validate-row 1+ ;
 
-: draw-row ( widths columns font -- )
-    '[ [ _ ] [ 0 2array ] [ ] tri* swap draw-string ] 2each ;
+: column-loc ( font column width align -- loc )
+    [ [ [ open-font ] dip string-width ] dip swap - ] dip
+    * 0 2array ;
+
+: draw-column ( font column width align -- )
+    over [
+        [ 2dup ] 2dip column-loc draw-string
+    ] dip table-gap + 0 2array gl-translate ;
+
+: draw-row ( columns widths align font -- )
+    '[ [ _ ] 3dip draw-column ] 3each ;
 
 : each-slice-index ( from to seq quot -- )
     [ [ <slice> ] [ drop [a,b) ] 3bi ] dip 2each ; inline
 
-:: draw-rows ( table -- )
-    table font>> :> font
-    table line-height :> line-height
-    table text-color>> gl-color
-    table
-    [ first-visible-row ]
-    [ last-visible-row ]
-    [ control-value ] tri [
-        line-height * 0 swap 2array [
-            table column-widths>>
-            swap
-            table renderer>> row-columns
-            font draw-row
+: column-alignment ( table -- seq )
+    dup column-alignment>>
+    [ ] [ column-widths>> length 0 <repetition> ] ?if ;
+
+: draw-rows ( table -- )
+    {
+        [ text-color>> gl-color ]
+        [ first-visible-row ]
+        [ last-visible-row ]
+        [ control-value ]
+        [ line-height ]
+        [ renderer>> ]
+        [ column-widths>> ]
+        [ column-alignment ]
+        [ font>> ]
+    } cleave '[
+        [ 0 ] dip _ * 2array [
+            _ row-columns _ _ _ draw-row
         ] with-translation
     ] each-slice-index ;
 
@@ -130,12 +162,10 @@ M: table draw-gadget*
     ] if ;
 
 M: table pref-dim*
-    dup update-cached-widths
-    [ total-width>> ] [
-        [ font>> open-font "" string-height ]
-        [ control-value length ]
-        bi *
-    ] bi 2array ;
+    [ compute-column-widths drop ] keep
+    [ font>> open-font "" string-height ]
+    [ control-value length ]
+    bi * 2array ;
 
 : nth-row ( row table -- value/f )
     over [ control-value nth ] [ 2drop f ] if ;
@@ -211,3 +241,5 @@ table H{
     { T{ key-down f f "HOME" } [ first-row ] }
     { T{ key-down f f "END" } [ last-row ] }
 } set-gestures
+
+PRIVATE>
\ No newline at end of file
index f064856ed0f063ff821227b667179ca74cc46a11..3c6dfefe1f2a1c7a3d281d10a7b2ea45be9d5ede 100644 (file)
@@ -1,13 +1,13 @@
-! Copyright (C) 2007, 2008 Slava Pestov.
+! Copyright (C) 2007, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: ui.tools.workspace kernel quotations accessors fry
-assocs present math math.order math.vectors arrays locals
+assocs present math.order math.vectors arrays locals
 models.search models.sort models sequences vocabs
 tools.profiler ui ui.commands ui.gadgets ui.gadgets.panes
 ui.gadgets.scrollers ui.gadgets.tracks ui.gestures
 ui.gadgets.buttons ui.gadgets.tables ui.gadgets.search-tables
 ui.gadgets.labelled ui.gadgets.buttons ui.gadgets.packs
-ui.gadgets.labels ui.gadgets.tabbed words ;
+ui.gadgets.labels ui.gadgets.tabbed words prettyprint ;
 FROM: models.filter => <filter> ;
 FROM: models.compose => <compose> ;
 IN: ui.tools.profiler
@@ -19,12 +19,18 @@ words
 methods
 generic class ;
 
-SINGLETON: profile-renderer
+SINGLETON: word-renderer
 
 ! Value is a { word count } pair
-M: profile-renderer row-columns
+M: word-renderer row-columns
     drop [ [ present ] map ] [ { "All" "" } ] if* ;
 
+SINGLETON: method-renderer
+
+! Value is a { method-body count } pair
+M: method-renderer row-columns
+    drop [ first synopsis ] [ second present ] bi 2array ;
+
 : <profiler-model> ( values profiler -- model )
     [ [ filter-counts ] <filter> ] [ sort>> ] bi* <sort> ;
 
@@ -38,7 +44,10 @@ M: profile-renderer row-columns
     swap dup [ first present subseq? ] [ 2drop t ] if ;
 
 : <profiler-table> ( model -- table )
-    [ match? ] <search-table> profile-renderer >>renderer ;
+    [ match? ] <search-table>
+        word-renderer >>renderer
+        { 0 1 } >>column-alignment
+        0 >>filled-column ;
 
 : <profiler-filter-model> ( counts profiler -- model' )
     [ <model> ] dip <profiler-model> [ f prefix ] <filter> ;
@@ -59,9 +68,11 @@ M: profile-renderer row-columns
     3bi and ;
 
 : <methods-model> ( profiler -- model )
-    [ method-counters <model> ] dip
-    [ generic>> ] [ class>> ] bi 3array <compose>
-    [ first3 '[ _ _ method-matches? ] filter ] <filter> ;
+    [
+        [ method-counters <model> ] dip
+        [ generic>> ] [ class>> ] bi 3array <compose>
+        [ first3 '[ _ _ method-matches? ] filter ] <filter>
+    ] keep <profiler-model> ;
 
 : sort-options ( -- alist )
     {
@@ -102,6 +113,7 @@ M: profile-renderer row-columns
         1/2 track-add
     1/2 track-add
         profiler methods>> <profiler-table>
+            method-renderer >>renderer
         "Methods" <labelled-gadget>
     1/2 track-add ;