Mercurial > repos > tabletprog
annotate modules/ui.tp @ 376:d61b1f0e1936
Some minor WIP stuff in UI module
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 15 Aug 2015 22:45:24 -0700 |
parents | b8f721bde066 |
children |
rev | line source |
---|---|
332
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 _visibleWindows <- [] |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 _needsInit <- true |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 _initRes <- 0 |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 _checkInitSDL <- { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 if: _needsInit { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 _initRes <- (sdl init: ((sdl subsystems) video)) = 0 |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 _needsInit <- true |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 _initRes |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 } |
335
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
12 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
13 _applyProps <- :base properties { |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
14 foreach: (object propertiesOf: base) :_ name { |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
15 if: (object does: properties understand?: name) { |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
16 object setProperty: name on: base to: (object sendMessage: name to: properties) |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
17 } |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
18 } |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
19 base |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
20 } |
337
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
21 _ft <- option none |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
22 _getFT <- { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
23 _ft value: :ft { ft } none: { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
24 ft <- freetype init |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
25 _ft <- option value: ft |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
26 ft |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
27 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
28 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
29 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
30 //TODO: Fix this for multi window |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
31 _atlasDict <- dict hash |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
32 _currentTex <- option none |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
33 _texX <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
34 _texY <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
35 _texRowHeight <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
36 _getFontAtlas <- :path _size renderer { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
37 sizes <- _atlasDict get: path else: { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
38 new <- dict hash |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
39 _atlasDict set: path new |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
40 new |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
41 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
42 _getTexture <- :width height { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
43 _currentTex value: { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
44 if: _texX + width > 2048 { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
45 _texY <- _texY + _texRowHeight |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
46 _texRowHeight <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
47 _texX <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
48 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
49 if: _texY + height > 2048 { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
50 _currentTex <- renderer createTexture: ((sdl pixelFormats) bgra8888) access: ((sdl textureAccess) streaming) width: 2048 height: 2048 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
51 _currentTex value: :tex { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
52 tex blendMode!: ((sdl blendModes) blend) |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
53 } none: {} |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
54 _texX <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
55 _texY <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
56 _texRowHeight <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
57 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
58 if: _texRowHeight < height { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
59 _texRowHeight <- height |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
60 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
61 } none: { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
62 _currentTex <- renderer createTexture: ((sdl pixelFormats) bgra8888) access: ((sdl textureAccess) streaming) width: 2048 height: 2048 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
63 _currentTex value: :tex { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
64 tex blendMode!: ((sdl blendModes) blend) |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
65 } none: {} |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
66 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
67 _currentTex |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
68 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
69 atlas <- sizes get: _size else: { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
70 //TODO: Only load face once for all sizes |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
71 a <- ((_getFT: ) faceFromPath: path index: 0) value: :_face { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
72 _textures <- #[] |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
73 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
74 _charmap <- _face charmap |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
75 //TODO: Feed in window system DPI or at least make this configurable |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
76 dpi <- 96 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
77 _face setCharSize: _size res: dpi |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
78 _pixelFactor <- ((_face unitsPerEm) f64) * 72.0 / (_size * (dpi f64)) |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
79 _emUnits <- _face unitsPerEm |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
80 _glyphs <- dict hash |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
81 _getGlyph <- :codePoint face { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
82 _glyphs get: codePoint else: { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
83 flags <- freetype loadFlags |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
84 _charmap ifget: codePoint :_glyphIndex { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
85 slot <- face glyphSlot |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
86 face loadGlyph: _glyphIndex flags: ((flags render) or (flags linearDesign) or (flags noHinting)) |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
87 w <- slot bitmapWidth |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
88 h <- slot bitmapRows |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
89 _advX <- slot linearHoriAdvance |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
90 _advY <- slot linearVertAdvance |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
91 _texture <- _getTexture: w h |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
92 _rect <- sdl rect: _texX _texY size: w h |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
93 _texture value: :tex { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
94 srcPitch <- slot bitmapPitch |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
95 srcBuffer <- slot bitmapData |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
96 tex lockRect: (sdl rect: _texX _texY size: w h ) with: :dstBuffer dstPitch { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
97 srcY <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
98 dstY <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
99 while: { srcY < h } do: { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
100 srcX <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
101 srcIdx <- srcY * srcPitch |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
102 dstIdx <- dstY * dstPitch |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
103 while: { srcX < w } do: { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
104 //Set destination pixel to white with the source pixel as alpha |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
105 //This allows text color to be set using colorMod! on the texture |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
106 dstBuffer set: dstIdx (srcBuffer get: srcIdx) |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
107 dstBuffer set: (dstIdx + 1) 255u8 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
108 dstBuffer set: (dstIdx + 2) 255u8 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
109 dstBuffer set: (dstIdx + 3) 255u8 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
110 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
111 srcX <- srcX + 1 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
112 srcIdx <- srcIdx + 1 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
113 dstIdx <- dstIdx + 4 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
114 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
115 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
116 srcY <- srcY + 1 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
117 dstY <- dstY + 1 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
118 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
119 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
120 } none: {} |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
121 _texX <- _texX + w |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
122 _leftOff <- slot bitmapLeft |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
123 _topOff <- slot bitmapTop |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
124 g <- #{ |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
125 advanceX <- { _advX } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
126 advanceY <- { _advY } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
127 atlasRect <- { _rect } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
128 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
129 glyphIndex <- { _glyphIndex } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
130 drawAt:color <- :x y :color { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
131 _texture value: :tex { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
132 tex colorMod!: color |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
133 tex copyRect: _rect To: (sdl rect: x+_leftOff y-_topOff size: (_rect w) (_rect h)) |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
134 } none: {} |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
135 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
136 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
137 _glyphs set: codePoint g |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
138 g |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
139 } else: { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
140 //get fallback |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
141 _getGlyph: 0u32 face |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
142 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
143 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
144 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
145 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
146 _getGlyphs <- :str face { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
147 i <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
148 lines <- #[] |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
149 curline <- #[] |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
150 nl <- ("\n" byte: 0) uint32 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
151 while: { i < (str byte_length) } do: { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
152 //TODO: Unicode |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
153 codePoint <- (str byte: i) uint32 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
154 if: codePoint = nl { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
155 lines append: curline |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
156 curline <- #[] |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
157 } else: { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
158 glyph <- _getGlyph: codePoint face |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
159 curline append: glyph |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
160 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
161 i <- i + 1 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
162 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
163 lines append: curline |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
164 lines |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
165 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
166 _iterateGlyphs:leading:using <- :str :leading :fun { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
167 lines <- _getGlyphs: str _face |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
168 y <- 0.0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
169 maxX <- 0.0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
170 print: "Leading: " . leading . ", EM units: " . _emUnits . "\n" |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
171 leading <- leading * (_emUnits f64) / _size |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
172 foreach: lines :_ glyphs { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
173 x <- 0.0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
174 baseline <- y + (_emUnits f64) |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
175 foreach: glyphs :_ glyph { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
176 fun: glyph x baseline |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
177 x <- x + ((glyph advanceX) f64) |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
178 //baseline <- baseline + ((glyph advanceY) f64) |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
179 //TODO: kerning |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
180 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
181 y <- y + leading |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
182 if: x > maxX { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
183 maxX <- x |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
184 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
185 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
186 //convert font units into pixels |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
187 x <- (maxX / _pixelFactor + 0.5) truncInt32 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
188 y <- (y / _pixelFactor + 0.5) truncInt32 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
189 vec x: x y: y |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
190 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
191 option value: #{ |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
192 stringSize:leading <- :str :leading { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
193 _iterateGlyphs: str leading: leading using: :glyph x y {} |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
194 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
195 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
196 drawString:at:color:leading <- :str :xpos ypos :color :lead { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
197 _iterateGlyphs: str leading: lead using: :glyph x y { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
198 x <- ((x / _pixelFactor + 0.5) truncInt32) + xpos |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
199 y <- ((y / _pixelFactor + 0.5) truncInt32) + ypos |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
200 glyph drawAt: x y color: color |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
201 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
202 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
203 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
204 } none: { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
205 option none |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
206 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
207 sizes set: _size a |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
208 a |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
209 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
210 } |
332
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
211 #{ |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
212 import: [ |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
213 r:g:b |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
214 r:g:b:a |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
215 ] from: sdl |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
216 _styles <- [] |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
217 window <- :properties { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
218 _wind <- option none |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
219 _renderer <- option none |
337
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
220 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
221 |
332
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
222 base <- #{ |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
223 title <- "Window" |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
224 width <- 640 |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
225 height <- 480 |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
226 x <- 0 |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
227 y <- 0 |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
228 color <- (ui r: 255u8 g: 255u8 b: 255u8) |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
229 children <- #[] |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
230 |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
231 show <- { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
232 if: (_checkInitSDL: ) { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
233 _wind <- sdl createWindow: title pos: x y size: width height flags: 0u32 |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
234 _wind value: :window { |
376
d61b1f0e1936
Some minor WIP stuff in UI module
Michael Pavone <pavone@retrodev.com>
parents:
337
diff
changeset
|
235 _visibleWindows <- self | _visibleWindows |
332
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
236 _renderer <- window createRenderer: -1 flags: ((window renderOpts) accelerated) |
335
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
237 layout: |
332
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
238 draw: |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
239 } none: { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
240 false |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
241 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
242 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
243 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
244 |
335
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
245 layout <- { |
337
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
246 _renderer value: :renderer { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
247 yPos <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
248 xPos <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
249 rowMaxHeight <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
250 foreach: children :_ child { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
251 softMax <- (width - xPos) |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
252 child softMaxWidth: softMax maxWidth: width maxHeight: (height - yPos) renderer: renderer |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
253 if: (child width) > softMax { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
254 yPos <- yPos + rowMaxHeight |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
255 xPos <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
256 rowMaxHeight <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
257 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
258 child x!: xPos |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
259 child y!: yPos |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
260 xPos <- xPos + (child width) |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
261 if: (child height) > rowMaxHeight { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
262 rowMaxHeight <- (child height) |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
263 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
264 if: xPos >= width { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
265 yPos <- yPos + rowMaxHeight |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
266 xPos <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
267 rowMaxHeight <- 0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
268 } |
335
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
269 } |
337
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
270 } none: {} |
335
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
271 } |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
272 |
332
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
273 draw <- { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
274 print: "Draw!\n" |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
275 _renderer value: :renderer { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
276 print: "Rendering!\n" |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
277 renderer drawColor!: color |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
278 renderer clear |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
279 |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
280 foreach: children :_ child { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
281 child draw: renderer |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
282 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
283 renderer present |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
284 true |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
285 } none: { false } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
286 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
287 |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
288 styles <- { _styles } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
289 |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
290 styles! <- :newstyles{ |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
291 //TODO: apply styles |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
292 _styles <- newstyles |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
293 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
294 } |
335
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
295 _applyProps: base properties |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
296 } |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
297 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
298 text <- :properties { |
337
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
299 _fontSize <- 12.0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
300 _leading <- 15.0 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
301 _explicitLeading <- false |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
302 _applyProps: #{ |
335
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
303 text <- "" |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
304 //TODO: replace this with font family and style once fontconfig is hooked up |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
305 font <- "/usr/share/fonts/truetype/droid/DroidSans.ttf" |
337
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
306 fontSize <- { _fontSize } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
307 fontSize! <- :newSize { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
308 _fontSize <- newSize |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
309 if: (not: _explicitLeading) { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
310 _leading <- newSize * 1.25 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
311 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
312 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
313 leading <- { _leading } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
314 leading! <- :newLeading { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
315 _explicitLeading <- true |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
316 _leading <- newLeading |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
317 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
318 color <- (ui r: 0u8 g: 0u8 b: 0u8) |
335
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
319 width <- -1 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
320 height <- -1 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
321 x <- 0 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
322 y <- 0 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
323 |
337
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
324 softMaxWidth:maxWidth:maxHeight:renderer <- :softMax :maxWidth :maxHeight :renderer { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
325 (_getFontAtlas: font fontSize renderer) value: :atlas { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
326 //TODO: word wrap |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
327 bbox <- atlas stringSize: text leading: _leading |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
328 width <- bbox x |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
329 height <- bbox y |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
330 print: "Text: " . text . " has size: " . width . ", " . height . "\n" |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
331 } none: { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
332 } |
335
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
333 } |
337
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
334 |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
335 draw <- :renderer { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
336 (_getFontAtlas: font fontSize renderer) value: :atlas { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
337 print: "Drawing: " . text . " at " . x . ", " . y . "\n" |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
338 atlas drawString: text at: x y color: color leading: _leading |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
339 } none: { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
340 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
341 } |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
342 } properties |
335
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
343 } |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
344 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
345 image <- :properties { |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
346 _texture <- option none |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
347 _applyProps: #{ |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
348 source <- "" |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
349 width <- -1 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
350 height <- -1 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
351 x <- 0 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
352 y <- 0 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
353 |
337
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
354 softMaxWidth:maxWidth:maxHeight:renderer <- :softMax :maxWidth :maxHeight :renderer { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
355 _texture value: :_ { |
b8f721bde066
Add support for text elements in ui module
Michael Pavone <pavone@retrodev.com>
parents:
335
diff
changeset
|
356 } none: { |
335
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
357 (sdl loadBMP: source) value: :surface { |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
358 (surface asTexture: renderer) value: :texture { |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
359 _texture <- option value: texture |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
360 width <- texture width |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
361 height <- texture height |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
362 if: (width > maxWidth) { |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
363 width <- maxWidth |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
364 } |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
365 if: (height > maxHeight) { |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
366 height <- maxHeight |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
367 } |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
368 } none: { |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
369 width <- 0 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
370 height <- 0 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
371 } |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
372 } none: { |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
373 print: "Failed to load " . source . "\n" |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
374 //Should this have some kind of placeholder as a fallback? |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
375 width <- 0 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
376 height <- 0 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
377 } |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
378 } |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
379 } |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
380 |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
381 draw <- :_ { |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
382 _texture value: :texture { |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
383 print: "Rendering bitmap to " . x . ", " . y . ", size: " . width . ", " . height . "\n" |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
384 texture copyTo: (sdl rect: x y size: width height) |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
385 } none: { |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
386 } |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
387 } |
79a14e41b79a
Add image element and placeholder text element to ui module
Michael Pavone <pavone@retrodev.com>
parents:
332
diff
changeset
|
388 } properties |
332
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
389 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
390 |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
391 enterEventLoop <- { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
392 continue? <- true |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
393 |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
394 _handlers <- dict hash |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
395 _handlers set: ((sdl eventTypes) quit) :event { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
396 continue? <- false |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
397 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
398 _handlers set: ((sdl eventTypes) window) :event { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
399 if: (event event) = ((sdl windowEventTypes) exposed) { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
400 foreach: _visibleWindows :_ wind { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
401 print: "Redrawing window\n" |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
402 wind draw |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
403 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
404 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
405 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
406 while: { continue? } do: { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
407 (sdl waitEvent) value: :event { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
408 _handlers ifget: (event type) :handler { |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
409 handler: event |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
410 } else: { |
376
d61b1f0e1936
Some minor WIP stuff in UI module
Michael Pavone <pavone@retrodev.com>
parents:
337
diff
changeset
|
411 |
d61b1f0e1936
Some minor WIP stuff in UI module
Michael Pavone <pavone@retrodev.com>
parents:
337
diff
changeset
|
412 if: (event type) = ((sdl eventTypes) mouseMotion) { |
d61b1f0e1936
Some minor WIP stuff in UI module
Michael Pavone <pavone@retrodev.com>
parents:
337
diff
changeset
|
413 print: "Window ID: " . (event windowID) . ", x: " . (event x) . ", y: " . (event y) . "\n" |
d61b1f0e1936
Some minor WIP stuff in UI module
Michael Pavone <pavone@retrodev.com>
parents:
337
diff
changeset
|
414 } else: { |
d61b1f0e1936
Some minor WIP stuff in UI module
Michael Pavone <pavone@retrodev.com>
parents:
337
diff
changeset
|
415 print: "Unhandled event type: " . (event type) . "\n" |
d61b1f0e1936
Some minor WIP stuff in UI module
Michael Pavone <pavone@retrodev.com>
parents:
337
diff
changeset
|
416 } |
332
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
417 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
418 } none: {} |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
419 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
420 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
421 } |
ead24192ed45
Initial work on a UI module
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
422 } |