-- LML original: Sandra Foubister, 1990 -- Haskell translation: Colin Runciman, May 1991 module Progfuns (tileprompt, tilequit, tiletrans, potatotile, State) where import Mgrfuns import Drawfuns import Geomfuns import Psfuns import Interstate import Auxprogfuns import Layout import Tilefuns import Help tileprompt :: a -> [Char] tileprompt _ = "" tilequit :: a -> [[Char]] -> Bool tilequit _ (('q':_):_) = True tilequit _ [] = True tilequit _ _ = False type State = ([([Int],[Int])], Int, [((Int,Int),Int)]) --CR needs abstraction! type Trans = State -> [[Char]] -> ([Char], State, [[Char]]) tiletrans :: Trans tiletrans (dlist,sel,tilist) (('m':'s':'a':' ':rest):inpt) = if intsave x y then doo tsave else if intclear x y then doo tclear else if intget x y then doo tget else if intile4 x y then doo t4' else if inquit x y then doo q else if inbigtile x y then doo delsq else if intoalter x y then doo tofiddle' else if intotile x y then doo totile' else if intodraw x y then doo todesign' else if inpicarea x y then doo sel' else if inhelp x y then doo tohelp' else tiletrans (dlist,sel,tilist) inpt where [x,y] = stoil rest doo fun = fun rest (dlist,sel,tilist) inpt tiletrans (dlist,sel,tilist) (('m':'s':'b':' ':rest):inpt) = if inbigtile x y then inv' rest (dlist,sel,tilist) inpt else tiletrans (dlist,sel,tilist) (('m':'s':'a':' ':rest):inpt) where [x,y] = stoil rest tiletrans (dlist,sel,tilist) (('m':'s':'c':' ':rest):inpt) = if indesign x y then doo rl else if indsave x y then doo dsave else if indclear x y then doo dclear else if indget x y then doo dget else tiletrans (dlist,sel,tilist) (('m':'s':'a':' ':rest):inpt) where [x,y] = stoil rest doo fun = fun rest (dlist,sel,tilist) inpt tiletrans state (('m':'s':'d':' ':rest):inpt) = (inithelp ++ out,state,inpt) where [x,y] = stoil rest cf str = clear ++ str out = if intodraw x y then cf helpdraw else if intotile x y then cf helptile else if intoalter x y then cf helpalter else if intsave x y then cf helptsave else if intclear x y then cf helptclear else if intget x y then cf helptget else if intile4 x y then cf helpt4 else if inquit x y then cf helpquit else if inbigtile x y then cf helpbt else if inpicarea x y then cf helppic else if indesign x y then cf helpdesign else if indsave x y then cf helpdsave else if indclear x y then cf helpdclear else if indget x y then cf helpdget else if inhelp x y then cf inithelp else cf errmes tiletrans (dlist,sel,tilist) (('c':'s':' ':rest):inpt) = if indgrid nstoilrest then (linecircs ++ wnstoilrest,(newele:dlist,sel,tilist),inpt) else ("",(dlist,sel,tilist),inpt) where nearline [x0,y0,x1,y1] = [nearx x0, neary y0, nearx x1, neary y1] nstoilrest = nearline (stoil rest) wnstoilrest = wline nstoilrest cssr = cs nstoilrest newele = (nstoilrest,snd cssr) linecircs = fst cssr tiletrans (dlist,sel,tilist) (('r':'o':'t':' ':rest):inpt) = if lsrest == [0,0] then ("",(dlist,sel,tilist),inpt) else ( undo (put lsrest (orient xymax oldas wcoords)) ++ put lsrest (orient xymax (rot oldas) wcoords) , (dlist,sel,newtilist) , inpt ) where stoilrest = stoil rest wcoords = map (map wscale) (map fst dlist) oldas = assoc (sqid stoilrest) tilist newtilist = newas (sqid stoilrest) (rot oldas) tilist lsrest = btlocate stoilrest tiletrans (dlist,sel,tilist) (('p':'u':'t':' ':rest):inpt) = if lsrest == [0,0] then ("",(dlist,sel,tilist),inpt) else ( undo (put lsrest (orient xymax oldas wcoords)) ++ put lsrest (orient xymax sel wcoords) , (dlist,sel,newtilist) , inpt ) where stoilrest = stoil rest newtilist = newas (sqid stoilrest) sel tilist lsrest = btlocate stoilrest coords = map fst dlist oldas = assoc (sqid stoilrest) tilist wcoords = map (map wscale) coords tiletrans state ("":inpt) = (helpend ++ todesign,state,inpt) tiletrans state (_:inpt)= ("",state,inpt) todesign', totile', tofiddle', tohelp' :: [Char] -> Trans todesign' _ (dlist,sel,tilist) inpt = ( cleara picarea ++ picgrid ++ cleara tilearea ++ tpgrid ++ showoris (map fst dlist) 1 ++ todesign , (dlist,sel,tilist) , inpt ) totile' _ (dlist,sel,tilist) inpt = ( concat (map (showoris coords) [1..8]) ++ totile , (dlist,sel,tilist) , inpt) where coords = map fst dlist tofiddle' _ (dlist,sel,tilist) inpt = (tofiddle,(dlist,sel,tilist),inpt) tohelp' _ (dlist,sel,tilist) inpt = (tohelp,(dlist,sel,tilist),inpt) rl, dsave, dclear, dget :: [Char] -> Trans rl rest (dlist,sel,tilist) inpt = (out,(newdlist,sel,tilist),inpt) where (out,newdlist) = deline dlist (stoil rest) dsave _ state inpt = ("", state, inpt) --CR: dsave does nothing, for now -- dsave _ (dlist,sel,tilist) inpt = -- (out,(dlist,sel,tilist),t) -- where -- (h:t) = inpt -- out = menumark "dsave" ++ -- prompt ++ -- tofile h ++ -- totext (map fst dlist) ++ -- "TOSTDOUT" ++ -- clearit ++ -- unmenumark "dsave" dclear rest (dlist,sel,tilist) inpt = ( menumark "dclear" ++ newdraw ++ unmark sel ++ unmenumark "dclear" , ([],1,initalist) , inpt ) dget _ state inpt = ("", state, inpt) --CR: dget does nothing, for now -- dget _ (dlist,sel,tilist) inpt = -- ( menumark "dget" ++ prompt ++ out ++ unmenumark "dget" -- , (newd,news,newt) -- , i ) -- where -- (h:t) = inpt -- conddraw = if dlist == [] then "" else newdraw -- (out,(newd,news,newt),i) = -- case openfile h of -- No emsg -> ( emsg ++ "\n" ++ delay 1000 ++ clearit -- , (dlist,sel,tilist) -- , t ) -- Yes file -> ( clearit ++ conddraw ++ out' -- , s -- , inp ) -- where -- (out',s,inp) = -- tiletrans ([],sel,tilist) (lines file ++ t)) sel', delsq, inv' :: [Char] -> Trans sel' rest (dlist,sel,slist) inpt = (unmark sel ++ mark newsel, (dlist,newsel,slist), inpt) where new = inbox (stoil rest) newsel = if new == 0 then sel else new delsq rest (dlist,sel,tilist) inpt = ( undo (put lsrest (orient xymax oldas wcoords)) , (dlist,sel,newtilist) , inpt ) where wcoords = map (map wscale) (map fst dlist) stoilrest = stoil rest oldas = assoc (sqid stoilrest) tilist lsrest = btlocate stoilrest newtilist = newas (sqid stoilrest) 0 tilist inv' rest (dlist,sel,tilist) inpt = if lsrest == [0,0] then ("",(dlist,sel,tilist),inpt) else ( undo (put lsrest (orient xymax oldas wcoords)) ++ put lsrest (orient xymax (inv oldas) wcoords) , (dlist,sel,newtilist) , inpt ) where stoilrest = stoil rest wcoords = map (map wscale) (map fst dlist) oldas = assoc (sqid stoilrest) tilist newtilist = newas (sqid stoilrest) (inv oldas) tilist lsrest = btlocate stoilrest tclear, tsave, tget, t4' :: [Char] -> Trans tclear _ (dlist,sel,tilist) inpt = ( menumark "tclear" ++ cleara tilearea ++ tpgrid ++ totile ++ unmenumark "tclear" , (dlist,sel,initalist) , inpt ) tsave _ state inpt = ("", state, inpt) --CR: tsave does nothing, for now -- tsave _ (dlist,sel,tilist) inpt = -- ( menumark "tsave" ++ -- prompt ++ -- tofile h ++ -- pos8head (tops dlist) ++ -- introline ++ -- concat . (map lf) ((reverse . ineights) (map (turn . snd) tilist)) ++ -- "\nshowpage\n" ++ -- tofile (h ++ ".pat") ++ -- (tpatformat . ineights . map snd) tilist ++ -- "TOSTDOUT" ++ -- clearit ++ -- unmenumark "tsave") -- , (dlist,sel,tilist) -- , t ) -- where -- (h:t) = inpt -- tops = (map (map wwscale)) . (map fst) tget _ state inpt = ("", state, inpt) --CR: tget does nothing, for now -- tget rest (dlist,sel,tilist) inpt = -- (out,(dlist,sel,(snd infromfile)),i) -- where -- (h:i) = inpt -- wcoords = map (map wscale) (map fst dlist) -- patfile = if h == "" then h -- else if head h == '*' then lib ++ tail h -- else h ++ ".pat" -- lib = "/n/johann/usr2/openday/reptile/potato/" --CR now where? -- infromfile = case openfile patfile of -- No emsg -> ( emsg ++ "\n" ++ delay 1000 ++ tpgrid -- , tilist ) -- Yes ls8 -> ( concat (map2 put (map squas alistind) -- (pam (orient xymax) orilist wcoords)) -- , zip alistind orilist ) -- where -- orilist = concat (map stoil (lines ls8)) -- -- have omitted @ tgrid after cleara tilearea -- out = menumark "tget" ++ -- cleara tilearea ++ -- prompt ++ -- fst infromfile ++ -- clearit ++ -- unmenumark "tget" t4' _ (dlist,sel,tilist) inpt = (out,(dlist,sel,newtilist),inpt) where orilist = pam assoc [(0,0),(0,1),(1,0),(1,1)] tilist wcoords = map (map wscale) (map fst dlist) pic = t4 (pam (orient xymax) orilist wcoords) newtilist = zip alistind (concrep 4 (cr12 ++ cr34)) where cr12 = concrep 4 [n1,n2] cr34 = concrep 4 [n3,n4] [n1,n2,n3,n4] = orilist out = menumark "t4" ++ cleara tilearea ++ tile tpxorig tpyorig 4 4 pic ++ unmenumark "t4" assoc :: (Eq a) => a -> [(a,b)] -> b assoc i ((j,v):ivs) = if i == j then v else assoc i ivs q :: [Char] -> Trans q _ state _ = ("",state,[]) {- UNUSED: prompt :: [Char] prompt = clearit ++ vistextreg ++ func 4 ++ stringto 0 50 600 "Type in filename: " ++ func 15 clearit :: [Char] clearit = cleara textarea totext :: [[Int]] -> [Char] totext = concat . map putline putline :: [Int] -> [Char] putline [x0,y0,x1,y1] = "cs " ++ show x0 ++ " " ++ show y0 ++ " " ++ show x1 ++ " " ++ show y1 ++ "\n" -} -- newdraw clears and redraws the design area, and the picarea. -- also the tile area -- It is used by dclear and by get newdraw :: [Char] newdraw = cleara designarea ++ dpgrid ++ cleara picarea ++ picgrid ++ cleara tilearea ++ tpgrid ++ invisibletext ++ todesign potatotile :: State -> [[Char]] -> [Char] potatotile = inter tileprompt tilequit tiletrans stoil :: [Char] -> [Int] stoil = map read . words