uni-htk-2.2.0.0: HTk/Canvasitems/Line.hs
-- | HTk\'s /line/ canvas item.
-- A line object on a canvas widget.
module HTk.Canvasitems.Line (
ArrowHead(..),
CapStyle(..),
JoinStyle(..),
Line,
createLine,
arrowshape,
getArrowshape,
arrowstyle,
getArrowstyle,
capstyle,
getCapstyle,
joinstyle,
getJoinstyle
) where
import HTk.Kernel.Core
import HTk.Kernel.Configuration
import HTk.Kernel.Geometry(Distance)
import HTk.Canvasitems.CanvasItem
import HTk.Canvasitems.CanvasTag
import HTk.Canvasitems.CanvasItemAux
import Data.Char
import Events.Destructible
import Util.Computation
import Events.Synchronized
-- -----------------------------------------------------------------------
-- datatype
-- -----------------------------------------------------------------------
-- | The @Line@ datatype.
newtype Line = Line GUIOBJECT deriving Eq
-- | The @ArrowShape@ datatype.
-- Describes the shape of an arrow at an end of a line.
type ArrowShape = (Distance, Distance, Distance)
-- -----------------------------------------------------------------------
-- constructor
-- -----------------------------------------------------------------------
-- | Constructs a new line item.
createLine :: Canvas
-- ^ the parent canvas.
-> [Config Line]
-- ^ the list of configuration options for this line item.
-> IO Line
-- ^ A line item.
createLine cnv cnf = createCanvasItem cnv LINE Line cnf [(-1,-1),(-1,-1)]
-- -----------------------------------------------------------------------
-- Instantiations
-- -----------------------------------------------------------------------
-- | Internal.
instance GUIObject Line where
toGUIObject (Line w) = w
cname _ = "Line"
-- | A line item can be destroyed.
instance Destroyable Line where
-- Destroys a line item.
destroy = destroy . toGUIObject
-- | A line item is a canvas item (any canvas item is an instance of the
-- abstract @class CanvasItem@).
instance CanvasItem Line
-- | A line item can have several tags (handlers for a set of canvas items).
instance TaggedCanvasItem Line
-- | A line item has filling, outline width and stipple configurations.
instance FilledCanvasItem Line where
-- Dummy.
outline c w = return w
-- Dummy.
getOutline w = return cdefault
-- | A line is a segmented canvas item. It has a splinesteps and smooth
-- configuration.
instance SegmentedCanvasItem Line
-- | You can synchronize on a line item.
instance Synchronized Line where
-- Synchronizes on a line item.
synchronize w = synchronize (toGUIObject w)
-- | You can specify the width of the line.
instance HasSize Line where
-- Dummy.
height _ w = return w
-- Dummy.
getHeight _ = return cdefault
-- -----------------------------------------------------------------------
-- configuration options
-- -----------------------------------------------------------------------
-- | Sets the style of the arrows at the ends of a line.
arrowstyle :: ArrowHead -> Config Line
arrowstyle d w = cset w "arrow" d
-- | Gets the style of the arrows at the ends of a line.
getArrowstyle :: Line -> IO ArrowHead
getArrowstyle w = cget w "arrow"
-- | Sets the shape of the arrows at the ends of a line.
arrowshape :: ArrowShape -> Config Line
arrowshape (x,y,z) w = cset w "arrowshape" [x, y, z]
-- | Gets the shape of the arrows at the end of a line.
getArrowshape :: Line -> IO ArrowShape
getArrowshape w = cget w "arrowshape" >>= next
where next (x:y:z:_) = return (x, y, z)
next _ = return (0, 0, 0)
-- | Sets the capstyle at the ends of a line (butt, projecting or round).
capstyle :: CapStyle -> Config Line
capstyle d w = cset w "capstyle" d
-- | Gets the capstyle at the ends of a line.
getCapstyle :: Line -> IO CapStyle
getCapstyle w = cget w "capstyle"
-- | Sets the joinstyle between the line segments (bevel, miter or round).
joinstyle :: JoinStyle -> Config Line
joinstyle d w = cset w "joinstyle" d
-- | Gets the joinstyle between the line segments.
getJoinstyle :: Line -> IO JoinStyle
getJoinstyle w = cget w "joinstyle"
-- -----------------------------------------------------------------------
-- ArrowHead
-- -----------------------------------------------------------------------
-- | The @ArrowHead@ datatype (see @Line.arrowstyle@).
data ArrowHead =
BothEnds | LastEnd | FirstEnd | NoHead deriving (Eq,Ord,Enum)
-- | Internal.
instance GUIValue ArrowHead where
cdefault = NoHead
-- | Internal.
instance Read ArrowHead where
readsPrec p b =
case dropWhile (isSpace) b of
'b':'o':'t':'h':xs -> [(BothEnds,xs)]
'l':'a':'s':'t': xs -> [(LastEnd,xs)]
'f':'i':'r':'s':'t':xs -> [(FirstEnd,xs)]
'n':'o':'n':'e':xs -> [(NoHead,xs)]
_ -> []
-- | Internal.
instance Show ArrowHead where
showsPrec d p r = (case p of
BothEnds -> "both"
LastEnd -> "last"
FirstEnd -> "first"
NoHead -> "none") ++ r
-- -----------------------------------------------------------------------
-- CapStyle
-- -----------------------------------------------------------------------
-- | The @CapStyle@ datatype (see @Line.capstyle@).
data CapStyle = CapRound | CapProjecting | CapButt deriving (Eq,Ord,Enum)
-- | Internal.
instance GUIValue CapStyle where
cdefault = CapButt
-- | Internal.
instance Read CapStyle where
readsPrec p b =
case dropWhile (isSpace) b of
'r':'o':'u':'n':'d':xs -> [(CapRound,xs)]
'p':'r':'o':'j':'e':'c':'t':'i':'n':'g': xs -> [(CapProjecting,xs)]
'b':'u':'t':'t':xs -> [(CapButt,xs)]
_ -> []
-- | Internal.
instance Show CapStyle where
showsPrec d p r = (case p of
CapRound -> "round"
CapProjecting -> "projecting"
CapButt -> "butt") ++ r
-- -----------------------------------------------------------------------
-- JoinStyle
-- -----------------------------------------------------------------------
-- | The @JoinStyle@ datatype (see @Line.joinstyle@).
data JoinStyle = JoinRound | JoinMiter | JoinBevel deriving (Eq,Ord,Enum)
-- | Internal.
instance GUIValue JoinStyle where
cdefault = JoinMiter
-- | Internal.
instance Read JoinStyle where
readsPrec p b = case dropWhile (isSpace) b of
'r':'o':'u':'n':'d':xs -> [(JoinRound,xs)]
'm':'i':'t':'e':'r': xs -> [(JoinMiter,xs)]
'b':'e':'v':'e':'l':xs -> [(JoinBevel,xs)]
_ -> []
-- | Internal.
instance Show JoinStyle where
showsPrec d p r = (case p of
JoinRound -> "round"
JoinMiter -> "miter"
JoinBevel -> "bevel") ++ r