0.0.0.0:80 juere-engine / master level-editor / ui / ui.factor
master

Tree @master (Download .tar.gz)

ui.factor @masterraw · history · blame

USING: accessors io.backend kernel sequences ui.gadgets 
ui.gadgets.borders ui.gadgets.labels ui.gadgets.packs 
ui.gadgets.presentations ui.gadgets.tracks ui.images ui.pens
ui.pens.image pair-rocket unicode combinators ui.gestures
   juere-engine
   juere-engine.stage
   juere-engine.utils
   juere-engine.rendering
   juere-engine.ui
   juere-engine.physics
   juere-engine.level-editor ;
IN: juere-engine.level-editor.ui

TUPLE: mat-entry < track ;
M: mat-entry pref-dim* drop { 100 200 } ;

: <image-pen>* ( pathname -- pen )
   normalize-path <image-name> cached-image <image-pen>
   t >>fill? ;

: <mat-entry> ( material -- gadget )
! TODO: Operations to select active-mat & edit material values
   vertical mat-entry new-track swap
   [ top-tex>> ] [ side-tex>> ] bi 
   [ "" over <presentation> 
     swap <image-pen>* >>interior 0.5 track-add
   ] bi@ ;

TUPLE: mat-editor < track ;

TUPLE: active-mat-gadget < gadget
   level ;
SINGLETON: active-mat-pen 

: <active-mat-gadget> ( level-editor -- gadget )
   [ active-mat-gadget new ] dip >>level 
   active-mat-pen >>interior ;

M: active-mat-gadget pref-dim* drop { 100 100 } ;

M: active-mat-pen draw-interior
   drop dup level>> [ active-mat>> ] [ mat-atlas>> ] bi
   nth side-tex>> [ draw-background ] curry with-3dgl ;

! TUPLE: new-mat-gadget ...

: <mat-editor> ( level-editor -- gadget )
   vertical mat-editor new-track
      <shelf> ! Update at runtime.
         pick mat-atlas>> [ <mat-entry> add-gadget ] each
   f track-add
      over <active-mat-gadget> { 0 15 } <border>
   f track-add
   { 0 0 } <border>
   nip ;

TUPLE: lv-edit-gadget < track ;

: <edit-level> ( stage -- lv-edit-gadget )
   ! Todo: save dropped slots into scraps
   >stage drop lv-editor <stage-as>
      0 "almaide.png" <rsrc> 1/360 { 1.5 1.5 } f f f cursor boa
      add-entity
   [ horizontal lv-edit-gadget new-track ] dip
      [ <mat-editor> f track-add ] keep
      [ <stage-gadget> f track-add ] keep 
   drop ;

: (play-level) ( stage -- stage scraps )
   >stage [ physical <stage-as> ] dip ;

: (restore-editor) ( stage scraps -- stage )
   lv-editor restore-substage ;

: play-level ( stage-gadget -- stage-gadget )
   dup stage>> (play-level) [ >>stage ] [ >>scraps ] bi* ;

: restore-editor ( stage-gadget -- stage-gadget )
   dup [ stage>> >stage drop ] [ scraps>> ] bi
   lv-editor restore-substage >>stage ;

: play-level* ( lv-editor-gadget -- lv-editor-gadget )
   1 over nth-gadget play-level drop ;
   
: restore-editor* ( lv-editor-gadget -- lv-editor-gadget )
   1 over nth-gadget restore-editor drop ;

: <edit-level>* ( stage -- lv-editor )
   <edit-level> run-juere 1 swap nth-gadget stage>> ;

M: lv-edit-gadget handle-gesture ( gesture gadget -- ? )
! Todo: gets shadowed by stage-gadget
   swap dup key-gesture? [ dup sym>> >lower {
      { "o" [     [ play-level* drop ] if-down ] }
      { "p" [ [ restore-editor* drop ] if-down ] }
   [ 3drop f ]
   } case ] [ 2drop f ] if ;