scope-0.5.0.0: Scope/View.hs
{-# LANGUAGE RecordWildCards #-}
{-# OPTIONS -Wall #-}
----------------------------------------------------------------------
-- |
-- Module : Scope.View
-- Copyright : Conrad Parker
-- License : BSD3-style (see LICENSE)
--
-- Maintainer : Conrad Parker <conrad@metadecks.org>
-- Stability : unstable
-- Portability : unknown
--
-- Functions for dealing with Views
----------------------------------------------------------------------
module Scope.View (
-- * Motion, zooming
viewAlign
, viewMoveTo
, viewZoomOutOn
-- * Button handling
, viewButtonDown
, viewButtonMotion
, viewButtonRelease
) where
import Data.Maybe (fromJust)
import Scope.Types
----------------------------------------------------------------------
canvasToData :: View -> CanvasX -> DataX
canvasToData View{..} (CanvasX cX) = translate viewX1 $
DataX (cX * toDouble (distance viewX1 viewX2))
viewSetEnds :: DataX -> DataX -> View -> View
viewSetEnds x1 x2 v@View{..} = v { viewX1 = x1, viewX2 = x2 }
-- | Align a view so the given DataX appears at CanvasX,
-- preserving the current view width.
viewAlign :: CanvasX -> DataX -> View -> View
viewAlign (CanvasX cx) (DataX dx) v@View{..} = viewSetEnds (DataX newX1') (DataX newX2') v
where
DataX vW = distance viewX1 viewX2 -- current width of view window
newX1 = max 0 $ dx - (cx * vW)
newX2 = newX1 + vW
(newX1', newX2') = restrictPair01 (newX1, newX2)
viewMoveTo :: Double -> View -> View
viewMoveTo val v@View{..} = viewSetEnds newX1' newX2' v
where
(newX1', newX2') = restrictPair01 .
translatePair (distance viewX1 (DataX val)) $
(viewX1, viewX2)
viewZoomOutOn :: CanvasX -> Double -> View -> View
viewZoomOutOn focus mult v@View{..} = viewSetEnds newX1 newX2' v
where
(newX1, newX2') = restrictPair01 $
zoomPair focus mult (viewX1, viewX2)
viewButtonDown :: CanvasX -> View -> View
viewButtonDown cX v = v { dragDX = Just (canvasToData v cX) }
viewButtonMotion :: CanvasX -> View -> View
viewButtonMotion cX v@View{..} = viewAlign cX (fromJust dragDX) v
viewButtonRelease :: View -> View
viewButtonRelease v = v { dragDX = Nothing}
----------------------------------------------------------------------