]> gitweb.factorcode.org Git - factor.git/blob - basis/ui/tools/inspector/inspector.factor
29b5dbce14683989652403f3c3bd776ad5692c4c
[factor.git] / basis / ui / tools / inspector / inspector.factor
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.tables ui.theme
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
12
13 TUPLE: inspector-gadget < tool table ;
14
15 TUPLE: slot-description key key-string value value-string ;
16
17 : <slot-description> ( key value -- slot-description )
18     [ dup unparse-short ] bi@ slot-description boa ;
19
20 SINGLETON: inspector-renderer
21
22 M: inspector-renderer row-columns
23     drop [ key-string>> ] [ value-string>> ] bi 2array ;
24
25 M: inspector-renderer row-value
26     drop value>> ;
27
28 M: inspector-renderer column-titles
29     drop { "Key" "Value" } ;
30
31 : <summary-gadget> ( model -- gadget )
32     [
33         standard-table-style [
34             {
35                 [
36                     [
37                         [ "Class:" write ] with-cell
38                         [ class-of pprint ] with-cell
39                     ] with-row
40                 ]
41                 [
42                     [
43                         [ "Object:" write ] with-cell
44                         [ pprint-short ] with-cell
45                     ] with-row
46                 ]
47                 [
48                     [
49                         [ "Summary:" write ] with-cell
50                         [ print-summary ] with-cell
51                     ] with-row
52                 ]
53                 [
54                     content-gadget [
55                         [
56                             [ "Content:" write ] with-cell
57                             [ output-stream get write-gadget ] with-cell
58                         ] with-row
59                     ] when*
60                 ]
61             } cleave
62         ] tabular-output
63     ] <pane-control> ;
64
65 GENERIC: make-slot-descriptions ( obj -- seq )
66
67 M: object make-slot-descriptions
68     make-mirror [ <slot-description> ] { } assoc>map ;
69
70 M: hashtable make-slot-descriptions
71     call-next-method [ key-string>> ] sort-with ;
72
73 : <inspector-table> ( model -- table )
74     [ make-slot-descriptions ] <arrow> inspector-renderer <table>
75         [ invoke-primary-operation ] >>action
76         monospace-font >>font theme-font-colors
77         line-color >>column-line-color
78         6 >>gap
79         15 >>min-rows
80         15 >>max-rows
81         40 >>min-cols
82         40 >>max-cols ;
83
84 : <inspector-gadget> ( model -- gadget )
85     vertical inspector-gadget new-track with-lines
86         add-toolbar
87         swap >>model
88         dup model>> <inspector-table> >>table
89         dup model>> <summary-gadget> margins white-interior "Object" object-color <labeled> f track-add
90         dup table>> <scroller> margins white-interior "Contents" contents-color <labeled> 1 track-add ;
91
92 M: inspector-gadget focusable-child*
93     table>> ;
94
95 : com-refresh ( inspector -- )
96     model>> notify-connections ;
97
98 : com-push ( inspector -- obj )
99     control-value ;
100
101 \ com-push H{ { +listener+ t } } define-command
102
103 : slot-editor-window ( close-hook update-hook assoc key key-string -- )
104     [ <value-ref> <slot-editor> ]
105     [
106         <world-attributes>
107             swap "Slot editor: " prepend >>title
108             [ { dialog-window } append ] change-window-controls
109     ] bi*
110     open-status-window ;
111
112 : com-edit-slot ( inspector -- )
113     [ close-window ] swap
114     [ '[ _ com-refresh ] ]
115     [ control-value make-mirror ]
116     [ table>> (selected-row) ] tri [
117         [ key>> ] [ key-string>> ] bi
118         slot-editor-window
119     ] [ 4drop ] if ;
120
121 : inspector-help ( -- ) "ui-inspector" com-browse ;
122
123 \ inspector-help H{ { +nullary+ t } } define-command
124
125 inspector-gadget "toolbar" f {
126     { T{ update-object } com-refresh }
127     { T{ key-down f f "p" } com-push }
128     { T{ key-down f f "e" } com-edit-slot }
129     { T{ key-down f f "F1" } inspector-help }
130 } define-command-map
131
132 inspector-gadget "multi-touch" f {
133     { up-action com-refresh }
134 } define-command-map
135
136 : inspect-model ( model -- )
137     <inspector-gadget> "Inspector" open-status-window ;
138
139 : inspector ( obj -- )
140     <model> inspect-model ;
141
142 { 550 400 } inspector-gadget set-tool-dim