module tut10_4_2 // ******************************************************************************** // Clean tutorial example program. // // This program defines a Controls component that implements a manually settable // counter. A receiver is used to add a reset option. // ******************************************************************************** import StdEnv, StdIO Start :: *World -> *World Start world = startIO NDI Void initialise [] world where initialise pst # (displayId, pst) = accPIO openId pst # (resetId, pst) = accPIO openRId pst # (error, pst) = openDialog Void (dialog displayId resetId) pst | error <> NoError = abort "Counter could not open Dialog." | otherwise = pst dialog displayId resetId = Dialog "Counter" (counter :+: resetButton) [WindowClose (noLS closeProcess)] where counter = { newLS = initcount, newDef = LayoutControl (EditControl (toString initcount) (PixelWidth (hmm 50.0)) 1 [ControlId displayId, ControlSelectState Unable] :+: ButtonControl "-" [ControlFunction (count(-1)), ControlWidth (PixelWidth (hmm 25.0)), ControlPos (BelowPrev, zero)] :+: ButtonControl "+" [ControlFunction (count 1 ), ControlWidth (PixelWidth (hmm 25.0))] :+: Receiver resetId reset []) [ControlPos (Center, zero), ControlHMargin 0 0, ControlVMargin 0 0, ControlItemSpace 0 0] } where initcount = 0 count :: Int (Int, PSt .l) -> (Int, PSt .l) count dx (count, pst) = (count + dx, appPIO (setControlText displayId (toString (count+dx))) pst) reset :: m (Int, PSt .l) -> (Int, PSt .l) reset _ (_, pst) = (initcount, appPIO (setControlText displayId (toString initcount)) pst) resetButton = ButtonControl "Reset" [ControlFunction (noLS (snd o syncSend resetId undef)), ControlPos (Center, zero)]