]> gitweb.factorcode.org Git - factor.git/blob - basis/ui/render/render.factor
reset frame inset when windows dwm is toggled off and on, and use the system dialog...
[factor.git] / basis / ui / render / render.factor
1 ! Copyright (C) 2005, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: math.rectangles math.vectors namespaces kernel accessors
4 assocs combinators sequences opengl opengl.gl colors
5 colors.constants ui.backend ui.gadgets ui.pens ;
6 IN: ui.render
7
8 SYMBOL: clip
9
10 SYMBOL: viewport-translation
11
12 : flip-rect ( rect -- loc dim )
13     rect-bounds [
14         [ { 1 -1 } v* ] dip { 0 -1 } v* v+
15         viewport-translation get v+
16     ] keep ;
17
18 : do-clip ( -- ) clip get flip-rect gl-set-clip ;
19
20 : init-clip ( clip-rect -- )
21     [
22         dim>>
23         [ { 0 1 } v* viewport-translation set ]
24         [ [ { 0 0 } ] dip gl-viewport ]
25         [ [ 0 ] dip first2 0 1 -1 glOrtho ] tri
26     ]
27     [ clip set ] bi
28     do-clip ;
29
30 : init-gl ( clip-rect -- )
31     GL_SMOOTH glShadeModel
32     GL_SCISSOR_TEST glEnable
33     GL_BLEND glEnable
34     GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA glBlendFunc
35     GL_VERTEX_ARRAY glEnableClientState
36     init-matrices
37     init-clip ;
38
39 : clear-gl ( transparent? -- )
40     [
41         system-background-color
42         [ red>> ] [ green>> ] [ blue>> ] tri 0.0
43         glClearColor
44         GL_COLOR_BUFFER_BIT glClear
45     ] [
46         ! white gl-clear is broken w.r.t window resizing
47         ! Linux/PPC Radeon 9200
48         COLOR: white gl-color
49         { 0 0 } clip get dim>> gl-fill-rect
50     ] if ;
51
52 GENERIC: draw-gadget* ( gadget -- )
53
54 M: gadget draw-gadget* drop ;
55
56 SYMBOL: origin
57
58 { 0 0 } origin set-global
59
60 : visible-children ( gadget -- seq )
61     [ clip get origin get vneg offset-rect ] dip children-on ;
62
63 : translate ( rect/point -- ) loc>> origin [ v+ ] change ;
64
65 GENERIC: draw-children ( gadget -- )
66
67 ! For gadget selection
68 SYMBOL: selected-gadgets
69
70 SYMBOL: selection-background
71
72 GENERIC: selected-children ( gadget -- assoc/f selection-background )
73
74 M: gadget selected-children drop f f ;
75
76 ! For text rendering
77 SYMBOL: background
78
79 SYMBOL: foreground
80
81 GENERIC: gadget-background ( gadget -- color )
82
83 M: gadget gadget-background dup interior>> pen-background ;
84
85 GENERIC: gadget-foreground ( gadget -- color )
86
87 M: gadget gadget-foreground dup interior>> pen-foreground ;
88
89 <PRIVATE
90
91 : draw-selection-background ( gadget -- )
92     selection-background get background set
93     selection-background get gl-color
94     [ { 0 0 } ] dip dim>> gl-fill-rect ;
95
96 : draw-standard-background ( object -- )
97     dup interior>> dup [ draw-interior ] [ 2drop ] if ;
98
99 : draw-background ( gadget -- )
100     origin get [
101         [
102             dup selected-gadgets get key?
103             [ draw-selection-background ]
104             [ draw-standard-background ] if
105         ] [ draw-gadget* ] bi
106     ] with-translation ;
107
108 : draw-border ( object -- )
109     dup boundary>> dup [
110         origin get [ draw-boundary ] with-translation
111     ] [ 2drop ] if ;
112
113 PRIVATE>
114
115 : (draw-gadget) ( gadget -- )
116     dup loc>> origin get v+ origin [
117         [ draw-background ] [ draw-children ] [ draw-border ] tri
118     ] with-variable ;
119
120 : >absolute ( rect -- rect )
121     origin get offset-rect ;
122
123 : change-clip ( gadget -- )
124     >absolute clip [ rect-intersect ] change ;
125
126 : with-clipping ( gadget quot -- )
127     clip get [ over change-clip do-clip call ] dip clip set do-clip ; inline
128
129 : draw-gadget ( gadget -- )
130     {
131         { [ dup visible?>> not ] [ drop ] }
132         { [ dup clipped?>> not ] [ (draw-gadget) ] }
133         [ [ (draw-gadget) ] with-clipping ]
134     } cond ;
135
136 M: gadget draw-children
137     dup children>> [
138         {
139             [ visible-children ]
140             [ selected-children ]
141             [ gadget-background ]
142             [ gadget-foreground ]
143         } cleave [
144             
145             {
146                 [ [ selected-gadgets set ] when* ]
147                 [ [ selection-background set ] when* ]
148                 [ [ background set ] when* ]
149                 [ [ foreground set ] when* ]
150             } spread
151             [ draw-gadget ] each
152         ] with-scope
153     ] [ drop ] if ;
154
155 CONSTANT: selection-color T{ rgba f 0.8 0.8 1.0 1.0 }
156
157 CONSTANT: panel-background-color
158     T{ rgba f
159         0.7843137254901961
160         0.7686274509803922
161         0.7176470588235294
162         1.0
163     }
164
165 CONSTANT: focus-border-color COLOR: dark-gray