metabrush/src/app/MetaBrush/Context.hs

156 lines
4.6 KiB
Haskell
Raw Normal View History

module MetaBrush.Context
( UIElements(..), Variables(..)
2021-04-21 15:08:33 +00:00
, LR(..), Modifier(..), modifierKey
, HoldAction(..), GuideAction(..), PartialPath(..)
)
where
-- base
2021-02-23 20:52:03 +00:00
import Data.Int
( Int32 )
import Data.Word
( Word32 )
-- containers
import Data.Set
( Set )
import Data.Map.Strict
( Map )
2021-02-23 19:58:53 +00:00
-- gi-cairo-render
import qualified GI.Cairo.Render as Cairo
( Render )
2021-04-21 15:08:33 +00:00
-- gi-gdk
import qualified GI.Gdk as GDK
2021-04-21 15:08:33 +00:00
-- gi-gio
import qualified GI.Gio as GIO
-- gi-gtk
import qualified GI.Gtk as GTK
-- stm
import qualified Control.Concurrent.STM.TVar as STM
2020-09-10 16:43:42 +00:00
( TVar )
-- unordered-containers
import Data.HashMap.Strict
( HashMap )
-- MetaBrush
import Math.Bezier.Cubic.Fit
( FitParameters )
2023-01-08 16:16:14 +00:00
import Math.Linear
( Point2D )
2021-04-21 15:08:33 +00:00
import {-# SOURCE #-} MetaBrush.Action
( ActionName )
import MetaBrush.Asset.Colours
( Colours )
import MetaBrush.Document.Draw
( DrawAnchor )
2020-09-10 16:43:42 +00:00
import MetaBrush.Document.History
( DocumentHistory(..) )
2020-09-18 09:40:14 +00:00
import MetaBrush.Document.Selection
( DragMoveSelect )
import {-# SOURCE #-} MetaBrush.UI.FileBar
2021-04-21 15:08:33 +00:00
( FileBar, FileBarTab )
import {-# SOURCE #-} MetaBrush.UI.InfoBar
2020-09-10 16:43:42 +00:00
( InfoBar )
import {-# SOURCE #-} MetaBrush.UI.ToolBar
( Tool, Mode )
import MetaBrush.UI.Viewport
( Viewport(..), Ruler(..) )
import MetaBrush.Unique
( UniqueSupply, Unique )
--------------------------------------------------------------------------------
data UIElements
= UIElements
2021-04-21 15:08:33 +00:00
{ application :: !GTK.Application
, window :: !GTK.ApplicationWindow
, windowKeys :: !GTK.EventControllerKey
, titleBar :: !GTK.HeaderBar
, titleLabel :: !GTK.Label
, fileBar :: !FileBar
, viewport :: !Viewport
, infoBar :: !InfoBar
, menuBar :: GTK.PopoverMenuBar -- needs to be lazy for RecursiveDo
, menuActions :: !( HashMap ActionName GIO.SimpleAction )
, colours :: !Colours
}
data Variables
= Variables
2021-02-23 19:58:53 +00:00
{ uniqueSupply :: !UniqueSupply
2021-04-21 15:08:33 +00:00
, recomputeStrokesTVar :: !( STM.TVar Bool )
, documentRenderTVar :: !( STM.TVar ( ( Int32, Int32 ) -> Cairo.Render () ) )
, activeDocumentTVar :: !( STM.TVar ( Maybe Unique ) )
, openDocumentsTVar :: !( STM.TVar ( Map Unique DocumentHistory ) )
, mousePosTVar :: !( STM.TVar ( Maybe ( Point2D Double ) ) )
, mouseHoldTVar :: !( STM.TVar ( Maybe HoldAction ) )
, modifiersTVar :: !( STM.TVar ( Set Modifier ) )
, toolTVar :: !( STM.TVar Tool )
, modeTVar :: !( STM.TVar Mode )
, debugTVar :: !( STM.TVar Bool )
, partialPathTVar :: !( STM.TVar ( Maybe PartialPath ) )
, fileBarTabsTVar :: !( STM.TVar ( Map Unique FileBarTab ) )
, showGuidesTVar :: !( STM.TVar Bool )
, maxHistorySizeTVar :: !( STM.TVar Int )
, fitParametersTVar :: !( STM.TVar FitParameters )
}
--------------------------------------------------------------------------------
data LR = L | R
deriving stock ( Show, Eq, Ord )
data Modifier
= Control LR
| Alt LR
| Shift LR
deriving stock ( Show, Eq, Ord )
modifierKey :: Word32 -> Maybe Modifier
2021-04-21 15:08:33 +00:00
modifierKey n = case fromIntegral n of
GDK.KEY_Control_L -> Just ( Control L )
GDK.KEY_Control_R -> Just ( Control R )
GDK.KEY_Shift_L -> Just ( Shift L )
GDK.KEY_Shift_R -> Just ( Shift R )
GDK.KEY_Alt_L -> Just ( Alt L )
GDK.KEY_Alt_R -> Just ( Alt R )
_ -> Nothing
data GuideAction
= CreateGuide !Ruler
| MoveGuide !Unique
deriving stock Show
-- | Keep track of a mouse hold action:
--
-- - start a rectangular selection,
-- - move objects by dragging,
2020-09-18 09:40:14 +00:00
-- - draw a control point,
-- - create/modify a guide.
data HoldAction
= SelectionHold { holdStartPos :: !( Point2D Double ) }
2020-09-18 09:40:14 +00:00
| DragMoveHold { holdStartPos :: !( Point2D Double )
, dragAction :: !DragMoveSelect
}
| DrawHold { holdStartPos :: !( Point2D Double ) }
| GuideAction { holdStartPos :: !( Point2D Double )
, guideAction :: !GuideAction
}
deriving stock Show
-- | Keep track of a path that is in the middle of being drawn.
data PartialPath
= PartialPath
{ partialStartPos :: !( Point2D Double )
, partialControlPoint :: !( Maybe ( Point2D Double ) )
, partialPathAnchor :: !DrawAnchor
, firstPoint :: !Bool
}
deriving stock Show