metabrush/src/app/MetaBrush/Document.hs

102 lines
2.3 KiB
Haskell
Raw Normal View History

{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DeriveGeneric #-}
2020-08-10 14:38:27 +00:00
{-# LANGUAGE MultiParamTypeClasses #-}
module MetaBrush.Document
( AABB(..)
, Document(..), currentDocument
, Stroke(..), StrokePoint(..), PointType(..)
, FocusState(..), switchFocusState
, Overlay(..)
)
where
2020-08-04 06:15:06 +00:00
-- containers
import Data.IntMap.Strict
( IntMap )
import qualified Data.IntMap.Strict as IntMap
( lookup )
import GHC.Generics
( Generic )
2020-08-10 14:38:27 +00:00
-- text
import Data.Text
( Text )
-- stm
import qualified Control.Concurrent.STM as STM
( atomically )
import qualified Control.Concurrent.STM.TVar as STM
( TVar, readTVar )
2020-08-10 14:38:27 +00:00
-- MetaBrush
import Math.Vector2D
( Point2D )
2020-08-04 06:15:06 +00:00
--------------------------------------------------------------------------------
2020-08-10 14:38:27 +00:00
data AABB
= AABB
{ topLeft :: !( Point2D Double )
, botRight :: !( Point2D Double )
}
deriving stock Show
2020-08-04 06:15:06 +00:00
data Document
= Document
{ displayName :: !Text
2020-08-10 14:38:27 +00:00
, filePath :: !( Maybe FilePath )
2020-08-04 06:15:06 +00:00
, unsavedChanges :: !Bool
2020-08-10 14:38:27 +00:00
, strokes :: ![ Stroke ]
, bounds :: !AABB
, viewportCenter :: !( Point2D Double )
, zoomFactor :: !Double
2020-08-04 06:15:06 +00:00
}
deriving stock ( Show, Generic )
2020-08-10 14:38:27 +00:00
data Stroke
= Stroke
2020-08-13 17:05:19 +00:00
{ strokePoints :: ![ StrokePoint ]
, strokeName :: !Text
, strokeVisible :: !Bool
}
deriving stock ( Show, Generic )
2020-08-13 17:05:19 +00:00
data StrokePoint
= StrokePoint
{ strokePoint :: !( Point2D Double )
, pointType :: !PointType
, pointState :: !FocusState
}
deriving stock ( Show, Generic )
2020-08-13 17:05:19 +00:00
data PointType
= PathPoint
| ControlPoint
deriving stock Show
data FocusState
= Normal
| Hover
| Selected
deriving stock Show
switchFocusState :: FocusState -> FocusState
switchFocusState Normal = Selected
switchFocusState Hover = Hover
switchFocusState Selected = Normal
2020-08-13 22:47:10 +00:00
data Overlay
= SelectionRectangle !( Point2D Double ) !( Point2D Double )
deriving stock Show
currentDocument :: STM.TVar ( Maybe Int ) -> STM.TVar ( IntMap Document ) -> IO ( Maybe Document )
currentDocument activeDocumentTVar openDocumentsTVar = STM.atomically do
mbActive <- STM.readTVar activeDocumentTVar
case mbActive of
Nothing -> pure Nothing
Just i -> do
docs <- STM.readTVar openDocumentsTVar
pure ( IntMap.lookup i docs )