-- | HTk\'s /arc/ canvas item.
-- An arc object on a canvas widget.
module HTk.Canvasitems.Arc (

  Arc,
  createArc,

  extent,
  getExtent,

  start,
  getStart

) where

import HTk.Kernel.Core
import HTk.Kernel.Configuration
import HTk.Canvasitems.CanvasItem
import HTk.Canvasitems.CanvasTag
import HTk.Canvasitems.CanvasItemAux
import Util.Computation
import Events.Synchronized
import Events.Destructible


-- -----------------------------------------------------------------------
-- arc
-- -----------------------------------------------------------------------

-- | The @Arc@ datatype.
data Arc = Arc GUIOBJECT deriving Eq


-- -----------------------------------------------------------------------
-- constructor
-- -----------------------------------------------------------------------

-- | Constructs a new arc item.
createArc :: Canvas
   -- ^ the parent canvas.
   -> [Config Arc]
   -- ^ the list of configuration options for this arc.
   -> IO Arc
   -- ^ An arc item.
createArc cnv cnf =
  createCanvasItem cnv ARC Arc cnf [(-1,-1),(-1,-1)]


-- -----------------------------------------------------------------------
-- instantiations
-- -----------------------------------------------------------------------

-- | Internal.
instance GUIObject Arc where
  toGUIObject (Arc w) = w
  cname _ = "Arc"

-- | An arc item can be destroyed.
instance Destroyable Arc where
  -- Destroys an arc item.
  destroy = destroy . toGUIObject

-- | You can synchronize on an arc item.
instance Synchronized Arc where
  -- Synchronizes on an arc item.
  synchronize = synchronize . toGUIObject

-- | An arc is a canvas item (any canvas item is an instance of the abstract
-- @class CanvasItem@).
instance CanvasItem Arc

-- | An arc item can have several tags (handlers for a set of canvas items).
instance TaggedCanvasItem Arc

-- | An arc is a filled canvas item (it has filling, outline, outline width,
-- and stipple configurations).
instance FilledCanvasItem Arc

-- | An alternative way to specify arc\'s coords.
instance HasGeometry Arc where
  -- Sets the arc\'s geometry (width, height, upper left position).
  geometry    = itemGeo
  -- Gets the arcs geometry (width, height, upper left position).
  getGeometry = getGeo

-- | You can specify the (upper left) position of an arc.
instance HasPosition Arc where
  -- Sets the arc\'s (upper left) position.
  position    = itemPosition
  -- Gets the (upper left) position of the arc.
  getPosition = getItemPosition

-- | You can specify the size of an arc.
instance HasSize Arc where
  -- Sets the width of an arc.
  width       = itemWidth
  -- Gets the width of an arc.
  getWidth    = getItemWidth
  -- Sets the height of an arc.
  height      = itemHeight
  -- Gets the height of an arc.
  getHeight   = getItemHeight
  -- Sets the size (width, height) of an arc.
  size        = itemSize
  -- Gets the size (width, height) of an arc.
  getSize     = getItemSize


-- -----------------------------------------------------------------------
-- config options
-- -----------------------------------------------------------------------

type Degree = Double

-- | Sets the length of an arc in counter-clockwise direction.
extent :: Degree -> Config Arc
extent d w = cset w "extent" d

-- | Gets the length of an arc in counter-clockwise direction.
getExtent :: Arc -> IO Degree
getExtent w = cget w "extent"

-- | Sets the starting angle of an arc.
start :: Degree -> Config Arc
start d w = cset w "start" d

-- | Gets the starting angle of an arc.
getStart :: Arc -> IO Degree
getStart w = cget w "start"