「パネル」をクリックした後、「statusField」を更新する方法についていくつかアドバイスをします。wxhaskell:パネルの「クリック」を使ってstatusFieldを更新する
次のプログラムは、この問題を示しています。プログラムは2つの フレームを描画します。左のフレームが何らかの描画領域 であり、右のフレームに「赤」と「緑」のボタンがあると想像できます。 「赤色」と表示されたボタンをクリックすると、statusFieldのテキストが が「現在の色:赤色」に更新されます。 「緑色」というラベルの付いたボタンは、テキストを「現在の色:緑色」に更新します。
ユーザーが左パネルの をクリックした後にstatusFieldのテキストを変更するにはどうすればよいですか?例えば。 「 描画パネルを正常にクリックしました」に変更します。
ボタンの「オンコマンド」と同じ方法で、「オンクリック」で行うことができないのはなぜですか? (下記の注釈を参照してください。)
ありがとうございました。
module Main where
import Graphics.UI.WX
-- | NOP (= No Operation)
data Command = Nop
| Red
| Green
deriving (Eq)
main :: IO()
main
= start hello
hello :: IO()
hello
= do currentCommand <- varCreate $ Nop -- current command performed on next click on "pDrawingarea"
status <- statusField [text := "Welcome."]
-- Frames and Panels
f <- frame [ text := "Demo"
, bgcolor := lightgrey ]
pButtons <- panel f [ bgcolor := lightgrey]
pDrawingarea <- panel f [ on paint := draw
, bgcolor := lightgrey
]
set pDrawingarea [on click := do drawingAreaOnClick status currentCommand pDrawingarea
-- set status [text := "User clicked on the panel."]
-- Problem: uncommenting the line above shows the problem
]
bRed <- button pButtons [text := "Red", on command := do varSet currentCommand Red
set status [text := "Current color: Red"]
]
bGreen <- button pButtons [text := "Green", on command := do varSet currentCommand Green
set status [text := "Current color: Green"]
]
set pButtons [ layout := column 1 [ hstretch.expand $ widget bRed
, hstretch.expand $ widget bGreen
]
]
set f [ statusBar := [status]
, layout := row 3 [
minsize (sz 600 500) $ stretch.expand $ widget pDrawingarea
, vstretch.expand $ rule 3 500
, minsize (sz 200 500) $ vstretch.expand $ widget pButtons
]
]
return()
draw :: DC a -> Rect -> IO()
draw dc viewArea
= do putStrLn "Imagine some code to repaint the screen."
drawingAreaOnClick :: statusField -> Var Command -> Panel() -> Point -> IO()
drawingAreaOnClick sf command panel pt
= do c <- varGet command
case c of
Red -> do putStrLn "Imagine some code to do red painting"
Green -> do putStrLn "Imagine some code to do green painting"