2016-03-30 14 views
2

ポップアップGTK Menuを作成し、MenuItemsを追加したいとします。私はこれを見つけたbit of sample code for popup menusしかしそれはbitrottedだった。固定バージョンは以下の通りです。コメント "これは動作しないビットです!"を探してください。Gtk2hsのメニューにMenuItemを追加する

問題は、メニューが表示されているときに追加したMenuItemが表示されないことです。 UIマネージャで作成されたアクション項目はありますが、手動で作成した「テスト」項目はありません。

いくつかのステップがありますか?それとも私はこれについて間違った方法をとっていますか?

import Control.Monad.IO.Class 
import Graphics.UI.Gtk 


main :: IO() 
main= do 
    initGUI 
    window <- windowNew 
    set window [windowTitle := "Click Right Popup", 
       windowDefaultWidth := 250, 
       windowDefaultHeight := 150 ] 

    eda <- actionNew "EDA" "Edit" Nothing Nothing 
    pra <- actionNew "PRA" "Process" Nothing Nothing 
    rma <- actionNew "RMA" "Remove" Nothing Nothing 
    saa <- actionNew "SAA" "Save" Nothing Nothing 

    agr <- actionGroupNew "AGR1" 
    mapM_ (actionGroupAddAction agr) [eda,pra,rma,saa] 

    uiman <- uiManagerNew 
    uiManagerAddUiFromString uiman uiDecl 
    uiManagerInsertActionGroup uiman agr 0 

    maybePopup <- uiManagerGetWidget uiman "/ui/popup" 
    let pop = case maybePopup of 
        (Just x) -> x 
        Nothing -> error "Cannot get popup from string" 

    window `on` buttonPressEvent $ do 
     b <- eventButton 
     if b == RightButton 
      then do 
       liftIO $ menuPopup (castToMenu pop) Nothing 
       return True 
      else return True 


    -- This is the bit that doesn't work! 
    testItem <- menuItemNewWithLabel "Test" 
    testItem `on` menuItemActivated $ putStrLn "Test clicked" 
    menuShellAppend (castToMenu pop) testItem 

    mapM_ prAct [eda,pra,rma,saa] 

    widgetShowAll window 
    window `on` objectDestroy $ mainQuit 
    mainGUI 

uiDecl = "<ui> \ 
\   <popup>\ 
\   <menuitem action=\"EDA\" />\ 
\   <menuitem action=\"PRA\" />\ 
\   <menuitem action=\"RMA\" />\ 
\   <separator />\ 
\   <menuitem action=\"SAA\" />\ 
\   </popup>\ 
\  </ui>" 

prAct :: ActionClass self => self -> IO (ConnectId self) 
prAct a = a `on` actionActivated $ do 
    name <- actionGetName a 
    putStrLn ("Action Name: " ++ name) 

答えて

1

私はそれを理解しました。私は新しいメニュー項目で "widgetShow"を呼び出す必要があります。

 testItem <- menuItemNewWithLabel "Test" 
    widgetShow testItem 
    testItem `on` menuItemActivated $ putStrLn "Test clicked" 
    menuShellAppend (castToMenu pop) testItem 
関連する問題