1 ! Copyright (C) 2010 Slava Pestov.
\r
2 USING: arrays accessors euler.b-rep fry gml gml.runtime gml.viewer
\r
3 gml.printer io.directories io.encodings.utf8 io.files
\r
4 io.pathnames io.streams.string kernel locals models namespaces
\r
5 sequences ui ui.gadgets ui.gadgets.buttons ui.gadgets.editors
\r
6 ui.gadgets.frames ui.gadgets.grids ui.gadgets.labels
\r
7 ui.gadgets.packs ui.gadgets.scrollers ui.gadgets.worlds
\r
8 ui.gadgets.tables ui.gadgets.labeled unicode.case ;
\r
12 SINGLETON: stack-entry-renderer
\r
14 M: stack-entry-renderer row-columns
\r
15 drop [ write-gml ] with-string-writer 1array ;
\r
17 M: stack-entry-renderer row-value
\r
20 : <stack-table> ( model -- table )
\r
21 stack-entry-renderer <table>
\r
27 : <stack-display> ( model -- gadget )
\r
28 <stack-table> <scroller> "Operand stack" <labeled-gadget> ;
\r
30 TUPLE: gml-editor < frame editor gml stack-model b-rep b-rep-model ;
\r
32 : update-models ( gml-editor -- )
\r
33 [ [ b-rep>> dup finish-b-rep ] [ b-rep-model>> ] bi set-model ]
\r
34 [ [ gml>> operand-stack>> ] [ stack-model>> ] bi set-model ]
\r
37 : with-gml-editor ( gml-editor quot -- )
\r
39 [ [ gml>> gml set ] [ b-rep>> b-rep set ] bi @ ]
\r
42 ] with-scope ; inline
\r
44 : find-gml-editor ( gadget -- gml-editor )
\r
45 [ gml-editor? ] find-parent ;
\r
47 : load-input ( file gml-editor -- )
\r
48 [ utf8 file-contents ] dip editor>> set-editor-string ;
\r
50 : update-viewer ( gml-editor -- )
\r
51 dup [ editor>> editor-string run-gml-string ] with-gml-editor ;
\r
53 : new-viewer ( gml-editor -- )
\r
55 [ [ b-rep-model>> ] [ stack-model>> ] bi gml-viewer ]
\r
58 : reset-viewer ( gml-editor -- )
\r
60 b-rep get clear-b-rep
\r
61 gml get operand-stack>> delete-all
\r
64 : <new-button> ( -- button )
\r
65 "New viewer" [ find-gml-editor new-viewer ] <border-button> ;
\r
67 : <update-button> ( -- button )
\r
68 "Update viewer" [ find-gml-editor update-viewer ] <border-button> ;
\r
70 : <reset-button> ( -- button )
\r
71 "Reset viewer" [ find-gml-editor reset-viewer ] <border-button> ;
\r
73 : <control-buttons> ( -- gadget )
\r
74 <shelf> { 5 5 } >>gap
\r
75 <new-button> add-gadget
\r
76 <update-button> add-gadget
\r
77 <reset-button> add-gadget ;
\r
79 CONSTANT: example-dir "vocab:gml/examples/"
\r
81 : gml-files ( -- seq )
\r
82 example-dir directory-files
\r
83 [ file-extension >lower "gml" = ] filter ;
\r
85 : <example-button> ( file -- button )
\r
86 dup '[ example-dir _ append-path swap find-gml-editor load-input ]
\r
89 : <example-buttons> ( -- gadget )
\r
91 <pile> { 5 5 } >>gap
\r
92 "Examples:" <label> add-gadget
\r
93 [ <example-button> add-gadget ] reduce ;
\r
95 : <editor-panel> ( editor -- gadget )
\r
100 <scroller> "Editor" <labeled-gadget> ;
\r
102 : <gml-editor> ( -- gadget )
\r
103 2 3 gml-editor new-frame
\r
106 dup b-rep>> <model> >>b-rep-model
\r
107 dup gml>> operand-stack>> <model> >>stack-model
\r
109 { 0 0 } >>filled-cell
\r
110 <source-editor> >>editor
\r
111 dup editor>> <editor-panel> { 0 0 } grid-add
\r
112 dup stack-model>> <stack-display> { 0 1 } grid-add
\r
113 <control-buttons> { 0 2 } grid-add
\r
114 <example-buttons> { 1 0 } grid-add ;
\r
116 M: gml-editor focusable-child* editor>> ;
\r
118 : gml-editor-window ( -- )
\r
119 <gml-editor> "Generative Modeling Language" open-window ;
\r
121 MAIN: gml-editor-window
\r