>>19
But can you write a graphical file browser in J, together with all common widgets?
arrow D Fn S:{\normal} = o
render:<=skin “arrow/$D-$S”>
input:<[\mice_left y P] = S,<\normal=!S:\pressed = timer 1/4 <= S,<\pressed = Fn,c = √>> >
;[\mice_left n P] = S,<\pressed=Fn,c=!S:\normal>>
_prn:<=“arrow\\$D S:\\$S”>
litem Text W:{140} S:{\normal} = T:ø = TW:1 = TH:ø = Bs:ø
= R:o render:<OS:{ø}=Bs.{OS;S}> text:<=T>
s_text:<ø = !S:\disabled = r “ ”
;Text:!T = !T:Text = textSize \small T | <[W H] = !TW:W = !TH:H>
= T,<!“ ”=!S:\normal> = !Bs: q normal picked disabled | sort
| m:N l N (skin “litem/$N” |h cut 0 0 W 18
| <G = C:N,<\picked=\white;\disabled=\grey;_=\yellow>
= blitText 4 G'h%2-TH%2+2 \small T Tint:C G>)>
s_state:<NS=!S:NS>
input:<[\mice_left y P] = !S:S,<\normal=\picked;\picked=\normal;X=X>>
_prn:<=“litem $T W:$W $S:\\$S”>
= R.s_text Text = R
list Xs L:{5} W:{300} F:{<V=>} = O:ø = N:0 = LV:ø = B: dup {L;1} “ ” | m:T litem T W:W | box\v
= Is:B'items | m ?,1 = H:Is,0'render'h
= R:o render:B.render value:<=Xs,N> data:<=Xs> off:<=O>
s_off:<NO:!O = !O: sature1D 0 Xs,len-1 NO
= rng 0 L | e <K = I:O+K = Is,K.s_text Xs,I = {I≥≤N = Is,K.s_state \picked}>>
s_data:<Ys = !Xs:Ys = !N:0 = !O:ø = s_off 0>
input:<[\mice_left y P] = NN: sature1D 0 Xs,len-1 P,1%H+O
= {NN≤≥N = K:N-O = {K≥≥0 |a K≤≤L= Is,K.s_state \normal}
= !N:NN = F Xs,N = Is,(N-O).s_state \picked}>
= R.s_off 0 = {Xs = Is,0.s_state \picked} = F Xs,N = R
box D Xs S:{0} = Rs:Xs|m:X [[0 0 1 1] X] = o items:<=Rs>
render:<= Hs: m ?'render Xs = !Rs:ø = W:0 = H:0
= D,<\v = !W: maxBy ?'w Hs | ?'w = !H: Hs | m ?'h | infix S | sum
; _ = !H: maxBy ?'h Hs | ?'h = !W: Hs | m ?'w | infix S | sum>
= u w:<=W> h:<=H>
proxy:<X Y G = N:0 = m [? ??] Xs Hs
| e <[B H] = P:D,<\v=[0 N];_=[N 0]> = G.blit @(P+[X Y]) H
= [@!Rs [[@P H'w H'h] B]] = !N+(S+D,<\v=H'h; _=H'w>)>>>
_prn:<=“box\\$D S:$S”>
slider D Fn Size:{124} A:{1} V:{0} S:{\normal}
= K: skin “slider/knob” = B: skin “slider/$D-normal”
= !B: B.cut 0 0 @D,<\v=[B'w Size];_=[Size B'h]> = M:Size-D,<\v=K'h;_=K'w>
= !V:(sature1D 0 100 V)*M/100 = R:o
render:<=B'copy.blit @([1 1]+D,<\v=[0 V,int];_=[V,int 0]>) K> value:<=V*100%M>
s_value:<NV = !NV:sature1D 0 100 NV = {NV≤≥(c value) = !V:NV*M/100 = R:value,c = Fn R} = ø>
input:<[\mice_move _ P] = S,<\pressed = sature1D 0 M D,<\v=P,1;_=P,0>
| <NV:!V = !V:NV = Fn value,c>>
;[\mice_left y P] = S,<\normal=!S:\pressed>
;[\mice_left n P] = S,<\pressed=!S:\normal>>
_prn:<=“slider\\$D Size:$Size”>
= {A = box D ::l (arrow D,<\v=\up;_=\left> <=R.s_value R'value-A>)
R
(arrow D,<\v=\down;_=\right> <=R.s_value R'value+A>)
;√ = R}
fileList Root F = fl:<R = Es:R,ls = Fs: k file? Es | m ?,pne,<[P N E]=“$N.$E”>
= Ds: k dir? Es | m ?,pne,0,rhd | m “$?/”
= [@R,<!“/”=[“../”]> @Ds @Fs]>
= Root,rhd,<!“/”=!Root:“$Root/”> = L:list L:9 F:<N=F “$Root$N”> Root,fl = LI:L.input
= !L.input:<[\mice_left_double y P] = V:L'value,<“../”=Root,pne,<[P N E]=[P,rtl N E],unpne>
;V=“$Root$V”>
= {V,dir? = !Root:V = L.s_data V,fl}
;E = LI E>
= box\h ::l L (slider\v <N = L.s_off N*L'data,len%100>)