{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -fno-warn-simplifiable-class-constraints #-}
module Data.GI.Gtk.Widget
( printWidgetTree
) where
import Control.Monad.IO.Class (MonadIO, liftIO)
import Data.Foldable (for_)
import Data.GI.Base.GObject (gtypeFromInstance)
import GI.Gtk.Objects.Widget (IsWidget, Widget, toWidget)
import GI.Gtk (Container(Container), castTo, containerGetChildren, gtypeName, managedForeignPtr, toManagedPtr)
printWidgetTree :: forall m a. (MonadIO m, IsWidget a) => a -> m ()
printWidgetTree :: forall (m :: * -> *) a. (MonadIO m, IsWidget a) => a -> m ()
printWidgetTree a
widget_ = do
widget <- a -> m Widget
forall (m :: * -> *) o. (MonadIO m, IsWidget o) => o -> m Widget
toWidget a
widget_
go "" widget
where
go :: String -> Widget -> m ()
go :: String -> Widget -> m ()
go String
indent Widget
w = do
type_ <- IO GType -> m GType
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO GType -> m GType) -> IO GType -> m GType
forall a b. (a -> b) -> a -> b
$ Widget -> IO GType
forall o. GObject o => o -> IO GType
gtypeFromInstance Widget
w
name <- liftIO $ gtypeName type_
let ptr = ManagedPtr Widget -> ForeignPtr Widget
forall a. ManagedPtr a -> ForeignPtr a
managedForeignPtr (ManagedPtr Widget -> ForeignPtr Widget)
-> (Widget -> ManagedPtr Widget) -> Widget -> ForeignPtr Widget
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Widget -> ManagedPtr Widget
forall a. ManagedPtrNewtype a => a -> ManagedPtr a
toManagedPtr (Widget -> ForeignPtr Widget) -> Widget -> ForeignPtr Widget
forall a b. (a -> b) -> a -> b
$ Widget
w
liftIO $ putStrLn $ indent <> name <> " " <> show ptr
maybeContainer <- liftIO $ castTo Container w
for_ maybeContainer $ \Container
container -> do
children <- Container -> m [Widget]
forall (m :: * -> *) a.
(HasCallStack, MonadIO m, IsContainer a) =>
a -> m [Widget]
containerGetChildren Container
container
for_ children $ \Widget
child -> do
String -> Widget -> m ()
go (String
" " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
indent) Widget
child