! Copyright (C) 2010 Slava Pestov. USING: arrays accessors euler.b-rep fry gml gml.runtime gml.viewer gml.printer io.directories io.encodings.utf8 io.files io.pathnames io.streams.string kernel locals models namespaces sequences ui ui.gadgets ui.gadgets.buttons ui.gadgets.editors ui.gadgets.frames ui.gadgets.grids ui.gadgets.labels ui.gadgets.packs ui.gadgets.scrollers ui.gadgets.worlds ui.gadgets.tables ui.gadgets.labeled unicode.case ; FROM: gml => gml ; IN: gml.ui SINGLETON: stack-entry-renderer M: stack-entry-renderer row-columns drop [ write-gml ] with-string-writer 1array ; M: stack-entry-renderer row-value drop ; : ( model -- table ) stack-entry-renderer 10 >>min-rows 10 >>max-rows 40 >>min-cols 40 >>max-cols ; : ( model -- gadget ) "Operand stack" ; TUPLE: gml-editor < frame editor gml stack-model b-rep b-rep-model ; : update-models ( gml-editor -- ) [ [ b-rep>> dup finish-b-rep ] [ b-rep-model>> ] bi set-model ] [ [ gml>> operand-stack>> ] [ stack-model>> ] bi set-model ] bi ; : with-gml-editor ( gml-editor quot -- ) '[ [ [ gml>> gml set ] [ b-rep>> b-rep set ] bi @ ] [ update-models ] bi ] with-scope ; inline : find-gml-editor ( gadget -- gml-editor ) [ gml-editor? ] find-parent ; : load-input ( file gml-editor -- ) [ utf8 file-contents ] dip editor>> set-editor-string ; : update-viewer ( gml-editor -- ) dup [ editor>> editor-string run-gml-string ] with-gml-editor ; : new-viewer ( gml-editor -- ) [ update-viewer ] [ [ b-rep-model>> ] [ stack-model>> ] bi gml-viewer ] bi ; : reset-viewer ( gml-editor -- ) [ b-rep get clear-b-rep gml get operand-stack>> delete-all ] with-gml-editor ; : ( -- button ) "New viewer" [ find-gml-editor new-viewer ] ; : ( -- button ) "Update viewer" [ find-gml-editor update-viewer ] ; : ( -- button ) "Reset viewer" [ find-gml-editor reset-viewer ] ; : ( -- gadget ) { 5 5 } >>gap add-gadget add-gadget add-gadget ; CONSTANT: example-dir "vocab:gml/examples/" : gml-files ( -- seq ) example-dir directory-files [ file-extension >lower "gml" = ] filter ; : ( file -- button ) dup '[ example-dir _ append-path swap find-gml-editor load-input ] ; : ( -- gadget ) gml-files { 5 5 } >>gap "Examples:"