> module Init
Module to deal with the screen and mouse initialisation.
Also contains function to control active screen regions.
> ( initialiseMouse,initialiseScreen,
> labelButtons,clearRender,clearTree,clearText,
> toNoTextRegion,toTextRegion,
> toMouseRegion,
> indicate,labelClassify,labelDefinePoly,
> unlabelButtons,mark,reset)
> where
> import Params (Command(..),Button(..),delimiter,renderHeight,windowWidth,
> windowHeight,renderLeft,buttons,mouseCaptionAcross,
> mouseCaptionDown,button1TextOrigin,button,button1Box,
> button2Box,button3Box,mouseBox,
> button2TextOrigin,button3TextOrigin,gap,renderRegion,
> treeRegion,windowRegion,noTextRegion,textRegion,mouseRegion,
> textIn,textDown,buttonIndent,buttonWidth,buttonHeight)
> import Stdlib (map2,mapcat,seQuence)
> import MGRlib (setEvent, setMode, setCursor, textReset, clear,
> line, movePrintTo, printOver, setTextRegion, writeVert)
initialiseMouse: Sets up the middle button to return the
string defined by delimiter.
Sets up the right button to return the
string "x y\n" where x and y are co-ordinates
of the mouse pointer at the moment the button
is pressed.
> initialiseMouse :: String
> initialiseMouse = seQuence [ setEvent 1 "%p\n",
> setEvent 2 (delimiter++"\n")]
initialiseScreen: Sets the screen into overwrite mode,
switches the off,
sets the textscreen to be the whole window,
clear the textscreen.
It then gets drawscreen to set up the
Geometric modeller interface screen.
Finally it switches to the 'notext' region.
> initialiseScreen :: String
> initialiseScreen = seQuence [ setMode 7,
> setCursor 5,
> textReset,
> clear,
> drawScreen,
> toNoTextRegion]
drawScreen: Draws two lines splitting the screen horizontally
and vertically. Creates four regions:
The Button Pad
The Rendering Window
The Tree Form Window
The Mouse State/Text window.
It thens intiates the drawing of the buttons on the
Button Pad and the Mouse State diagram.
> drawScreen :: String
> drawScreen = seQuence [ line [0,renderHeight+1,windowWidth,renderHeight+1],
> line [renderLeft-1,0,renderLeft-1,windowHeight],
> drawButtons buttons,
> drawMouse]
drawMouse: Draws the Mouse State diagram. This is a Box labelled
"Mouse" with three interior boxes representing
the mouses button. The left is permanently
marked "SYSTEM RESERVED" since the MGR window
manager reserves this button for MGR operations.
The remaining button are labelled for the initial
state.
> drawMouse :: String
> drawMouse = seQuence [ movePrintTo mouseCaptionAcross mouseCaptionDown "Mouse",
> drawBox mouseBox,
> drawBox button1Box,
> drawBox button2Box,
> drawBox button3Box,
> writeVert button1TextOrigin (map2 spacer "RESERVED" "SYSTEM !"),
> labelButtons ("BUTTON ","DISABLED ") ("SELECT ","OPERATION")]
labelButtons: Takes two pairs of strings and labels the
middle and right button boxes on the mouse state
diagram respectively.
> labelButtons :: (String,String) -> (String,String) -> String
> labelButtons (label2_1,label2_2) (label3_1,label3_2)
> = seQuence [ toMouseRegion,
> writeVert button2TextOrigin (map2 spacer label2_1 label2_2),
> writeVert button3TextOrigin (map2 spacer label3_1 label3_2),
> toNoTextRegion]
> spacer :: Char -> Char -> String
> spacer x y = x:gap:[y]
clearRender: Clear the render section of the screen of its contents
> clearRender :: String
> clearRender = clearRegion renderRegion
cleartree: Clear the tree-form section of the screen of its contents
> clearTree :: String
> clearTree = clearRegion treeRegion
clearButton: Clear the button at height d of the screen of its contents
> clearButton :: Button -> String
> clearButton (_,d,_) = clearRegion (button d)
> clearRegion :: [Int] -> String
> clearRegion region = seQuence [setTextRegion (inside region), clear, toNoTextRegion]
> clearText :: String
> clearText = clear
> inside :: [Int] -> [Int]
> inside [top,left,width,height] = [top+1,left+1,width-2,height-2]
toScreenRegion: Set up the whole screen as the current text window
> toScreenRegion :: String
> toScreenRegion = setTextRegion windowRegion
toNoTextRegion: Set up the notext region as the current text window
> toNoTextRegion :: String
> toNoTextRegion = setTextRegion noTextRegion
toTextRegion: Set up the text region as the current text window
> toTextRegion :: String
> toTextRegion = setTextRegion textRegion
toMouseRegion: Set up the mouse region as the current text window
> toMouseRegion :: String
> toMouseRegion = setTextRegion mouseRegion
drawButtons: Draw the button on the button pad
> drawButtons :: [Button] -> String
> drawButtons = mapcat drawButton
drawButton: Draws one button. A button is defined by
its representing Command, its position
on the pad and its label.
Drawing the button involves drawing the button
box on the pad at a depth d and labelling it.
> drawButton :: Button -> String
> drawButton (_,d,name) = seQuence [ printOver textIn (d+textDown) name,
> drawBox [buttonIndent,d,buttonWidth,buttonHeight] ]
mark: Takes a button indicated by its position on the pad
and wipes of the remaining button labels. Thus
indicates the button selected.
> mark :: Command -> String
> mark cmd = seQuence [ toScreenRegion,
> mapcatButton clearButton cmd buttons,
> toNoTextRegion]
noMark: Restores the buttons after an operation has taken place
> noMark :: Command -> String
> noMark cmd = seQuence [ toScreenRegion,
> mapcatButton title cmd buttons,
> toNoTextRegion]
> where
> title (_,d,str) = movePrintTo textIn (d+textDown) str
mapcatButton : applies a function f to each button except the one
at height h. Note can use simple map once button h is
encountered.
> mapcatButton :: (Button->String) -> Command -> [Button] -> String
> mapcatButton f cmd [] = []
> mapcatButton f cmd (butt@(cmd',_,_):butts)
> | cmd==cmd' = mapcat f butts
> | otherwise = f butt ++ mapcatButton f cmd butts
drawBox: Draws a box on the screen with origin (i.e. topLeft corner)
at point (x,y) and of height h and width w.
> drawBox :: [Int] -> String
> drawBox [x,y,width,height] = seQuence [ line [x,y,x,y+height],
> line [x,y+height,x+width,y+height],
> line [x+width,y+height,x+width,y],
> line [x+width,y,x,y]]
reset: Disclaims control of the window when GMS is Quit.
Cursor returned to normal and text region
returned to full screen.
> reset :: String
> reset = seQuence [mark Quit, textReset, setCursor 0]
indicate : Unlabels all button but the one selected,
evaluates the string given
and labels the buttons again.
> indicate :: Command -> [String] -> String
> indicate Null _ = ""
> indicate cmd str = mark cmd ++ seQuence str ++ noMark cmd
unlabelButtons, labelDefinePoly, labelClassify:
Shorthand definitions for labelling actions.
> unlabelButtons = labelButtons ("BUTTON ","DISABLED ")
> ("SELECT ","OPERATION")
> labelDefinePoly = labelButtons ("COMPLETE ","POLYGON ")
> ("DEFINE ","VERTEX ")
> labelClassify = labelButtons ("FINISH ","CLASSIFY ")
> ("CLASSIFY ","POINT ")
|