Разделение состояния для модели и графического интерфейса ввода-вывода ( Wx): стек или FRP?

Для моего инструмента построения диаграмм я хотел бы сохранить код основной модели изолированным от GUI.

В следующем примере "состояние" передается с vDiag, который является Tvar, Это дизайнерское решение в WX. Теперь, для моего инструмента построения диаграмм, я бы хотел, чтобы основная модель была "сохранена" в fgl График (со сложными типами в нем) и wx будет дан только взгляд на это; скажем, в этом примере, список точек для доступа для чтения при рисовании и некоторые функции для записи при нажатии, перетаскивании и т. д. Сначала я подумал о некотором стеке Monad, но даже объединение StateT и IO из wx не выглядит тривиальным, потому что действия io распространяются повсюду в коде обратного вызова (при нажатии, при рисовании… и т. Д.). Такое ощущение, что IO в нижней части стека больше не подходит.

так как вы передаете состояние вокруг, или это не путь? (Интуиция, это классика. Так начался RFP?)

(В коде, который рисует красный круг при щелчке, список точек передается в виде TvarvDiag, Я пометил "--fgl", где эквивалентный метод доступа к состоянию будет идти. и установить базовые средства доступа к графу тестов fgl для иллюстрации. Я хотел бы поставить в состояние) (я изначально пытался попробовать без FRP - реактивный банан, чтобы понять проблему, но я думаю, что, возможно, уже ударил его;-)

module Main where

import Graphics.UI.WX hiding (empty)
import Data.Graph.Inductive

main
  = start ballsFrame 

ballsFrame
  = do 


  vDiag  <- varCreate [] 
  --gDiag  <- initg -- fgl
  frame  <- frame    [text := "Demo"]
  p <- panel frame []
  file   <- menuPane [text := "&File"]
  quit   <- menuQuit file [on command := close frame]

  set frame [text:= "testing", menuBar := [file] ]
  set p [on click := drawBins vDiag p , on paint := paintDiag vDiag ] 
                -- fgl pass the var around
  return ()  
    where
    drawBins  d ppanel pt = 
                do varUpdate d  (pt:) 
                    -- addpoint f g -- fgl : insert a point
                   repaint ppanel


    -- paint the balls
    paintDiag vdiag dc view
      = do  balls <- varGet vdiag  -- getPointsFromGraph 
        -- fgl : change to get the list of points
            set dc [brushColor := red, brushKind := BrushSolid] 
            mapM_ (drawDiag dc)  balls

    drawDiag dc pt
      = circle dc pt 10 []

-- basic fgl test graph accessors  I would like to put in a State and replace vDiag

initg:: Gr Point  String
initg = mkGraph [(1,pt 10 10),(2,pt 30 30)] [(1,2,"truc"), (2,1,"revtruc")]

getPointsFromGraph :: Graph gr => gr b b1 -> [b]
getPointsFromGraph g = map snd $ labNodes g
-- getPointsFromGraph initg = [Point {pointX = 10, pointY = 10},Point {pointX = 30, pointY = 30}]

addpoint :: DynGraph gr => a -> gr a b -> gr a b
addpoint p g = -- add a point p into graph p
               insNode (4,p) g

0 ответов

Другие вопросы по тегам