2

私の作図ツールでは、コア モデルのコードを GUI から切り離したいと考えています。

次の例では、「状態」は で渡されvDiagますTvar。これは wx の設計上の決定です。ここで、私の作図ツールでは、コア モデルをfglグラフに "格納" し (複雑な型を含む)、wxビューのみを与えたいと考えています。この例では、ペイント時の読み取りアクセス用のポイントのリストと、クリック、ドラッグなどの際に書き込むいくつかの関数を言います.. 最初に Monad スタックをいくつか考えましたが、StateT と wx の IO を組み合わせることさえ簡単ではないように見えます。これは、io アクションがコールバックのコード全体に広がっているためです (クリック時、ペイント時など)。スタックの一番下に IO を配置するのがうまくいかなくなったように感じます。

それで、どのようにSTateを渡すのですか、それとも行く方法ではありませんか?(私は直感的にこれは古典的です。RFP はどのように始まったのでしょうか?)

(クリックすると赤い円を描くコードでは、ポイントのリストが で渡されTvar vDiagます。同等の状態アクセサーが移動する場所に「--fgl」をタグ付けし、基本的な fgl テスト グラフ アクセサーを設定します。 State に入れたいと思います) (元々、問題を理解するために 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
4

0 に答える 0