! Copyright (C) 2008 Jeff Bigot ! See http://factorcode.org/license.txt for BSD license. USING: kernel io.files io.backend io.directories io.files.info io.pathnames sequences models strings ui ui.operations ui.commands ui.gestures ui.gadgets ui.gadgets.buttons ui.gadgets.lists ui.gadgets.labels ui.gadgets.tracks ui.gadgets.packs ui.gadgets.panes ui.gadgets.scrollers prettyprint combinators rewrite-closures accessors values tools.walker fry ; IN: 4DNav.file-chooser TUPLE: file-chooser < track path extension selected-file presenter hook list ; : find-file-list ( gadget -- list ) [ file-chooser? ] find-parent list>> ; file-chooser H{ { T{ key-down f f "UP" } [ find-file-list select-previous ] } { T{ key-down f f "DOWN" } [ find-file-list select-next ] } { T{ key-down f f "PAGE_UP" } [ find-file-list list-page-up ] } { T{ key-down f f "PAGE_DOWN" } [ find-file-list list-page-down ] } { T{ key-down f f "RET" } [ find-file-list invoke-value-action ] } { T{ button-down } request-focus } { T{ button-down f 1 } [ find-file-list invoke-value-action ] } } set-gestures : list-of-files ( file-chooser -- seq ) [ path>> value>> directory-entries ] [ extension>> ] bi '[ [ name>> _ [ tail? ] with contains? ] [ directory? ] bi or ] filter ; : update-filelist-model ( file-chooser -- file-chooser ) [ list-of-files ] [ model>> ] bi set-model ; : init-filelist-model ( file-chooser -- file-chooser ) dup list-of-files >>model ; : (fc-go) ( file-chooser quot -- ) [ [ file-chooser? ] find-parent dup path>> ] dip call normalize-path swap set-model update-filelist-model drop ; : fc-go-parent ( file-chooser -- ) [ dup value>> parent-directory ] (fc-go) ; : fc-go-home ( file-chooser -- ) [ home ] (fc-go) ; : fc-change-directory ( file-chooser file -- file-chooser ) dupd [ path>> value>> normalize-path ] [ name>> ] bi* append-path over path>> set-model update-filelist-model ; : fc-load-file ( file-chooser file -- ) dupd [ selected-file>> ] [ name>> ] bi* swap set-model [ path>> value>> ] [ selected-file>> value>> append ] [ hook>> ] tri call ; inline ! : fc-ok-action ( file-chooser -- quot ) ! dup selected-file>> value>> "" = ! [ drop [ drop ] ] [ ! [ path>> value>> ] ! [ selected-file>> value>> append ] ! [ hook>> prefix ] tri ! [ drop ] prepend ! ] if ; : line-selected-action ( file-chooser -- ) dup list>> list-value dup directory? [ fc-change-directory ] [ fc-load-file ] if ; : present-dir-element ( element -- string ) [ name>> ] [ directory? ] bi [ "-> " prepend ] when ; : ( file-chooser -- list ) dup [ nip line-selected-action ] curry [ present-dir-element ] rot model>> ; : ( hook path extension -- gadget ) { 0 1 } file-chooser new-track swap >>extension swap >>path "" >>selected-file swap >>hook init-filelist-model dup >>list "choose a file in directory "