[Fencommits] fenfire-hs: refactor menu-creating code

Benja Fallenstein benja.fallenstein at gmail.com
Sat Feb 17 22:47:19 EET 2007


Sat Feb 17 22:47:08 EET 2007  Benja Fallenstein <benja.fallenstein at gmail.com>
  * refactor menu-creating code
diff -rN -u old-fenfire-hs/Fenfire.fhs new-fenfire-hs/Fenfire.fhs
--- old-fenfire-hs/Fenfire.fhs	2007-02-17 22:47:18.000000000 +0200
+++ new-fenfire-hs/Fenfire.fhs	2007-02-17 22:47:18.000000000 +0200
@@ -41,7 +41,7 @@
 import Data.Monoid(Monoid(mempty, mconcat), Dual(Dual), getDual)
 
 import Control.Applicative
-import Control.Monad (when, guard, msum)
+import Control.Monad (when, guard, msum, liftM)
 import Control.Monad.Reader (ReaderT, runReaderT, local, ask, asks)
 import Control.Monad.State (StateT, get, gets, modify, put, execStateT)
 import Control.Monad.Trans (lift, liftIO)
@@ -597,35 +597,26 @@
         actionGroupAddActionWithAccel actionGroup action accel
         actionSetAccelGroup action bindings
 
-makeMenus actionGroup root = mapM_ (createMenu root) menuentries
-    where
-        leaf x = Tree.Node x []
-        menuentries = [ Tree.Node "_File" (map leaf ["new","open","loadURI","",
-                                                     "save","saveas","revert",
-                                                     "",
-                                                     "quit"])
-                      , Tree.Node "_Edit" (map leaf ["noder","nodel","",
-                                                     "breakr","breakl","",
-                                                     "mark","connr","connl","",
-                                                     "rmlit"])
-                      , Tree.Node "_View" (map (leaf . fst) ?views)
-                      , Tree.Node "_Help" (map leaf ["about"])
-                      ]
-        createMenu :: MenuShellClass menu => menu -> Tree.Tree String -> IO ()
-        createMenu parent (Tree.Node name children) = 
-            if children /= [] then do
-                item <- menuItemNewWithMnemonic name
-                menu <- menuNew
-                mapM_ (createMenu menu) children
-                menuItemSetSubmenu item menu
-                menuShellAppend parent item
-            else if name == "" then do
-                item <- separatorMenuItemNew
-                menuShellAppend parent item
-            else do 
-                Just action <- actionGroupGetAction actionGroup name
+makeMenus actionGroup root = addAll root menu where
+    menu = [m "_File" [a "new", a "open", a "loadURI", sep,
+                       a "save", a "saveas", a "revert", sep,
+                       a "quit"],
+            m "_Edit" [a "noder", a "nodel", sep,
+                       a "breakr", a "breakl", sep,
+                       a "mark", a "connr", a "connl", sep, a "rmlit"],
+            m "_View" (map (a . fst) ?views),
+            m "_Help" [a "about"]]
+    addAll parent items = mapM_ (menuShellAppend parent) =<< sequence items
+    m :: String -> [IO MenuItem] -> IO MenuItem
+    m name children = do item <- menuItemNewWithMnemonic name
+                         menu' <- menuNew
+                         addAll menu' children
+                         menuItemSetSubmenu item menu'
+                         return item
+    sep = liftM castToMenuItem separatorMenuItemNew
+    a name = do Just action <- actionGroupGetAction actionGroup name
                 item <- actionCreateMenuItem action
-                menuShellAppend parent (castToMenuItem item)
+                return (castToMenuItem item)
 
 makeToolbarItems actionGroup toolbar = do
     forM_ ["new", "open", "", "save"] $ \name -> 




More information about the Fencommits mailing list