@@ -2,30 +2,25 @@ module View.Diagram.DiagramEditor where
22
33import Prelude hiding (div )
44
5- import Data.Bifunctor (bimap )
6- import Data.Int (floor , round )
75import Data.Maybe
86import Data.Traversable (traverse )
97import Data.Tuple.Nested ((/\))
10- import Data.Vec3 (vec2 , vec3 )
11- import Effect.Aff.Class (class MonadAff , liftAff )
12- import Effect (Effect )
13- import Foreign (Foreign )
8+ import Data.Vec3 (vec2 )
9+ import Effect.Aff.Class (class MonadAff )
1410import Halogen as H
1511import Halogen (ComponentDSL , HalogenM )
1612import Halogen.HTML as HH
17- import Halogen.HTML (HTML , div , br )
13+ import Halogen.HTML (HTML , div )
1814import Halogen.HTML.Core (ClassName (..))
1915import Halogen.HTML.Events as HE
2016import Halogen.HTML.Properties as HP
2117import Halogen.HTML.Properties (classes )
22- import Halogen.Query (getHTMLElementRef )
2318import Svg.Elements as SE
2419import Svg.Attributes as SA
2520import Unsafe.Coerce (unsafeCoerce )
2621import Web.DOM (Element )
2722import Web.HTML.HTMLElement as HTMLElement
28- import Web.HTML.HTMLElement (HTMLElement , DOMRect , getBoundingClientRect )
23+ import Web.HTML.HTMLElement (HTMLElement , getBoundingClientRect )
2924
3025import View.Diagram.Model
3126import View.Diagram.Update as Update
@@ -46,35 +41,27 @@ initialState ops =
4641 , dragStart: DragNotStarted
4742 }
4843 , msg: " "
49- , boundingClientRectMaybe : Nothing
44+ , componentElemMaybe : Nothing
5045 }
5146
5247ui :: ∀ m . MonadAff m => H.Component HTML Query Operators Msg m
53- ui = H .component { initialState: initialState, render, eval, receiver: HE .input UpdateDiagram }
48+ ui = H .lifecycleComponent { initialState: initialState, render, eval, receiver: HE .input UpdateDiagram , initializer: Just ( Initialize unit), finalizer: Nothing }
5449 where
5550 render :: State -> HTML Void (Query Unit )
5651 render state =
5752 div [ classes [ ClassName " css-diagram-editor" ] ]
5853 [ div [ classes [] ]
59- [ View .diagramEditorSVG state.model <#> \msg -> MouseAction msg unit
54+ [ View .diagramEditorSVG state.componentElemMaybe state. model <#> \msg -> MouseAction msg unit
6055 , div [ classes [ ClassName " mt-4" , ClassName " rb-2" , ClassName " p-4" , ClassName " bg-grey-lightest" , ClassName " text-grey-dark" , ClassName " rounded" , ClassName " text-sm" ] ]
6156 [ Inspector .view state ]
6257 ]
6358 ]
6459
65- -- TODO We shouldn't need to getBoundingClientRect on every single model update, that is incredibly inefficient.
66- -- Doing it just on initialisation and window resizing/layout changes should do.
6760 eval :: Query ~> ComponentDSL State Query Msg m
6861 eval = case _ of
6962 MouseAction msg next -> do
70- componentElemMaybe <- getHTMLElementRef' View .componentRefLabel
71- boundingRectMaybe <- H .liftEffect $ getBoundingClientRect `traverse` componentElemMaybe
72-
7363 state <- H .get
74- let updater = maybe (\ state -> state { msg = " Could not determine this component's boundingClientRect." })
75- (\rect state -> state { model = evalModel msg state.model })
76- boundingRectMaybe
77- state' = (updater <<< _ { boundingClientRectMaybe = boundingRectMaybe }) state
64+ let state' = state { model = evalModel msg state.model }
7865
7966 isOperatorClicked = case msg of
8067 MouseUp _ -> true
@@ -96,6 +83,11 @@ ui = H.component { initialState: initialState, render, eval, receiver: HE.input
9683 H .modify_ \state -> state { model = state.model { ops = ops } }
9784 pure next
9885
86+ Initialize next -> do
87+ componentElemMaybe <- getHTMLElementRef' View .componentRefLabel
88+ H .modify_ \state -> state { componentElemMaybe = componentElemMaybe }
89+ pure next
90+
9991-- TODO this is generally useful; move elsewhere
10092-- This was made because the original implementation from Halogen.Query doesn't seem to work, at least in this case:
10193-- getHTMLElementRef = map (HTMLElement.fromElement =<< _) <<< getRef
0 commit comments