module System.Taffybar.Widget.Generic.DynamicMenu where

import           Control.Monad.IO.Class
import qualified GI.Gtk as Gtk

data DynamicMenuConfig = DynamicMenuConfig
  { DynamicMenuConfig -> Widget
dmClickWidget :: Gtk.Widget
  , DynamicMenuConfig -> Menu -> IO ()
dmPopulateMenu :: Gtk.Menu -> IO ()
  }

dynamicMenuNew :: MonadIO m => DynamicMenuConfig -> m Gtk.Widget
dynamicMenuNew :: forall (m :: * -> *). MonadIO m => DynamicMenuConfig -> m Widget
dynamicMenuNew 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 ()
emptyMenu :: forall a (m :: * -> *). (IsContainer a, MonadIO m) => a -> m ()
emptyMenu 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