ui.gadgets.charts.lines ui.gadgets.charts.utils ui.render ;
IN: ui.gadgets.charts.axes
-TUPLE: axis < gadget vertical? color ;
+TUPLE: axis < gadget color ;
+TUPLE: vertical-axis < axis ;
+TUPLE: horizontal-axis < axis ;
<PRIVATE
:: 0x-y-chunk ( x y -- chunk ) 0 y 2array x y 2array 2array ;
: flip-y ( axis-y xmax ymax -- xmax axis-y' ) rot - ;
-: ?[x/y] ( ? -- quot )
- [ x ] [ y ] ? [ call( a -- b ) ] curry ; inline
+GENERIC: axis-line ( pos xmax ymax axis -- chunk )
+GENERIC: chart-dims ( chart axis -- pixel-width axis-min,max )
+
+M: vertical-axis axis-line
+ drop nip x-0y-chunk ;
+
+M: horizontal-axis axis-line
+ drop flip-y 0x-y-chunk ;
+
+M: vertical-axis chart-dims
+ drop [ dim>> x ] [ chart-axes x ] bi ;
+
+M: horizontal-axis chart-dims
+ drop [ dim>> y ] [ chart-axes y ] bi ;
PRIVATE>
M: axis draw-gadget*
dup parent>> dup chart? [| axis chart |
- axis vertical?>> :> vert?
- chart dim>> :> dim
COLOR: black axis default-color
- dim chart chart-axes vert? ?[x/y] bi@
- [ axis-pos ] keep first2 swap scale
- dim first2 vert? [ nip x-0y-chunk ] [ flip-y 0x-y-chunk ] if
- draw-line
+ chart axis chart-dims [ axis-pos ] keep first2 swap scale
+ chart dim>> first2 axis axis-line draw-line
] [ 2drop ] if ;
chart new ${ ${ -pi pi } { -1 1 } } >>axes
line new COLOR: blue >>color n sine-wave >>data add-gadget
line new COLOR: red >>color n cosine-wave >>data add-gadget
- axis new add-gadget
- axis new t >>vertical? add-gadget
+ vertical-axis new add-gadget
+ horizontal-axis new add-gadget
"Chart" open-window ;
PRIVATE>