Add support for column filling and alignment to table gadgets

Finish profiler tool's methods tab
db4
Slava Pestov 2009-01-05 17:31:21 -06:00
parent cb3102f9d1
commit 872d12d29b
3 changed files with 96 additions and 50 deletions

View 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. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors kernel delegate fry sequences USING: accessors kernel delegate fry sequences
models models.search models.delay calendar locals 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 ! We don't want to delegate all slots, just a few setters
PROTOCOL: table-protocol PROTOCOL: table-protocol
renderer>> (>>renderer) renderer>> (>>renderer)
selected-value>> (>>selected-value) ; filled-column>> (>>filled-column)
selected-value>> (>>selected-value)
column-alignment>> (>>column-alignment) ;
CONSULT: table-protocol search-table table>> ; CONSULT: table-protocol search-table table>> ;

View 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. ! 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 math.geometry.rect math.order math.vectors namespaces opengl
sequences ui.gadgets ui.gadgets.scrollers ui.gadgets.status-bar sequences ui.gadgets ui.gadgets.scrollers ui.gadgets.status-bar
ui.gadgets.worlds ui.gestures ui.render models math.ranges sequences ui.gadgets.worlds ui.gestures ui.render models math.ranges sequences
@ -15,11 +15,12 @@ SINGLETON: trivial-renderer
M: trivial-renderer row-columns drop ; M: trivial-renderer row-columns drop ;
TUPLE: table < gadget TUPLE: table < gadget
renderer column-widths total-width renderer filled-column column-alignment
font text-color selection-color mouse-color column-widths total-width
selected-index selected-value font text-color selection-color mouse-color
mouse-index selected-index selected-value
focused? ; mouse-index
focused? ;
: <table> ( rows -- table ) : <table> ( rows -- table )
table new-gadget table new-gadget
@ -31,6 +32,8 @@ TUPLE: table < gadget
black >>mouse-color black >>mouse-color
black >>text-color ; black >>text-color ;
<PRIVATE
: line-height ( table -- n ) : line-height ( table -- n )
font>> open-font "" string-height ; font>> open-font "" string-height ;
@ -39,21 +42,36 @@ CONSTANT: table-gap 5
: table-rows ( table -- rows ) : table-rows ( table -- rows )
[ control-value ] [ renderer>> ] bi '[ _ row-columns ] map ; [ 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 { } ] [ [ drop 0 { } ] [
tuck [ first length 0 <repetition> ] 2dip [ tuck [ first length 0 <repetition> ] 2dip
[ string-width ] with map vmax [ [ string-width ] with map vmax ] with each
] with each [ [ sum ] [ length 1 [-] table-gap * ] bi + ] keep
0 [ table-gap + + ] accumulate
[ table-gap - ] dip
] if-empty ; ] if-empty ;
: update-cached-widths ( table -- ) : compute-column-widths ( table -- total-width column-widths )
dup [ font>> open-font ] [ table-rows ] bi (compute-column-widths) ;
[ font>> open-font ] [ table-rows ] bi column-widths
[ >>total-width ] [ >>column-widths ] bi* drop ;
M: table layout* update-cached-widths ; : update-cached-widths ( table -- )
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 ] [ update-filled-column ] bi ;
: row-rect ( table row -- rect ) : row-rect ( table row -- rect )
[ [ line-height ] dip * 0 swap 2array ] [ [ line-height ] dip * 0 swap 2array ]
@ -97,25 +115,39 @@ M: table layout* update-cached-widths ;
y>row y>row
] keep validate-row 1+ ; ] keep validate-row 1+ ;
: draw-row ( widths columns font -- ) : column-loc ( font column width align -- loc )
'[ [ _ ] [ 0 2array ] [ ] tri* swap draw-string ] 2each ; [ [ [ 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 -- ) : each-slice-index ( from to seq quot -- )
[ [ <slice> ] [ drop [a,b) ] 3bi ] dip 2each ; inline [ [ <slice> ] [ drop [a,b) ] 3bi ] dip 2each ; inline
:: draw-rows ( table -- ) : column-alignment ( table -- seq )
table font>> :> font dup column-alignment>>
table line-height :> line-height [ ] [ column-widths>> length 0 <repetition> ] ?if ;
table text-color>> gl-color
table : draw-rows ( table -- )
[ first-visible-row ] {
[ last-visible-row ] [ text-color>> gl-color ]
[ control-value ] tri [ [ first-visible-row ]
line-height * 0 swap 2array [ [ last-visible-row ]
table column-widths>> [ control-value ]
swap [ line-height ]
table renderer>> row-columns [ renderer>> ]
font draw-row [ column-widths>> ]
[ column-alignment ]
[ font>> ]
} cleave '[
[ 0 ] dip _ * 2array [
_ row-columns _ _ _ draw-row
] with-translation ] with-translation
] each-slice-index ; ] each-slice-index ;
@ -130,12 +162,10 @@ M: table draw-gadget*
] if ; ] if ;
M: table pref-dim* M: table pref-dim*
dup update-cached-widths [ compute-column-widths drop ] keep
[ total-width>> ] [ [ font>> open-font "" string-height ]
[ font>> open-font "" string-height ] [ control-value length ]
[ control-value length ] bi * 2array ;
bi *
] bi 2array ;
: nth-row ( row table -- value/f ) : nth-row ( row table -- value/f )
over [ control-value nth ] [ 2drop f ] if ; 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 "HOME" } [ first-row ] }
{ T{ key-down f f "END" } [ last-row ] } { T{ key-down f f "END" } [ last-row ] }
} set-gestures } set-gestures
PRIVATE>

View 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. ! See http://factorcode.org/license.txt for BSD license.
USING: ui.tools.workspace kernel quotations accessors fry 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 models.search models.sort models sequences vocabs
tools.profiler ui ui.commands ui.gadgets ui.gadgets.panes tools.profiler ui ui.commands ui.gadgets ui.gadgets.panes
ui.gadgets.scrollers ui.gadgets.tracks ui.gestures ui.gadgets.scrollers ui.gadgets.tracks ui.gestures
ui.gadgets.buttons ui.gadgets.tables ui.gadgets.search-tables ui.gadgets.buttons ui.gadgets.tables ui.gadgets.search-tables
ui.gadgets.labelled ui.gadgets.buttons ui.gadgets.packs 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.filter => <filter> ;
FROM: models.compose => <compose> ; FROM: models.compose => <compose> ;
IN: ui.tools.profiler IN: ui.tools.profiler
@ -19,12 +19,18 @@ words
methods methods
generic class ; generic class ;
SINGLETON: profile-renderer SINGLETON: word-renderer
! Value is a { word count } pair ! Value is a { word count } pair
M: profile-renderer row-columns M: word-renderer row-columns
drop [ [ present ] map ] [ { "All" "" } ] if* ; 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 ) : <profiler-model> ( values profiler -- model )
[ [ filter-counts ] <filter> ] [ sort>> ] bi* <sort> ; [ [ filter-counts ] <filter> ] [ sort>> ] bi* <sort> ;
@ -38,7 +44,10 @@ M: profile-renderer row-columns
swap dup [ first present subseq? ] [ 2drop t ] if ; swap dup [ first present subseq? ] [ 2drop t ] if ;
: <profiler-table> ( model -- table ) : <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' ) : <profiler-filter-model> ( counts profiler -- model' )
[ <model> ] dip <profiler-model> [ f prefix ] <filter> ; [ <model> ] dip <profiler-model> [ f prefix ] <filter> ;
@ -59,9 +68,11 @@ M: profile-renderer row-columns
3bi and ; 3bi and ;
: <methods-model> ( profiler -- model ) : <methods-model> ( profiler -- model )
[ method-counters <model> ] dip [
[ generic>> ] [ class>> ] bi 3array <compose> [ method-counters <model> ] dip
[ first3 '[ _ _ method-matches? ] filter ] <filter> ; [ generic>> ] [ class>> ] bi 3array <compose>
[ first3 '[ _ _ method-matches? ] filter ] <filter>
] keep <profiler-model> ;
: sort-options ( -- alist ) : sort-options ( -- alist )
{ {
@ -102,6 +113,7 @@ M: profile-renderer row-columns
1/2 track-add 1/2 track-add
1/2 track-add 1/2 track-add
profiler methods>> <profiler-table> profiler methods>> <profiler-table>
method-renderer >>renderer
"Methods" <labelled-gadget> "Methods" <labelled-gadget>
1/2 track-add ; 1/2 track-add ;