Переключение между обработчиками событий в gtk2hs - PullRequest
2 голосов
/ 24 февраля 2011

Я хотел бы сделать что-то вроде этого:

handlerOn = do
  cid <- canvas `on` buttonPressEvent $ tryEvent do
    signalDisconnect cid
    handlerOff
  putStrLn "handlerOn"

handlerOff = do
  cid <- canvas `on` buttonPressEvent $ tryEvent do
    signalDisconnect cid
    handlerOn
  putStrLn "handlerOff"

Это, конечно, не будет работать, потому что я пытаюсь использовать cid внутри блока кода, где cid не назначенпока что.

Идея состоит в том, чтобы зарегистрировать прослушиватель событий, который при получении события отменяет регистрацию и регистрирует другого прослушивателя событий, который будет делать то же самое, туда и обратно.

1 Ответ

5 голосов
/ 25 февраля 2011

GHC поддерживает рекурсив do.

handlerOn = do
  rec cid <- canvas `on` buttonPressEvent $ tryEvent do
    signalDisconnect cid
    handlerOff
  putStrLn "handlerOn"

Вы также можете использовать Control.Monad.Fix.

handlerOff = do
  mfix $ \cid -> canvas `on` buttonPressEvent $ tryEvent do
    signalDisconnect cid
    handlerOn
  putStrLn "handlerOff"

Или управляйте обработчиком самостоятельно.

do ...
    h <- newIORef undefined
    let handlerOn = do
            ...
            writeIORef h handlerOff
        handlerOff = do
            ...
            writeIORef h handlerOn
    writeIORef h handlerOn
    canvas `on` buttonPressEvent $ tryEvent =<< readIORef h

Или просто превратить все в один обработчик.

do ...
    ms <- newIORef False
    canvas `on` buttonPressEvent $ tryEvent do
        s <- readIORef ms
        if s
            then ...
            else ...
...