module GUI.GUIDefinitionsBase where

open import Data.Unit
open import Data.Empty
open import Data.Bool
open import Data.String.Base


--\GUIDefinitionsBase
record CompStruc : Set₁ where 
  field 
    Components     :  Set
    Properties     :  Components → Set
    SubCompIndex   :  Components → Set
    subComp        :  (c : Components) → SubCompIndex c
                      → Components
    hasMethod      :  Components → Bool
    returnsStr     :  Components → Bool
open CompStruc public

--\GUIDefinitionsBase
data FrameCmpts : Set where
  frame button label textbox : FrameCmpts


data FrameSubCmptIndex : Set where
  buttonIdx labelIdx textboxIdx : FrameSubCmptIndex

FrameSubCmpIdx : FrameCmpts → Set
FrameSubCmpIdx frame = FrameSubCmptIndex
FrameSubCmpIdx _ = ⊥


frameSubCmpIdx2Cmpt : (c : FrameCmpts)(i : FrameSubCmpIdx c) → FrameCmpts
frameSubCmpIdx2Cmpt frame buttonIdx = button
frameSubCmpIdx2Cmpt frame labelIdx = label
frameSubCmpIdx2Cmpt frame textboxIdx = textbox
frameSubCmpIdx2Cmpt button ()
frameSubCmpIdx2Cmpt label ()
frameSubCmpIdx2Cmpt textbox ()

frameCmptsProp : FrameCmpts → Set
frameCmptsProp frame = ⊤
frameCmptsProp _     = String
-- in case of textbox it is the initial value inserted into a textbox

frameCmptHasMethod : FrameCmpts → Bool
frameCmptHasMethod button = true
frameCmptHasMethod _      = false


frameCmpIsTxtBox : FrameCmpts → Bool
frameCmpIsTxtBox textbox = true
frameCmpIsTxtBox _       = false


--\GUIDefinitionsBase
frameCmpStruc : CompStruc
Components   frameCmpStruc = FrameCmpts
SubCompIndex frameCmpStruc = FrameSubCmpIdx
subComp      frameCmpStruc = frameSubCmpIdx2Cmpt
Properties   frameCmpStruc = frameCmptsProp
hasMethod    frameCmpStruc = frameCmptHasMethod
returnsStr   frameCmpStruc = frameCmpIsTxtBox

--\GUIDefinitionsBase
--BEGIN@GUIel
data GUIel (cmpStruc : CompStruc)
           : (c : Components cmpStruc) → Set where
  createCmp : {c : Components cmpStruc} → Properties cmpStruc c
              → GUIel cmpStruc c
  addCmp : {c : Components cmpStruc} → GUIel cmpStruc c
              → (i : SubCompIndex cmpStruc c)
              → GUIel cmpStruc (subComp cmpStruc c i)
              → GUIel cmpStruc c