{-# OPTIONS_GHC -fno-warn-unticked-promoted-constructors -fno-warn-orphans #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module GI.Gtk.Declarative.Container.Paned
( Pane
, PaneProperties (..)
, defaultPaneProperties
, pane
, paned
)
where
import Data.Coerce (coerce)
import Data.Default.Class (Default (def))
import Data.Typeable
import Data.Vector (Vector)
import qualified Data.Vector as Vector
import GHC.Ptr (nullPtr)
import qualified GI.GLib as GLib
import qualified GI.Gtk as Gtk
import GI.Gtk.Declarative.Attributes
import GI.Gtk.Declarative.Container
import GI.Gtk.Declarative.Container.Class
import GI.Gtk.Declarative.EventSource
import GI.Gtk.Declarative.Patch
import GI.Gtk.Declarative.Widget
data Pane event = Pane
{ paneProperties :: PaneProperties
, paneChild :: Widget event
}
deriving (Functor)
data PaneProperties = PaneProperties
{ resize :: Bool
, shrink :: Bool
}
defaultPaneProperties :: PaneProperties
defaultPaneProperties = PaneProperties {resize = False, shrink = True}
instance Default PaneProperties where
def = defaultPaneProperties
pane :: PaneProperties -> Widget event -> Pane event
pane paneProperties paneChild = Pane {..}
instance Patchable Pane where
create = create . paneChild
patch s b1 b2 = patch s (paneChild b1) (paneChild b2)
instance EventSource Pane where
subscribe Pane{..} = subscribe paneChild
paned :: Typeable event => Vector (Attribute Gtk.Paned event) -> Pane event -> Pane event -> Widget event
paned attrs p1 p2 = container Gtk.Paned attrs (Panes p1 p2)
data Panes child = Panes child child
deriving (Functor)
instance IsContainer Gtk.Paned Pane where
appendChild paned' Pane{paneProperties = PaneProperties{resize, shrink}} widget' = do
c1 <- Gtk.panedGetChild1 paned'
c2 <- Gtk.panedGetChild2 paned'
case (c1, c2) of
(Nothing, Nothing) -> Gtk.panedPack1 paned' widget' (coerce resize) (coerce shrink)
(Just _, Nothing) -> Gtk.panedPack2 paned' widget' (coerce resize) (coerce shrink)
_ -> GLib.logDefaultHandler
(Just "gi-gtk-declarative")
[GLib.LogLevelFlagsLevelWarning]
(Just "appendChild: The `GI.Gtk.Paned` widget can only fit 2 panes. Additional children will be ignored.")
nullPtr
replaceChild paned' Pane{paneProperties = PaneProperties{resize, shrink}} i old new = do
Gtk.widgetDestroy old
case i of
0 -> Gtk.panedPack1 paned' new (coerce resize) (coerce shrink)
1 -> Gtk.panedPack2 paned' new (coerce resize) (coerce shrink)
_ -> GLib.logDefaultHandler
(Just "gi-gtk-declarative")
[GLib.LogLevelFlagsLevelWarning]
(Just "replaceChild: The `GI.Gtk.Paned` widget can only fit 2 panes. Additional children will be ignored.")
nullPtr
instance ToChildren Gtk.Paned Panes Pane where
toChildren _ (Panes p1 p2) = Children (Vector.fromList [p1, p2])