{-# LANGUAGE RecordWildCards #-}

module Monomer.Dragboard.DragboardEvent
    ( DragId(..)
    , DragboardEvent(..)
    , handleEvent
    ) where

import Control.Lens
import Data.Maybe
import Monomer.Main.UserUtil
import Monomer.Widgets.Animation
import Monomer.Widgets.Composite
import Monomer.Widgets.Single
import TextShow
import qualified Data.Map as Map
import qualified Monomer.Lens as L

import Monomer.Dragboard.DragboardCfg
import Monomer.Dragboard.DragboardModel

newtype DragId = DragId Int deriving DragId -> DragId -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DragId -> DragId -> Bool
$c/= :: DragId -> DragId -> Bool
== :: DragId -> DragId -> Bool
$c== :: DragId -> DragId -> Bool
Eq

data DragboardEvent a
    = EventDrop Int DragId
    | EventClick Int
    | EventFinished Int
    | EventMerge (DragboardModel a)
    | EventFocus Path
    | EventBlur Path
    deriving DragboardEvent a -> DragboardEvent a -> Bool
forall a. Eq a => DragboardEvent a -> DragboardEvent a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DragboardEvent a -> DragboardEvent a -> Bool
$c/= :: forall a. Eq a => DragboardEvent a -> DragboardEvent a -> Bool
== :: DragboardEvent a -> DragboardEvent a -> Bool
$c== :: forall a. Eq a => DragboardEvent a -> DragboardEvent a -> Bool
Eq

type EventHandle a sp ep
    = (DragboardCfg sp ep a)
    -> (DragboardModel a)
    -> [EventResponse (DragboardModel a) (DragboardEvent a) sp ep]

handleEvent
    :: (Eq a)
    => (WidgetData sp [[a]])
    -> (DragboardCfg sp ep a)
    -> EventHandler (DragboardModel a) (DragboardEvent a) sp ep
handleEvent :: forall a sp ep.
Eq a =>
WidgetData sp [[a]]
-> DragboardCfg sp ep a
-> EventHandler (DragboardModel a) (DragboardEvent a) sp ep
handleEvent WidgetData sp [[a]]
wdata DragboardCfg sp ep a
config WidgetEnv (DragboardModel a) (DragboardEvent a)
wenv WidgetNode (DragboardModel a) (DragboardEvent a)
node DragboardModel a
model DragboardEvent a
event = case DragboardEvent a
event of
    EventDrop Int
i DragId
d -> forall sp a ep.
Int -> DragId -> WidgetData sp [[a]] -> EventHandle a sp ep
dropHandle Int
i DragId
d WidgetData sp [[a]]
wdata DragboardCfg sp ep a
config DragboardModel a
model
    EventClick Int
i -> forall a sp ep.
Int
-> WidgetEnv (DragboardModel a) (DragboardEvent a)
-> EventHandle a sp ep
clickHandle Int
i WidgetEnv (DragboardModel a) (DragboardEvent a)
wenv DragboardCfg sp ep a
config DragboardModel a
model
    EventFinished Int
i -> forall a sp ep. Int -> EventHandle a sp ep
finishedHandle Int
i DragboardCfg sp ep a
config DragboardModel a
model
    EventMerge DragboardModel a
m -> forall a sp ep.
Eq a =>
DragboardModel a
-> WidgetEnv (DragboardModel a) (DragboardEvent a)
-> EventHandle a sp ep
mergeHandle DragboardModel a
m WidgetEnv (DragboardModel a) (DragboardEvent a)
wenv DragboardCfg sp ep a
config DragboardModel a
model
    EventFocus Path
prev -> forall s e a sp ep. WidgetNode s e -> Path -> EventHandle a sp ep
focusHandle WidgetNode (DragboardModel a) (DragboardEvent a)
node Path
prev DragboardCfg sp ep a
config DragboardModel a
model
    EventBlur Path
next -> forall s e a sp ep. WidgetNode s e -> Path -> EventHandle a sp ep
blurHandle WidgetNode (DragboardModel a) (DragboardEvent a)
node Path
next DragboardCfg sp ep a
config DragboardModel a
model

dropHandle
    :: Int
    -> DragId
    -> (WidgetData sp [[a]])
    -> EventHandle a sp ep
dropHandle :: forall sp a ep.
Int -> DragId -> WidgetData sp [[a]] -> EventHandle a sp ep
dropHandle Int
ixTo (DragId Int
ixFrom) WidgetData sp [[a]]
wdata DragboardCfg sp ep a
config DragboardModel a
model = forall {e}. [EventResponse (DragboardModel a) e sp ep]
response where
    response :: [EventResponse (DragboardModel a) e sp ep]
response = if Maybe Bool
valid forall a. Eq a => a -> a -> Bool
== forall a. a -> Maybe a
Just Bool
False Bool -> Bool -> Bool
|| Bool
emptySource
        then []
        else forall {e} {ep}. [EventResponse (DragboardModel a) e sp ep]
setBoardState forall a. Semigroup a => a -> a -> a
<> forall {s} {e}. [EventResponse s e sp ep]
report
    setBoardState :: [EventResponse (DragboardModel a) e sp ep]
setBoardState = if Bool
validFrom
        then [forall s e sp ep. s -> EventResponse s e sp ep
Model forall a b. (a -> b) -> a -> b
$ DragboardModel a
model forall a b. a -> (a -> b) -> b
& forall s a. HasBoardState s a => Lens' s a
boardState forall s t a b. ASetter s t a b -> b -> s -> t
.~ [[a]]
newState] forall a. Semigroup a => a -> a -> a
<> forall {s} {e} {ep}. [EventResponse s e sp ep]
dataReq
        else []
    valid :: Maybe Bool
valid = (forall a b. (a -> b) -> a -> b
$ ([[a]], Int, Int)
changeInfo) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (([[a]], Int, Int) -> Bool)
_dcValidator
    changeInfo :: ([[a]], Int, Int)
changeInfo = ([[a]]
_dmBoardState, Int
ixTo, Int
ixFrom)
    emptySource :: Bool
emptySource = Bool
validFrom Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
sourceSquare forall a. Eq a => a -> a -> Bool
== Int
0
    validFrom :: Bool
validFrom = Int
ixFrom' forall a. Ord a => a -> a -> Bool
>= Int
0 Bool -> Bool -> Bool
&& Int
ixFrom' forall a. Ord a => a -> a -> Bool
< forall (t :: * -> *) a. Foldable t => t a -> Int
length [[a]]
_dmBoardState
    report :: [EventResponse s e sp ep]
report = forall s e sp ep. WidgetRequest sp ep -> EventResponse s e sp ep
RequestParent forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((forall a b. (a -> b) -> a -> b
$ ([[a]], Int, Int)
changeInfo) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [([[a]], Int, Int) -> WidgetRequest sp ep]
_dcOnChangeReq)
    dataReq :: [EventResponse s e sp ep]
dataReq = forall s e sp ep. WidgetRequest sp ep -> EventResponse s e sp ep
RequestParent forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall s a e. WidgetData s a -> a -> [WidgetRequest s e]
widgetDataSet WidgetData sp [[a]]
wdata [[a]]
newState)
    newState :: [[a]]
newState = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Int -> [a] -> [a]
f [Int
offset..] [[a]]
_dmBoardState
    f :: Int -> [a] -> [a]
f Int
i [a]
xs
        | Int
i forall a. Eq a => a -> a -> Bool
== Int
ixTo = [forall a. [a] -> a
head [a]
sourceSquare]
        | Int
i forall a. Eq a => a -> a -> Bool
== Int
ixFrom = forall a. [a] -> [a]
tail [a]
xs
        | Bool
otherwise = [a]
xs
    sourceSquare :: [a]
sourceSquare = [[a]]
_dmBoardStateforall a. [a] -> Int -> a
!!Int
ixFrom'
    ixFrom' :: Int
ixFrom' = Int
ixFromforall a. Num a => a -> a -> a
-Int
offset
    offset :: Int
offset = forall a. a -> Maybe a -> a
fromMaybe Int
0 Maybe Int
_dcOffset
    DragboardCfg{[CheckerboardCfg]
[([[a]], Int, Int) -> WidgetRequest sp ep]
[Path -> WidgetRequest sp ep]
Maybe Bool
Maybe Int
Maybe Color
Maybe Millisecond
Maybe (([[a]], Int, Int) -> Bool)
_dcOnChangeReq :: forall s e a. DragboardCfg s e a -> [Info a -> WidgetRequest s e]
_dcOnBlurReq :: forall s e a. DragboardCfg s e a -> [Path -> WidgetRequest s e]
_dcOnFocusReq :: forall s e a. DragboardCfg s e a -> [Path -> WidgetRequest s e]
_dcCheckerCfg :: forall s e a. DragboardCfg s e a -> [CheckerboardCfg]
_dcDuration :: forall s e a. DragboardCfg s e a -> Maybe Millisecond
_dcRenderS :: forall s e a. DragboardCfg s e a -> Maybe Bool
_dcNoClick :: forall s e a. DragboardCfg s e a -> Maybe Bool
_dcSelectColor :: forall s e a. DragboardCfg s e a -> Maybe Color
_dcOffset :: forall s e a. DragboardCfg s e a -> Maybe Int
_dcValidator :: forall s e a. DragboardCfg s e a -> Maybe (Info a -> Bool)
_dcOnBlurReq :: [Path -> WidgetRequest sp ep]
_dcOnFocusReq :: [Path -> WidgetRequest sp ep]
_dcCheckerCfg :: [CheckerboardCfg]
_dcDuration :: Maybe Millisecond
_dcRenderS :: Maybe Bool
_dcNoClick :: Maybe Bool
_dcSelectColor :: Maybe Color
_dcOffset :: Maybe Int
_dcOnChangeReq :: [([[a]], Int, Int) -> WidgetRequest sp ep]
_dcValidator :: Maybe (([[a]], Int, Int) -> Bool)
..} = DragboardCfg sp ep a
config
    DragboardModel{[[a]]
Maybe Int
Map Int Rect
_dmAnimationSources :: forall a. DragboardModel a -> Map Int Rect
_dmSelectedSquare :: forall a. DragboardModel a -> Maybe Int
_dmBoardState :: forall a. DragboardModel a -> [[a]]
_dmAnimationSources :: Map Int Rect
_dmSelectedSquare :: Maybe Int
_dmBoardState :: [[a]]
..} = DragboardModel a
model

clickHandle
    :: Int
    -> WidgetEnv (DragboardModel a) (DragboardEvent a)
    -> EventHandle a sp ep
clickHandle :: forall a sp ep.
Int
-> WidgetEnv (DragboardModel a) (DragboardEvent a)
-> EventHandle a sp ep
clickHandle Int
i WidgetEnv (DragboardModel a) (DragboardEvent a)
wenv DragboardCfg sp ep a
config model :: DragboardModel a
model@(DragboardModel{[[a]]
Maybe Int
Map Int Rect
_dmAnimationSources :: Map Int Rect
_dmSelectedSquare :: Maybe Int
_dmBoardState :: [[a]]
_dmAnimationSources :: forall a. DragboardModel a -> Map Int Rect
_dmSelectedSquare :: forall a. DragboardModel a -> Maybe Int
_dmBoardState :: forall a. DragboardModel a -> [[a]]
..}) = forall {a} {sp} {ep}.
[EventResponse (DragboardModel a) (DragboardEvent a) sp ep]
resp where
    resp :: [EventResponse (DragboardModel a) (DragboardEvent a) sp ep]
resp
        | forall (t :: * -> *) a. Foldable t => t a -> Bool
null Maybe Int
_dmSelectedSquare = forall {e} {sp} {ep}.
Maybe Int -> [EventResponse (DragboardModel a) e sp ep]
setSelectedSquare forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just Int
i
        | Maybe Int
_dmSelectedSquare forall a. Eq a => a -> a -> Bool
== forall a. a -> Maybe a
Just Int
i = forall {e} {sp} {ep}.
Maybe Int -> [EventResponse (DragboardModel a) e sp ep]
setSelectedSquare forall a. Maybe a
Nothing
        | Bool
otherwise =
            [ forall s e sp ep. s -> EventResponse s e sp ep
Model forall a b. (a -> b) -> a -> b
$ DragboardModel a
model
                forall a b. a -> (a -> b) -> b
& forall s a. HasSelectedSquare s a => Lens' s a
selectedSquare forall s t a b. ASetter s t a b -> b -> s -> t
.~ Maybe Int
newSelected
                forall a b. a -> (a -> b) -> b
& forall s a. HasAnimationSources s a => Lens' s a
animationSources forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Map Int Rect -> Map Int Rect
insertSource
            , forall s e sp ep. e -> EventResponse s e sp ep
Event forall a b. (a -> b) -> a -> b
$ forall a. Int -> DragId -> DragboardEvent a
EventDrop Int
i DragId
d
            , forall s e sp ep.
Bool -> EventResponse s e sp ep -> EventResponse s e sp ep
responseIf (Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => t a -> Bool
null [EventResponse (DragboardModel a) (DragboardEvent a) sp ep]
dropResponses) forall a b. (a -> b) -> a -> b
$
                forall s e sp ep i.
Typeable i =>
WidgetKey -> i -> EventResponse s e sp ep
Message WidgetKey
destinationKey AnimationMsg
AnimationStart
            ]
    newSelected :: Maybe Int
newSelected = if forall (t :: * -> *) a. Foldable t => t a -> Bool
null [EventResponse (DragboardModel a) (DragboardEvent a) sp ep]
dropResponses
        then forall a. a -> Maybe a
Just Int
i
        else forall a. Maybe a
Nothing
    insertSource :: Map Int Rect -> Map Int Rect
insertSource = if forall (t :: * -> *) a. Foldable t => t a -> Bool
null Maybe Rect
sourceRect
        then forall a. a -> a
id
        else forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert Int
i forall a b. (a -> b) -> a -> b
$ forall a. HasCallStack => Maybe a -> a
fromJust Maybe Rect
sourceRect
    sourceRect :: Maybe Rect
sourceRect = forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view forall s a. HasViewport s a => Lens' s a
L.viewport forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe WidgetNodeInfo
sourceInfo
    sourceInfo :: Maybe WidgetNodeInfo
sourceInfo = forall s e. WidgetEnv s e -> WidgetKey -> Maybe WidgetNodeInfo
nodeInfoFromKey WidgetEnv (DragboardModel a) (DragboardEvent a)
wenv forall a b. (a -> b) -> a -> b
$ Text -> WidgetKey
WidgetKey Text
sourceKey
    destinationKey :: WidgetKey
destinationKey = Text -> WidgetKey
WidgetKey forall a b. (a -> b) -> a -> b
$ Text
"dragItem" forall a. Semigroup a => a -> a -> a
<> forall a. TextShow a => a -> Text
showt Int
i
    sourceKey :: Text
sourceKey = Text
"dragItem" forall a. Semigroup a => a -> a -> a
<> (forall a. TextShow a => a -> Text
showt forall a b. (a -> b) -> a -> b
$ forall a. HasCallStack => Maybe a -> a
fromJust Maybe Int
_dmSelectedSquare)
    dropResponses :: [EventResponse (DragboardModel a) (DragboardEvent a) sp ep]
dropResponses = forall sp a ep.
Int -> DragId -> WidgetData sp [[a]] -> EventHandle a sp ep
dropHandle Int
i DragId
d (forall s a. a -> WidgetData s a
WidgetValue []) DragboardCfg sp ep a
config' DragboardModel a
model
    config' :: DragboardCfg sp ep a
config' = DragboardCfg sp ep a
config forall a. Semigroup a => a -> a -> a
<> (forall t s e a.
CmbOnChangeReq t s e a =>
(a -> WidgetRequest s e) -> t
onChangeReq forall a b. (a -> b) -> a -> b
$ forall a b. a -> b -> a
const forall s e. WidgetRequest s e
RenderOnce)
    d :: DragId
d = Int -> DragId
DragId forall a b. (a -> b) -> a -> b
$ forall a. HasCallStack => Maybe a -> a
fromJust Maybe Int
_dmSelectedSquare
    setSelectedSquare :: Maybe Int -> [EventResponse (DragboardModel a) e sp ep]
setSelectedSquare Maybe Int
v = [forall s e sp ep. s -> EventResponse s e sp ep
Model forall a b. (a -> b) -> a -> b
$ DragboardModel a
model forall a b. a -> (a -> b) -> b
& forall s a. HasSelectedSquare s a => Lens' s a
selectedSquare forall s t a b. ASetter s t a b -> b -> s -> t
.~ Maybe Int
v]

finishedHandle :: Int -> EventHandle a sp ep
finishedHandle :: forall a sp ep. Int -> EventHandle a sp ep
finishedHandle Int
i DragboardCfg sp ep a
_ DragboardModel a
_ = forall {s} {e} {sp} {ep}. [EventResponse s e sp ep]
response where
    response :: [EventResponse s e sp ep]
response = [forall s e sp ep i.
Typeable i =>
WidgetKey -> i -> EventResponse s e sp ep
Message WidgetKey
destinationKey AnimationMsg
AnimationStop]
    destinationKey :: WidgetKey
destinationKey = Text -> WidgetKey
WidgetKey forall a b. (a -> b) -> a -> b
$ Text
"dragItem" forall a. Semigroup a => a -> a -> a
<> (forall a. TextShow a => a -> Text
showt Int
i)

mergeHandle
    :: (Eq a)
    => DragboardModel a
    -> WidgetEnv (DragboardModel a) (DragboardEvent a)
    -> EventHandle a sp ep
mergeHandle :: forall a sp ep.
Eq a =>
DragboardModel a
-> WidgetEnv (DragboardModel a) (DragboardEvent a)
-> EventHandle a sp ep
mergeHandle DragboardModel{[[a]]
Maybe Int
Map Int Rect
_dmAnimationSources :: Map Int Rect
_dmSelectedSquare :: Maybe Int
_dmBoardState :: [[a]]
_dmAnimationSources :: forall a. DragboardModel a -> Map Int Rect
_dmSelectedSquare :: forall a. DragboardModel a -> Maybe Int
_dmBoardState :: forall a. DragboardModel a -> [[a]]
..} WidgetEnv (DragboardModel a) (DragboardEvent a)
wenv DragboardCfg sp ep a
config DragboardModel a
model = forall {e} {sp} {ep}. [EventResponse (DragboardModel a) e sp ep]
response where
    response :: [EventResponse (DragboardModel a) e sp ep]
response = forall {e} {sp} {ep}. EventResponse (DragboardModel a) e sp ep
setSourcesforall a. a -> [a] -> [a]
:(forall a b c. (a -> b -> c) -> b -> a -> c
flip forall s e sp ep i.
Typeable i =>
WidgetKey -> i -> EventResponse s e sp ep
Message AnimationMsg
AnimationStart forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [WidgetKey]
newKeys)
    setSources :: EventResponse (DragboardModel a) e sp ep
setSources = forall s e sp ep. s -> EventResponse s e sp ep
Model forall a b. (a -> b) -> a -> b
$ DragboardModel a
model forall a b. a -> (a -> b) -> b
& forall s a. HasAnimationSources s a => Lens' s a
animationSources forall s t a b. ASetter s t a b -> b -> s -> t
.~ Map Int Rect
newSources
    (Map Int Rect
newSources, [WidgetKey]
newKeys, [Int]
_) = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl forall {a}.
(TextShow a, Ord a) =>
(Map a Rect, [WidgetKey], [Int])
-> (a, [a], [a]) -> (Map a Rect, [WidgetKey], [Int])
f forall {a} {a}. (Map Int Rect, [a], [a])
initState [(Int, [a], [a])]
models
    initState :: (Map Int Rect, [a], [a])
initState = (Map Int Rect
_dmAnimationSources, [], [])
    f :: (Map a Rect, [WidgetKey], [Int])
-> (a, [a], [a]) -> (Map a Rect, [WidgetKey], [Int])
f (Map a Rect
sources, [WidgetKey]
keys, [Int]
kk) (a
i, [a]
a, [a]
b) = (Map a Rect
sources', [WidgetKey]
keys', [Int]
kk') where
        sources' :: Map a Rect
sources' = if Bool
noAnimation
            then Map a Rect
sources
            else forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert a
i (forall a. HasCallStack => Maybe a -> a
fromJust Maybe Rect
sourceRect) Map a Rect
sources
        keys' :: [WidgetKey]
keys' = if Bool
noAnimation
            then [WidgetKey]
keys
            else (Text -> WidgetKey
WidgetKey forall a b. (a -> b) -> a -> b
$ Text
"dragItem" forall a. Semigroup a => a -> a -> a
<> (forall a. TextShow a => a -> Text
showt a
i))forall a. a -> [a] -> [a]
:[WidgetKey]
keys
        kk' :: [Int]
kk' = if Bool
noAnimation Bool -> Bool -> Bool
|| forall (t :: * -> *) a. Foldable t => t a -> Bool
null Maybe Int
sourceKey
            then [Int]
kk
            else (forall a. HasCallStack => Maybe a -> a
fromJust Maybe Int
sourceKey)forall a. a -> [a] -> [a]
:[Int]
kk
        noAnimation :: Bool
noAnimation = (forall {a}. Eq a => [a] -> [a] -> Bool
same [a]
a [a]
b) Bool -> Bool -> Bool
|| forall (t :: * -> *) a. Foldable t => t a -> Bool
null Maybe Rect
sourceRect
        sourceRect :: Maybe Rect
sourceRect = Maybe Int
sourceKey forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall {p}. TextShow p => p -> Maybe Rect
getRect
        sourceKey :: Maybe Int
sourceKey = [(Int, [a], [a])] -> Maybe Int
findSource [(Int, [a], [a])]
models
        findSource :: [(Int, [a], [a])] -> Maybe Int
findSource [] = forall a. Maybe a
Nothing
        findSource ((Int
j, [a]
a', [a]
b'):[(Int, [a], [a])]
xs) = Maybe Int
result where
            result :: Maybe Int
result = if (forall {a}. Eq a => [a] -> [a] -> Bool
same [a]
a' [a]
b') Bool -> Bool -> Bool
|| (Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall {a}. Eq a => [a] -> [a] -> Bool
same [a]
a' [a]
b) Bool -> Bool -> Bool
|| Bool
usedKey
                then [(Int, [a], [a])] -> Maybe Int
findSource [(Int, [a], [a])]
xs
                else forall a. a -> Maybe a
Just Int
j
            usedKey :: Bool
usedKey = Int
j forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
kk
    getRect :: p -> Maybe Rect
getRect p
i = forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view forall s a. HasViewport s a => Lens' s a
L.viewport forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe WidgetNodeInfo
sourceInfo where
        sourceInfo :: Maybe WidgetNodeInfo
sourceInfo = forall s e. WidgetEnv s e -> WidgetKey -> Maybe WidgetNodeInfo
nodeInfoFromKey WidgetEnv (DragboardModel a) (DragboardEvent a)
wenv forall a b. (a -> b) -> a -> b
$ Text -> WidgetKey
WidgetKey Text
sourceKey
        sourceKey :: Text
sourceKey = Text
"dragItem" forall a. Semigroup a => a -> a -> a
<> (forall a. TextShow a => a -> Text
showt p
i)
    same :: [a] -> [a] -> Bool
same [a]
a [a]
b = Bool
sameHead Bool -> Bool -> Bool
|| (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
a Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
b) where
        sameHead :: Bool
sameHead = Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
a) Bool -> Bool -> Bool
&& Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
b) Bool -> Bool -> Bool
&& forall a. [a] -> a
head [a]
a forall a. Eq a => a -> a -> Bool
== forall a. [a] -> a
head [a]
b
    models :: [(Int, [a], [a])]
models = forall a b c. [a] -> [b] -> [c] -> [(a, b, c)]
zip3 [Int
offset..] [[a]]
_dmBoardState [[a]]
boardState'
    boardState' :: [[a]]
boardState' = DragboardModel a
model forall s a. s -> Getting a s a -> a
^. forall s a. HasBoardState s a => Lens' s a
boardState
    offset :: Int
offset = forall a. a -> Maybe a -> a
fromMaybe Int
0 forall a b. (a -> b) -> a -> b
$ forall s e a. DragboardCfg s e a -> Maybe Int
_dcOffset DragboardCfg sp ep a
config

focusHandle :: WidgetNode s e -> Path -> EventHandle a sp ep
focusHandle :: forall s e a sp ep. WidgetNode s e -> Path -> EventHandle a sp ep
focusHandle WidgetNode s e
node Path
prev DragboardCfg{[CheckerboardCfg]
[Info a -> WidgetRequest sp ep]
[Path -> WidgetRequest sp ep]
Maybe Bool
Maybe Int
Maybe Color
Maybe Millisecond
Maybe (Info a -> Bool)
_dcOnChangeReq :: [Info a -> WidgetRequest sp ep]
_dcOnBlurReq :: [Path -> WidgetRequest sp ep]
_dcOnFocusReq :: [Path -> WidgetRequest sp ep]
_dcCheckerCfg :: [CheckerboardCfg]
_dcDuration :: Maybe Millisecond
_dcRenderS :: Maybe Bool
_dcNoClick :: Maybe Bool
_dcSelectColor :: Maybe Color
_dcOffset :: Maybe Int
_dcValidator :: Maybe (Info a -> Bool)
_dcOnChangeReq :: forall s e a. DragboardCfg s e a -> [Info a -> WidgetRequest s e]
_dcOnBlurReq :: forall s e a. DragboardCfg s e a -> [Path -> WidgetRequest s e]
_dcOnFocusReq :: forall s e a. DragboardCfg s e a -> [Path -> WidgetRequest s e]
_dcCheckerCfg :: forall s e a. DragboardCfg s e a -> [CheckerboardCfg]
_dcDuration :: forall s e a. DragboardCfg s e a -> Maybe Millisecond
_dcRenderS :: forall s e a. DragboardCfg s e a -> Maybe Bool
_dcNoClick :: forall s e a. DragboardCfg s e a -> Maybe Bool
_dcSelectColor :: forall s e a. DragboardCfg s e a -> Maybe Color
_dcOffset :: forall s e a. DragboardCfg s e a -> Maybe Int
_dcValidator :: forall s e a. DragboardCfg s e a -> Maybe (Info a -> Bool)
..} DragboardModel a
_ = forall {s} {e}. [EventResponse s e sp ep]
response where
    response :: [EventResponse s e sp ep]
response = if Bool
valid
        then forall s e sp ep. WidgetRequest sp ep -> EventResponse s e sp ep
RequestParent forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((forall a b. (a -> b) -> a -> b
$ Path
prev) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Path -> WidgetRequest sp ep]
_dcOnFocusReq)
        else []
    valid :: Bool
valid = Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall s e. WidgetNode s e -> Path -> Bool
isNodeParentOfPath WidgetNode s e
node Path
prev

blurHandle :: WidgetNode s e -> Path -> EventHandle a sp ep
blurHandle :: forall s e a sp ep. WidgetNode s e -> Path -> EventHandle a sp ep
blurHandle WidgetNode s e
node Path
next DragboardCfg{[CheckerboardCfg]
[Info a -> WidgetRequest sp ep]
[Path -> WidgetRequest sp ep]
Maybe Bool
Maybe Int
Maybe Color
Maybe Millisecond
Maybe (Info a -> Bool)
_dcOnChangeReq :: [Info a -> WidgetRequest sp ep]
_dcOnBlurReq :: [Path -> WidgetRequest sp ep]
_dcOnFocusReq :: [Path -> WidgetRequest sp ep]
_dcCheckerCfg :: [CheckerboardCfg]
_dcDuration :: Maybe Millisecond
_dcRenderS :: Maybe Bool
_dcNoClick :: Maybe Bool
_dcSelectColor :: Maybe Color
_dcOffset :: Maybe Int
_dcValidator :: Maybe (Info a -> Bool)
_dcOnChangeReq :: forall s e a. DragboardCfg s e a -> [Info a -> WidgetRequest s e]
_dcOnBlurReq :: forall s e a. DragboardCfg s e a -> [Path -> WidgetRequest s e]
_dcOnFocusReq :: forall s e a. DragboardCfg s e a -> [Path -> WidgetRequest s e]
_dcCheckerCfg :: forall s e a. DragboardCfg s e a -> [CheckerboardCfg]
_dcDuration :: forall s e a. DragboardCfg s e a -> Maybe Millisecond
_dcRenderS :: forall s e a. DragboardCfg s e a -> Maybe Bool
_dcNoClick :: forall s e a. DragboardCfg s e a -> Maybe Bool
_dcSelectColor :: forall s e a. DragboardCfg s e a -> Maybe Color
_dcOffset :: forall s e a. DragboardCfg s e a -> Maybe Int
_dcValidator :: forall s e a. DragboardCfg s e a -> Maybe (Info a -> Bool)
..} DragboardModel a
_ = forall {s} {e}. [EventResponse s e sp ep]
response where
    response :: [EventResponse s e sp ep]
response = if Bool
valid
        then forall s e sp ep. WidgetRequest sp ep -> EventResponse s e sp ep
RequestParent forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((forall a b. (a -> b) -> a -> b
$ Path
next) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Path -> WidgetRequest sp ep]
_dcOnBlurReq)
        else []
    valid :: Bool
valid = Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall s e. WidgetNode s e -> Path -> Bool
isNodeParentOfPath WidgetNode s e
node Path
next