From 377bff811906a7d5eb2b587370b8c97a77c7f562 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Fri, 21 Aug 2015 15:13:43 +0200 Subject: Tut 10.4.3 Reading the counter --- tut10_4_3.icl | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 tut10_4_3.icl diff --git a/tut10_4_3.icl b/tut10_4_3.icl new file mode 100644 index 0000000..61c957c --- /dev/null +++ b/tut10_4_3.icl @@ -0,0 +1,58 @@ +module tut10_4_3 + +// ******************************************************************************** +// Clean tutorial example program. +// +// This program defines a Controls component that implements a manually settable +// counter. +// A bi-directional receiver is added to give external access to the counter value. +// ******************************************************************************** + +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 + # (readId, pst) = accPIO openR2Id pst + # (error, pst) = openDialog Void (dialog displayId resetId readId) pst + | error <> NoError = abort "Counter could not open counter dialog." + # (displayId, pst) = accPIO openId pst + # (error, pst) = openDialog Void (display displayId readId) pst + | error <> NoError = abort "Counter could not open display dialog." + | otherwise = pst + +dialog displayId resetId readId = 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 [] :+: + Receiver2 readId read []) + [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) + + read :: m (Int, PSt .l) -> (Int, (Int, PSt .l)) + read _ (count, pst) = (count, (count, pst)) + + resetButton = ButtonControl "Reset" [ControlFunction (noLS (snd o syncSend resetId undef)), ControlPos (Center, zero)] + +display displayId readId = Dialog "Read" (EditControl "" (PixelWidth (hmm 50.0)) 1 [ControlId displayId, ControlSelectState Unable] :+: + ButtonControl "Read" [ControlFunction (noLS read), ControlPos (Center, zero)]) + [WindowClose (noLS closeProcess)] +where + read pst + # ((error, value), pst) = syncSend2 readId undef pst + | error <> SendOk = abort "Could not read counter value" + | otherwise = appPIO (setControlText displayId (toString (fromJust value))) pst + -- cgit v1.2.3