1 ! Copyright (C) 2006, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors colors inspector namespaces kernel models fry
4 colors.constants models.arrow prettyprint sequences mirrors assocs
5 classes io io.styles arrays hashtables math.order sorting refs fonts
6 ui.tools.browser ui.commands ui.operations ui.gadgets ui.gadgets.panes
7 ui.gadgets.scrollers ui.gadgets.slots ui.gadgets.tracks ui.gestures
8 ui.gadgets.buttons ui.gadgets.lines ui.gadgets.tables
9 ui.gadgets.toolbar ui.gadgets.status-bar
10 ui.gadgets.labeled ui.tools.common ui combinators ui.gadgets.worlds ;
11 IN: ui.tools.inspector
13 TUPLE: inspector-gadget < tool table ;
15 TUPLE: slot-description key key-string value value-string ;
17 : <slot-description> ( key value -- slot-description )
18 [ dup unparse-short ] bi@ slot-description boa ;
20 SINGLETON: inspector-renderer
22 M: inspector-renderer row-columns
23 drop [ key-string>> ] [ value-string>> ] bi 2array ;
25 M: inspector-renderer row-value
28 M: inspector-renderer column-titles
29 drop { "Key" "Value" } ;
31 : <summary-gadget> ( model -- gadget )
33 standard-table-style [
37 [ "Class:" write ] with-cell
38 [ class-of pprint ] with-cell
43 [ "Object:" write ] with-cell
44 [ pprint-short ] with-cell
49 [ "Summary:" write ] with-cell
50 [ print-summary ] with-cell
56 [ "Content:" write ] with-cell
57 [ output-stream get write-gadget ] with-cell
65 GENERIC: make-slot-descriptions ( obj -- seq )
67 M: object make-slot-descriptions
68 make-mirror [ <slot-description> ] { } assoc>map ;
70 M: hashtable make-slot-descriptions
71 call-next-method [ key-string>> ] sort-with ;
73 : <inspector-table> ( model -- table )
74 [ make-slot-descriptions ] <arrow> inspector-renderer <table>
75 [ invoke-primary-operation ] >>action
77 COLOR: dark-gray >>column-line-color
86 CONSTANT: object-color COLOR: aquamarine2
87 CONSTANT: contents-color COLOR: orchid2
91 : <inspector-gadget> ( model -- gadget )
92 vertical inspector-gadget new-track with-lines
95 dup model>> <inspector-table> >>table
96 dup model>> <summary-gadget> margins white-interior "Object" object-color <labeled-gadget> f track-add
97 dup table>> <scroller> white-interior "Contents" contents-color <labeled-gadget> 1 track-add ;
99 M: inspector-gadget focusable-child*
102 : com-refresh ( inspector -- )
103 model>> notify-connections ;
105 : com-push ( inspector -- obj )
108 \ com-push H{ { +listener+ t } } define-command
110 : slot-editor-window ( close-hook update-hook assoc key key-string -- )
111 [ <value-ref> <slot-editor> ]
114 swap "Slot editor: " prepend >>title
115 [ { dialog-window } append ] change-window-controls
119 : com-edit-slot ( inspector -- )
120 [ close-window ] swap
121 [ '[ _ com-refresh ] ]
122 [ control-value make-mirror ]
123 [ table>> (selected-row) ] tri [
124 [ key>> ] [ key-string>> ] bi
128 : inspector-help ( -- ) "ui-inspector" com-browse ;
130 \ inspector-help H{ { +nullary+ t } } define-command
132 inspector-gadget "toolbar" f {
133 { T{ update-object } com-refresh }
134 { T{ key-down f f "p" } com-push }
135 { T{ key-down f f "e" } com-edit-slot }
136 { T{ key-down f f "F1" } inspector-help }
139 inspector-gadget "multi-touch" f {
140 { up-action com-refresh }
143 : inspect-model ( model -- )
144 <inspector-gadget> "Inspector" open-status-window ;
146 : inspector ( obj -- )
147 <model> inspect-model ;
149 { 550 400 } inspector-gadget set-tool-dim