metabrush/src/app/MetaBrush/Document.hs

118 lines
2.7 KiB
Haskell
Raw Normal View History

{-# LANGUAGE BlockArguments #-}
2020-08-19 21:34:43 +00:00
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DeriveGeneric #-}
2020-08-20 01:57:26 +00:00
{-# LANGUAGE FlexibleContexts #-}
2020-08-10 14:38:27 +00:00
{-# LANGUAGE MultiParamTypeClasses #-}
2020-08-19 21:34:43 +00:00
{-# LANGUAGE TypeApplications #-}
2020-08-10 14:38:27 +00:00
module MetaBrush.Document
( AABB(..)
, Document(..), currentDocument
2020-08-19 21:34:43 +00:00
, Stroke(..)
2020-08-20 01:57:26 +00:00
, PointData(..), BrushPointData(..)
, FocusState(..)
, _selection, _brush
)
where
2020-08-04 06:15:06 +00:00
-- containers
import Data.IntMap.Strict
( IntMap )
import qualified Data.IntMap.Strict as IntMap
( lookup )
2020-08-16 22:09:16 +00:00
import Data.Sequence
( Seq )
import GHC.Generics
( Generic )
2020-08-19 21:34:43 +00:00
-- generic-lens
import Data.Generics.Product.Fields
( field' )
2020-08-20 01:57:26 +00:00
import Data.Generics.Product.Typed
( HasType(typed) )
2020-08-19 21:34:43 +00:00
-- lens
import Control.Lens
( Lens' )
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
2020-08-19 21:34:43 +00:00
import Math.Bezier.Stroke
( StrokePoint(..) )
2020-08-10 14:38:27 +00:00
import Math.Vector2D
( Point2D )
2020-08-16 22:09:16 +00:00
import MetaBrush.Unique
( Unique )
2020-08-10 14:38:27 +00:00
2020-08-04 06:15:06 +00:00
--------------------------------------------------------------------------------
2020-08-10 14:38:27 +00:00
data AABB
= AABB
{ topLeft, botRight :: !( Point2D Double ) }
2020-08-10 14:38:27 +00:00
deriving stock Show
2020-08-04 06:15:06 +00:00
data Document
= Document
{ displayName :: !Text
, mbFilePath :: !( Maybe FilePath )
2020-08-04 06:15:06 +00:00
, unsavedChanges :: !Bool
2020-08-10 14:38:27 +00:00
, bounds :: !AABB
, viewportCenter :: !( Point2D Double )
, zoomFactor :: !Double
, documentUnique :: Unique
, strokes :: ![ Stroke ]
2020-08-04 06:15:06 +00:00
}
deriving stock ( Show, Generic )
2020-08-10 14:38:27 +00:00
data Stroke
= Stroke
{ strokeName :: Text
2020-08-13 17:05:19 +00:00
, strokeVisible :: !Bool
2020-08-16 22:09:16 +00:00
, strokeUnique :: Unique
, strokePoints :: !( Seq ( StrokePoint PointData ) )
2020-08-13 17:05:19 +00:00
}
deriving stock ( Show, Generic )
2020-08-13 17:05:19 +00:00
2020-08-19 21:34:43 +00:00
data PointData
= PointData
{ pointState :: FocusState
2020-08-20 01:57:26 +00:00
, brushShape :: Seq ( StrokePoint BrushPointData )
2020-08-13 17:05:19 +00:00
}
deriving stock ( Show, Generic )
2020-08-20 01:57:26 +00:00
data BrushPointData
= BrushPointData
{ brushPointState :: FocusState }
deriving stock ( Show, Generic )
2020-08-13 17:05:19 +00:00
data FocusState
= Normal
| Hover
| Selected
2020-08-19 03:28:47 +00:00
deriving stock ( Show, Eq )
2020-08-20 01:57:26 +00:00
_selection :: HasType FocusState pt => Lens' ( StrokePoint pt ) FocusState
_selection = field' @"pointData" . typed @FocusState
_brush :: Lens' ( StrokePoint PointData ) ( Seq ( StrokePoint BrushPointData ) )
_brush = field' @"pointData" . field' @"brushShape"
2020-08-19 21:34:43 +00:00
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 )