Well, I think I will be the first to find the answer to my question :)
(1) First of all, the example http://www.muitovar.com/gtk2hs/chap7-2.html did not work for me, because you have two eventButton functions in gtk2hs and you have to use one of Graphics.UI.Gtk.Gdk.Events . Therefore, you need to add at the beginning of the file:
import Graphics.UI.Gtk.Gdk.Events as Ev
and then add the prefix Ev. to eventButton , RightButton and eventSent . Now it will work :)
(2) How to respond to right-clicks on a treeView row:
Solving the above problem, I came across this example where it showed how to respond to row selection in treeView. So I mixed these two solutions and came up with something like this (most of the code comes from the treeview example with some of my tricks):
module Main where {- an example how to select from a list not satisfactory yet: - there should be a simpler way to render a simple list - i could not convert the model i got back to a list from which to get the value - the interface offers a great number of functions and it is very difficult to find which ones are really needed for simple tasks -} import Graphics.UI.Gtk import Graphics.UI.Gtk.ModelView as Model import Graphics.UI.Gtk.Gdk.Events as Ev main :: IO () main = do initGUI -- is start window <- windowNew list <- listStoreNew ["Vince", "Jhen", "Chris", "Sharon"] treeview <- Model.treeViewNewWithModel list Model.treeViewSetHeadersVisible treeview True -- there should be a simpler way to render a list as the following! col <- Model.treeViewColumnNew Model.treeViewColumnSetTitle col "colTitle" renderer <- Model.cellRendererTextNew Model.cellLayoutPackStart col renderer False Model.cellLayoutSetAttributes col renderer list $ \ind -> [Model.cellText := ind] Model.treeViewAppendColumn treeview col --tree <- Model.treeViewGetSelection treeview --Model.treeSelectionSetMode tree SelectionSingle --Model.onSelectionChanged tree (oneSelection list tree) set window [ windowDefaultWidth := 100 , windowDefaultHeight := 200 , containerChild := treeview ] -- here comes the right-click popup 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" onButtonPress treeview (\x -> if (Ev.eventButton x) == Ev.RightButton then do menuPopup (castToMenu pop) Nothing return (Ev.eventSent x) else return (Ev.eventSent x)) mapM_ (prAct treeview list) [eda,pra,rma,saa] onDestroy window mainQuit widgetShowAll window mainGUI return () uiDecl = "<ui> \ \ <popup>\ \ <menuitem action=\"EDA\" />\ \ <menuitem action=\"PRA\" />\ \ <menuitem action=\"RMA\" />\ \ <separator />\ \ <menuitem action=\"SAA\" />\ \ </popup>\ \ </ui>" -- Handle the right-click. You can write a function that'll respond to various -- actions, like for example: handleAction "EDA" = do something, etc. prAct treeview list a = onActionActivate a $ do name <- actionGetName a -- getting the selected row tree <- Model.treeViewGetSelection treeview -- you can also use treeSelectionGetSelected to get the Iter object -- and then convert it to Int by using listStoreIterToIndex and so get -- the ListStore item at given index sel <- Model.treeSelectionGetSelectedRows tree let s = head (head sel) v <- Model.listStoreGetValue list s putStrLn ("Action Name: " ++ name ++ " | Item: " ++ v)
I hope this will be useful for someone :)
Greetings
source share