2009-01-06 14:56:14 -05:00
|
|
|
! Copyright (C) 2006, 2009 Slava Pestov.
|
2007-09-20 18:09:08 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2017-06-11 11:59:45 -04:00
|
|
|
USING: accessors arrays assocs classes combinators fonts fry
|
|
|
|
hashtables inspector io io.styles kernel math.vectors mirrors
|
|
|
|
models models.arrow namespaces prettyprint refs sequences
|
|
|
|
sorting ui ui.commands ui.gadgets ui.gadgets.labeled
|
2016-05-10 00:34:31 -04:00
|
|
|
ui.gadgets.panes ui.gadgets.scrollers ui.gadgets.slots
|
2017-06-11 11:59:45 -04:00
|
|
|
ui.gadgets.status-bar ui.gadgets.tables
|
|
|
|
ui.gadgets.tables.private ui.gadgets.toolbar ui.gadgets.tracks
|
|
|
|
ui.gadgets.worlds ui.gestures ui.operations ui.theme
|
|
|
|
ui.tools.browser ui.tools.common ;
|
2007-09-20 18:09:08 -04:00
|
|
|
IN: ui.tools.inspector
|
|
|
|
|
2009-01-08 19:56:39 -05:00
|
|
|
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
|
|
|
|
2009-01-07 13:18:42 -05:00
|
|
|
M: inspector-renderer row-value
|
|
|
|
drop value>> ;
|
|
|
|
|
2009-02-16 05:25:15 -05:00
|
|
|
M: inspector-renderer column-titles
|
|
|
|
drop { "Key" "Value" } ;
|
|
|
|
|
2009-01-06 17:53:08 -05:00
|
|
|
: <summary-gadget> ( model -- gadget )
|
|
|
|
[
|
|
|
|
standard-table-style [
|
2012-02-21 18:06:27 -05:00
|
|
|
{
|
2009-01-06 17:53:08 -05:00
|
|
|
[
|
2012-02-21 18:06:27 -05:00
|
|
|
[
|
|
|
|
[ "Class:" write ] with-cell
|
|
|
|
[ class-of pprint ] with-cell
|
|
|
|
] with-row
|
|
|
|
]
|
2009-01-06 17:53:08 -05:00
|
|
|
[
|
2012-02-21 18:06:27 -05:00
|
|
|
[
|
|
|
|
[ "Object:" write ] with-cell
|
|
|
|
[ pprint-short ] with-cell
|
|
|
|
] with-row
|
|
|
|
]
|
2009-01-06 17:53:08 -05:00
|
|
|
[
|
2012-02-21 18:06:27 -05:00
|
|
|
[
|
|
|
|
[ "Summary:" write ] with-cell
|
|
|
|
[ print-summary ] with-cell
|
|
|
|
] with-row
|
|
|
|
]
|
|
|
|
[
|
|
|
|
content-gadget [
|
|
|
|
[
|
|
|
|
[ "Content:" write ] with-cell
|
|
|
|
[ output-stream get write-gadget ] with-cell
|
|
|
|
] with-row
|
|
|
|
] when*
|
|
|
|
]
|
|
|
|
} cleave
|
2009-01-06 17:53:08 -05:00
|
|
|
] tabular-output
|
|
|
|
] <pane-control> ;
|
|
|
|
|
2009-01-07 16:06:43 -05:00
|
|
|
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
|
|
|
|
2009-01-07 16:06:43 -05:00
|
|
|
M: hashtable make-slot-descriptions
|
2009-08-02 21:09:23 -04:00
|
|
|
call-next-method [ key-string>> ] sort-with ;
|
2009-01-07 16:06:43 -05:00
|
|
|
|
2017-06-11 11:59:45 -04:00
|
|
|
TUPLE: inspector-table < table ;
|
|
|
|
|
|
|
|
! Improve performance for big arrays or large hashtables by
|
|
|
|
! only calculating column width for the longest key.
|
|
|
|
M: inspector-table compute-column-widths
|
|
|
|
dup rows>> [ drop 0 { } ] [
|
|
|
|
[ drop gap>> ]
|
|
|
|
[ initial-widths ]
|
|
|
|
[ keys longest "" 2array row-column-widths ] 2tri
|
|
|
|
vmax [ compute-total-width ] keep
|
|
|
|
] if-empty ;
|
|
|
|
|
2009-01-06 17:53:08 -05:00
|
|
|
: <inspector-table> ( model -- table )
|
2017-06-11 11:59:45 -04:00
|
|
|
[ make-slot-descriptions ] <arrow> inspector-renderer
|
|
|
|
inspector-table new-table
|
2009-02-17 09:26:33 -05:00
|
|
|
[ invoke-primary-operation ] >>action
|
2016-05-15 13:44:29 -04:00
|
|
|
monospace-font >>font
|
2016-05-04 15:57:04 -04:00
|
|
|
line-color >>column-line-color
|
2009-02-17 09:26:33 -05:00
|
|
|
6 >>gap
|
2009-02-16 05:34:22 -05:00
|
|
|
15 >>min-rows
|
|
|
|
15 >>max-rows
|
|
|
|
40 >>min-cols
|
|
|
|
40 >>max-cols ;
|
2009-01-06 17:53:08 -05:00
|
|
|
|
2009-02-05 05:00:27 -05:00
|
|
|
: <inspector-gadget> ( model -- gadget )
|
2015-07-21 15:11:42 -04:00
|
|
|
vertical inspector-gadget new-track with-lines
|
2008-11-20 22:58:30 -05:00
|
|
|
add-toolbar
|
2009-02-05 05:00:27 -05:00
|
|
|
swap >>model
|
2009-01-06 17:53:08 -05:00
|
|
|
dup model>> <inspector-table> >>table
|
2015-07-25 03:39:46 -04:00
|
|
|
dup model>> <summary-gadget> margins white-interior "Object" object-color <labeled> f track-add
|
2015-07-25 05:53:00 -04:00
|
|
|
dup table>> <scroller> margins white-interior "Contents" contents-color <labeled> 1 track-add ;
|
2008-09-27 15:36:04 -04:00
|
|
|
|
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
|
|
|
|
2009-01-08 18:02:54 -05:00
|
|
|
: slot-editor-window ( close-hook update-hook assoc key key-string -- )
|
2014-07-16 05:26:52 -04:00
|
|
|
[ <value-ref> <slot-editor> ]
|
|
|
|
[
|
|
|
|
<world-attributes>
|
|
|
|
swap "Slot editor: " prepend >>title
|
2014-08-05 13:03:17 -04:00
|
|
|
[ { dialog-window } append ] change-window-controls
|
2014-07-16 05:26:52 -04:00
|
|
|
] bi*
|
2009-09-23 23:51:25 -04:00
|
|
|
open-status-window ;
|
2009-01-08 18:02:54 -05:00
|
|
|
|
|
|
|
: com-edit-slot ( inspector -- )
|
|
|
|
[ close-window ] swap
|
|
|
|
[ '[ _ com-refresh ] ]
|
|
|
|
[ control-value make-mirror ]
|
|
|
|
[ table>> (selected-row) ] tri [
|
|
|
|
[ key>> ] [ key-string>> ] bi
|
|
|
|
slot-editor-window
|
2012-10-23 15:21:30 -04:00
|
|
|
] [ 4drop ] if ;
|
2009-01-08 18:02:54 -05:00
|
|
|
|
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 {
|
2016-12-31 21:54:18 -05:00
|
|
|
{ T{ key-down f f "r" } com-refresh }
|
2009-01-06 17:53:08 -05:00
|
|
|
{ T{ key-down f f "p" } com-push }
|
2009-01-08 18:02:54 -05:00
|
|
|
{ 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
|
|
|
|
|
2009-01-07 13:18:42 -05:00
|
|
|
inspector-gadget "multi-touch" f {
|
2009-01-28 01:30:57 -05:00
|
|
|
{ up-action com-refresh }
|
2009-01-07 13:18:42 -05:00
|
|
|
} define-command-map
|
|
|
|
|
2009-02-05 05:00:27 -05:00
|
|
|
: inspect-model ( model -- )
|
|
|
|
<inspector-gadget> "Inspector" open-status-window ;
|
|
|
|
|
2009-01-07 00:30:08 -05:00
|
|
|
: inspector ( obj -- )
|
2009-02-05 05:00:27 -05:00
|
|
|
<model> inspect-model ;
|
2012-02-21 18:06:27 -05:00
|
|
|
|
2016-07-30 12:16:29 -04:00
|
|
|
inspector-gadget { 550 400 } set-tool-dim
|