{-# LANGUAGE RecordWildCards #-}
module Potato.Flow.Controller.Manipulator.Box (
  BoxHandleType(..)
  , BoxHandler(..)
  , BoxCreationType(..)
  , makeHandleBox
  , makeDeltaBox
  
) where
import           Relude
import           Potato.Flow.Controller.Handler
import           Potato.Flow.Controller.Input
import           Potato.Flow.Controller.Manipulator.BoxText
import           Potato.Flow.Controller.Manipulator.TextArea
import           Potato.Flow.Controller.Manipulator.Common
import           Potato.Flow.Controller.Types
import           Potato.Flow.Math
import           Potato.Flow.SEltMethods
import           Potato.Flow.SElts
import           Potato.Flow.Types
import           Potato.Flow.OwlItem
import Potato.Flow.Owl
import           Potato.Flow.OwlItem
import Potato.Flow.OwlState
import           Potato.Flow.OwlItem
import Potato.Flow.OwlWorkspace
import Potato.Flow.Methods.Types
import Potato.Flow.Llama
import           Data.Default
import           Data.Dependent.Sum                         (DSum ((:=>)))
import qualified Data.IntMap                                as IM
import qualified Data.Map as Map
import qualified Data.List                                  as L
import qualified Data.Sequence as Seq
import Control.Exception (assert)
superOwl_isTransformable :: (HasOwlTree o) => SuperOwl -> o -> Bool
superOwl_isTransformable :: forall o. HasOwlTree o => SuperOwl -> o -> Bool
superOwl_isTransformable SuperOwl
sowl o
ot = case OwlItem -> OwlSubItem
_owlItem_subItem (SuperOwl -> OwlItem
_superOwl_elt SuperOwl
sowl) of
  OwlSubItem
OwlSubItemNone -> Bool
False
  OwlSubItemFolder Seq Int
_ -> Bool
False
  OwlSubItemLine SAutoLine
sline -> Bool -> Bool
not forall a b. (a -> b) -> a -> b
$
    (forall a. a -> Maybe a -> a
fromMaybe Bool
False forall a b. (a -> b) -> a -> b
$ SAutoLine -> Maybe Attachment
_sAutoLine_attachStart SAutoLine
sline forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> (\Attachment
att -> forall o. HasOwlTree o => o -> Int -> Bool
hasOwlTree_exists o
ot (Attachment -> Int
_attachment_target Attachment
att)))
    Bool -> Bool -> Bool
&& (forall a. a -> Maybe a -> a
fromMaybe Bool
False forall a b. (a -> b) -> a -> b
$ SAutoLine -> Maybe Attachment
_sAutoLine_attachEnd SAutoLine
sline forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> (\Attachment
att -> forall o. HasOwlTree o => o -> Int -> Bool
hasOwlTree_exists o
ot (Attachment -> Int
_attachment_target Attachment
att)))
  OwlSubItem
_ -> Bool
True
transformableSelection :: PotatoHandlerInput -> Seq SuperOwl
transformableSelection :: PotatoHandlerInput -> Seq SuperOwl
transformableSelection PotatoHandlerInput {LBox
CanvasSelection
Selection
PotatoDefaultParameters
RenderCache
OwlPFState
LayersState
BroadPhaseState
_potatoHandlerInput_canvasSelection :: PotatoHandlerInput -> CanvasSelection
_potatoHandlerInput_selection :: PotatoHandlerInput -> Selection
_potatoHandlerInput_screenRegion :: PotatoHandlerInput -> LBox
_potatoHandlerInput_layersState :: PotatoHandlerInput -> LayersState
_potatoHandlerInput_renderCache :: PotatoHandlerInput -> RenderCache
_potatoHandlerInput_broadPhase :: PotatoHandlerInput -> BroadPhaseState
_potatoHandlerInput_potatoDefaultParameters :: PotatoHandlerInput -> PotatoDefaultParameters
_potatoHandlerInput_pFState :: PotatoHandlerInput -> OwlPFState
_potatoHandlerInput_canvasSelection :: CanvasSelection
_potatoHandlerInput_selection :: Selection
_potatoHandlerInput_screenRegion :: LBox
_potatoHandlerInput_layersState :: LayersState
_potatoHandlerInput_renderCache :: RenderCache
_potatoHandlerInput_broadPhase :: BroadPhaseState
_potatoHandlerInput_potatoDefaultParameters :: PotatoDefaultParameters
_potatoHandlerInput_pFState :: OwlPFState
..} = OwlPFState -> CanvasSelection -> Seq SuperOwl
transformableSelection' OwlPFState
_potatoHandlerInput_pFState CanvasSelection
_potatoHandlerInput_canvasSelection
transformableSelection' :: OwlPFState -> CanvasSelection -> Seq SuperOwl
transformableSelection' :: OwlPFState -> CanvasSelection -> Seq SuperOwl
transformableSelection' OwlPFState
pfs CanvasSelection
sel = forall a. (a -> Bool) -> Seq a -> Seq a
Seq.filter (forall a b c. (a -> b -> c) -> b -> a -> c
flip forall o. HasOwlTree o => SuperOwl -> o -> Bool
superOwl_isTransformable OwlPFState
pfs) (CanvasSelection -> Seq SuperOwl
unCanvasSelection CanvasSelection
sel)
data MouseManipulatorType = MouseManipulatorType_Corner | MouseManipulatorType_Side | MouseManipulatorType_Point | MouseManipulatorType_Area | MouseManipulatorType_Text deriving (Int -> MouseManipulatorType -> ShowS
[MouseManipulatorType] -> ShowS
MouseManipulatorType -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MouseManipulatorType] -> ShowS
$cshowList :: [MouseManipulatorType] -> ShowS
show :: MouseManipulatorType -> String
$cshow :: MouseManipulatorType -> String
showsPrec :: Int -> MouseManipulatorType -> ShowS
$cshowsPrec :: Int -> MouseManipulatorType -> ShowS
Show, MouseManipulatorType -> MouseManipulatorType -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MouseManipulatorType -> MouseManipulatorType -> Bool
$c/= :: MouseManipulatorType -> MouseManipulatorType -> Bool
== :: MouseManipulatorType -> MouseManipulatorType -> Bool
$c== :: MouseManipulatorType -> MouseManipulatorType -> Bool
Eq)
data MouseManipulator = MouseManipulator {
  MouseManipulator -> LBox
_mouseManipulator_box    :: LBox
  , MouseManipulator -> MouseManipulatorType
_mouseManipulator_type :: MouseManipulatorType
  
  
}
type MouseManipulatorSet = [MouseManipulator]
type ManipulatorIndex = Int
toMouseManipulators :: OwlPFState -> CanvasSelection -> MouseManipulatorSet
toMouseManipulators :: OwlPFState -> CanvasSelection -> MouseManipulatorSet
toMouseManipulators OwlPFState
pfs CanvasSelection
selection' = MouseManipulatorSet
bb where
  union_lBoxes :: NonEmpty LBox -> LBox
  union_lBoxes :: NonEmpty LBox -> LBox
union_lBoxes (LBox
x:|[LBox]
xs) = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' LBox -> LBox -> LBox
union_lBox LBox
x [LBox]
xs
  selection :: Seq SuperOwl
selection = OwlPFState -> CanvasSelection -> Seq SuperOwl
transformableSelection' OwlPFState
pfs CanvasSelection
selection'
  fmapfn :: SuperOwl -> LBox
fmapfn SuperOwl
sowl = SEltDrawer -> SEltDrawerBoxFn
_sEltDrawer_box (OwlSubItem -> SEltDrawer
getDrawer forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall o. HasOwlItem o => o -> OwlSubItem
hasOwlItem_toOwlSubItem forall a b. (a -> b) -> a -> b
$ SuperOwl
sowl) OwlPFState
pfs
  
  sboxes :: [LBox]
sboxes = forall (t :: * -> *) a. Foldable t => t a -> [a]
toList forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap SuperOwl -> LBox
fmapfn Seq SuperOwl
selection
  bb :: MouseManipulatorSet
bb = case [LBox]
sboxes of
    []   -> []
    LBox
x:[LBox]
xs -> forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b c. (a -> b -> c) -> b -> a -> c
flip BoxHandleType -> LBox -> MouseManipulator
makeHandleBox (NonEmpty LBox -> LBox
union_lBoxes (LBox
xforall a. a -> [a] -> NonEmpty a
:|[LBox]
xs))) [BoxHandleType
BH_TL .. BoxHandleType
BH_A]
findFirstMouseManipulator :: OwlPFState -> RelMouseDrag -> CanvasSelection -> Maybe ManipulatorIndex
findFirstMouseManipulator :: OwlPFState -> RelMouseDrag -> CanvasSelection -> Maybe Int
findFirstMouseManipulator OwlPFState
pfs (RelMouseDrag MouseDrag {Bool
[KeyModifier]
XY
MouseDragState
MouseButton
_mouseDrag_isLayerMouse :: MouseDrag -> Bool
_mouseDrag_state :: MouseDrag -> MouseDragState
_mouseDrag_to :: MouseDrag -> XY
_mouseDrag_modifiers :: MouseDrag -> [KeyModifier]
_mouseDrag_button :: MouseDrag -> MouseButton
_mouseDrag_from :: MouseDrag -> XY
_mouseDrag_isLayerMouse :: Bool
_mouseDrag_state :: MouseDragState
_mouseDrag_to :: XY
_mouseDrag_modifiers :: [KeyModifier]
_mouseDrag_button :: MouseButton
_mouseDrag_from :: XY
..}) CanvasSelection
selection = Maybe Int
r where
  mms :: MouseManipulatorSet
mms = OwlPFState -> CanvasSelection -> MouseManipulatorSet
toMouseManipulators OwlPFState
pfs CanvasSelection
selection
  smt :: SelectionManipulatorType
smt = CanvasSelection -> SelectionManipulatorType
computeSelectionType CanvasSelection
selection
  
  normalSel :: Maybe Int
normalSel = forall a. (a -> Bool) -> [a] -> Maybe Int
L.findIndex (\MouseManipulator
mm -> LBox -> XY -> Bool
does_lBox_contains_XY (MouseManipulator -> LBox
_mouseManipulator_box MouseManipulator
mm) XY
_mouseDrag_from) MouseManipulatorSet
mms
  r :: Maybe Int
r = case SelectionManipulatorType
smt of
    SelectionManipulatorType
SMTTextArea -> Maybe Int
normalSel 
    SelectionManipulatorType
_       -> Maybe Int
normalSel
data BoxHandleType = BH_TL | BH_TR | BH_BL | BH_BR | BH_A | BH_T | BH_B | BH_L | BH_R  deriving (Int -> BoxHandleType -> ShowS
[BoxHandleType] -> ShowS
BoxHandleType -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BoxHandleType] -> ShowS
$cshowList :: [BoxHandleType] -> ShowS
show :: BoxHandleType -> String
$cshow :: BoxHandleType -> String
showsPrec :: Int -> BoxHandleType -> ShowS
$cshowsPrec :: Int -> BoxHandleType -> ShowS
Show, BoxHandleType -> BoxHandleType -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: BoxHandleType -> BoxHandleType -> Bool
$c/= :: BoxHandleType -> BoxHandleType -> Bool
== :: BoxHandleType -> BoxHandleType -> Bool
$c== :: BoxHandleType -> BoxHandleType -> Bool
Eq, Int -> BoxHandleType
BoxHandleType -> Int
BoxHandleType -> [BoxHandleType]
BoxHandleType -> BoxHandleType
BoxHandleType -> BoxHandleType -> [BoxHandleType]
BoxHandleType -> BoxHandleType -> BoxHandleType -> [BoxHandleType]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: BoxHandleType -> BoxHandleType -> BoxHandleType -> [BoxHandleType]
$cenumFromThenTo :: BoxHandleType -> BoxHandleType -> BoxHandleType -> [BoxHandleType]
enumFromTo :: BoxHandleType -> BoxHandleType -> [BoxHandleType]
$cenumFromTo :: BoxHandleType -> BoxHandleType -> [BoxHandleType]
enumFromThen :: BoxHandleType -> BoxHandleType -> [BoxHandleType]
$cenumFromThen :: BoxHandleType -> BoxHandleType -> [BoxHandleType]
enumFrom :: BoxHandleType -> [BoxHandleType]
$cenumFrom :: BoxHandleType -> [BoxHandleType]
fromEnum :: BoxHandleType -> Int
$cfromEnum :: BoxHandleType -> Int
toEnum :: Int -> BoxHandleType
$ctoEnum :: Int -> BoxHandleType
pred :: BoxHandleType -> BoxHandleType
$cpred :: BoxHandleType -> BoxHandleType
succ :: BoxHandleType -> BoxHandleType
$csucc :: BoxHandleType -> BoxHandleType
Enum)
makeHandleBox ::
  BoxHandleType
  -> LBox 
  -> MouseManipulator
makeHandleBox :: BoxHandleType -> LBox -> MouseManipulator
makeHandleBox BoxHandleType
bht (LBox (V2 Int
x Int
y) (V2 Int
w Int
h)) = case BoxHandleType
bht of
  BoxHandleType
BH_BR -> LBox -> MouseManipulatorType -> MouseManipulator
MouseManipulator LBox
box MouseManipulatorType
MouseManipulatorType_Corner
  BoxHandleType
BH_TL -> LBox -> MouseManipulatorType -> MouseManipulator
MouseManipulator LBox
box MouseManipulatorType
MouseManipulatorType_Corner
  BoxHandleType
BH_TR -> LBox -> MouseManipulatorType -> MouseManipulator
MouseManipulator LBox
box MouseManipulatorType
MouseManipulatorType_Corner
  BoxHandleType
BH_BL -> LBox -> MouseManipulatorType -> MouseManipulator
MouseManipulator LBox
box MouseManipulatorType
MouseManipulatorType_Corner
  BoxHandleType
BH_A  -> LBox -> MouseManipulatorType -> MouseManipulator
MouseManipulator LBox
box MouseManipulatorType
MouseManipulatorType_Area
  BoxHandleType
_     -> LBox -> MouseManipulatorType -> MouseManipulator
MouseManipulator LBox
box MouseManipulatorType
MouseManipulatorType_Side
  where
    (Int
px, Int
py) = (Int
0,Int
0) 
    CanonicalLBox Bool
_ Bool
_ LBox
clbox = LBox -> CanonicalLBox
canonicalLBox_from_lBox forall a b. (a -> b) -> a -> b
$ XY -> XY -> LBox
LBox (forall a. a -> a -> V2 a
V2 (Int
xforall a. Num a => a -> a -> a
+Int
px) (Int
yforall a. Num a => a -> a -> a
+Int
py)) (forall a. a -> a -> V2 a
V2 Int
w Int
h)
    nudgex :: Int
nudgex = if Int
w forall a. Ord a => a -> a -> Bool
< Int
0 then Int
1 else Int
0
    nudgey :: Int
nudgey = if Int
h forall a. Ord a => a -> a -> Bool
< Int
0 then Int
1 else Int
0
    l :: Int
l = Int
xforall a. Num a => a -> a -> a
+Int
pxforall a. Num a => a -> a -> a
-Int
1 forall a. Num a => a -> a -> a
+ Int
nudgex
    t :: Int
t = Int
yforall a. Num a => a -> a -> a
+Int
pyforall a. Num a => a -> a -> a
-Int
1 forall a. Num a => a -> a -> a
+ Int
nudgey
    r :: Int
r = Int
xforall a. Num a => a -> a -> a
+Int
pxforall a. Num a => a -> a -> a
+Int
w forall a. Num a => a -> a -> a
- Int
nudgex
    b :: Int
b = Int
yforall a. Num a => a -> a -> a
+Int
pyforall a. Num a => a -> a -> a
+Int
h forall a. Num a => a -> a -> a
- Int
nudgey
    box :: LBox
box = case BoxHandleType
bht of
      BoxHandleType
BH_BR -> XY -> XY -> LBox
LBox (forall a. a -> a -> V2 a
V2 Int
r Int
b) (forall a. a -> a -> V2 a
V2 Int
1 Int
1)
      BoxHandleType
BH_TL -> XY -> XY -> LBox
LBox (forall a. a -> a -> V2 a
V2 Int
l Int
t) (forall a. a -> a -> V2 a
V2 Int
1 Int
1)
      BoxHandleType
BH_TR -> XY -> XY -> LBox
LBox (forall a. a -> a -> V2 a
V2 Int
r Int
t) (forall a. a -> a -> V2 a
V2 Int
1 Int
1)
      BoxHandleType
BH_BL -> XY -> XY -> LBox
LBox (forall a. a -> a -> V2 a
V2 Int
l Int
b) (forall a. a -> a -> V2 a
V2 Int
1 Int
1)
      BoxHandleType
BH_A  -> LBox
clbox
      BoxHandleType
_     -> forall a t. (HasCallStack, IsText t) => t -> a
error Text
"not supported yet"
makeDeltaBox :: BoxHandleType -> XY -> DeltaLBox
makeDeltaBox :: BoxHandleType -> XY -> DeltaLBox
makeDeltaBox BoxHandleType
bht (V2 Int
dx Int
dy) = case BoxHandleType
bht of
  BoxHandleType
BH_BR -> XY -> XY -> DeltaLBox
DeltaLBox XY
0 forall a b. (a -> b) -> a -> b
$ forall a. a -> a -> V2 a
V2 Int
dx Int
dy
  BoxHandleType
BH_TL -> XY -> XY -> DeltaLBox
DeltaLBox (forall a. a -> a -> V2 a
V2 Int
dx Int
dy) (forall a. a -> a -> V2 a
V2 (-Int
dx) (-Int
dy))
  BoxHandleType
BH_TR -> XY -> XY -> DeltaLBox
DeltaLBox (forall a. a -> a -> V2 a
V2 Int
0 Int
dy) (forall a. a -> a -> V2 a
V2 Int
dx (-Int
dy))
  BoxHandleType
BH_BL -> XY -> XY -> DeltaLBox
DeltaLBox (forall a. a -> a -> V2 a
V2 Int
dx Int
0) (forall a. a -> a -> V2 a
V2 (-Int
dx) Int
dy)
  BoxHandleType
BH_T  -> XY -> XY -> DeltaLBox
DeltaLBox (forall a. a -> a -> V2 a
V2 Int
0 Int
dy) (forall a. a -> a -> V2 a
V2 Int
0 (-Int
dy))
  BoxHandleType
BH_B  -> XY -> XY -> DeltaLBox
DeltaLBox XY
0 (forall a. a -> a -> V2 a
V2 Int
0 Int
dy)
  BoxHandleType
BH_L  -> XY -> XY -> DeltaLBox
DeltaLBox (forall a. a -> a -> V2 a
V2 Int
dx Int
0) (forall a. a -> a -> V2 a
V2 (-Int
dx) Int
0)
  BoxHandleType
BH_R  -> XY -> XY -> DeltaLBox
DeltaLBox XY
0 (forall a. a -> a -> V2 a
V2 Int
dx Int
0)
  BoxHandleType
BH_A  -> XY -> XY -> DeltaLBox
DeltaLBox (forall a. a -> a -> V2 a
V2 Int
dx Int
dy) (forall a. a -> a -> V2 a
V2 Int
0 Int
0)
data BoxCreationType = BoxCreationType_None | BoxCreationType_Box | BoxCreationType_Text | BoxCreationType_TextArea | BoxCreationType_DragSelect deriving (Int -> BoxCreationType -> ShowS
[BoxCreationType] -> ShowS
BoxCreationType -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BoxCreationType] -> ShowS
$cshowList :: [BoxCreationType] -> ShowS
show :: BoxCreationType -> String
$cshow :: BoxCreationType -> String
showsPrec :: Int -> BoxCreationType -> ShowS
$cshowsPrec :: Int -> BoxCreationType -> ShowS
Show, BoxCreationType -> BoxCreationType -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: BoxCreationType -> BoxCreationType -> Bool
$c/= :: BoxCreationType -> BoxCreationType -> Bool
== :: BoxCreationType -> BoxCreationType -> Bool
$c== :: BoxCreationType -> BoxCreationType -> Bool
Eq)
boxCreationType_isCreation :: BoxCreationType -> Bool
boxCreationType_isCreation :: BoxCreationType -> Bool
boxCreationType_isCreation BoxCreationType
bct = BoxCreationType
bct forall a. Eq a => a -> a -> Bool
/= BoxCreationType
BoxCreationType_None Bool -> Bool -> Bool
&& BoxCreationType
bct forall a. Eq a => a -> a -> Bool
/= BoxCreationType
BoxCreationType_DragSelect
data BoxHandler = BoxHandler {
    BoxHandler -> BoxHandleType
_boxHandler_handle      :: BoxHandleType 
    , BoxHandler -> Bool
_boxHandler_undoFirst :: Bool
    
    , BoxHandler -> BoxCreationType
_boxHandler_creation  :: BoxCreationType
    , BoxHandler -> Bool
_boxHandler_active    :: Bool
    , BoxHandler -> Bool
_boxHandler_downOnLabel :: Bool
  } deriving (Int -> BoxHandler -> ShowS
[BoxHandler] -> ShowS
BoxHandler -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BoxHandler] -> ShowS
$cshowList :: [BoxHandler] -> ShowS
show :: BoxHandler -> String
$cshow :: BoxHandler -> String
showsPrec :: Int -> BoxHandler -> ShowS
$cshowsPrec :: Int -> BoxHandler -> ShowS
Show)
makeDragDeltaBox :: BoxHandleType -> RelMouseDrag -> DeltaLBox
makeDragDeltaBox :: BoxHandleType -> RelMouseDrag -> DeltaLBox
makeDragDeltaBox BoxHandleType
bht RelMouseDrag
rmd = DeltaLBox
r where
  RelMouseDrag MouseDrag {Bool
[KeyModifier]
XY
MouseDragState
MouseButton
_mouseDrag_isLayerMouse :: Bool
_mouseDrag_state :: MouseDragState
_mouseDrag_to :: XY
_mouseDrag_modifiers :: [KeyModifier]
_mouseDrag_button :: MouseButton
_mouseDrag_from :: XY
_mouseDrag_isLayerMouse :: MouseDrag -> Bool
_mouseDrag_state :: MouseDrag -> MouseDragState
_mouseDrag_to :: MouseDrag -> XY
_mouseDrag_modifiers :: MouseDrag -> [KeyModifier]
_mouseDrag_button :: MouseDrag -> MouseButton
_mouseDrag_from :: MouseDrag -> XY
..} = RelMouseDrag
rmd
  dragDelta :: XY
dragDelta = XY
_mouseDrag_to forall a. Num a => a -> a -> a
- XY
_mouseDrag_from
  shiftClick :: Bool
shiftClick = forall (f :: * -> *) a.
(Foldable f, DisallowElem f, Eq a) =>
a -> f a -> Bool
elem KeyModifier
KeyModifier_Shift [KeyModifier]
_mouseDrag_modifiers
  boxRestrictedDelta :: XY
boxRestrictedDelta = if Bool
shiftClick
    then XY -> XY
restrict8 XY
dragDelta
    else XY
dragDelta
  r :: DeltaLBox
r = BoxHandleType -> XY -> DeltaLBox
makeDeltaBox BoxHandleType
bht XY
boxRestrictedDelta
makeDragOperation :: Bool -> PotatoHandlerInput -> DeltaLBox -> Maybe WSEvent
makeDragOperation :: Bool -> PotatoHandlerInput -> DeltaLBox -> Maybe WSEvent
makeDragOperation Bool
undoFirst PotatoHandlerInput
phi DeltaLBox
dbox = Maybe WSEvent
op where
  selection :: Seq SuperOwl
selection = PotatoHandlerInput -> Seq SuperOwl
transformableSelection PotatoHandlerInput
phi
  makeController :: SuperOwl -> DSum CTag Identity
makeController SuperOwl
_ = DSum CTag Identity
cmd where
    cmd :: DSum CTag Identity
cmd = CTag CBoundingBox
CTagBoundingBox forall {k} (tag :: k -> *) (f :: k -> *) (a :: k).
tag a -> f a -> DSum tag f
:=> (forall a. a -> Identity a
Identity forall a b. (a -> b) -> a -> b
$ CBoundingBox {
      _cBoundingBox_deltaBox :: DeltaLBox
_cBoundingBox_deltaBox = DeltaLBox
dbox
    })
  op :: Maybe WSEvent
op = if forall a. Seq a -> Bool
Seq.null Seq SuperOwl
selection
    then forall a. Maybe a
Nothing
    else forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ (Bool, Llama) -> WSEvent
WSEApplyLlama (Bool
undoFirst, OwlPFCmd -> Llama
makePFCLlama forall b c a. (b -> c) -> (a -> b) -> a -> c
. ControllersWithId -> OwlPFCmd
OwlPFCManipulate forall a b. (a -> b) -> a -> b
$ forall a. [(Int, a)] -> IntMap a
IM.fromList (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\SuperOwl
s -> (SuperOwl -> Int
_superOwl_id SuperOwl
s, SuperOwl -> DSum CTag Identity
makeController SuperOwl
s)) (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList Seq SuperOwl
selection)))
instance Default BoxHandler where
  def :: BoxHandler
def = BoxHandler {
      _boxHandler_handle :: BoxHandleType
_boxHandler_handle       = BoxHandleType
BH_BR
      , _boxHandler_undoFirst :: Bool
_boxHandler_undoFirst  = Bool
False
      , _boxHandler_creation :: BoxCreationType
_boxHandler_creation = BoxCreationType
BoxCreationType_None
      , _boxHandler_active :: Bool
_boxHandler_active = Bool
False
      , _boxHandler_downOnLabel :: Bool
_boxHandler_downOnLabel = Bool
False
      
      
    }
selectionOnlySBox :: CanvasSelection -> Maybe SBox
selectionOnlySBox :: CanvasSelection -> Maybe SBox
selectionOnlySBox (CanvasSelection Seq SuperOwl
selection) = if forall a. Seq a -> Int
Seq.length Seq SuperOwl
selection forall a. Eq a => a -> a -> Bool
== Int
1
  then case SuperOwl -> SElt
superOwl_toSElt_hack (forall a. Seq a -> Int -> a
Seq.index Seq SuperOwl
selection Int
0) of
    SEltBox SBox
sbox -> forall a. a -> Maybe a
Just SBox
sbox
    SElt
_ -> forall a. Maybe a
Nothing
  else forall a. Maybe a
Nothing
isMouseOnSelectionSBoxBorder :: CanvasSelection -> RelMouseDrag -> Bool
isMouseOnSelectionSBoxBorder :: CanvasSelection -> RelMouseDrag -> Bool
isMouseOnSelectionSBoxBorder CanvasSelection
cs (RelMouseDrag MouseDrag {Bool
[KeyModifier]
XY
MouseDragState
MouseButton
_mouseDrag_isLayerMouse :: Bool
_mouseDrag_state :: MouseDragState
_mouseDrag_to :: XY
_mouseDrag_modifiers :: [KeyModifier]
_mouseDrag_button :: MouseButton
_mouseDrag_from :: XY
_mouseDrag_isLayerMouse :: MouseDrag -> Bool
_mouseDrag_state :: MouseDrag -> MouseDragState
_mouseDrag_to :: MouseDrag -> XY
_mouseDrag_modifiers :: MouseDrag -> [KeyModifier]
_mouseDrag_button :: MouseDrag -> MouseButton
_mouseDrag_from :: MouseDrag -> XY
..}) = case CanvasSelection -> Maybe SBox
selectionOnlySBox CanvasSelection
cs of
  
  Maybe SBox
Nothing -> Bool
False
  Just SBox
sbox -> if SBoxType -> Bool
sBoxType_hasBorder (SBox -> SBoxType
_sBox_boxType SBox
sbox) Bool -> Bool -> Bool
&& LBox -> XY -> Bool
does_lBox_contains_XY (LBox -> LBox
lBox_to_boxLabelBox (SBox -> LBox
_sBox_box SBox
sbox)) XY
_mouseDrag_from
    then Bool
True
    else Bool
False
instance PotatoHandler BoxHandler where
  pHandlerName :: BoxHandler -> Text
pHandlerName BoxHandler
_ = Text
handlerName_box
  pHandleMouse :: BoxHandler
-> PotatoHandlerInput -> RelMouseDrag -> Maybe PotatoHandlerOutput
pHandleMouse bh :: BoxHandler
bh@BoxHandler {Bool
BoxCreationType
BoxHandleType
_boxHandler_downOnLabel :: Bool
_boxHandler_active :: Bool
_boxHandler_creation :: BoxCreationType
_boxHandler_undoFirst :: Bool
_boxHandler_handle :: BoxHandleType
_boxHandler_downOnLabel :: BoxHandler -> Bool
_boxHandler_active :: BoxHandler -> Bool
_boxHandler_creation :: BoxHandler -> BoxCreationType
_boxHandler_undoFirst :: BoxHandler -> Bool
_boxHandler_handle :: BoxHandler -> BoxHandleType
..} phi :: PotatoHandlerInput
phi@PotatoHandlerInput {LBox
CanvasSelection
Selection
PotatoDefaultParameters
RenderCache
OwlPFState
LayersState
BroadPhaseState
_potatoHandlerInput_canvasSelection :: CanvasSelection
_potatoHandlerInput_selection :: Selection
_potatoHandlerInput_screenRegion :: LBox
_potatoHandlerInput_layersState :: LayersState
_potatoHandlerInput_renderCache :: RenderCache
_potatoHandlerInput_broadPhase :: BroadPhaseState
_potatoHandlerInput_potatoDefaultParameters :: PotatoDefaultParameters
_potatoHandlerInput_pFState :: OwlPFState
_potatoHandlerInput_canvasSelection :: PotatoHandlerInput -> CanvasSelection
_potatoHandlerInput_selection :: PotatoHandlerInput -> Selection
_potatoHandlerInput_screenRegion :: PotatoHandlerInput -> LBox
_potatoHandlerInput_layersState :: PotatoHandlerInput -> LayersState
_potatoHandlerInput_renderCache :: PotatoHandlerInput -> RenderCache
_potatoHandlerInput_broadPhase :: PotatoHandlerInput -> BroadPhaseState
_potatoHandlerInput_potatoDefaultParameters :: PotatoHandlerInput -> PotatoDefaultParameters
_potatoHandlerInput_pFState :: PotatoHandlerInput -> OwlPFState
..} rmd :: RelMouseDrag
rmd@(RelMouseDrag MouseDrag {Bool
[KeyModifier]
XY
MouseDragState
MouseButton
_mouseDrag_isLayerMouse :: Bool
_mouseDrag_state :: MouseDragState
_mouseDrag_to :: XY
_mouseDrag_modifiers :: [KeyModifier]
_mouseDrag_button :: MouseButton
_mouseDrag_from :: XY
_mouseDrag_isLayerMouse :: MouseDrag -> Bool
_mouseDrag_state :: MouseDrag -> MouseDragState
_mouseDrag_to :: MouseDrag -> XY
_mouseDrag_modifiers :: MouseDrag -> [KeyModifier]
_mouseDrag_button :: MouseDrag -> MouseButton
_mouseDrag_from :: MouseDrag -> XY
..}) = case MouseDragState
_mouseDrag_state of
    
    MouseDragState
MouseDragState_Down | BoxCreationType -> Bool
boxCreationType_isCreation BoxCreationType
_boxHandler_creation ->  forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. Default a => a
def {
        _potatoHandlerOutput_nextHandler :: Maybe SomePotatoHandler
_potatoHandlerOutput_nextHandler = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall h. PotatoHandler h => h -> SomePotatoHandler
SomePotatoHandler BoxHandler
bh { _boxHandler_active :: Bool
_boxHandler_active = Bool
True }
      }
    
    
    MouseDragState
MouseDragState_Down | forall (f :: * -> *) a.
(Foldable f, DisallowElem f, Eq a) =>
a -> f a -> Bool
elem KeyModifier
KeyModifier_Shift [KeyModifier]
_mouseDrag_modifiers -> forall a. Maybe a
Nothing
    
    MouseDragState
MouseDragState_Down | BoxCreationType
_boxHandler_creation forall a. Eq a => a -> a -> Bool
== BoxCreationType
BoxCreationType_DragSelect  -> forall a. HasCallStack => Bool -> a -> a
assert (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IsParliament a => a -> Bool
isParliament_null forall a b. (a -> b) -> a -> b
$ Selection
_potatoHandlerInput_selection) Maybe PotatoHandlerOutput
r where
        newbh :: BoxHandler
newbh = BoxHandler
bh {
            
            _boxHandler_handle :: BoxHandleType
_boxHandler_handle = BoxHandleType
BH_A
            , _boxHandler_active :: Bool
_boxHandler_active = Bool
True
          }
        r :: Maybe PotatoHandlerOutput
r = forall a. a -> Maybe a
Just forall a. Default a => a
def { _potatoHandlerOutput_nextHandler :: Maybe SomePotatoHandler
_potatoHandlerOutput_nextHandler = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall h. PotatoHandler h => h -> SomePotatoHandler
SomePotatoHandler BoxHandler
newbh }
    MouseDragState
MouseDragState_Down -> case OwlPFState -> RelMouseDrag -> CanvasSelection -> Maybe Int
findFirstMouseManipulator OwlPFState
_potatoHandlerInput_pFState RelMouseDrag
rmd CanvasSelection
_potatoHandlerInput_canvasSelection of
      Maybe Int
Nothing -> forall a. Maybe a
Nothing
      
      Just Int
mi -> Maybe PotatoHandlerOutput
r where
        newbh :: BoxHandler
newbh = BoxHandler
bh {
            _boxHandler_handle :: BoxHandleType
_boxHandler_handle = BoxHandleType
bht
            , _boxHandler_active :: Bool
_boxHandler_active = Bool
True
            
            , _boxHandler_downOnLabel :: Bool
_boxHandler_downOnLabel = if BoxHandleType
bht forall a. Eq a => a -> a -> Bool
== BoxHandleType
BH_A then CanvasSelection -> RelMouseDrag -> Bool
isMouseOnSelectionSBoxBorder CanvasSelection
_potatoHandlerInput_canvasSelection RelMouseDrag
rmd else Bool
False
          }
        bht :: BoxHandleType
bht = forall a. Enum a => Int -> a
toEnum Int
mi
        
        clickOnSelection :: Bool
clickOnSelection = forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (XY -> SElt -> Bool
doesSEltIntersectPoint XY
_mouseDrag_to forall b c a. (b -> c) -> (a -> b) -> a -> c
. SuperOwl -> SElt
superOwl_toSElt_hack) forall a b. (a -> b) -> a -> b
$ CanvasSelection -> Seq SuperOwl
unCanvasSelection CanvasSelection
_potatoHandlerInput_canvasSelection
        r :: Maybe PotatoHandlerOutput
r = if BoxHandleType
bht forall a. Eq a => a -> a -> Bool
/= BoxHandleType
BH_A Bool -> Bool -> Bool
|| Bool
clickOnSelection
          then forall a. a -> Maybe a
Just forall a. Default a => a
def { _potatoHandlerOutput_nextHandler :: Maybe SomePotatoHandler
_potatoHandlerOutput_nextHandler = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall h. PotatoHandler h => h -> SomePotatoHandler
SomePotatoHandler BoxHandler
newbh }
          else forall a. Maybe a
Nothing
    MouseDragState
MouseDragState_Dragging -> forall a. a -> Maybe a
Just PotatoHandlerOutput
r where
      dragDelta :: XY
dragDelta = XY
_mouseDrag_to forall a. Num a => a -> a -> a
- XY
_mouseDrag_from
      newEltPos :: OwlSpot
newEltPos = OwlTree -> Selection -> OwlSpot
lastPositionInSelection (OwlPFState -> OwlTree
_owlPFState_owlTree OwlPFState
_potatoHandlerInput_pFState) Selection
_potatoHandlerInput_selection
      
      
      
      boxToAdd :: SBox
boxToAdd = forall a. Default a => a
def {
          _sBox_box :: LBox
_sBox_box     = LBox -> LBox
canonicalLBox_from_lBox_ forall a b. (a -> b) -> a -> b
$ XY -> XY -> LBox
LBox XY
_mouseDrag_from XY
dragDelta
          
          , _sBox_boxType :: SBoxType
_sBox_boxType  = if BoxCreationType
_boxHandler_creation forall a. Eq a => a -> a -> Bool
== BoxCreationType
BoxCreationType_Text
            then SBoxType
SBoxType_BoxText 
            else SBoxType
SBoxType_Box
          , _sBox_superStyle :: SuperStyle
_sBox_superStyle = PotatoDefaultParameters -> SuperStyle
_potatoDefaultParameters_superStyle PotatoDefaultParameters
_potatoHandlerInput_potatoDefaultParameters
          , _sBox_title :: SBoxTitle
_sBox_title = forall a. Default a => a
def { _sBoxTitle_align :: TextAlign
_sBoxTitle_align = PotatoDefaultParameters -> TextAlign
_potatoDefaultParameters_box_label_textAlign PotatoDefaultParameters
_potatoHandlerInput_potatoDefaultParameters }
          , _sBox_text :: SBoxText
_sBox_text = forall a. Default a => a
def { _sBoxText_style :: TextStyle
_sBoxText_style = forall a. Default a => a
def { _textStyle_alignment :: TextAlign
_textStyle_alignment = PotatoDefaultParameters -> TextAlign
_potatoDefaultParameters_box_text_textAlign PotatoDefaultParameters
_potatoHandlerInput_potatoDefaultParameters } }
        }
      textAreaToAdd :: STextArea
textAreaToAdd = forall a. Default a => a
def {
          _sTextArea_box :: LBox
_sTextArea_box   =  LBox -> LBox
canonicalLBox_from_lBox_ forall a b. (a -> b) -> a -> b
$ XY -> XY -> LBox
LBox XY
_mouseDrag_from XY
dragDelta
          , _sTextArea_text :: TextAreaMapping
_sTextArea_text        = forall k a. Map k a
Map.empty
          , _sTextArea_transparent :: Bool
_sTextArea_transparent = Bool
True
        }
      nameToAdd :: Text
nameToAdd = case BoxCreationType
_boxHandler_creation of
        BoxCreationType
BoxCreationType_Box -> Text
"<box>"
        BoxCreationType
BoxCreationType_Text -> Text
"<text>"
        BoxCreationType
BoxCreationType_TextArea -> Text
"<textarea>"
        BoxCreationType
_ -> forall a t. (HasCallStack, IsText t) => t -> a
error Text
"invalid BoxCreationType"
      mop :: Maybe WSEvent
mop = case BoxCreationType
_boxHandler_creation of
        BoxCreationType
x | BoxCreationType
x forall a. Eq a => a -> a -> Bool
== BoxCreationType
BoxCreationType_Box Bool -> Bool -> Bool
|| BoxCreationType
x forall a. Eq a => a -> a -> Bool
== BoxCreationType
BoxCreationType_Text -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ (Bool, OwlSpot, OwlItem) -> WSEvent
WSEAddElt (Bool
_boxHandler_undoFirst, OwlSpot
newEltPos, OwlInfo -> OwlSubItem -> OwlItem
OwlItem (Text -> OwlInfo
OwlInfo Text
nameToAdd) (SBox -> OwlSubItem
OwlSubItemBox SBox
boxToAdd))
        BoxCreationType
BoxCreationType_TextArea -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ (Bool, OwlSpot, OwlItem) -> WSEvent
WSEAddElt (Bool
_boxHandler_undoFirst, OwlSpot
newEltPos, OwlInfo -> OwlSubItem -> OwlItem
OwlItem (Text -> OwlInfo
OwlInfo Text
nameToAdd) (STextArea -> OwlSubItem
OwlSubItemTextArea STextArea
textAreaToAdd))
        BoxCreationType
_ -> Bool -> PotatoHandlerInput -> DeltaLBox -> Maybe WSEvent
makeDragOperation Bool
_boxHandler_undoFirst PotatoHandlerInput
phi (BoxHandleType -> RelMouseDrag -> DeltaLBox
makeDragDeltaBox BoxHandleType
_boxHandler_handle RelMouseDrag
rmd)
      newbh :: BoxHandler
newbh = BoxHandler
bh {
          _boxHandler_undoFirst :: Bool
_boxHandler_undoFirst = Bool
True
          
          , _boxHandler_downOnLabel :: Bool
_boxHandler_downOnLabel = Bool
False
        }
      
      r :: PotatoHandlerOutput
r = forall a. Default a => a
def {
          _potatoHandlerOutput_nextHandler :: Maybe SomePotatoHandler
_potatoHandlerOutput_nextHandler = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall h. PotatoHandler h => h -> SomePotatoHandler
SomePotatoHandler BoxHandler
newbh
          , _potatoHandlerOutput_pFEvent :: Maybe WSEvent
_potatoHandlerOutput_pFEvent = Maybe WSEvent
mop
        }
    MouseDragState
MouseDragState_Up | Bool
_boxHandler_downOnLabel -> if CanvasSelection -> RelMouseDrag -> Bool
isMouseOnSelectionSBoxBorder CanvasSelection
_potatoHandlerInput_canvasSelection RelMouseDrag
rmd
      
      
      
      then forall h.
PotatoHandler h =>
h
-> PotatoHandlerInput -> RelMouseDrag -> Maybe PotatoHandlerOutput
pHandleMouse (SomePotatoHandler
-> CanvasSelection -> RelMouseDrag -> BoxLabelHandler
makeBoxLabelHandler (forall h. PotatoHandler h => h -> SomePotatoHandler
SomePotatoHandler (forall a. Default a => a
def :: BoxHandler)) CanvasSelection
_potatoHandlerInput_canvasSelection RelMouseDrag
rmd) PotatoHandlerInput
phi RelMouseDrag
rmd
      else forall a. Maybe a
Nothing
    MouseDragState
MouseDragState_Up -> Maybe PotatoHandlerOutput
r where
      
      nselected :: Int
nselected = forall a. Seq a -> Int
Seq.length (CanvasSelection -> Seq SuperOwl
unCanvasSelection CanvasSelection
_potatoHandlerInput_canvasSelection)
      selt :: Maybe SElt
selt = SuperOwl -> SElt
superOwl_toSElt_hack forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HasCallStack => CanvasSelection -> Maybe SuperOwl
selectionToMaybeFirstSuperOwl CanvasSelection
_potatoHandlerInput_canvasSelection
      isText :: Bool
isText = Int
nselected forall a. Eq a => a -> a -> Bool
== Int
1 Bool -> Bool -> Bool
&& case Maybe SElt
selt of
        Just (SEltBox SBox{LBox
SBoxType
SBoxText
SBoxTitle
SuperStyle
_sBox_boxType :: SBoxType
_sBox_text :: SBoxText
_sBox_title :: SBoxTitle
_sBox_superStyle :: SuperStyle
_sBox_box :: LBox
_sBox_text :: SBox -> SBoxText
_sBox_title :: SBox -> SBoxTitle
_sBox_superStyle :: SBox -> SuperStyle
_sBox_box :: SBox -> LBox
_sBox_boxType :: SBox -> SBoxType
..}) -> SBoxType -> Bool
sBoxType_isText SBoxType
_sBox_boxType
        Maybe SElt
_                                    -> Bool
False
      isTextArea :: Bool
isTextArea = Int
nselected forall a. Eq a => a -> a -> Bool
== Int
1 Bool -> Bool -> Bool
&& case Maybe SElt
selt of
        Just (SEltTextArea STextArea
_) -> Bool
True
        Maybe SElt
_ -> Bool
False
      
      wasNotDragSelecting :: Bool
wasNotDragSelecting = Bool -> Bool
not (BoxCreationType
_boxHandler_creation forall a. Eq a => a -> a -> Bool
== BoxCreationType
BoxCreationType_DragSelect)
      
      wasNotActuallyDragging :: Bool
wasNotActuallyDragging = Bool -> Bool
not Bool
_boxHandler_undoFirst
      
      isCreation :: Bool
isCreation = BoxCreationType -> Bool
boxCreationType_isCreation BoxCreationType
_boxHandler_creation
      r :: Maybe PotatoHandlerOutput
r = if Bool
isText
          Bool -> Bool -> Bool
&& (Bool
wasNotActuallyDragging Bool -> Bool -> Bool
|| Bool
isCreation)
          Bool -> Bool -> Bool
&& Bool
wasNotDragSelecting
        
        then forall h.
PotatoHandler h =>
h
-> PotatoHandlerInput -> RelMouseDrag -> Maybe PotatoHandlerOutput
pHandleMouse (SomePotatoHandler
-> CanvasSelection -> RelMouseDrag -> BoxTextHandler
makeBoxTextHandler (forall h. PotatoHandler h => h -> SomePotatoHandler
SomePotatoHandler (forall a. Default a => a
def :: BoxHandler)) CanvasSelection
_potatoHandlerInput_canvasSelection RelMouseDrag
rmd) PotatoHandlerInput
phi RelMouseDrag
rmd
        else if Bool
isTextArea
          Bool -> Bool -> Bool
&& (Bool
wasNotActuallyDragging Bool -> Bool -> Bool
|| Bool
isCreation)
          Bool -> Bool -> Bool
&& Bool
wasNotDragSelecting
          then forall h.
PotatoHandler h =>
h
-> PotatoHandlerInput -> RelMouseDrag -> Maybe PotatoHandlerOutput
pHandleMouse (SomePotatoHandler
-> CanvasSelection -> RelMouseDrag -> Bool -> TextAreaHandler
makeTextAreaHandler (forall h. PotatoHandler h => h -> SomePotatoHandler
SomePotatoHandler (forall a. Default a => a
def :: BoxHandler)) CanvasSelection
_potatoHandlerInput_canvasSelection RelMouseDrag
rmd Bool
isCreation) PotatoHandlerInput
phi RelMouseDrag
rmd
          
          
          else forall a. a -> Maybe a
Just forall a. Default a => a
def
      
    
    MouseDragState
MouseDragState_Cancelled -> if Bool
_boxHandler_undoFirst then forall a. a -> Maybe a
Just forall a. Default a => a
def { _potatoHandlerOutput_pFEvent :: Maybe WSEvent
_potatoHandlerOutput_pFEvent = forall a. a -> Maybe a
Just WSEvent
WSEUndo } else forall a. a -> Maybe a
Just forall a. Default a => a
def
  pHandleKeyboard :: BoxHandler
-> PotatoHandlerInput -> KeyboardData -> Maybe PotatoHandlerOutput
pHandleKeyboard BoxHandler
bh phi :: PotatoHandlerInput
phi@PotatoHandlerInput {LBox
CanvasSelection
Selection
PotatoDefaultParameters
RenderCache
OwlPFState
LayersState
BroadPhaseState
_potatoHandlerInput_canvasSelection :: CanvasSelection
_potatoHandlerInput_selection :: Selection
_potatoHandlerInput_screenRegion :: LBox
_potatoHandlerInput_layersState :: LayersState
_potatoHandlerInput_renderCache :: RenderCache
_potatoHandlerInput_broadPhase :: BroadPhaseState
_potatoHandlerInput_potatoDefaultParameters :: PotatoDefaultParameters
_potatoHandlerInput_pFState :: OwlPFState
_potatoHandlerInput_canvasSelection :: PotatoHandlerInput -> CanvasSelection
_potatoHandlerInput_selection :: PotatoHandlerInput -> Selection
_potatoHandlerInput_screenRegion :: PotatoHandlerInput -> LBox
_potatoHandlerInput_layersState :: PotatoHandlerInput -> LayersState
_potatoHandlerInput_renderCache :: PotatoHandlerInput -> RenderCache
_potatoHandlerInput_broadPhase :: PotatoHandlerInput -> BroadPhaseState
_potatoHandlerInput_potatoDefaultParameters :: PotatoHandlerInput -> PotatoDefaultParameters
_potatoHandlerInput_pFState :: PotatoHandlerInput -> OwlPFState
..} (KeyboardData KeyboardKey
key [KeyModifier]
_) = Maybe PotatoHandlerOutput
r where
    todlbox :: (Int, Int) -> Maybe DeltaLBox
todlbox (Int
x,Int
y) = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ XY -> XY -> DeltaLBox
DeltaLBox (forall a. a -> a -> V2 a
V2 Int
x Int
y) XY
0
    mmove :: Maybe DeltaLBox
mmove = case KeyboardKey
key of
      KeyboardKey
KeyboardKey_Left -> (Int, Int) -> Maybe DeltaLBox
todlbox (-Int
1,Int
0)
      KeyboardKey
KeyboardKey_Right -> (Int, Int) -> Maybe DeltaLBox
todlbox (Int
1,Int
0)
      KeyboardKey
KeyboardKey_Up -> (Int, Int) -> Maybe DeltaLBox
todlbox (Int
0,-Int
1)
      KeyboardKey
KeyboardKey_Down -> (Int, Int) -> Maybe DeltaLBox
todlbox (Int
0,Int
1)
      KeyboardKey
_ -> forall a. Maybe a
Nothing
    r :: Maybe PotatoHandlerOutput
r = if BoxHandler -> Bool
_boxHandler_active BoxHandler
bh
      
      then forall a. Maybe a
Nothing
      else case Maybe DeltaLBox
mmove of
        Maybe DeltaLBox
Nothing -> forall a. Maybe a
Nothing
        Just DeltaLBox
move -> forall a. a -> Maybe a
Just PotatoHandlerOutput
r2 where
          mop :: Maybe WSEvent
mop = Bool -> PotatoHandlerInput -> DeltaLBox -> Maybe WSEvent
makeDragOperation Bool
False PotatoHandlerInput
phi DeltaLBox
move
          r2 :: PotatoHandlerOutput
r2 = forall a. Default a => a
def {
              _potatoHandlerOutput_nextHandler :: Maybe SomePotatoHandler
_potatoHandlerOutput_nextHandler = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall h. PotatoHandler h => h -> SomePotatoHandler
SomePotatoHandler BoxHandler
bh
              , _potatoHandlerOutput_pFEvent :: Maybe WSEvent
_potatoHandlerOutput_pFEvent = Maybe WSEvent
mop
            }
  pRenderHandler :: BoxHandler -> PotatoHandlerInput -> HandlerRenderOutput
pRenderHandler BoxHandler {Bool
BoxCreationType
BoxHandleType
_boxHandler_downOnLabel :: Bool
_boxHandler_active :: Bool
_boxHandler_creation :: BoxCreationType
_boxHandler_undoFirst :: Bool
_boxHandler_handle :: BoxHandleType
_boxHandler_downOnLabel :: BoxHandler -> Bool
_boxHandler_active :: BoxHandler -> Bool
_boxHandler_creation :: BoxHandler -> BoxCreationType
_boxHandler_undoFirst :: BoxHandler -> Bool
_boxHandler_handle :: BoxHandler -> BoxHandleType
..} PotatoHandlerInput {LBox
CanvasSelection
Selection
PotatoDefaultParameters
RenderCache
OwlPFState
LayersState
BroadPhaseState
_potatoHandlerInput_canvasSelection :: CanvasSelection
_potatoHandlerInput_selection :: Selection
_potatoHandlerInput_screenRegion :: LBox
_potatoHandlerInput_layersState :: LayersState
_potatoHandlerInput_renderCache :: RenderCache
_potatoHandlerInput_broadPhase :: BroadPhaseState
_potatoHandlerInput_potatoDefaultParameters :: PotatoDefaultParameters
_potatoHandlerInput_pFState :: OwlPFState
_potatoHandlerInput_canvasSelection :: PotatoHandlerInput -> CanvasSelection
_potatoHandlerInput_selection :: PotatoHandlerInput -> Selection
_potatoHandlerInput_screenRegion :: PotatoHandlerInput -> LBox
_potatoHandlerInput_layersState :: PotatoHandlerInput -> LayersState
_potatoHandlerInput_renderCache :: PotatoHandlerInput -> RenderCache
_potatoHandlerInput_broadPhase :: PotatoHandlerInput -> BroadPhaseState
_potatoHandlerInput_potatoDefaultParameters :: PotatoHandlerInput -> PotatoDefaultParameters
_potatoHandlerInput_pFState :: PotatoHandlerInput -> OwlPFState
..} = HandlerRenderOutput
r where
    handlePoints :: [LBox]
handlePoints = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap MouseManipulator -> LBox
_mouseManipulator_box forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (\MouseManipulator
mm -> MouseManipulator -> MouseManipulatorType
_mouseManipulator_type MouseManipulator
mm forall a. Eq a => a -> a -> Bool
== MouseManipulatorType
MouseManipulatorType_Corner) forall a b. (a -> b) -> a -> b
$ OwlPFState -> CanvasSelection -> MouseManipulatorSet
toMouseManipulators OwlPFState
_potatoHandlerInput_pFState CanvasSelection
_potatoHandlerInput_canvasSelection
    
    
    r :: HandlerRenderOutput
r = if Bool -> Bool
not Bool
_boxHandler_active Bool -> Bool -> Bool
&& BoxCreationType -> Bool
boxCreationType_isCreation BoxCreationType
_boxHandler_creation 
      
      then HandlerRenderOutput
emptyHandlerRenderOutput
      else [RenderHandle] -> HandlerRenderOutput
HandlerRenderOutput (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap LBox -> RenderHandle
defaultRenderHandle [LBox]
handlePoints)
  pIsHandlerActive :: BoxHandler -> Bool
pIsHandlerActive = BoxHandler -> Bool
_boxHandler_active
  pHandlerTool :: BoxHandler -> Maybe Tool
pHandlerTool BoxHandler {Bool
BoxCreationType
BoxHandleType
_boxHandler_downOnLabel :: Bool
_boxHandler_active :: Bool
_boxHandler_creation :: BoxCreationType
_boxHandler_undoFirst :: Bool
_boxHandler_handle :: BoxHandleType
_boxHandler_downOnLabel :: BoxHandler -> Bool
_boxHandler_active :: BoxHandler -> Bool
_boxHandler_creation :: BoxHandler -> BoxCreationType
_boxHandler_undoFirst :: BoxHandler -> Bool
_boxHandler_handle :: BoxHandler -> BoxHandleType
..} = case BoxCreationType
_boxHandler_creation of
    BoxCreationType
BoxCreationType_Box -> forall a. a -> Maybe a
Just Tool
Tool_Box
    BoxCreationType
BoxCreationType_Text -> forall a. a -> Maybe a
Just Tool
Tool_Text
    BoxCreationType
BoxCreationType_TextArea -> forall a. a -> Maybe a
Just Tool
Tool_TextArea
    BoxCreationType
_ -> forall a. Maybe a
Nothing