2015-01-25 4 views
1

Ниже представлена ​​программа Haskell, которая запускает ноутбук wxHaskell.Как получить новый выбранный индекс страницы на ноутбуке, изменив страницу с помощью wxHaskell?

Это работает, за исключением того, что я не могу справиться с событием смены страницы, чтобы получить индекс нулевой выбранной. Вместо этого я получаю предыдущий (см. Комментарий «ПРОБЛЕМА» в приведенном ниже коде).

Предупреждение об этом в C wxNotebook Class Reference documentation (см. Раздел о getSelection), а также в разделе «Подробное описание» wxBookCtrlEvent Class Reference documetnation, но я не понимаю, как его использовать.

Может ли кто-нибудь, пожалуйста, показать мне какой-нибудь рабочий код для ноутбука, где вы получаете новый индекс страницы, когда пользователь выбирает новую страницу (нажав на заголовок)?

Второй вопрос: я не понимаю, что аргумент 0 находится рядом с - ???.

Спасибо заранее!

module Main where 

import Graphics.UI.WX 
import Graphics.UI.WXCore 

main :: IO() 
main = 
    start $ 
    do 

    f <- frame [] 
    nbk <- notebook f [] 

    pages <- sequence [ do 
         p <- panel nbk [] 
         return $ tab ("Page "++show i) (container p $ label ("Page " ++ show i)) 
        | i <- [0..3]] 

    set f [layout := fill $ tabs nbk pages,clientSize := sz 300 100] 



    let h event = case event of 
        wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED -> 
         do 
         i <- notebookGetSelection nbk -- PROBLEM: gives the OLD index 
         infoDialog f "Event otification" $ "Notebook selected page: " ++ show i 
         propagateEvent 

    windowOnEvent nbk 
        [wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED] 
        0 -- ??? 
        h 

ответ

1

Этот странный код работает для меня. Я нашел его в японском (?) Блоге. К сожалению, у меня больше нет ссылки.

import Graphics.UI.WX 
import Graphics.UI.WXCore 

import Foreign.Marshal.Alloc 
import Foreign.Storable 
import Foreign.Ptr 
import Foreign.C.Types 

import System.IO.Unsafe 

main :: IO() 
main = start gui 

gui :: IO() 
gui = do 
    f <- frame [] 
    nb <- notebook f [] 
    p1 <- panel nb [] 
    b1 <- button p1 [text := "*"] 
    p2 <- panel nb [] 
    b2 <- button p2 [text := "!"] 

    set nb [on click := (\pt -> onMouse nb pt >>= print)] 
    set f [ layout := tabs nb [ tab "p1" $ container p1 $ widget b1 
           , tab "p2" $ container p2 $ widget b2]] 


onMouse :: Notebook() -> Point -> IO Int 
onMouse nb p = propagateEvent >> notebookHitTest nb p flag 


{-# NOINLINE flag #-} 
flag :: Ptr CInt 
flag = unsafePerformIO flag' 
    where flag' = do 
      work <- malloc::IO (Ptr CInt) 
      poke work (fromIntegral wxBK_HITTEST_ONPAGE) 
      return work