Try removing s type parameter from WidgetRequest (to be reverted next)

This commit is contained in:
Francisco Vallarino 2021-04-21 11:07:09 -03:00
parent 531df8828a
commit 1f4462b630
22 changed files with 227 additions and 184 deletions

View File

@ -141,7 +141,7 @@ handleAppEvent wenv node model evt = case evt of
_ -> []
buildUI :: WidgetEnv App AppEvent -> App -> WidgetNode App AppEvent
buildUI wenv model = traceShow "Creating UI" widgetSplitH where
buildUI wenv model = traceShow "Creating UI" widgetSplit where
widgetSimple = vstack [
label $ "Count: " <> showt (model ^. clickCount),
button "Increase" IncButton

View File

@ -175,25 +175,25 @@ class CmbOnFocus t e | t -> e where
onFocus :: e -> t
class CmbOnFocusReq t s | t -> s where
onFocusReq :: WidgetRequest s -> t
onFocusReq :: WidgetRequest -> t
class CmbOnBlur t e | t -> e where
onBlur :: e -> t
class CmbOnBlurReq t s | t -> s where
onBlurReq :: WidgetRequest s -> t
onBlurReq :: WidgetRequest -> t
class CmbOnClick t e | t -> e where
onClick :: e -> t
class CmbOnClickReq t s | t -> s where
onClickReq :: WidgetRequest s -> t
onClickReq :: WidgetRequest -> t
class CmbOnClickEmpty t e | t -> e where
onClickEmpty :: e -> t
class CmbOnClickEmptyReq t s | t -> s where
onClickEmptyReq :: WidgetRequest s -> t
onClickEmptyReq :: WidgetRequest -> t
class CmbOnEnabledChange t e | t -> e where
onEnabledChange :: e -> t
@ -208,10 +208,10 @@ class CmbOnChangeIdx t a e | t -> e where
onChangeIdx :: (Int -> a -> e) -> t
class CmbOnChangeReq t s | t -> s where
onChangeReq :: WidgetRequest s -> t
onChangeReq :: WidgetRequest -> t
class CmbOnChangeIdxReq t s | t -> s where
onChangeIdxReq :: (Int -> WidgetRequest s) -> t
onChangeIdxReq :: (Int -> WidgetRequest) -> t
class CmbOnLoadError t a e | t -> e where
onLoadError :: (a -> e) -> t

View File

@ -53,36 +53,36 @@ nodeInstDesc level node = infoDesc (_winInfo node) where
spaces ++ "req: " ++ show (_wniSizeReqW info, _wniSizeReqH info) ++ "\n"
rectDesc r = show (_rX r, _rY r, _rW r, _rH r)
isResizeWidgets :: WidgetRequest s -> Bool
isResizeWidgets :: WidgetRequest -> Bool
isResizeWidgets ResizeWidgets = True
isResizeWidgets _ = False
isRenderOnce :: WidgetRequest s -> Bool
isRenderOnce :: WidgetRequest -> Bool
isRenderOnce RenderOnce{} = True
isRenderOnce _ = False
isRenderEvery :: WidgetRequest s -> Bool
isRenderEvery :: WidgetRequest -> Bool
isRenderEvery RenderEvery{} = True
isRenderEvery _ = False
isRenderStop :: WidgetRequest s -> Bool
isRenderStop :: WidgetRequest -> Bool
isRenderStop RenderStop{} = True
isRenderStop _ = False
isFocusRequest :: WidgetRequest s -> Bool
isFocusRequest :: WidgetRequest -> Bool
isFocusRequest MoveFocus{} = True
isFocusRequest SetFocus{} = True
isFocusRequest _ = False
isIgnoreParentEvents :: WidgetRequest s -> Bool
isIgnoreParentEvents :: WidgetRequest -> Bool
isIgnoreParentEvents IgnoreParentEvents = True
isIgnoreParentEvents _ = False
isIgnoreChildrenEvents :: WidgetRequest s -> Bool
isIgnoreChildrenEvents :: WidgetRequest -> Bool
isIgnoreChildrenEvents IgnoreChildrenEvents = True
isIgnoreChildrenEvents _ = False
isRunTask :: WidgetRequest s -> Bool
isRunTask :: WidgetRequest -> Bool
isRunTask RunTask{} = True
isRunTask _ = False

View File

@ -92,7 +92,7 @@ instance Serialise WidgetState where
0 -> return $ WidgetState (model :: ByteString)
_ -> fail "Invalid WidgetState"
data WidgetRequest s
data WidgetRequest
= IgnoreParentEvents
| IgnoreChildrenEvents
| ResizeWidgets
@ -113,15 +113,15 @@ data WidgetRequest s
| RenderStop WidgetId
| ExitApplication Bool
| UpdateWindow WindowRequest
| UpdateModel (s -> s)
| SetWidgetPath WidgetId Path
| ResetWidgetPath WidgetId
| forall s . Typeable s => UpdateModel (s -> s)
| forall i . Typeable i => RaiseEvent i
| forall i . Typeable i => SendMessage WidgetId i
| forall i . Typeable i => RunTask WidgetId Path (IO i)
| forall i . Typeable i => RunProducer WidgetId Path ((i -> IO ()) -> IO ())
instance Eq (WidgetRequest s) where
instance Eq WidgetRequest where
IgnoreParentEvents == IgnoreParentEvents = True
IgnoreChildrenEvents == IgnoreChildrenEvents = True
ResizeWidgets == ResizeWidgets = True
@ -148,7 +148,7 @@ instance Eq (WidgetRequest s) where
data WidgetResult s e = WidgetResult {
_wrNode :: WidgetNode s e,
_wrRequests :: Seq (WidgetRequest s)
_wrRequests :: Seq WidgetRequest
}
-- This instance is lawless (there is not an empty widget): use with caution
@ -363,7 +363,7 @@ data Widget s e =
-> IO ()
}
instance Show (WidgetRequest s) where
instance Show WidgetRequest where
show IgnoreParentEvents = "IgnoreParentEvents"
show IgnoreChildrenEvents = "IgnoreChildrenEvents"
show ResizeWidgets = "ResizeWidgets"
@ -384,9 +384,9 @@ instance Show (WidgetRequest s) where
show (RenderStop wid) = "RenderStop: " ++ show wid
show ExitApplication{} = "ExitApplication"
show (UpdateWindow req) = "UpdateWindow: " ++ show req
show UpdateModel{} = "UpdateModel"
show (SetWidgetPath wid path) = "SetWidgetPath: " ++ show (wid, path)
show (ResetWidgetPath wid) = "ResetWidgetPath: " ++ show wid
show UpdateModel{} = "UpdateModel"
show RaiseEvent{} = "RaiseEvent"
show SendMessage{} = "SendMessage"
show RunTask{} = "RunTask"

View File

@ -85,7 +85,7 @@ simpleApp model eventHandler uiBuilder configs = do
appWidget = composite_ "app" id uiBuilder eventHandler compCfgs
runApp
:: (MonomerM s m, WidgetEvent e)
:: (WidgetModel s, WidgetEvent e, MonomerM s m)
=> SDL.Window
-> WidgetNode s ep
-> AppConfig e
@ -163,7 +163,7 @@ runApp window widgetRoot config = do
mainLoop window renderer config loopArgs
mainLoop
:: (MonomerM s m, WidgetEvent e)
:: (WidgetModel s, WidgetEvent e, MonomerM s m)
=> SDL.Window
-> Renderer
-> AppConfig e
@ -370,7 +370,7 @@ saveMonomerCtx wenv root config = do
liftIO $ writeFileSerialise file (ctxp, instNode)
loadMonomerCtx
:: MonomerM s m
:: (WidgetModel s, MonomerM s m)
=> WidgetEnv s ep
-> WidgetNode s ep
-> AppConfig e

View File

@ -27,7 +27,7 @@ import Data.Default
import Data.List (foldl')
import Data.Maybe
import Data.Sequence (Seq(..), (|>))
import Data.Typeable (Typeable)
import Data.Typeable (Typeable, cast)
import Foreign (alloca, poke)
import Safe (headMay)
import SDL (($=))
@ -47,7 +47,7 @@ import Monomer.Main.Util
import qualified Monomer.Lens as L
import Control.Monad.Trans.Maybe
type HandlerStep s e = (WidgetEnv s e, WidgetNode s e, Seq (WidgetRequest s))
type HandlerStep s e = (WidgetEnv s e, WidgetNode s e, Seq WidgetRequest)
getTargetPath
:: WidgetEnv s e
@ -87,7 +87,7 @@ getTargetPath wenv pressed overlay target event root = case event of
pointEvent point = pressed <|> pathFromPoint point <|> overlay
handleSystemEvents
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetEnv s e
-> [SystemEvent]
-> WidgetNode s e
@ -138,7 +138,7 @@ handleSystemEvents wenv baseEvents widgetRoot = nextStep where
nextStep = foldM reduceEvt (wenv, widgetRoot, Seq.empty) newEvents
handleSystemEvent
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetEnv s e
-> SystemEvent
-> Path
@ -176,7 +176,7 @@ handleResourcesInit = do
return $ Map.insert icon cursor map
handleWidgetInit
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetEnv s e
-> WidgetNode s e
-> m (HandlerStep s e)
@ -194,7 +194,7 @@ handleWidgetInit wenv widgetRoot = do
else return step
handleWidgetRestore
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetEnv s e
-> WidgetInstanceNode
-> WidgetNode s e
@ -206,7 +206,7 @@ handleWidgetRestore wenv widgetInst widgetRoot = do
handleWidgetResult wenv True widgetResult
handleWidgetDispose
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetEnv s e
-> WidgetNode s e
-> m (HandlerStep s e)
@ -217,7 +217,7 @@ handleWidgetDispose wenv widgetRoot = do
handleWidgetResult wenv False widgetResult
handleWidgetResult
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetEnv s e
-> Bool
-> WidgetResult s e
@ -236,8 +236,8 @@ handleWidgetResult wenv resizeWidgets result = do
return step
handleRequests
:: (MonomerM s m)
=> Seq (WidgetRequest s)
:: (Typeable s, MonomerM s m)
=> Seq WidgetRequest
-> HandlerStep s e
-> m (HandlerStep s e)
handleRequests reqs step = foldM handleRequest step reqs where
@ -262,7 +262,9 @@ handleRequests reqs step = foldM handleRequest step reqs where
RenderStop wid -> handleRenderStop wid step
ExitApplication exit -> handleExitApplication exit step
UpdateWindow req -> handleUpdateWindow req step
UpdateModel fn -> handleUpdateModel fn step
UpdateModel fnt -> case cast fnt of
Just fn -> handleUpdateModel fn step
_ -> return step
SetWidgetPath wid path -> handleSetWidgetPath wid path step
ResetWidgetPath wid -> handleResetWidgetPath wid step
RaiseEvent msg -> handleRaiseEvent msg step
@ -271,7 +273,7 @@ handleRequests reqs step = foldM handleRequest step reqs where
RunProducer wid path handler -> handleRunProducer wid path handler step
handleResizeWidgets
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> HandlerStep s e
-> m (HandlerStep s e)
handleResizeWidgets previousStep = do
@ -289,7 +291,7 @@ handleResizeWidgets previousStep = do
return (wenv2, root2, reqs <> reqs2)
handleMoveFocus
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> Maybe WidgetId
-> FocusDirection
-> HandlerStep s e
@ -318,7 +320,7 @@ handleMoveFocus startFromWid dir (wenv, root, reqs) = do
return (wenv1, root1, reqs <> reqs1)
handleSetFocus
:: (MonomerM s m) => WidgetId -> HandlerStep s e -> m (HandlerStep s e)
:: (Typeable s, MonomerM s m) => WidgetId -> HandlerStep s e -> m (HandlerStep s e)
handleSetFocus newFocusWid (wenv, root, reqs) = do
newFocus <- getWidgetIdPath newFocusWid
oldFocus <- getFocusedPath
@ -338,7 +340,7 @@ handleSetFocus newFocusWid (wenv, root, reqs) = do
return (wenv, root, reqs)
handleGetClipboard
:: (MonomerM s m) => WidgetId -> HandlerStep s e -> m (HandlerStep s e)
:: (Typeable s, MonomerM s m) => WidgetId -> HandlerStep s e -> m (HandlerStep s e)
handleGetClipboard widgetId (wenv, root, reqs) = do
path <- getWidgetIdPath widgetId
hasText <- SDL.hasClipboardText
@ -350,27 +352,27 @@ handleGetClipboard widgetId (wenv, root, reqs) = do
return (wenv2, root2, reqs <> reqs2)
handleSetClipboard
:: (MonomerM s m) => ClipboardData -> HandlerStep s e -> m (HandlerStep s e)
:: (Typeable s, MonomerM s m) => ClipboardData -> HandlerStep s e -> m (HandlerStep s e)
handleSetClipboard (ClipboardText text) previousStep = do
SDL.setClipboardText text
return previousStep
handleSetClipboard _ previousStep = return previousStep
handleStartTextInput
:: (MonomerM s m) => Rect -> HandlerStep s e -> m (HandlerStep s e)
:: (Typeable s, MonomerM s m) => Rect -> HandlerStep s e -> m (HandlerStep s e)
handleStartTextInput (Rect x y w h) previousStep = do
SDL.startTextInput (SDLT.Rect (c x) (c y) (c w) (c h))
return previousStep
where
c x = fromIntegral $ round x
handleStopTextInput :: (MonomerM s m) => HandlerStep s e -> m (HandlerStep s e)
handleStopTextInput :: (Typeable s, MonomerM s m) => HandlerStep s e -> m (HandlerStep s e)
handleStopTextInput previousStep = do
SDL.stopTextInput
return previousStep
handleSetOverlay
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetId
-> Path
-> HandlerStep s e
@ -383,7 +385,7 @@ handleSetOverlay widgetId path previousStep = do
return previousStep
handleResetOverlay
:: (MonomerM s m) => WidgetId -> HandlerStep s e -> m (HandlerStep s e)
:: (Typeable s, MonomerM s m) => WidgetId -> HandlerStep s e -> m (HandlerStep s e)
handleResetOverlay widgetId step = do
let (wenv, root, reqs) = step
let mousePos = wenv ^. L.inputStatus . L.mousePos
@ -401,7 +403,7 @@ handleResetOverlay widgetId step = do
return (wenv2, root2, reqs <> reqs2)
handleSetCursorIcon
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetId
-> CursorIcon
-> HandlerStep s e
@ -415,7 +417,7 @@ handleSetCursorIcon wid icon previousStep = do
return previousStep
handleResetCursorIcon
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetId
-> HandlerStep s e
-> m (HandlerStep s e)
@ -432,7 +434,7 @@ handleResetCursorIcon wid previousStep = do
return previousStep
handleStartDrag
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetId
-> Path
-> WidgetDragMsg
@ -447,7 +449,7 @@ handleStartDrag widgetId path dragData previousStep = do
return previousStep
handleStopDrag
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetId
-> HandlerStep s e
-> m (HandlerStep s e)
@ -463,7 +465,7 @@ handleStopDrag widgetId previousStep = do
else return previousStep
handleFinalizeDrop
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> HandlerStep s e
-> m (HandlerStep s e)
handleFinalizeDrop previousStep = do
@ -477,13 +479,13 @@ handleFinalizeDrop previousStep = do
return $ previousStep & _1 . L.dragStatus .~ Nothing
else return previousStep
handleRenderOnce :: (MonomerM s m) => HandlerStep s e -> m (HandlerStep s e)
handleRenderOnce :: (Typeable s, MonomerM s m) => HandlerStep s e -> m (HandlerStep s e)
handleRenderOnce previousStep = do
L.renderRequested .= True
return previousStep
handleRenderEvery
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetId
-> Int
-> Maybe Int
@ -506,20 +508,20 @@ handleRenderEvery widgetId ms repeat previousStep = do
| otherwise = schedule
handleRenderStop
:: (MonomerM s m) => WidgetId -> HandlerStep s e -> m (HandlerStep s e)
:: (Typeable s, MonomerM s m) => WidgetId -> HandlerStep s e -> m (HandlerStep s e)
handleRenderStop widgetId previousStep = do
schedule <- use L.renderSchedule
L.renderSchedule .= Map.delete widgetId schedule
return previousStep
handleExitApplication
:: (MonomerM s m) => Bool -> HandlerStep s e -> m (HandlerStep s e)
:: (Typeable s, MonomerM s m) => Bool -> HandlerStep s e -> m (HandlerStep s e)
handleExitApplication exit previousStep = do
L.exitApplication .= exit
return previousStep
handleUpdateWindow
:: (MonomerM s m) => WindowRequest -> HandlerStep s e -> m (HandlerStep s e)
:: (Typeable s, MonomerM s m) => WindowRequest -> HandlerStep s e -> m (HandlerStep s e)
handleUpdateWindow windowRequest previousStep = do
window <- use L.window
case windowRequest of
@ -532,7 +534,7 @@ handleUpdateWindow windowRequest previousStep = do
return previousStep
handleUpdateModel
:: (MonomerM s m) => (s -> s) -> HandlerStep s e -> m (HandlerStep s e)
:: (Typeable s, MonomerM s m) => (s -> s) -> HandlerStep s e -> m (HandlerStep s e)
handleUpdateModel fn (wenv, root, reqs) = do
L.mainModel .= _weModel wenv2
return (wenv2, root, reqs)
@ -540,13 +542,13 @@ handleUpdateModel fn (wenv, root, reqs) = do
wenv2 = wenv & L.model %~ fn
handleSetWidgetPath
:: (MonomerM s m) => WidgetId -> Path -> HandlerStep s e -> m (HandlerStep s e)
:: (Typeable s, MonomerM s m) => WidgetId -> Path -> HandlerStep s e -> m (HandlerStep s e)
handleSetWidgetPath wid path step = do
setWidgetIdPath wid path
return step
handleResetWidgetPath
:: (MonomerM s m) => WidgetId -> HandlerStep s e -> m (HandlerStep s e)
:: (Typeable s, MonomerM s m) => WidgetId -> HandlerStep s e -> m (HandlerStep s e)
handleResetWidgetPath wid step = do
delWidgetIdPath wid
return step
@ -561,7 +563,7 @@ handleRaiseEvent message step = do
return step
handleSendMessage
:: forall s e m msg . (MonomerM s m, Typeable msg)
:: forall s e m msg . (Typeable s, MonomerM s m, Typeable msg)
=> WidgetId
-> msg
-> HandlerStep s e
@ -616,8 +618,8 @@ sendMessage channel message = atomically $ writeTChan channel message
addFocusReq
:: SystemEvent
-> Seq (WidgetRequest s)
-> Seq (WidgetRequest s)
-> Seq WidgetRequest
-> Seq WidgetRequest
addFocusReq (KeyAction mod code KeyPressed) reqs = newReqs where
isTabPressed = isKeyTab code
stopProcessing = isJust $ Seq.findIndexL isIgnoreParentEvents reqs
@ -638,7 +640,7 @@ preProcessEvents (e:es) = case e of
_ -> e : preProcessEvents es
addRelatedEvents
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetEnv s e
-> Button
-> WidgetNode s e
@ -715,7 +717,7 @@ addRelatedEvents wenv mainBtn widgetRoot evt = case evt of
_ -> return [(evt, Nothing)]
addHoverEvents
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetEnv s e
-> WidgetNode s e
-> Point
@ -737,7 +739,7 @@ addHoverEvents wenv widgetRoot point = do
return (target, leave ++ enter)
findEvtTargetByPoint
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetEnv s e
-> WidgetNode s e
-> SystemEvent
@ -767,7 +769,7 @@ findNextFocus wenv dir start overlay widgetRoot = fromJust nextFocus where
nextFocus = candidateWni <|> fromRootWni <|> Just focusWni
dropNonParentWidgetId
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetId
-> [(WidgetId, a)]
-> m [(WidgetId, a)]
@ -783,7 +785,7 @@ dropNonParentWidgetId wid (x:xs) = do
isParentPath parent child = seqStartsWith parent child && parent /= child
resetCursorOnNodeLeave
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> SystemEvent
-> HandlerStep s e
-> m ()

View File

@ -24,7 +24,7 @@ import Monomer.Main.Types
import qualified Monomer.Lens as L
handleWidgetTasks
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetEnv s e -> WidgetNode s e -> m (HandlerStep s e)
handleWidgetTasks wenv widgetRoot = do
tasks <- use widgetTasks
@ -34,7 +34,7 @@ handleWidgetTasks wenv widgetRoot = do
processTasks wenv widgetRoot tasks
processTasks
:: (MonomerM s m, Traversable t)
:: (Typeable s, MonomerM s m, Traversable t)
=> WidgetEnv s e
-> WidgetNode s e
-> t WidgetTask
@ -46,7 +46,7 @@ processTasks wenv widgetRoot tasks = nextStep where
nextStep = foldM reducer (wenv, widgetRoot, Seq.empty) tasks
processTask
:: (MonomerM s m)
:: (Typeable s, MonomerM s m)
=> WidgetEnv s e
-> WidgetNode s e
-> WidgetTask
@ -65,7 +65,7 @@ processTask model widgetRoot (WidgetProducer widgetId channel task) = do
Nothing -> return (model, widgetRoot, Seq.empty)
processTaskResult
:: (MonomerM s m, Typeable a)
:: (Typeable s, MonomerM s m, Typeable a)
=> WidgetEnv s e
-> WidgetNode s e
-> WidgetId
@ -78,7 +78,7 @@ processTaskResult wenv widgetRoot widgetId (Right taskResult)
= processTaskEvent wenv widgetRoot widgetId taskResult
processTaskEvent
:: (MonomerM s m, Typeable a)
:: (Typeable s, MonomerM s m, Typeable a)
=> WidgetEnv s e
-> WidgetNode s e
-> WidgetId

View File

@ -70,7 +70,7 @@ data EventResponse s e ep
= Model s
| Event e
| Report ep
| Request (WidgetRequest s)
| Request WidgetRequest
| forall i . Typeable i => Message WidgetKey i
| Task (TaskHandler e)
| Producer (ProducerHandler e)
@ -81,7 +81,7 @@ data CompositeCfg s e sp ep = CompositeCfg {
_cmcOnDispose :: [e],
_cmcOnResize :: [Rect -> e],
_cmcOnChange :: [s -> ep],
_cmcOnChangeReq :: [WidgetRequest sp],
_cmcOnChangeReq :: [WidgetRequest],
_cmcOnEnabledChange :: [e],
_cmcOnVisibleChange :: [e]
}
@ -162,7 +162,7 @@ data Composite s e sp ep = Composite {
_cmpOnDispose :: [e],
_cmpOnResize :: [Rect -> e],
_cmpOnChange :: [s -> ep],
_cmpOnChangeReq :: [WidgetRequest sp],
_cmpOnChangeReq :: [WidgetRequest],
_cmpOnEnabledChange :: [e],
_cmpOnVisibleChange :: [e]
}
@ -193,8 +193,8 @@ data ReducedEvents s e sp ep = ReducedEvents {
_reModel :: s,
_reEvents :: Seq e,
_reReports :: Seq ep,
_reRequests :: Seq (WidgetRequest s),
_reMessages :: Seq (WidgetRequest sp),
_reRequests :: Seq WidgetRequest,
_reMessages :: Seq WidgetRequest,
_reTasks :: Seq (TaskHandler e),
_reProducers :: Seq (ProducerHandler e)
}
@ -709,7 +709,7 @@ reduceEvtResponse
=> WidgetNode sp ep
-> WidgetKeysMap s e
-> EventResponse s e ep
-> Maybe (WidgetRequest sp)
-> Maybe WidgetRequest
reduceEvtResponse widgetComp globalKeys response = case response of
Model newModel -> Just $ sendTo widgetComp (CompMsgUpdate $ const newModel)
Event event -> Just $ sendTo widgetComp event
@ -757,10 +757,10 @@ getModel
-> s
getModel comp wenv = widgetDataGet (_weModel wenv) (_cmpWidgetData comp)
toParentReqs :: (Typeable s, Typeable sp) => WidgetId -> Seq (WidgetRequest s) -> Seq (WidgetRequest sp)
toParentReqs :: WidgetId -> Seq WidgetRequest -> Seq WidgetRequest
toParentReqs wid reqs = fromJust <$> Seq.filter isJust (toParentReq wid <$> reqs)
toParentReq :: (Typeable s, Typeable sp) => WidgetId -> WidgetRequest s -> Maybe (WidgetRequest sp)
toParentReq :: WidgetId -> WidgetRequest -> Maybe WidgetRequest
toParentReq _ IgnoreParentEvents = Just IgnoreParentEvents
toParentReq _ IgnoreChildrenEvents = Just IgnoreChildrenEvents
toParentReq _ ResizeWidgets = Just ResizeWidgets

View File

@ -29,9 +29,9 @@ data BoxCfg s e = BoxCfg {
_boxAlignH :: Maybe AlignH,
_boxAlignV :: Maybe AlignV,
_boxOnClick :: [e],
_boxOnClickReq :: [WidgetRequest s],
_boxOnClickReq :: [WidgetRequest],
_boxOnClickEmpty :: [e],
_boxOnClickEmptyReq :: [WidgetRequest s]
_boxOnClickEmptyReq :: [WidgetRequest]
}
instance Default (BoxCfg s e) where

View File

@ -21,6 +21,7 @@ import Control.Lens (ALens', (&), (^.), (.~), (<>~))
import Data.Default
import Data.Maybe
import Data.Tuple (swap)
import Data.Typeable (Typeable)
import GHC.Generics
import qualified Data.Sequence as Seq
@ -35,7 +36,7 @@ data SplitCfg s e = SplitCfg {
_spcHandleSize :: Maybe Double,
_spcIgnoreChildResize :: Maybe Bool,
_spcOnChange :: [Double -> e],
_spcOnChangeReq :: [WidgetRequest s]
_spcOnChangeReq :: [WidgetRequest]
}
instance Default (SplitCfg s e) where
@ -101,26 +102,34 @@ instance WidgetModel SplitState where
modelToByteString = serialise
byteStringToModel = bsToSerialiseModel
hsplit :: WidgetEvent e => (WidgetNode s e, WidgetNode s e) -> WidgetNode s e
hsplit
:: (Typeable s, WidgetEvent e)
=> (WidgetNode s e, WidgetNode s e)
-> WidgetNode s e
hsplit nodes = hsplit_ def nodes
hsplit_
:: WidgetEvent e
=> [SplitCfg s e] -> (WidgetNode s e, WidgetNode s e) -> WidgetNode s e
:: (Typeable s, WidgetEvent e)
=> [SplitCfg s e]
-> (WidgetNode s e, WidgetNode s e)
-> WidgetNode s e
hsplit_ configs nodes = split_ True nodes configs
vsplit :: WidgetEvent e => (WidgetNode s e, WidgetNode s e) -> WidgetNode s e
vsplit
:: (Typeable s, WidgetEvent e)
=> (WidgetNode s e, WidgetNode s e)
-> WidgetNode s e
vsplit nodes = vsplit_ def nodes
vsplit_
:: WidgetEvent e
:: (Typeable s, WidgetEvent e)
=> [SplitCfg s e]
-> (WidgetNode s e, WidgetNode s e)
-> WidgetNode s e
vsplit_ configs nodes = split_ False nodes configs
split_
:: WidgetEvent e
:: (Typeable s, WidgetEvent e)
=> Bool
-> (WidgetNode s e, WidgetNode s e)
-> [SplitCfg s e]
@ -139,7 +148,12 @@ split_ isHorizontal (node1, node2) configs = newNode where
newNode = defaultWidgetNode widgetName widget
& L.children .~ Seq.fromList [node1, node2]
makeSplit :: WidgetEvent e => Bool -> SplitCfg s e -> SplitState -> Widget s e
makeSplit
:: (Typeable s, WidgetEvent e)
=> Bool
-> SplitCfg s e
-> SplitState
-> Widget s e
makeSplit isHorizontal config state = widget where
widget = createContainer state def {
containerUseCustomCursor = True,
@ -318,7 +332,7 @@ makeSplit isHorizontal config state = widget where
| isHorizontal = (^. L.info . L.sizeReqW)
| otherwise = (^. L.info . L.sizeReqH)
setModelPos :: SplitCfg s e -> Double -> [WidgetRequest s]
setModelPos :: Typeable s => SplitCfg s e -> Double -> [WidgetRequest]
setModelPos cfg
| isJust (_spcHandlePos cfg) = widgetDataSet (fromJust $ _spcHandlePos cfg)
| otherwise = const []

View File

@ -36,11 +36,11 @@ data ButtonCfg s e = ButtonCfg {
_btnFactorW :: Maybe Double,
_btnFactorH :: Maybe Double,
_btnOnFocus :: [e],
_btnOnFocusReq :: [WidgetRequest s],
_btnOnFocusReq :: [WidgetRequest],
_btnOnBlur :: [e],
_btnOnBlurReq :: [WidgetRequest s],
_btnOnBlurReq :: [WidgetRequest],
_btnOnClick :: [e],
_btnOnClickReq :: [WidgetRequest s]
_btnOnClickReq :: [WidgetRequest]
}
instance Default (ButtonCfg s e) where

View File

@ -17,6 +17,7 @@ import Control.Monad
import Data.Default
import Data.Maybe
import Data.Text (Text)
import Data.Typeable (Typeable)
import qualified Data.Sequence as Seq
@ -33,11 +34,11 @@ data CheckboxCfg s e = CheckboxCfg {
_ckcMark :: Maybe CheckboxMark,
_ckcWidth :: Maybe Double,
_ckcOnFocus :: [e],
_ckcOnFocusReq :: [WidgetRequest s],
_ckcOnFocusReq :: [WidgetRequest],
_ckcOnBlur :: [e],
_ckcOnBlurReq :: [WidgetRequest s],
_ckcOnBlurReq :: [WidgetRequest],
_ckcOnChange :: [Bool -> e],
_ckcOnChangeReq :: [WidgetRequest s]
_ckcOnChangeReq :: [WidgetRequest]
}
instance Default (CheckboxCfg s e) where
@ -107,23 +108,34 @@ checkboxMark mark = def {
_ckcMark = Just mark
}
checkbox :: WidgetEvent e => ALens' s Bool -> WidgetNode s e
checkbox :: (Typeable s, WidgetEvent e) => ALens' s Bool -> WidgetNode s e
checkbox field = checkbox_ field def
checkbox_
:: WidgetEvent e => ALens' s Bool -> [CheckboxCfg s e] -> WidgetNode s e
:: (Typeable s, WidgetEvent e)
=> ALens' s Bool
-> [CheckboxCfg s e]
-> WidgetNode s e
checkbox_ field config = checkboxD_ (WidgetLens field) config
checkboxV :: WidgetEvent e => Bool -> (Bool -> e) -> WidgetNode s e
checkboxV
:: (Typeable s, WidgetEvent e) => Bool -> (Bool -> e) -> WidgetNode s e
checkboxV value handler = checkboxV_ value handler def
checkboxV_
:: WidgetEvent e => Bool -> (Bool -> e) -> [CheckboxCfg s e] -> WidgetNode s e
:: (Typeable s, WidgetEvent e)
=> Bool
-> (Bool -> e)
-> [CheckboxCfg s e]
-> WidgetNode s e
checkboxV_ value handler config = checkboxD_ (WidgetValue value) newConfig where
newConfig = onChange handler : config
checkboxD_
:: WidgetEvent e => WidgetData s Bool -> [CheckboxCfg s e] -> WidgetNode s e
:: (Typeable s, WidgetEvent e)
=> WidgetData s Bool
-> [CheckboxCfg s e]
-> WidgetNode s e
checkboxD_ widgetData configs = checkboxNode where
config = mconcat configs
widget = makeCheckbox widgetData config
@ -131,7 +143,7 @@ checkboxD_ widgetData configs = checkboxNode where
& L.info . L.focusable .~ True
makeCheckbox
:: WidgetEvent e => WidgetData s Bool -> CheckboxCfg s e -> Widget s e
:: (Typeable s, WidgetEvent e) => WidgetData s Bool -> CheckboxCfg s e -> Widget s e
makeCheckbox widgetData config = widget where
widget = createSingle () def {
singleGetBaseStyle = getBaseStyle,

View File

@ -22,6 +22,7 @@ import Control.Monad
import Data.Default
import Data.Maybe
import Data.Text (Text)
import Data.Typeable (Typeable)
import GHC.Generics
import qualified Data.Sequence as Seq
@ -36,11 +37,11 @@ data DialCfg s e a = DialCfg {
_dlcWidth :: Maybe Double,
_dlcDragRate :: Maybe Rational,
_dlcOnFocus :: [e],
_dlcOnFocusReq :: [WidgetRequest s],
_dlcOnFocusReq :: [WidgetRequest],
_dlcOnBlur :: [e],
_dlcOnBlurReq :: [WidgetRequest s],
_dlcOnBlurReq :: [WidgetRequest],
_dlcOnChange :: [a -> e],
_dlcOnChangeReq :: [WidgetRequest s]
_dlcOnChangeReq :: [WidgetRequest]
}
instance Default (DialCfg s e a) where
@ -119,11 +120,11 @@ instance WidgetModel DialState where
modelToByteString = serialise
byteStringToModel = bsToSerialiseModel
dial :: (DialValue a, WidgetEvent e) => ALens' s a -> a -> a -> WidgetNode s e
dial :: (Typeable s, WidgetEvent e, DialValue a) => ALens' s a -> a -> a -> WidgetNode s e
dial field minVal maxVal = dial_ field minVal maxVal def
dial_
:: (DialValue a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, DialValue a)
=> ALens' s a
-> a
-> a
@ -132,11 +133,11 @@ dial_
dial_ field minVal maxVal cfgs = dialD_ (WidgetLens field) minVal maxVal cfgs
dialV
:: (DialValue a, WidgetEvent e) => a -> (a -> e) -> a -> a -> WidgetNode s e
:: (Typeable s, WidgetEvent e, DialValue a) => a -> (a -> e) -> a -> a -> WidgetNode s e
dialV value handler minVal maxVal = dialV_ value handler minVal maxVal def
dialV_
:: (DialValue a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, DialValue a)
=> a
-> (a -> e)
-> a
@ -149,7 +150,7 @@ dialV_ value handler minVal maxVal configs = newNode where
newNode = dialD_ widgetData minVal maxVal newConfigs
dialD_
:: (DialValue a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, DialValue a)
=> WidgetData s a
-> a
-> a
@ -163,7 +164,7 @@ dialD_ widgetData minVal maxVal configs = dialNode where
& L.info . L.focusable .~ True
makeDial
:: (DialValue a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, DialValue a)
=> WidgetData s a
-> a
-> a

View File

@ -25,7 +25,7 @@ import Data.List (foldl')
import Data.Maybe (fromJust, fromMaybe, isJust)
import Data.Sequence (Seq(..), (<|), (|>))
import Data.Text (Text)
import Data.Typeable (cast)
import Data.Typeable (Typeable, cast)
import GHC.Generics
import qualified Data.Sequence as Seq
@ -44,13 +44,13 @@ data DropdownCfg s e a = DropdownCfg {
_ddcItemStyle :: Maybe Style,
_ddcItemSelectedStyle :: Maybe Style,
_ddcOnFocus :: [e],
_ddcOnFocusReq :: [WidgetRequest s],
_ddcOnFocusReq :: [WidgetRequest],
_ddcOnBlur :: [e],
_ddcOnBlurReq :: [WidgetRequest s],
_ddcOnBlurReq :: [WidgetRequest],
_ddcOnChange :: [a -> e],
_ddcOnChangeReq :: [WidgetRequest s],
_ddcOnChangeReq :: [WidgetRequest],
_ddcOnChangeIdx :: [Int -> a -> e],
_ddcOnChangeIdxReq :: [Int -> WidgetRequest s]
_ddcOnChangeIdxReq :: [Int -> WidgetRequest]
}
instance Default (DropdownCfg s e a) where
@ -162,7 +162,7 @@ data DropdownMessage
| OnListBlur
dropdown
:: (Traversable t, DropdownItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, DropdownItem a)
=> ALens' s a
-> t a
-> (a -> WidgetNode s e)
@ -172,7 +172,7 @@ dropdown field items makeMain makeRow = newNode where
newNode = dropdown_ field items makeMain makeRow def
dropdown_
:: (Traversable t, DropdownItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, DropdownItem a)
=> ALens' s a
-> t a
-> (a -> WidgetNode s e)
@ -184,7 +184,7 @@ dropdown_ field items makeMain makeRow configs = newNode where
newNode = dropdownD_ widgetData items makeMain makeRow configs
dropdownV
:: (Traversable t, DropdownItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, DropdownItem a)
=> a
-> (Int -> a -> e)
-> t a
@ -195,7 +195,7 @@ dropdownV value handler items makeMain makeRow = newNode where
newNode = dropdownV_ value handler items makeMain makeRow def
dropdownV_
:: (Traversable t, DropdownItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, DropdownItem a)
=> a
-> (Int -> a -> e)
-> t a
@ -208,7 +208,7 @@ dropdownV_ value handler items makeMain makeRow configs = newNode where
newNode = dropdownD_ (WidgetValue value) items makeMain makeRow newConfigs
dropdownD_
:: (Traversable t, DropdownItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, DropdownItem a)
=> WidgetData s a
-> t a
-> (a -> WidgetNode s e)
@ -226,7 +226,7 @@ makeNode widget = defaultWidgetNode "dropdown" widget
& L.info . L.focusable .~ True
makeDropdown
:: (DropdownItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, DropdownItem a)
=> WidgetData s a
-> Seq a
-> (a -> WidgetNode s e)
@ -477,7 +477,7 @@ makeDropdown widgetData items makeMain makeRow config state = widget where
renderAction = widgetRender widget renderer wenv overlayNode
makeListView
:: (DropdownItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, DropdownItem a)
=> WidgetEnv s e
-> WidgetData s a
-> Seq a
@ -502,7 +502,7 @@ makeListView wenv value items makeRow config widgetId = listViewNode where
& L.info . L.style .~ lvStyle
& L.info . L.overlay .~ True
createMoveFocusReq :: WidgetEnv s e -> WidgetRequest s
createMoveFocusReq :: WidgetEnv s e -> WidgetRequest
createMoveFocusReq wenv = MoveFocus Nothing direction where
direction
| wenv ^. L.inputStatus . L.keyMod . L.leftShift = FocusBwd

View File

@ -54,11 +54,11 @@ data InputFieldCfg s e a = InputFieldCfg {
_ifcDragHandler :: Maybe (InputDragHandler a),
_ifcDragCursor :: Maybe CursorIcon,
_ifcOnFocus :: [e],
_ifcOnFocusReq :: [WidgetRequest s],
_ifcOnFocusReq :: [WidgetRequest],
_ifcOnBlur :: [e],
_ifcOnBlurReq :: [WidgetRequest s],
_ifcOnBlurReq :: [WidgetRequest],
_ifcOnChange :: [a -> e],
_ifcOnChangeReq :: [WidgetRequest s]
_ifcOnChangeReq :: [WidgetRequest]
}
data HistoryStep a = HistoryStep {
@ -120,7 +120,7 @@ caretMs :: Int
caretMs = 500
inputField_
:: (InputFieldValue a, WidgetEvent e)
:: (Typeable s, InputFieldValue a, WidgetEvent e)
=> WidgetType
-> InputFieldCfg s e a
-> WidgetNode s e
@ -131,7 +131,7 @@ inputField_ widgetType config = node where
& L.info . L.focusable .~ True
makeInputField
:: (InputFieldValue a, WidgetEvent e)
:: (Typeable s, InputFieldValue a, WidgetEvent e)
=> InputFieldCfg s e a
-> InputFieldState a
-> Widget s e
@ -589,18 +589,18 @@ renderContent renderer state style currText = do
delim :: Char -> Bool
delim c = c == ' ' || c == '.' || c == ','
setModelValid :: InputFieldCfg s e a -> Bool -> [WidgetRequest s]
setModelValid :: Typeable s => InputFieldCfg s e a -> Bool -> [WidgetRequest]
setModelValid config
| isJust (_ifcValid config) = widgetDataSet (fromJust $ _ifcValid config)
| otherwise = const []
genReqsEvents
:: (Eq a)
:: (Typeable s, Eq a)
=> InputFieldCfg s e a
-> InputFieldState a
-> Text
-> [WidgetRequest s]
-> ([WidgetRequest s], [e])
-> [WidgetRequest]
-> ([WidgetRequest], [e])
genReqsEvents config state newText newReqs = result where
resizeOnChange = _ifcResizeOnChange config
fromText = _ifcFromText config
@ -630,7 +630,7 @@ genReqsEvents config state newText newReqs = result where
result = (reqs, events)
moveHistory
:: (InputFieldValue a, WidgetEvent e)
:: (Typeable s, InputFieldValue a, WidgetEvent e)
=> WidgetEnv s e
-> WidgetNode s e
-> InputFieldState a

View File

@ -49,13 +49,13 @@ data ListViewCfg s e a = ListViewCfg {
_lvcItemSelectedStyle :: Maybe Style,
_lvcMergeRequired :: Maybe (Seq a -> Seq a -> Bool),
_lvcOnFocus :: [e],
_lvcOnFocusReq :: [WidgetRequest s],
_lvcOnFocusReq :: [WidgetRequest],
_lvcOnBlur :: [e],
_lvcOnBlurReq :: [WidgetRequest s],
_lvcOnBlurReq :: [WidgetRequest],
_lvcOnChange :: [a -> e],
_lvcOnChangeReq :: [WidgetRequest s],
_lvcOnChangeReq :: [WidgetRequest],
_lvcOnChangeIdx :: [Int -> a -> e],
_lvcOnChangeIdxReq :: [Int -> WidgetRequest s]
_lvcOnChangeIdxReq :: [Int -> WidgetRequest]
}
instance Default (ListViewCfg s e a) where
@ -183,7 +183,7 @@ newtype ListViewMessage
= OnClickMessage Int
listView
:: (Traversable t, ListItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, ListItem a)
=> ALens' s a
-> t a
-> MakeRow s e a
@ -191,7 +191,7 @@ listView
listView field items makeRow = listView_ field items makeRow def
listView_
:: (Traversable t, ListItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, ListItem a)
=> ALens' s a
-> t a
-> MakeRow s e a
@ -201,7 +201,7 @@ listView_ field items makeRow configs = newNode where
newNode = listViewD_ (WidgetLens field) items makeRow configs
listViewV
:: (Traversable t, ListItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, ListItem a)
=> a
-> (Int -> a -> e)
-> t a
@ -211,7 +211,7 @@ listViewV value handler items makeRow = newNode where
newNode = listViewV_ value handler items makeRow def
listViewV_
:: (Traversable t, ListItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, ListItem a)
=> a
-> (Int -> a -> e)
-> t a
@ -224,7 +224,7 @@ listViewV_ value handler items makeRow configs = newNode where
newNode = listViewD_ widgetData items makeRow newConfigs
listViewD_
:: (Traversable t, ListItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, ListItem a)
=> WidgetData s a
-> t a
-> MakeRow s e a
@ -242,7 +242,7 @@ makeNode widget = scroll_ [scrollStyle L.listViewStyle] childNode where
& L.info . L.focusable .~ True
makeListView
:: (ListItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, ListItem a)
=> WidgetData s a
-> Seq a
-> MakeRow s e a
@ -442,7 +442,7 @@ updateStyles
-> WidgetNode s e
-> Int
-> Int
-> (WidgetNode s e, [WidgetRequest s])
-> (WidgetNode s e, [WidgetRequest])
updateStyles wenv config state node newSlIdx newHlIdx = (newNode, newReqs) where
items = node ^. L.children . ix 0 . L.children
slStyle = getSlStyle wenv config

View File

@ -47,11 +47,11 @@ data NumericFieldCfg s e a = NumericFieldCfg {
_nfcResizeOnChange :: Maybe Bool,
_nfcSelectOnFocus :: Maybe Bool,
_nfcOnFocus :: [e],
_nfcOnFocusReq :: [WidgetRequest s],
_nfcOnFocusReq :: [WidgetRequest],
_nfcOnBlur :: [e],
_nfcOnBlurReq :: [WidgetRequest s],
_nfcOnBlurReq :: [WidgetRequest],
_nfcOnChange :: [a -> e],
_nfcOnChangeReq :: [WidgetRequest s]
_nfcOnChangeReq :: [WidgetRequest]
}
instance Default (NumericFieldCfg s e a) where
@ -157,12 +157,12 @@ instance CmbOnChangeReq (NumericFieldCfg s e a) s where
}
numericField
:: (FormattableNumber a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, FormattableNumber a)
=> ALens' s a -> WidgetNode s e
numericField field = numericField_ field def
numericField_
:: (FormattableNumber a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, FormattableNumber a)
=> ALens' s a
-> [NumericFieldCfg s e a]
-> WidgetNode s e
@ -170,12 +170,12 @@ numericField_ field configs = widget where
widget = numericFieldD_ (WidgetLens field) configs
numericFieldV
:: (FormattableNumber a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, FormattableNumber a)
=> a -> (a -> e) -> WidgetNode s e
numericFieldV value handler = numericFieldV_ value handler def
numericFieldV_
:: (FormattableNumber a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, FormattableNumber a)
=> a
-> (a -> e)
-> [NumericFieldCfg s e a]
@ -186,7 +186,7 @@ numericFieldV_ value handler configs = newNode where
newNode = numericFieldD_ widgetData newConfigs
numericFieldD_
:: (FormattableNumber a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, FormattableNumber a)
=> WidgetData s a
-> [NumericFieldCfg s e a]
-> WidgetNode s e

View File

@ -15,6 +15,7 @@ import Control.Monad
import Data.Default
import Data.Maybe
import Data.Text (Text)
import Data.Typeable (Typeable)
import Monomer.Widgets.Single
@ -23,11 +24,11 @@ import qualified Monomer.Lens as L
data RadioCfg s e a = RadioCfg {
_rdcWidth :: Maybe Double,
_rdcOnFocus :: [e],
_rdcOnFocusReq :: [WidgetRequest s],
_rdcOnFocusReq :: [WidgetRequest],
_rdcOnBlur :: [e],
_rdcOnBlurReq :: [WidgetRequest s],
_rdcOnBlurReq :: [WidgetRequest],
_rdcOnChange :: [a -> e],
_rdcOnChangeReq :: [WidgetRequest s]
_rdcOnChangeReq :: [WidgetRequest]
}
instance Default (RadioCfg s e a) where
@ -90,23 +91,23 @@ instance CmbOnChangeReq (RadioCfg s e a) s where
_rdcOnChangeReq = [req]
}
radio :: (Eq a, WidgetEvent e) => ALens' s a -> a -> WidgetNode s e
radio :: (Typeable s, WidgetEvent e, Eq a) => ALens' s a -> a -> WidgetNode s e
radio field option = radio_ field option def
radio_ :: (Eq a, WidgetEvent e) => ALens' s a -> a -> [RadioCfg s e a] -> WidgetNode s e
radio_ :: (Typeable s, WidgetEvent e, Eq a) => ALens' s a -> a -> [RadioCfg s e a] -> WidgetNode s e
radio_ field option configs = radioD_ (WidgetLens field) option configs
radioV :: (Eq a, WidgetEvent e) => a -> (a -> e) -> a -> WidgetNode s e
radioV :: (Typeable s, WidgetEvent e, Eq a) => a -> (a -> e) -> a -> WidgetNode s e
radioV value handler option = radioV_ value handler option def
radioV_ :: (Eq a, WidgetEvent e) => a -> (a -> e) -> a -> [RadioCfg s e a] -> WidgetNode s e
radioV_ :: (Typeable s, WidgetEvent e, Eq a) => a -> (a -> e) -> a -> [RadioCfg s e a] -> WidgetNode s e
radioV_ value handler option configs = newNode where
widgetData = WidgetValue value
newConfigs = onChange handler : configs
newNode = radioD_ widgetData option newConfigs
radioD_
:: (Eq a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Eq a)
=> WidgetData s a
-> a
-> [RadioCfg s e a]
@ -117,7 +118,7 @@ radioD_ widgetData option configs = radioNode where
radioNode = defaultWidgetNode "radio" widget
& L.info . L.focusable .~ True
makeRadio :: (Eq a, WidgetEvent e) => WidgetData s a -> a -> RadioCfg s e a -> Widget s e
makeRadio :: (Typeable s, WidgetEvent e, Eq a) => WidgetData s a -> a -> RadioCfg s e a -> Widget s e
makeRadio field option config = widget where
widget = createSingle () def {
singleGetBaseStyle = getBaseStyle,

View File

@ -14,6 +14,7 @@ module Monomer.Widgets.Singles.TextDropdown (
import Control.Lens (ALens')
import Data.Default
import Data.Text (Text, pack)
import Data.Typeable (Typeable)
import TextShow
import Monomer.Core
@ -24,7 +25,7 @@ import Monomer.Widgets.Singles.Dropdown
type TextDropdownItem a = DropdownItem a
textDropdown
:: (Traversable t, TextDropdownItem a, TextShow a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, TextDropdownItem a, TextShow a)
=> ALens' s a
-> t a
-> WidgetNode s e
@ -32,7 +33,7 @@ textDropdown field items = newNode where
newNode = textDropdown_ field items showt def
textDropdown_
:: (Traversable t, TextDropdownItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, TextDropdownItem a)
=> ALens' s a
-> t a
-> (a -> Text)
@ -42,7 +43,7 @@ textDropdown_ field items toText configs = newNode where
newNode = textDropdownD_ (WidgetLens field) items toText configs
textDropdownV
:: (Traversable t, TextDropdownItem a, TextShow a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, TextDropdownItem a, TextShow a)
=> a
-> (a -> e)
-> t a
@ -51,7 +52,7 @@ textDropdownV value handler items = newNode where
newNode = textDropdownV_ value handler items showt def
textDropdownV_
:: (Traversable t, TextDropdownItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, TextDropdownItem a)
=> a
-> (a -> e)
-> t a
@ -64,7 +65,7 @@ textDropdownV_ value handler items toText configs = newNode where
newNode = textDropdownD_ widgetData items toText newConfigs
textDropdownD_
:: (Traversable t, TextDropdownItem a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, TextDropdownItem a)
=> WidgetData s a
-> t a
-> (a -> Text)
@ -76,7 +77,7 @@ textDropdownD_ widgetData items toText configs = newNode where
newNode = dropdownD_ widgetData items makeMain makeRow configs
textDropdownS
:: (Traversable t, TextDropdownItem a, Show a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, TextDropdownItem a, Show a)
=> ALens' s a
-> t a
-> WidgetNode s e
@ -84,7 +85,7 @@ textDropdownS field items = newNode where
newNode = textDropdownS_ field items def
textDropdownS_
:: (Traversable t, TextDropdownItem a, Show a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, TextDropdownItem a, Show a)
=> ALens' s a
-> t a
-> [DropdownCfg s e a]
@ -93,7 +94,7 @@ textDropdownS_ field items configs = newNode where
newNode = textDropdownDS_ (WidgetLens field) items configs
textDropdownSV
:: (Traversable t, TextDropdownItem a, Show a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, TextDropdownItem a, Show a)
=> a
-> (a -> e)
-> t a
@ -102,7 +103,7 @@ textDropdownSV value handler items = newNode where
newNode = textDropdownSV_ value handler items def
textDropdownSV_
:: (Traversable t, TextDropdownItem a, Show a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, TextDropdownItem a, Show a)
=> a
-> (a -> e)
-> t a
@ -114,7 +115,7 @@ textDropdownSV_ value handler items configs = newNode where
newNode = textDropdownDS_ widgetData items newConfigs
textDropdownDS_
:: (Traversable t, TextDropdownItem a, Show a, WidgetEvent e)
:: (Typeable s, WidgetEvent e, Traversable t, TextDropdownItem a, Show a)
=> WidgetData s a
-> t a
-> [DropdownCfg s e a]

View File

@ -16,6 +16,7 @@ import Control.Lens (ALens')
import Data.Default
import Data.Maybe
import Data.Text (Text)
import Data.Typeable (Typeable)
import qualified Data.Text as T
@ -31,11 +32,11 @@ data TextFieldCfg s e = TextFieldCfg {
_tfcResizeOnChange :: Maybe Bool,
_tfcSelectOnFocus :: Maybe Bool,
_tfcOnFocus :: [e],
_tfcOnFocusReq :: [WidgetRequest s],
_tfcOnFocusReq :: [WidgetRequest],
_tfcOnBlur :: [e],
_tfcOnBlurReq :: [WidgetRequest s],
_tfcOnBlurReq :: [WidgetRequest],
_tfcOnChange :: [Text -> e],
_tfcOnChangeReq :: [WidgetRequest s]
_tfcOnChangeReq :: [WidgetRequest]
}
instance Default (TextFieldCfg s e) where
@ -122,24 +123,35 @@ instance CmbOnChangeReq (TextFieldCfg s e) s where
instance Default Text where
def = T.empty
textField :: WidgetEvent e => ALens' s Text -> WidgetNode s e
textField :: (Typeable s, WidgetEvent e) => ALens' s Text -> WidgetNode s e
textField field = textField_ field def
textField_
:: WidgetEvent e => ALens' s Text -> [TextFieldCfg s e] -> WidgetNode s e
:: (Typeable s, WidgetEvent e)
=> ALens' s Text
-> [TextFieldCfg s e]
-> WidgetNode s e
textField_ field configs = textFieldD_ (WidgetLens field) configs
textFieldV :: WidgetEvent e => Text -> (Text -> e) -> WidgetNode s e
textFieldV
:: (Typeable s, WidgetEvent e) => Text -> (Text -> e) -> WidgetNode s e
textFieldV value handler = textFieldV_ value handler def
textFieldV_
:: WidgetEvent e => Text -> (Text -> e) -> [TextFieldCfg s e] -> WidgetNode s e
:: (Typeable s, WidgetEvent e)
=> Text
-> (Text -> e)
-> [TextFieldCfg s e]
-> WidgetNode s e
textFieldV_ value handler configs = textFieldD_ widgetData newConfig where
widgetData = WidgetValue value
newConfig = onChange handler : configs
textFieldD_
:: WidgetEvent e => WidgetData s Text -> [TextFieldCfg s e] -> WidgetNode s e
:: (Typeable s, WidgetEvent e)
=> WidgetData s Text
-> [TextFieldCfg s e]
-> WidgetNode s e
textFieldD_ widgetData configs = inputField where
config = mconcat configs
fromText = textToText (_tfcMaxLength config)

View File

@ -100,7 +100,7 @@ isNodeBeforePath path node = result where
handleFocusChange
:: Typeable e
=> (c -> [e])
-> (c -> [WidgetRequest s])
-> (c -> [WidgetRequest])
-> c
-> WidgetNode s e
-> Maybe (WidgetResult s e)

View File

@ -97,7 +97,7 @@ widgetDataGet :: s -> WidgetData s a -> a
widgetDataGet _ (WidgetValue value) = value
widgetDataGet model (WidgetLens lens) = model ^# lens
widgetDataSet :: WidgetData s a -> a -> [WidgetRequest s]
widgetDataSet :: Typeable s => WidgetData s a -> a -> [WidgetRequest]
widgetDataSet WidgetValue{} _ = []
widgetDataSet (WidgetLens lens) value = [UpdateModel updateFn] where
updateFn model = model & lens #~ value
@ -109,12 +109,12 @@ resultEvts :: Typeable e => WidgetNode s e -> [e] -> WidgetResult s e
resultEvts node events = result where
result = WidgetResult node (Seq.fromList $ RaiseEvent <$> events)
resultReqs :: WidgetNode s e -> [WidgetRequest s] -> WidgetResult s e
resultReqs :: WidgetNode s e -> [WidgetRequest] -> WidgetResult s e
resultReqs node requests = result where
result = WidgetResult node (Seq.fromList requests)
resultReqsEvts
:: Typeable e => WidgetNode s e -> [WidgetRequest s] -> [e] -> WidgetResult s e
:: Typeable e => WidgetNode s e -> [WidgetRequest] -> [e] -> WidgetResult s e
resultReqsEvts node requests events = result where
result = WidgetResult node (Seq.fromList requests <> evtSeq)
evtSeq = Seq.fromList $ RaiseEvent <$> events
@ -163,7 +163,7 @@ findWidgetIdFromPath :: WidgetEnv s e -> Path -> Maybe WidgetId
findWidgetIdFromPath wenv path = mwni ^? _Just . L.widgetId where
mwni = wenv ^. L.findByPath $ path
delayedMessage :: Typeable i => WidgetNode s e -> i -> Int -> WidgetRequest s
delayedMessage :: Typeable i => WidgetNode s e -> i -> Int -> WidgetRequest
delayedMessage node msg delay = RunTask widgetId path $ do
threadDelay (delay * 1000)
return msg