]> gitweb.factorcode.org Git - factor.git/blob - basis/ui/tools/inspector/inspector.factor
bf6ac03b55f913ebaa8a597b33938eb1e3eb5b0e
[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 inspector namespaces kernel models fry
4 models.filter prettyprint sequences mirrors assocs classes
5 io io.styles arrays hashtables math.order sorting refs
6 ui.tools.browser ui.commands ui.operations ui.gadgets ui.gadgets.panes
7 ui.gadgets.scrollers ui.gadgets.slots ui.gadgets.tracks
8 ui.gestures ui.gadgets.buttons ui.gadgets.tables
9 ui.gadgets.status-bar ui.gadgets.theme ui.gadgets.labelled
10 ui.tools.common ui ;
11 IN: ui.tools.inspector
12
13 TUPLE: inspector-gadget < tool table ;
14
15 { 500 300 } inspector-gadget set-tool-dim
16
17 TUPLE: slot-description key key-string value value-string ;
18
19 : <slot-description> ( key value -- slot-description )
20     [ dup unparse-short ] bi@ slot-description boa ;
21
22 SINGLETON: inspector-renderer
23
24 M: inspector-renderer row-columns
25     drop [ key-string>> ] [ value-string>> ] bi 2array ;
26
27 M: inspector-renderer row-value
28     drop value>> ;
29
30 : <summary-gadget> ( model -- gadget )
31     [
32         standard-table-style [
33             [
34                 [
35                     [ "Class:" write ] with-cell
36                     [ class . ] with-cell
37                 ] with-row
38             ]
39             [
40                 [
41                     [ "Object:" write ] with-cell
42                     [ short. ] with-cell
43                 ] with-row
44             ]
45             [
46                 [
47                     [ "Summary:" write ] with-cell
48                     [ summary. ] with-cell
49                 ] with-row
50             ] tri
51         ] tabular-output
52     ] <pane-control> ;
53
54 GENERIC: make-slot-descriptions ( obj -- seq )
55
56 M: object make-slot-descriptions
57     make-mirror [ <slot-description> ] { } assoc>map ;
58
59 M: hashtable make-slot-descriptions
60     call-next-method [ [ key-string>> ] compare ] sort ;
61
62 : <inspector-table> ( model -- table )
63     [ make-slot-descriptions ] <filter> <table>
64         [ dup primary-operation invoke-command ] >>action
65         inspector-renderer >>renderer
66         monospace-font >>font ;
67
68 : <inspector-gadget> ( obj -- gadget )
69     { 0 1 } inspector-gadget new-track
70         add-toolbar
71         swap <model> >>model
72         dup model>> <inspector-table> >>table
73         dup model>> <summary-gadget> "Object" <labelled-gadget> f track-add
74         dup table>> <scroller> "Contents" <labelled-gadget> 1 track-add ;
75
76 M: inspector-gadget focusable-child*
77     table>> ;
78
79 : com-refresh ( inspector -- )
80     model>> notify-connections ;
81
82 : com-push ( inspector -- obj )
83     control-value ;
84
85 \ com-push H{ { +listener+ t } } define-command
86
87 : slot-editor-window ( close-hook update-hook assoc key key-string -- )
88     [ <value-ref> <slot-editor> ] [ "Slot editor: " prepend ] bi*
89     open-window ;
90
91 : com-edit-slot ( inspector -- )
92     [ close-window ] swap
93     [ '[ _ com-refresh ] ]
94     [ control-value make-mirror ]
95     [ table>> (selected-row) ] tri [
96         [ key>> ] [ key-string>> ] bi
97         slot-editor-window
98     ] [ 2drop 2drop ] if ;
99
100 : inspector-help ( -- ) "ui-inspector" com-follow ;
101
102 \ inspector-help H{ { +nullary+ t } } define-command
103
104 inspector-gadget "toolbar" f {
105     { T{ update-object } com-refresh }
106     { T{ key-down f f "p" } com-push }
107     { T{ key-down f f "e" } com-edit-slot }
108     { T{ key-down f f "F1" } inspector-help }
109 } define-command-map
110
111 inspector-gadget "multi-touch" f {
112     { up-action com-refresh }
113 } define-command-map
114
115 : inspector ( obj -- )
116     <inspector-gadget> "Inspector" open-status-window ;