packages feed

chiasma-0.12.2.0: lib/Chiasma/Ui/Data/RenderableTree.hs

module Chiasma.Ui.Data.RenderableTree where

import Prettyprinter (Doc, Pretty (..), emptyDoc, space, (<+>))

import Chiasma.Data.Axis (Axis)
import Chiasma.Data.TmuxId (PaneId (..))
import Chiasma.Ui.Data.Tree (NNode, NTree)
import Chiasma.Ui.Data.ViewGeometry (ViewGeometry (ViewGeometry))
import Chiasma.Ui.Data.ViewState (ViewState)

data RLayout =
  RLayout {
    _ref :: RPane,
    _axis :: Axis
  }
  deriving stock (Eq, Show)

data RPane =
  RPane {
    _id :: PaneId,
    _top :: Int,
    _left :: Int
  }
  deriving stock (Eq, Show)

data Renderable a =
  Renderable {
    _state :: ViewState,
    _geometry :: ViewGeometry,
    _view :: a
  }
  deriving stock (Eq, Show)

type RenderableLayout = Renderable RLayout
type RenderablePane = Renderable RPane
type RenderableTree = NTree RenderableLayout RenderablePane
type RenderableNode = NNode RenderableLayout RenderablePane

instance Pretty RLayout where
  pretty (RLayout (RPane (PaneId refId) _ _) axis) =
    "l –" <+> "ref:" <+> pretty refId <+> "pos:" <+> pretty axis

instance Pretty RPane where
  pretty (RPane (PaneId paneId) top left) =
    "p –" <+> pretty paneId <+> pretty top <+> pretty left

mayPretty :: Text -> Maybe Float -> Doc a
mayPretty prefix (Just a) =
  space <> pretty (prefix <> ":") <+> pretty a
mayPretty _ Nothing =
  emptyDoc

instance Pretty a => Pretty (Renderable a) where
  pretty (Renderable _ (ViewGeometry minSize maxSize fixedSize _ _ _) a) =
    pretty a <> mayPretty "min" minSize <> mayPretty "max" maxSize <> mayPretty "fixed" fixedSize