{-# 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