Add right-click menu to tables, row-value word

db4
Slava Pestov 2009-01-07 12:18:42 -06:00
parent c054c8028a
commit c09f91da69
3 changed files with 47 additions and 16 deletions

View File

@ -3,16 +3,18 @@
USING: accessors arrays colors fry io.styles kernel math USING: accessors arrays colors fry io.styles kernel math
math.geometry.rect math.order math.vectors namespaces opengl math.geometry.rect math.order math.vectors namespaces opengl
sequences ui.gadgets ui.gadgets.scrollers ui.gadgets.status-bar sequences ui.gadgets ui.gadgets.scrollers ui.gadgets.status-bar
ui.gadgets.worlds ui.gadgets.theme ui.gestures ui.render models ui.gadgets.worlds ui.gadgets.theme ui.gestures ui.render
math.ranges sequences combinators ; ui.gadgets.menus models math.ranges sequences combinators ;
IN: ui.gadgets.tables IN: ui.gadgets.tables
! Row rendererer protocol ! Row rendererer protocol
GENERIC: row-columns ( row renderer -- columns ) GENERIC: row-columns ( row renderer -- columns )
GENERIC: row-value ( row renderer -- object )
SINGLETON: trivial-renderer SINGLETON: trivial-renderer
M: trivial-renderer row-columns drop ; M: trivial-renderer row-columns drop ;
M: object row-value drop ;
TUPLE: table < gadget TUPLE: table < gadget
renderer filled-column column-alignment action renderer filled-column column-alignment action
@ -172,10 +174,11 @@ M: table pref-dim*
over [ control-value nth ] [ 2drop f ] if ; over [ control-value nth ] [ 2drop f ] if ;
: selected-row ( table -- value/f ) : selected-row ( table -- value/f )
[ selected-index>> ] keep nth-row ; [ selected-index>> ] keep [ nth-row ] keep
over [ renderer>> row-value ] [ drop ] if ;
: update-selected-value ( table -- ) : update-selected-value ( table -- )
[ selected-row ] keep selected-value>> set-model ; [ selected-row ] [ selected-value>> ] bi set-model ;
M: table model-changed M: table model-changed
nip nip
@ -228,21 +231,37 @@ M: table model-changed
: hide-mouse-help ( table -- ) : hide-mouse-help ( table -- )
f >>mouse-index [ hide-status ] [ relayout-1 ] bi ; f >>mouse-index [ hide-status ] [ relayout-1 ] bi ;
: valid-row? ( row table -- ? )
control-value length 1- 0 swap between? ;
: show-row-summary ( row table -- )
[ renderer>> row-value ] keep show-summary ;
: if-mouse-row ( table true false -- )
[ [ mouse-row ] keep 2dup valid-row? ]
[ ] [ '[ nip @ ] ] tri* if ; inline
: show-mouse-help ( table -- ) : show-mouse-help ( table -- )
[ mouse-row ] keep [
2dup control-value length 1- 0 swap between? [
[ swap >>mouse-index relayout-1 ] [ swap >>mouse-index relayout-1 ]
[ [
[ nth-row ] keep [ nth-row ] keep
over [ show-summary ] [ 2drop ] if over [ show-row-summary ] [ 2drop ] if
] 2bi ] 2bi
] [ nip hide-mouse-help ] if ; ] [ hide-mouse-help ] if-mouse-row ;
: table-operations-menu ( table -- )
[
[ nth-row ] keep [ renderer>> row-value ] keep
swap show-operations-menu
] [ drop ] if-mouse-row ;
table H{ table H{
{ T{ mouse-enter } [ show-mouse-help ] } { T{ mouse-enter } [ show-mouse-help ] }
{ T{ mouse-leave } [ hide-mouse-help ] } { T{ mouse-leave } [ hide-mouse-help ] }
{ T{ motion } [ show-mouse-help ] } { T{ motion } [ show-mouse-help ] }
{ T{ button-down } [ table-button-down ] } { T{ button-down } [ table-button-down ] }
{ T{ button-down f f 3 } [ table-operations-menu ] }
{ T{ button-up } [ table-button-up ] } { T{ button-up } [ table-button-up ] }
{ T{ gain-focus } [ t >>focused? drop ] } { T{ gain-focus } [ t >>focused? drop ] }
{ T{ lose-focus } [ f >>focused? drop ] } { T{ lose-focus } [ f >>focused? drop ] }

View File

@ -21,6 +21,9 @@ SINGLETON: inspector-renderer
M: inspector-renderer row-columns M: inspector-renderer row-columns
drop [ key-string>> ] [ value-string>> ] bi 2array ; drop [ key-string>> ] [ value-string>> ] bi 2array ;
M: inspector-renderer row-value
drop value>> ;
: <summary-gadget> ( model -- gadget ) : <summary-gadget> ( model -- gadget )
[ [
standard-table-style [ standard-table-style [
@ -52,7 +55,7 @@ DEFER: inspector
: <inspector-table> ( model -- table ) : <inspector-table> ( model -- table )
[ make-slot-descriptions ] <filter> <table> [ make-slot-descriptions ] <filter> <table>
[ value>> inspector ] >>action [ inspector ] >>action
inspector-renderer >>renderer inspector-renderer >>renderer
monospace-font >>font ; monospace-font >>font ;
@ -88,5 +91,9 @@ inspector-gadget "toolbar" f {
{ T{ key-down f f "F1" } inspector-help } { T{ key-down f f "F1" } inspector-help }
} define-command-map } define-command-map
inspector-gadget "multi-touch" f {
{ T{ up-action } com-refresh }
} define-command-map
: inspector ( obj -- ) : inspector ( obj -- )
<inspector-gadget> "Inspector" open-status-window ; <inspector-gadget> "Inspector" open-status-window ;

View File

@ -1,13 +1,14 @@
! Copyright (C) 2007, 2009 Slava Pestov. ! Copyright (C) 2007, 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: ui.tools.browser kernel quotations accessors fry USING: kernel quotations accessors fry
assocs present math.order math.vectors arrays locals assocs present math.order math.vectors arrays locals
models.search models.sort models sequences vocabs models.search models.sort models sequences vocabs
tools.profiler ui ui.commands ui.gadgets ui.gadgets.panes tools.profiler words prettyprint ui ui.commands ui.gadgets
ui.gadgets.scrollers ui.gadgets.tracks ui.gestures ui.gadgets.panes ui.gadgets.scrollers ui.gadgets.tracks ui.gestures
ui.gadgets.buttons ui.gadgets.tables ui.gadgets.search-tables ui.gadgets.buttons ui.gadgets.tables ui.gadgets.search-tables
ui.gadgets.labelled ui.gadgets.buttons ui.gadgets.packs ui.gadgets.labelled ui.gadgets.buttons ui.gadgets.packs
ui.gadgets.labels ui.gadgets.tabbed words prettyprint ; ui.gadgets.labels ui.gadgets.tabbed ui.gadgets.status-bar
ui.tools.browser ;
FROM: models.filter => <filter> ; FROM: models.filter => <filter> ;
FROM: models.compose => <compose> ; FROM: models.compose => <compose> ;
IN: ui.tools.profiler IN: ui.tools.profiler
@ -25,19 +26,23 @@ SINGLETON: word-renderer
M: word-renderer row-columns M: word-renderer row-columns
drop [ [ present ] map ] [ { "All" "" } ] if* ; drop [ [ present ] map ] [ { "All" "" } ] if* ;
M: word-renderer row-value drop first ;
SINGLETON: method-renderer SINGLETON: method-renderer
! Value is a { method-body count } pair ! Value is a { method-body count } pair
M: method-renderer row-columns M: method-renderer row-columns
drop [ first synopsis ] [ second present ] bi 2array ; drop [ first synopsis ] [ second present ] bi 2array ;
M: method-renderer row-value drop first ;
: <profiler-model> ( values profiler -- model ) : <profiler-model> ( values profiler -- model )
[ [ filter-counts ] <filter> ] [ sort>> ] bi* <sort> ; [ [ filter-counts ] <filter> ] [ sort>> ] bi* <sort> ;
: <words-model> ( profiler -- model ) : <words-model> ( profiler -- model )
[ [
[ words>> ] [ vocab>> ] bi [ words>> ] [ vocab>> ] bi
[ [ [ first vocabulary>> ] [ first ] bi* = ] when* ] <search> [ [ [ first vocabulary>> ] dip = ] when* ] <search>
] keep <profiler-model> ; ] keep <profiler-model> ;
: match? ( pair/f str -- ? ) : match? ( pair/f str -- ? )
@ -62,7 +67,7 @@ M: method-renderer row-columns
[ class-counters ] dip <profiler-filter-model> ; [ class-counters ] dip <profiler-filter-model> ;
: method-matches? ( method generic class -- ? ) : method-matches? ( method generic class -- ? )
[ dup [ first ] when ] tri@ [ first ] 2dip
[ drop dup [ subwords memq? ] [ 2drop t ] if ] [ drop dup [ subwords memq? ] [ 2drop t ] if ]
[ nip dup [ swap "method-class" word-prop = ] [ 2drop t ] if ] [ nip dup [ swap "method-class" word-prop = ] [ 2drop t ] if ]
3bi and ; 3bi and ;
@ -145,6 +150,6 @@ profiler-gadget "toolbar" f {
} define-command-map } define-command-map
: profiler-window ( -- ) : profiler-window ( -- )
<profiler-gadget> "Profiling results" open-window ; <profiler-gadget> "Profiling results" open-status-window ;
MAIN: profiler-window MAIN: profiler-window