module Casui.Menu where import Graphics.UI.Gtk import Control.Monad populateMenu :: MenuShellClass a => a -> [SimpleMenu] -> IO () populateMenu shell = mapM_ ((menuShellAppend shell =<<) . buildMenu) buildMenu (LeafM name action) = do item <- menuItemNewWithLabel name onActivateLeaf item action return item buildMenu SeperatorM = fmap castToMenuItem separatorMenuItemNew buildMenu (MenuM name children) = do item <- menuItemNewWithLabel name menu <- menuNew menuItemSetSubmenu item menu populateMenu menu children return item buildMenu (DynM name mchildren) = do item <- menuItemNewWithLabel name menu <- menuNew menuItemSetSubmenu item menu onSelect item $ do children <- mchildren when (genMenuValue children) $ do mapM_ (containerRemove menu) =<< containerGetChildren menu populateMenu menu $ genMenuItems children widgetShowAll menu return item data SimpleMenu = LeafM String (IO ()) | SeperatorM | MenuM String [SimpleMenu] | DynM String (IO (GenMenu Bool)) data GenMenu a = GenMenu { genMenuItems :: [SimpleMenu], genMenuValue :: a } instance Monad GenMenu where return = GenMenu [] GenMenu l a >>= f = case f a of GenMenu k b -> GenMenu (l++k) b seperator = GenMenu [SeperatorM] () leaf a b = GenMenu [LeafM a b] () submenu a s = GenMenu [MenuM a $ genMenuItems s] () dynamicMenu a s = GenMenu [DynM a s] ()