factor/basis/ui/operations/operations.factor

84 lines
2.3 KiB
Factor
Raw Normal View History

! Copyright (C) 2006, 2008 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays definitions kernel ui.commands
ui.gestures sequences strings math words generic namespaces make
hashtables help.markup quotations assocs ;
2007-09-20 18:09:08 -04:00
IN: ui.operations
SYMBOL: +keyboard+
SYMBOL: +primary+
SYMBOL: +secondary+
TUPLE: operation predicate command translator hook listener? ;
: <operation> ( predicate command -- operation )
operation new
[ ] >>hook
[ ] >>translator
swap >>command
swap >>predicate ;
2007-09-20 18:09:08 -04:00
2008-03-26 19:23:19 -04:00
PREDICATE: listener-operation < operation
[ command>> listener-command? ] [ listener?>> ] bi or ;
2007-09-20 18:09:08 -04:00
M: operation command-name
command>> command-name ;
2007-09-20 18:09:08 -04:00
M: operation command-description
command>> command-description ;
2007-09-20 18:09:08 -04:00
M: operation command-word command>> command-word ;
2007-09-20 18:09:08 -04:00
: operation-gesture ( operation -- gesture )
command>> +keyboard+ word-prop ;
2007-09-20 18:09:08 -04:00
SYMBOL: operations
: object-operations ( obj -- operations )
operations get [ predicate>> call ] with filter ;
2007-09-20 18:09:08 -04:00
: find-operation ( obj quot -- command )
>r object-operations r> find-last nip ; inline
: primary-operation ( obj -- operation )
[ command>> +primary+ word-prop ] find-operation ;
2007-09-20 18:09:08 -04:00
: secondary-operation ( obj -- operation )
dup
[ command>> +secondary+ word-prop ] find-operation
2007-09-20 18:09:08 -04:00
[ ] [ primary-operation ] ?if ;
: default-flags ( -- assoc )
H{ { +keyboard+ f } { +primary+ f } { +secondary+ f } } ;
: define-operation ( pred command flags -- )
default-flags swap assoc-union
2007-09-20 18:09:08 -04:00
dupd define-command <operation>
operations get push ;
: modify-operation ( hook translator operation -- operation )
clone
swap >>translator
swap >>hook
t >>listener? ;
2007-09-20 18:09:08 -04:00
: modify-operations ( operations hook translator -- operations )
rot [ modify-operation ] with with map ;
2007-09-20 18:09:08 -04:00
: operations>commands ( object hook translator -- pairs )
[ object-operations ] 2dip modify-operations
2007-09-20 18:09:08 -04:00
[ [ operation-gesture ] keep ] { } map>assoc ;
: define-operation-map ( class group blurb object hook translator -- )
operations>commands define-command-map ;
: operation-quot ( target command -- quot )
[
swap literalize ,
dup translator>> %
command>> ,
2007-09-20 18:09:08 -04:00
] [ ] make ;
M: operation invoke-command ( target command -- )
[ hook>> call ] keep operation-quot call ;