module Graphics.UI.Gtk.Layout.EitherWidget where import Control.Monad import Data.IORef import Graphics.UI.Gtk import System.Glib.Types data EitherWidget a b = EitherWidget Notebook (IORef EitherWidgetParams) type EitherWidgetParams = Bool instance WidgetClass (EitherWidget a b) instance ObjectClass (EitherWidget a b) instance GObjectClass (EitherWidget a b) where toGObject (EitherWidget nb _) = toGObject nb unsafeCastGObject o = EitherWidget (unsafeCastGObject o) undefined eitherWidgetNew :: (WidgetClass a, WidgetClass b) => a -> b -> IO (EitherWidget a b) eitherWidgetNew wL wR = do nb <- notebookNew _ <- notebookAppendPage nb wL "" _ <- notebookAppendPage nb wR "" notebookSetShowTabs nb False params <- newIORef True return $ EitherWidget nb params eitherWidgetLeftActivated :: Attr (EitherWidget a b) Bool eitherWidgetLeftActivated = newAttr getter setter where getter (EitherWidget _ paramsR) = readIORef paramsR setter (EitherWidget nb paramsR) v = do params <- readIORef paramsR when (v /= params) $ do let upd = if v then 0 else 1 notebookSetCurrentPage nb upd writeIORef paramsR v eitherWidgetRightActivated :: Attr (EitherWidget a b) Bool eitherWidgetRightActivated = newAttr getter setter where getter w = fmap not $ get w eitherWidgetLeftActivated setter w v = set w [ eitherWidgetLeftActivated := not v ] eitherWidgetToggle :: EitherWidget a b -> IO() eitherWidgetToggle w = set w [ eitherWidgetLeftActivated :~ not ]