1 ! Copyright (C) 2008 Jeff Bigot
\r
2 ! See http://factorcode.org/license.txt for BSD license.
\r
24 ui.gadgets.scrollers
\r
33 IN: 4DNav.file-chooser
\r
35 TUPLE: file-chooser < track
\r
44 : find-file-list ( gadget -- list )
\r
45 [ file-chooser? ] find-parent list>> ;
\r
48 { T{ key-down f f "UP" } [ find-file-list select-previous ] }
\r
49 { T{ key-down f f "DOWN" } [ find-file-list select-next ] }
\r
50 { T{ key-down f f "PAGE_UP" } [ find-file-list list-page-up ] }
\r
51 { T{ key-down f f "PAGE_DOWN" } [ find-file-list list-page-down ] }
\r
52 { T{ key-down f f "RET" } [ find-file-list invoke-value-action ] }
\r
53 { T{ button-down } request-focus }
\r
54 { T{ button-down f 1 } [ find-file-list invoke-value-action ] }
\r
57 : list-of-files ( file-chooser -- seq )
\r
58 [ path>> value>> directory-entries ] [ extension>> ] bi
\r
59 '[ [ name>> _ [ tail? ] with contains? ] [ directory? ] bi or ] filter
\r
62 : update-filelist-model ( file-chooser -- file-chooser )
\r
63 [ list-of-files ] [ model>> ] bi set-model ;
\r
65 : init-filelist-model ( file-chooser -- file-chooser )
\r
66 dup list-of-files <model> >>model ;
\r
68 : (fc-go) ( file-chooser quot -- )
\r
69 [ [ file-chooser? ] find-parent dup path>> ] dip
\r
71 normalize-path swap set-model
\r
72 update-filelist-model
\r
75 : fc-go-parent ( file-chooser -- )
\r
76 [ dup value>> parent-directory ] (fc-go) ;
\r
78 : fc-go-home ( file-chooser -- )
\r
81 : fc-change-directory ( file-chooser file -- file-chooser )
\r
82 dupd [ path>> value>> normalize-path ] [ name>> ] bi*
\r
83 append-path over path>> set-model
\r
84 update-filelist-model
\r
87 : fc-load-file ( file-chooser file -- )
\r
88 dupd [ selected-file>> ] [ name>> ] bi* swap set-model
\r
90 [ selected-file>> value>> append ]
\r
95 ! : fc-ok-action ( file-chooser -- quot )
\r
96 ! dup selected-file>> value>> "" =
\r
97 ! [ drop [ drop ] ] [
\r
98 ! [ path>> value>> ]
\r
99 ! [ selected-file>> value>> append ]
\r
100 ! [ hook>> prefix ] tri
\r
104 : line-selected-action ( file-chooser -- )
\r
105 dup list>> list-value
\r
107 [ fc-change-directory ] [ fc-load-file ] if ;
\r
109 : present-dir-element ( element -- string )
\r
110 [ name>> ] [ directory? ] bi [ "-> " prepend ] when ;
\r
112 : <file-list> ( file-chooser -- list )
\r
113 dup [ nip line-selected-action ] curry
\r
114 [ present-dir-element ] rot model>> <list> ;
\r
116 : <file-chooser> ( hook path extension -- gadget )
\r
117 { 0 1 } file-chooser new-track
\r
119 swap <model> >>path
\r
120 "" <model> >>selected-file
\r
122 init-filelist-model
\r
123 dup <file-list> >>list
\r
124 "choose a file in directory " <label> f track-add
\r
125 dup path>> <label-control> f track-add
\r
126 dup extension>> ", " join "limited to : " prepend <label> f track-add
\r
128 "selected file : " <label> add-gadget
\r
129 over selected-file>> <label-control> add-gadget
\r
132 over [ swap fc-go-parent ] curry "go up" swap <bevel-button> add-gadget
\r
133 over [ swap fc-go-home ] curry "go home" swap <bevel-button> add-gadget
\r
134 ! over [ swap fc-ok-action ] curry "OK" swap <bevel-button> add-gadget
\r
135 ! [ drop ] "Cancel" swap <bevel-button> add-gadget
\r
137 dup list>> <scroller> 1 track-add
\r
140 M: file-chooser pref-dim* drop { 400 200 } ;
\r
142 : file-chooser-window ( -- )
\r
143 [ . ] home { "xml" "txt" } <file-chooser> "Choose a file" open-window ;
\r