module System.Taffybar.Widget.XDGMenu.MenuWidget
(
menuWidgetNew
)
where
import Control.Monad
import Control.Monad.IO.Class
import qualified Data.Text as T
import GI.Gtk hiding (Menu, imageMenuItemNew)
import System.Log.Logger
import System.Process
import System.Taffybar.Widget.Generic.AutoSizeImage
import System.Taffybar.Widget.Util
import System.Taffybar.Widget.XDGMenu.Menu
logHere :: Priority -> String -> IO ()
logHere :: Priority -> String -> IO ()
logHere = String -> Priority -> String -> IO ()
logM String
"System.Taffybar.Widget.XDGMenu.MenuWidget"
addItem :: (IsMenuShell msc) =>
msc
-> MenuEntry
-> IO ()
addItem :: forall msc. IsMenuShell msc => msc -> MenuEntry -> IO ()
addItem msc
ms MenuEntry
de = do
item <- Text -> (Int32 -> IO (Maybe Pixbuf)) -> IO MenuItem
forall (m :: * -> *).
MonadIO m =>
Text -> (Int32 -> IO (Maybe Pixbuf)) -> m MenuItem
imageMenuItemNew (MenuEntry -> Text
feName MenuEntry
de) (Maybe Text -> Int32 -> IO (Maybe Pixbuf)
getImageForMaybeIconName (MenuEntry -> Maybe Text
feIcon MenuEntry
de))
setWidgetTooltipText item (feComment de)
menuShellAppend ms item
_ <- onMenuItemActivate item $ do
let cmd = MenuEntry -> String
feCommand MenuEntry
de
logHere DEBUG $ "Launching '" ++ cmd ++ "'"
_ <- spawnCommand cmd
return ()
return ()
addMenu
:: (IsMenuShell msc)
=> msc
-> Menu
-> IO ()
msc
ms Menu
fm = do
let subMenus :: [Menu]
subMenus = Menu -> [Menu]
fmSubmenus Menu
fm
items :: [MenuEntry]
items = Menu -> [MenuEntry]
fmEntries Menu
fm
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not ([MenuEntry] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [MenuEntry]
items) Bool -> Bool -> Bool
|| Bool -> Bool
not ([Menu] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Menu]
subMenus)) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
item <- Text -> (Int32 -> IO (Maybe Pixbuf)) -> IO MenuItem
forall (m :: * -> *).
MonadIO m =>
Text -> (Int32 -> IO (Maybe Pixbuf)) -> m MenuItem
imageMenuItemNew (String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Menu -> String
fmName Menu
fm)
(Maybe Text -> Int32 -> IO (Maybe Pixbuf)
getImageForMaybeIconName (String -> Text
T.pack (String -> Text) -> Maybe String -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Menu -> Maybe String
fmIcon Menu
fm))
menuShellAppend ms item
subMenu <- menuNew
menuItemSetSubmenu item (Just subMenu)
mapM_ (addMenu subMenu) subMenus
mapM_ (addItem subMenu) items
menuWidgetNew
:: MonadIO m
=> Maybe String
-> m GI.Gtk.Widget
Maybe String
mMenuPrefix = IO Widget -> m Widget
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Widget -> m Widget) -> IO Widget -> m Widget
forall a b. (a -> b) -> a -> b
$ do
mb <- IO MenuBar
forall (m :: * -> *). (HasCallStack, MonadIO m) => m MenuBar
menuBarNew
m <- buildMenu mMenuPrefix
addMenu mb m
widgetShowAll mb
toWidget mb