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" }
\r
49 [ find-file-list select-previous ] }
\r
50 { T{ key-down f f "DOWN" }
\r
51 [ find-file-list select-next ] }
\r
52 { T{ key-down f f "PAGE_UP" }
\r
53 [ find-file-list list-page-up ] }
\r
54 { T{ key-down f f "PAGE_DOWN" }
\r
55 [ find-file-list list-page-down ] }
\r
56 { T{ key-down f f "RET" }
\r
57 [ find-file-list invoke-value-action ] }
\r
60 { T{ button-down f 1 }
\r
61 [ find-file-list invoke-value-action ] }
\r
64 : list-of-files ( file-chooser -- seq )
\r
65 [ path>> value>> directory-entries ] [ extension>> ] bi
\r
66 '[ [ name>> _ [ tail? ] with any? ]
\r
67 [ directory? ] bi or ] filter
\r
70 : update-filelist-model ( file-chooser -- file-chooser )
\r
71 [ list-of-files ] [ model>> ] bi set-model ;
\r
73 : init-filelist-model ( file-chooser -- file-chooser )
\r
74 dup list-of-files <model> >>model ;
\r
76 : (fc-go) ( file-chooser quot -- )
\r
77 [ [ file-chooser? ] find-parent dup path>> ] dip
\r
79 normalize-path swap set-model
\r
80 update-filelist-model
\r
83 : fc-go-parent ( file-chooser -- )
\r
84 [ dup value>> parent-directory ] (fc-go) ;
\r
86 : fc-go-home ( file-chooser -- )
\r
89 : fc-change-directory ( file-chooser file -- file-chooser )
\r
90 dupd [ path>> value>> normalize-path ] [ name>> ] bi*
\r
91 append-path over path>> set-model
\r
92 update-filelist-model
\r
95 : fc-load-file ( file-chooser file -- )
\r
96 dupd [ selected-file>> ] [ name>> ] bi* swap set-model
\r
98 [ selected-file>> value>> append ]
\r
103 ! : fc-ok-action ( file-chooser -- quot )
\r
104 ! dup selected-file>> value>> "" =
\r
105 ! [ drop [ drop ] ] [
\r
106 ! [ path>> value>> ]
\r
107 ! [ selected-file>> value>> append ]
\r
108 ! [ hook>> prefix ] tri
\r
112 : line-selected-action ( file-chooser -- )
\r
113 dup list>> list-value
\r
115 [ fc-change-directory ] [ fc-load-file ] if ;
\r
117 : present-dir-element ( element -- string )
\r
118 [ name>> ] [ directory? ] bi [ "-> " prepend ] when ;
\r
120 : <file-list> ( file-chooser -- list )
\r
121 dup [ nip line-selected-action ] curry
\r
122 [ present-dir-element ] rot model>> <list> ;
\r
124 : <file-chooser> ( hook path extension -- gadget )
\r
125 { 0 1 } file-chooser new-track
\r
127 swap <model> >>path
\r
128 "" <model> >>selected-file
\r
130 init-filelist-model
\r
131 dup <file-list> >>list
\r
132 "choose a file in directory " <label> f track-add
\r
133 dup path>> <label-control> f track-add
\r
134 dup extension>> ", " join "limited to : " prepend
\r
135 <label> f track-add
\r
137 "selected file : " <label> add-gadget
\r
138 over selected-file>> <label-control> add-gadget
\r
141 over [ swap fc-go-parent ] curry "go up"
\r
142 swap <bevel-button> add-gadget
\r
143 over [ swap fc-go-home ] curry "go home"
\r
144 swap <bevel-button> add-gadget
\r
145 ! over [ swap fc-ok-action ] curry "OK"
\r
146 ! swap <bevel-button> add-gadget
\r
147 ! [ drop ] "Cancel" swap <bevel-button> add-gadget
\r
149 dup list>> <scroller> 1 track-add
\r
152 M: file-chooser pref-dim* drop { 400 200 } ;
\r
154 : file-chooser-window ( -- )
\r
155 [ . ] home { "xml" "txt" } <file-chooser>
\r
156 "Choose a file" open-window ;
\r