TUPLE: line-gadget < gadget
font selection-color
min-rows max-rows
-min-cols max-cols ;
+min-cols max-cols
+line-leading line-height
+pref-viewport-dim ;
: new-line-gadget ( class -- gadget )
new
selection-color >>selection-color ;
+GENERIC: line-leading* ( gadget -- n )
+
+M: line-gadget line-leading* font>> font-metrics leading>> ;
+
GENERIC: line-leading ( gadget -- n )
-M: line-gadget line-leading font>> font-metrics leading>> ;
+M: line-gadget line-leading
+ dup line-leading>>
+ [ ] [
+ [ line-leading* ] [ ] [ layout-state>> ] tri
+ [ drop ] [ dupd line-leading<< ] if
+ ] ?if ;
+
+GENERIC: line-height* ( gadget -- n )
+
+M: line-gadget line-height* font>> font-metrics height>> ceiling ;
GENERIC: line-height ( gadget -- n )
-M: line-gadget line-height font>> font-metrics height>> ceiling ;
+M: line-gadget line-height
+ dup line-height>>
+ [ ] [
+ [ line-height* ] [ ] [ layout-state>> ] tri
+ [ drop ] [ dupd line-height<< ] if
+ ] ?if ;
: y>line ( y gadget -- n ) line-height /i ;
: line-gadget-height ( pref-dim gadget -- h )
[ second ] [ [ line-height ] [ min-rows>> ] [ max-rows>> ] tri ] bi* clamp ;
-M: line-gadget pref-viewport-dim
+: pref-viewport-dim* ( gadget -- dim )
[ pref-dim ] [ ] bi
[ line-gadget-width ]
[ line-gadget-height ]
- 2bi 2array ;
+ 2bi 2array ; inline
+
+M: line-gadget pref-viewport-dim
+ dup pref-viewport-dim>>
+ [ ] [
+ [ pref-viewport-dim* ] [ ] [ layout-state>> ] tri
+ [ drop ] [ dupd pref-viewport-dim<< ] if
+ ] ?if ;
: visible-lines ( gadget -- n )
[ visible-dim second ] [ line-height ] bi /i ;
selection
mouse-index
{ takes-focus? initial: t }
-focused? ;
+focused?
+rows ;
: new-table ( rows renderer class -- table )
new-line-gadget
: table-rows ( table -- rows )
[ control-value ] [ renderer>> ] bi '[ _ row-columns ] map ;
+: update-table-rows ( table -- )
+ [ table-rows ] [ rows<< ] bi ; inline
+
: column-offsets ( widths gap -- x xs )
[ 0 ] dip '[ _ + + ] accumulate ;
swap [ column-offsets drop ] keep - ;
: compute-column-widths ( table -- total widths )
- dup table-rows [ drop 0 { } ] [
+ dup rows>> [ drop 0 { } ] [
[ drop gap>> ] [ initial-widths ] [ ] 2tri
[ row-column-widths vmax ] with each
[ compute-total-width ] keep
[ [ + ] change-nth ] [ 3drop ] if ;
M: table layout*
- [ update-cached-widths ] [ update-filled-column ] bi ;
+ [ update-table-rows ]
+ [ update-cached-widths ]
+ [ update-filled-column ] tri ;
: row-rect ( table row -- rect )
[ [ line-height ] dip * 0 swap 2array ]
] with-variable
] if ;
-M: table line-height ( table -- y )
+M: table line-height* ( table -- y )
[ font>> ] [ renderer>> prototype-row ] bi
[ [ cell-height ] [ cell-padding ] bi + ] with
[ max ] map-reduce ;
: prev/next-row ( table n -- )
[ dup selection-index>> value>> ] dip
'[ _ + ] [ 0 ] if* select-row ;
-
+
: previous-row ( table -- )
-1 prev/next-row ;
TUPLE: tool < track ;
M: tool pref-dim*
- { [ class-of tool-dims get at ] [ call-next-method ] } 1|| ;
+ { [ class-of tool-dims get-global at ] [ call-next-method ] } 1|| ;
M: tool layout*
[ call-next-method ]
- [ [ dim>> ] [ class-of ] bi tool-dims get set-at ]
+ [ [ dim>> ] [ class-of ] bi tool-dims get-global set-at ]
bi ;
-: set-tool-dim ( dim class -- ) tool-dims get set-at ;
+: set-tool-dim ( dim class -- ) tool-dims get-global set-at ;
SLOT: scroller