module System.Taffybar.Widget.Generic.DynamicMenu where
import Control.Monad.IO.Class
import qualified GI.Gtk as Gtk
data =
{ DynamicMenuConfig -> Widget
dmClickWidget :: Gtk.Widget
, :: Gtk.Menu -> IO ()
}
dynamicMenuNew :: MonadIO m => DynamicMenuConfig -> m Gtk.Widget
DynamicMenuConfig
{ dmClickWidget :: DynamicMenuConfig -> Widget
dmClickWidget = Widget
clickWidget
, dmPopulateMenu :: DynamicMenuConfig -> Menu -> IO ()
dmPopulateMenu = Menu -> IO ()
populateMenu
} = do
button <- m MenuButton
forall (m :: * -> *). (HasCallStack, MonadIO m) => m MenuButton
Gtk.menuButtonNew
menu <- Gtk.menuNew
Gtk.containerAdd button clickWidget
Gtk.menuButtonSetPopup button $ Just menu
_ <- Gtk.onButtonPressed button $ emptyMenu menu >> populateMenu menu
Gtk.widgetShowAll button
Gtk.toWidget button
emptyMenu :: (Gtk.IsContainer a, MonadIO m) => a -> m ()
a
menu =
a -> Callback -> m ()
forall (m :: * -> *) a.
(HasCallStack, MonadIO m, IsContainer a) =>
a -> Callback -> m ()
Gtk.containerForeach a
menu (Callback -> m ()) -> Callback -> m ()
forall a b. (a -> b) -> a -> b
$ \Widget
item ->
a -> Callback
forall (m :: * -> *) a b.
(HasCallStack, MonadIO m, IsContainer a, IsWidget b) =>
a -> b -> m ()
Gtk.containerRemove a
menu Widget
item IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Callback
forall (m :: * -> *) a.
(HasCallStack, MonadIO m, IsWidget a) =>
a -> m ()
Gtk.widgetDestroy Widget
item