-- LML original: Sandra Foubister, 1990
-- Haskell translation: Colin Runciman, May 1991
module Layout( setup,dpxyorig, dpxygap, dpxynum,invisibletext,
vistextreg, designarea,tilearea,inpicarea,picarea,
textarea, helptextarea, dpgrid,tpgrid,picgrid,
cleara, picxorig, picyorig, picbox,menumark,unmenumark,
tpxorig, tpyorig, tpxygap,inrect, incirc,
todesign, tofiddle, totile, tohelp, indgrid,
inbigtile, indesign, indsave, indclear,
indget, intsave, intclear, intget, intile4,
inhelp, inquit, intodraw, intotile, intoalter) where
import Mgrfuns
import Drawfuns
import Diff
-- dp definitions relate to the design phase of the program
--CR so they are now obsolete - in name at least
dpxyorig, dpxygap, dpxynum :: Int
dpxyorig = 20
dpxygap = 20
dpxynum = 19
dpfun :: Int -> Int -> [Char]
dpfun = drawdot
dpgrid :: [Char]
dpgrid = grid dpxyorig dpxyorig dpxygap dpxygap dpxynum dpxynum dpfun
designarea :: [Int]
designarea = [0,0,390,390]
-- tp definitions relate to the tiling phase of the program
--CR so they too are obsolete - in name at least
tpxorig, tpyorig, tpxygap, tpxynum :: Int
tpxorig = 524
tpyorig = 20
tpxygap = 72
tpxynum = 9
tpfun :: Int -> Int -> [Char]
tpfun = drawdot
tpgrid :: [Char]
tpgrid = grid tpxorig tpyorig tpxygap tpxygap tpxynum tpxynum tpfun
tilearea :: [Int]
tilearea = [521,18,580,580]
-- tm definitions relate to the menu for the tiling phase
tmxorig, tmyorig, tmxygap, tmxnum, tmynum :: Int
tmxorig = 485
tmyorig = 282
tmxygap = 57
tmxnum = 1
tmynum = 6
tmfun :: Int -> Int -> [Char]
tmfun = circ 28
tmgrid :: [Char]
tmgrid = grid tmxorig tmyorig tmxygap tmxygap tmxnum tmynum tmfun
-- dm definitions relate to the menu for the design phase
dmxorig, dmyorig, dmxygap, dmxnum, dmynum :: Int
dmxorig = 425
dmyorig = 54
dmxygap = 57
dmxnum = 1
dmynum = 4
dmfun :: Int -> Int -> [Char]
dmfun = circ 28
dmgrid :: [Char]
dmgrid = grid dmxorig dmyorig dmxygap dmxygap dmxnum dmynum dmfun
-- pic definitions relate to the display of the eight orientations
-- of the print
picxorig, picyorig, picxygap, picxnum, picynum :: Int
picxorig = 624
picyorig = 676
picxygap = 100
picxnum = 4
picynum = 2
picfun :: Int -> Int -> [Char]
picfun = squ 74
picgrid :: [Char]
picgrid =
grid (picxorig -1) (picyorig-1) picxygap picxygap picxnum picynum picfun
inpicarea :: Int -> Int -> Bool
inpicarea = inrect 624 676 400 200
picarea :: [Int]
picarea = [623,675,400,200]
picbox :: Int -> [Int]
picbox 1 = [picxorig,picyorig,72,72]
picbox 2 = [picxorig + picxygap,picyorig,72,72]
picbox 3 = [picxorig + (2 * picxygap),picyorig,72,72]
picbox 4 = [picxorig + (3 * picxygap),picyorig,72,72]
picbox 5 = [picxorig,picyorig + picxygap,72,72]
picbox 6 = [picxorig + picxygap,picyorig + picxygap,72,72]
picbox 7 = [picxorig + (2 * picxygap),picyorig + picxygap,72,72]
picbox 8 = [picxorig + (3 * picxygap),picyorig + picxygap,72,72]
textarea :: [Int]
textarea = [50,550,300,300]
-- vistextreg is the region into which to type filenames
vistextreg :: [Char]
vistextreg = textregion [50,615,200,100]
helptextarea :: [Int]
helptextarea = [50,500,380,400]
-- cleartextreg incorporates vistextreg and the prompt region
cleara :: [Int] -> [Char]
cleara area = textregion area ++ clear ++ invisibletext
-- these are strings to go in the menu boxes
menustrings :: [Char]
menustrings = func 4 ++
font 8 ++
stringto 0 405 64 "DRAW" ++
stringto 0 405 121 "SAVE" ++
stringto 0 410 178 "GET" ++
stringto 0 402 235 "CLEAR" ++
stringto 0 468 292 "TILE" ++
stringto 0 462 349 "ALTER" ++
stringto 0 468 404 "SAVE" ++
stringto 0 471 463 "GET" ++
stringto 0 464 520 "CLEAR" ++
stringto 0 474 577 "T4" ++
font 12 ++
stringto 0 457 729 "HELP" ++
stringto 0 457 829 "QUIT" ++
font 13 ++
stringto 0 112 450 "STAMP DESIGN"++
stringto 0 730 666 "TILE DESIGN"++
func 15
-- invisibletext sets up a scrolling text region, then moves the
-- text cursor out of it.
invisibletext :: [Char]
invisibletext = vistextreg ++
go [500,500] ++
aligntext ++ "\n"
inrect :: Int -> Int -> Int -> Int -> Int -> Int -> Bool
inrect x y w h xp yp = xp > x && xp <= x + w &&
yp > y && yp <= y + h
dmcirc, tmcirc, amcirc, hmcirc :: [Char]
dmcirc = circle [425,54,30]
tmcirc = circle [485,282,30]
amcirc = circle [485,339,30]
hmcirc = circle [485,712,38]
modemark :: [Char] -> [Char]
modemark str =
case str of
"draw" -> dmcirc ++ undo (tmcirc ++ amcirc ++ hmcirc)
"tile" -> tmcirc ++ undo (dmcirc ++ amcirc ++ hmcirc)
"alter"-> amcirc ++ undo (dmcirc ++ tmcirc ++ hmcirc)
"help" -> hmcirc ++ undo (dmcirc ++ tmcirc ++ amcirc)
menumark :: [Char] -> [Char]
menumark "tsave" = circ 30 tmxorig (tmyorig + (2 * tmxygap))
menumark "tget" = circ 30 tmxorig (tmyorig + (3 * tmxygap))
menumark "tclear"= circ 30 tmxorig (tmyorig + (4 * tmxygap))
menumark "t4" = circ 30 tmxorig (tmyorig + (5 * tmxygap))
menumark "dsave" = circ 30 dmxorig (dmyorig + dmxygap)
menumark "dget" = circ 30 dmxorig (dmyorig + (2 * dmxygap))
menumark "dclear"= circ 30 dmxorig (dmyorig + (3 * dmxygap))
unmenumark :: [Char] -> [Char]
unmenumark = undo . menumark
incirc :: Int -> Int -> Int -> Int -> Int -> Bool
incirc xc yc r xp yp = square (xp - xc) + square (yp - yc) <= square r
indgrid :: [Int] -> Bool
indgrid [x0,y0,x1,y1] = indesign x0 y0 && indesign x1 y1
inbigtile, indesign :: Int -> Int -> Bool
inbigtile = inrect tpxorig tpyorig tpwh tpwh
where
tpwh = tpxygap * (tpxynum - 1)
indesign = inrect 0 0 390 390
intodraw, indsave, indget, indclear :: Int -> Int -> Bool
-- some abstraction needed here!!!
intodraw = incirc dmxorig dmyorig 28
indsave = incirc dmxorig (dmyorig + dmxygap) 28
indget = incirc dmxorig (dmyorig + (2 * dmxygap)) 28
indclear = incirc dmxorig (dmyorig + (3 * dmxygap)) 28
intotile, intoalter, intsave, intget, intclear, intile4 :: Int -> Int -> Bool
intotile = incirc tmxorig tmyorig 28
intoalter = incirc tmxorig (tmyorig + tmxygap) 28
intsave = incirc tmxorig (tmyorig + (2 * tmxygap)) 28
intget = incirc tmxorig (tmyorig + (3 * tmxygap)) 28
intclear = incirc tmxorig (tmyorig + (4 * tmxygap)) 28
intile4 = incirc tmxorig (tmyorig + (5 * tmxygap)) 28
inhelp, inquit :: Int -> Int -> Bool
inhelp = incirc 485 712 36
inquit = incirc 485 812 36
-- the mode buttons:
buttons :: [Char]
buttons = circle [485,712,36] ++ circle [485,812,36]
setup :: [Char]
setup = textregion [0,0,0,0] ++
clear ++
tpgrid ++
dpgrid ++
tmgrid ++
dmgrid ++
picgrid ++
buttons ++
invisibletext ++
menustrings ++
todesign
-- cs shouldn't have an effect if all the coordinates are
-- outside the design area
todesign :: [Char]
todesign = setevent 1 "msc %p\n" ++ setevent 2 "cs %l\n" ++ modemark "draw"
-- in this mode 1 should be able to select orientations if clicked
-- over one of them, perhaps incorporate this in msa
totile :: [Char]
totile = setevent 1 "msa %p\n" ++
setevent 2 "put %p\n" ++
tpgrid ++
modemark "tile"
tofiddle :: [Char]
tofiddle = setevent 1 "msb %p\n" ++ setevent 2 "rot %p\n" ++ modemark "alter"
tohelp :: [Char]
tohelp = setevent 1 "msd %p\n" ++ setevent 2 "msd %p\n" ++ modemark "help"
|