factor/basis/ui/tools/inspector/inspector.factor

126 lines
3.6 KiB
Factor
Raw Normal View History

! Copyright (C) 2006, 2009 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: accessors inspector namespaces kernel models fry
2009-02-26 17:15:28 -05:00
colors.constants models.arrow prettyprint sequences mirrors assocs
2009-02-17 09:26:33 -05:00
classes io io.styles arrays hashtables math.order sorting refs fonts
ui.tools.browser ui.commands ui.operations ui.gadgets ui.gadgets.panes
2009-02-17 09:26:33 -05:00
ui.gadgets.scrollers ui.gadgets.slots ui.gadgets.tracks ui.gestures
ui.gadgets.buttons ui.gadgets.tables ui.gadgets.status-bar
ui.gadgets.labeled ui.tools.common ui ;
2007-09-20 18:09:08 -04:00
IN: ui.tools.inspector
TUPLE: inspector-gadget < tool table ;
2007-09-20 18:09:08 -04:00
2009-01-07 00:30:08 -05:00
TUPLE: slot-description key key-string value value-string ;
: <slot-description> ( key value -- slot-description )
[ dup unparse-short ] bi@ slot-description boa ;
2009-01-06 17:53:08 -05:00
SINGLETON: inspector-renderer
2007-09-20 18:09:08 -04:00
2009-01-06 17:53:08 -05:00
M: inspector-renderer row-columns
2009-01-07 00:30:08 -05:00
drop [ key-string>> ] [ value-string>> ] bi 2array ;
2009-01-06 17:53:08 -05:00
M: inspector-renderer row-value
drop value>> ;
M: inspector-renderer column-titles
drop { "Key" "Value" } ;
2009-01-06 17:53:08 -05:00
: <summary-gadget> ( model -- gadget )
[
standard-table-style [
[
[
[ "Class:" write ] with-cell
[ class pprint ] with-cell
2009-01-06 17:53:08 -05:00
] with-row
]
[
[
[ "Object:" write ] with-cell
[ pprint-short ] with-cell
2009-01-06 17:53:08 -05:00
] with-row
]
[
[
[ "Summary:" write ] with-cell
[ print-summary ] with-cell
2009-01-06 17:53:08 -05:00
] with-row
] tri
] tabular-output
] <pane-control> ;
GENERIC: make-slot-descriptions ( obj -- seq )
M: object make-slot-descriptions
2009-01-07 00:30:08 -05:00
make-mirror [ <slot-description> ] { } assoc>map ;
2009-01-06 17:53:08 -05:00
M: hashtable make-slot-descriptions
call-next-method [ key-string>> ] sort-with ;
2009-01-06 17:53:08 -05:00
: <inspector-table> ( model -- table )
2009-02-26 17:15:28 -05:00
[ make-slot-descriptions ] <arrow> inspector-renderer <table>
2009-02-17 09:26:33 -05:00
[ invoke-primary-operation ] >>action
monospace-font >>font
2009-02-17 09:26:33 -05:00
COLOR: dark-gray >>column-line-color
6 >>gap
15 >>min-rows
15 >>max-rows
40 >>min-cols
40 >>max-cols ;
2009-01-06 17:53:08 -05:00
: <inspector-gadget> ( model -- gadget )
vertical inspector-gadget new-track
{ 3 3 } >>gap
2008-11-20 22:58:30 -05:00
add-toolbar
swap >>model
2009-01-06 17:53:08 -05:00
dup model>> <inspector-table> >>table
dup model>> <summary-gadget> "Object" <labeled-gadget> f track-add
dup table>> <scroller> "Contents" <labeled-gadget> 1 track-add ;
2009-01-06 17:53:08 -05:00
M: inspector-gadget focusable-child*
table>> ;
2007-09-20 18:09:08 -04:00
2009-01-06 17:53:08 -05:00
: com-refresh ( inspector -- )
model>> notify-connections ;
2007-09-20 18:09:08 -04:00
2009-01-06 17:53:08 -05:00
: com-push ( inspector -- obj )
control-value ;
\ com-push H{ { +listener+ t } } define-command
2007-09-20 18:09:08 -04:00
: slot-editor-window ( close-hook update-hook assoc key key-string -- )
[ <value-ref> <slot-editor> ] [ "Slot editor: " prepend ] bi*
2009-09-23 23:51:25 -04:00
open-status-window ;
: com-edit-slot ( inspector -- )
[ close-window ] swap
[ '[ _ com-refresh ] ]
[ control-value make-mirror ]
[ table>> (selected-row) ] tri [
[ key>> ] [ key-string>> ] bi
slot-editor-window
] [ 2drop 2drop ] if ;
2009-02-18 22:01:19 -05:00
: inspector-help ( -- ) "ui-inspector" com-browse ;
2007-09-20 18:09:08 -04:00
\ inspector-help H{ { +nullary+ t } } define-command
inspector-gadget "toolbar" f {
2009-01-06 17:53:08 -05:00
{ T{ update-object } com-refresh }
{ T{ key-down f f "p" } com-push }
{ T{ key-down f f "e" } com-edit-slot }
2007-09-20 18:09:08 -04:00
{ T{ key-down f f "F1" } inspector-help }
} define-command-map
inspector-gadget "multi-touch" f {
{ up-action com-refresh }
} define-command-map
: inspect-model ( model -- )
<inspector-gadget> "Inspector" open-status-window ;
2009-01-07 00:30:08 -05:00
: inspector ( obj -- )
<model> inspect-model ;