module System.Taffybar.Widget.Generic.DynamicMenu where import Control.Monad.IO.Class import qualified GI.Gtk as Gtk data DynamicMenuConfig = DynamicMenuConfig { dmClickWidget :: Gtk.Widget , dmPopulateMenu :: Gtk.Menu -> IO () } dynamicMenuNew :: MonadIO m => DynamicMenuConfig -> m Gtk.Widget dynamicMenuNew DynamicMenuConfig { dmClickWidget = clickWidget , dmPopulateMenu = populateMenu } = do button <- 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 () emptyMenu menu = Gtk.containerForeach menu $ \item -> Gtk.containerRemove menu item >> Gtk.widgetDestroy item