Спасибо большое за ссылку, помогло, но осталась одна проблема: окно не перерисовывается сразу после того как я черчу линию(чтоб картинка «проявилось», требуется свернуть-развернуть окно). Как это исправить?
-- advance all the balls to their next position
nextBalls :: Var [[Point]] -> Panel () -> IO ()
nextBalls vballs p
= do varUpdate vballs (filter (not.null) . map (drop 1))
repaint p
import Graphics.UI.WX
import Graphics.UI.WXCore
main = start gui
gui = do
frm <- frame [text := "Window!!!", size := sz 500 500]
vLines <- varCreate [(pt 0 0,pt 100 100)] -- Список линий
vState <- varCreate (False,pt 0 0) -- (Чертим или запоминаем координаты, координаты последнего клика)
panl <- panel frm [size := sz 500 500,
on paint := paintFig vLines]
set panl [on click := clickReaction vLines vState] -- Реакция на мышку
return()
paintFig vLines dc viewArea =
do
lines <- varGet vLines
set dc [brushColor := black, brushKind := BrushSolid]
mapM_ (\(x,y) -> line dc x y []) lines
clickReaction vLines vState p = -- p :: Point
do
(reactType,prevPoint) <- varGet vState -- Получаем тип клика и координаты прошлого
if (reactType) then oneMore prevPoint
else switchState
where
oneMore p0 = do
l <- varGet vLines
varSet vLines ((p0,p):l)
varSet vState (False,p)
switchState = do
varSet vState (True,p)
когда гуй маленький - дак пофиг на чем писать.
но при использовании реактивного программирования - получаем много преимуществ, а именно - может отследить: какие состояния и события - от каких зависят.
а при императивном программировании - с разделенными лиснерами, событиями и переменными - трудно понять, на что данная переменная влияет, и кто ее может изменить.