From 6d9ba7714bdd661c7e68c58cf764399af26d2a41 Mon Sep 17 00:00:00 2001 From: Giorgos Vyronos Date: Wed, 9 Mar 2022 14:37:33 +0000 Subject: [PATCH] Changes to return (side,XYPos). Ignore SelectedComponentView.fs --- src/Renderer/DrawBlock/BusWire.fs | 22 +++++++++---------- src/Renderer/DrawBlock/Sheet.fs | 14 ++++++------ src/Renderer/DrawBlock/Symbol.fs | 21 +++++++++++------- src/Renderer/UI/SelectedComponentView.fs | 27 +++++++++++++++++++++++- 4 files changed, 58 insertions(+), 26 deletions(-) diff --git a/src/Renderer/DrawBlock/BusWire.fs b/src/Renderer/DrawBlock/BusWire.fs index 30aa103..6316272 100644 --- a/src/Renderer/DrawBlock/BusWire.fs +++ b/src/Renderer/DrawBlock/BusWire.fs @@ -660,7 +660,7 @@ let view (model : Model) (dispatch : Dispatch) = Segments = List.map makeSegPos wire.Segments ColorP = wire.Color StrokeWidthP = wire.Width - OutputPortLocation = outputPortLocation + OutputPortLocation = snd outputPortLocation } singleWireView props) TimeHelpers.instrumentInterval "WirePrepareProps" rStart () @@ -763,8 +763,8 @@ let routeGivenWiresBasedOnPortPositions (wiresToBeRouted : list) ( |> List.map ( fun wire -> - let posTuple = Symbol.getTwoPortLocations (model.Symbol) (wire.InputPort) (wire.OutputPort) - (wire.Id, {wire with Segments = makeInitialSegmentsList wire.Id posTuple}) + let posTuple1,posTuple2 = Symbol.getTwoPortLocations (model.Symbol) (wire.InputPort) (wire.OutputPort) + (wire.Id, {wire with Segments = makeInitialSegmentsList wire.Id (snd posTuple1, snd posTuple2)}) ) |> Map.ofList @@ -990,8 +990,8 @@ let filterWiresByCompMoved (wModel : Model) (compIds : list) = //Returns a newly autorouted wire given a model and wire let autorouteWire (model : Model) (wire : Wire) : Wire = - let posTuple = Symbol.getTwoPortLocations (model.Symbol) (wire.InputPort) (wire.OutputPort) - {wire with Segments = makeInitialSegmentsList wire.Id posTuple} + let posTuple1,posTuple2 = Symbol.getTwoPortLocations (model.Symbol) (wire.InputPort) (wire.OutputPort) + {wire with Segments = makeInitialSegmentsList wire.Id (snd posTuple1,snd posTuple2)} /// reverse segment order, and Start, End coordinates, so list can be processed from input to output /// this function is self-inverse @@ -1134,10 +1134,10 @@ let updateWire (model : Model) (wire : Wire) (inOut : bool) = | true -> Symbol.getInputPortLocation model.Symbol wire.InputPort | false -> Symbol.getOutputPortLocation model.Symbol wire.OutputPort if inOut then - partialAutoRoute (revSegments wire.Segments) newPort + partialAutoRoute (revSegments wire.Segments) (snd newPort) |> Option.map revSegments else - partialAutoRoute wire.Segments newPort + partialAutoRoute wire.Segments (snd newPort) |> Option.map (fun segs -> {wire with Segments = segs}) |> Option.defaultValue (autorouteWire model wire) @@ -1259,7 +1259,7 @@ let update (msg : Msg) (model : Model) : Model*Cmd = let portOnePos, portTwoPos = Symbol.getTwoPortLocations model.Symbol inputId outputId let wireWidthFromSymbol = WireWidth.Configured 1 let wireId = ConnectionId(JSHelpers.uuid()) - let segmentList = makeInitialSegmentsList wireId (portOnePos, portTwoPos) + let segmentList = makeInitialSegmentsList wireId (snd portOnePos, snd portTwoPos) let newWire = { @@ -1448,11 +1448,11 @@ let update (msg : Msg) (model : Model) : Model*Cmd = let makeWirePosMatchSymbol inOut (wire:Wire) = match inOut with | true -> posMatchesVertex - (Symbol.getInputPortLocation model.Symbol inputId) + (snd (Symbol.getInputPortLocation model.Symbol inputId)) (List.head conn.Vertices) | false -> posMatchesVertex - (Symbol.getOutputPortLocation model.Symbol outputId) + (snd (Symbol.getOutputPortLocation model.Symbol outputId)) (List.last conn.Vertices) |> (fun b -> if b then @@ -1519,7 +1519,7 @@ let pasteWires (wModel : Model) (newCompIds : list) : (Model * list | Some (newInputPort, newOutputPort) -> let portOnePos, portTwoPos = Symbol.getTwoPortLocations wModel.Symbol (InputPortId newInputPort) (OutputPortId newOutputPort) - let segmentList = makeInitialSegmentsList newId (portOnePos, portTwoPos) + let segmentList = makeInitialSegmentsList newId (snd portOnePos, snd portTwoPos) [ { oldWire with diff --git a/src/Renderer/DrawBlock/Sheet.fs b/src/Renderer/DrawBlock/Sheet.fs index 9e39eb8..d4d8db5 100644 --- a/src/Renderer/DrawBlock/Sheet.fs +++ b/src/Renderer/DrawBlock/Sheet.fs @@ -422,8 +422,9 @@ let findNearbyPorts (model: Model) = /// Returns what is located at pos /// Priority Order: InputPort -> OutputPort -> Component -> Wire -> Canvas let mouseOn (model: Model) (pos: XYPos) : MouseOn = - let inputPorts, outputPorts = findNearbyPorts model - + let inputPortsWithSide, outputPortsWithSide = findNearbyPorts model + let inputPorts = List.map(fun (outPort,(orient,location)) -> outPort,location) inputPortsWithSide + let outputPorts = List.map(fun (outPort,(orient,location)) -> outPort,location) outputPortsWithSide //TODO FIX THIS - QUICK FIX TO MAKE WORK, NOT IDEAL //The ports/wires are being loaded in the correct place but the detection is not working //Something is wrong with the mouse coordinates somewhere, might be caused by zoom? not sure @@ -682,8 +683,9 @@ let mDragUpdate (model: Model) (mMsg: MouseT) : Model * Cmd = moveSymbols model mMsg | ConnectingInput _ -> let nearbyComponents = findNearbyComponents model mMsg.Pos - let _, nearbyOutputPorts = findNearbyPorts model - + let _, nearbyOutputPortsWithSide = findNearbyPorts model + let nearbyOutputPorts = List.map(fun (outPort,(orient,location)) -> outPort,location)nearbyOutputPortsWithSide + let targetPort, drawLineTarget = match mouseOnPort nearbyOutputPorts mMsg.Pos 12.5 with | Some (OutputPortId portId, portLoc) -> (portId, portLoc) // If found target, snap target of the line to the port @@ -698,8 +700,8 @@ let mDragUpdate (model: Model) (mMsg: MouseT) : Model * Cmd = , Cmd.ofMsg CheckAutomaticScrolling | ConnectingOutput _ -> let nearbyComponents = findNearbyComponents model mMsg.Pos - let nearbyInputPorts, _ = findNearbyPorts model - + let nearbyInputPortsWithSide, _ = findNearbyPorts model + let nearbyInputPorts = List.map(fun (outPort,(orient,location)) -> outPort,location) nearbyInputPortsWithSide let targetPort, drawLineTarget = match mouseOnPort nearbyInputPorts mMsg.Pos 12.5 with | Some (InputPortId portId, portLoc) -> (portId, portLoc) // If found target, snap target of the line to the port diff --git a/src/Renderer/DrawBlock/Symbol.fs b/src/Renderer/DrawBlock/Symbol.fs index c518b44..755aefd 100644 --- a/src/Renderer/DrawBlock/Symbol.fs +++ b/src/Renderer/DrawBlock/Symbol.fs @@ -765,7 +765,7 @@ let canvasPortLocation (sym:Symbol) : XYPos list = // Function to generate the true XYPos of a specified Port on the Canvas given the port and symbol // Input: Symbol, Port -> Take the symbol and the specified port // Output: XYPos-> Return the XYPos position of the ports depending on being inputs or outputs -let getGlobalPortPos (sym: Symbol) (port:Port) :XYPos = +let getGlobalPortPos (sym: Symbol) (port:Port) : (PortOrientation*XYPos) = let typePort,ports = if port.PortType = PortType.Input then ("I",sym.Compo.InputPorts) @@ -773,13 +773,15 @@ let getGlobalPortPos (sym: Symbol) (port:Port) :XYPos = ("O",sym.Compo.OutputPorts) let index = float( List.findIndex (fun (p:Port) -> p = port) ports ) - (Map.find (typePort + string index) sym.APortOffsetsMap).Offset + let positionOffset = (Map.find (typePort + string index) sym.APortOffsetsMap) + (positionOffset.Side,positionOffset.Offset) + /// It is used in getInputPortLocation for a single port let getInputPortsPositionMap (symbols: Symbol list) = symbols |> List.collect (fun sym -> List.map (fun p -> sym,p) sym.Compo.InputPorts) - |> List.map (fun (sym,port) -> (InputPortId port.Id, posAdd (getGlobalPortPos sym port) sym.Pos)) + |> List.map (fun (sym,port) -> (InputPortId port.Id,((fst (getGlobalPortPos sym port)), posAdd (snd (getGlobalPortPos sym port)) sym.Pos))) |> Map.ofList @@ -787,7 +789,7 @@ let getInputPortsPositionMap (symbols: Symbol list) = let getOutputPortsPositionMap (symbols: Symbol list) = symbols |> List.collect (fun sym -> List.map (fun p -> sym,p) sym.Compo.OutputPorts) - |> List.map (fun (sym,port) -> (OutputPortId port.Id , posAdd (getGlobalPortPos sym port) sym.Pos)) + |> List.map (fun (sym,port) -> (OutputPortId port.Id ,((fst (getGlobalPortPos sym port)), posAdd (snd (getGlobalPortPos sym port)) sym.Pos))) |> Map.ofList ///Returns the port object associated with a given portId @@ -835,9 +837,9 @@ let getOnePortLocation (symModel: Model) (portId : string) (pType: PortType)= getInputPortLocation symModel (InputPortId portId) | PortType.Output -> getOutputPortLocation symModel (OutputPortId portId) - + /// Returns the location of a given portId, with better efficiency -let getOnePortLocationNew (symModel: Model) (portId : string) (pType: PortType) : XYPos = +let getOnePortLocationNew (symModel: Model) (portId : string) (pType: PortType): PortOrientation * XYPos = symModel.Symbols |> Map.pick (fun _ sym -> let comp = sym.Compo @@ -845,10 +847,10 @@ let getOnePortLocationNew (symModel: Model) (portId : string) (pType: PortType) List.tryFind (fun (po:Port) -> po.Id = portId) comp.InputPorts else List.tryFind (fun (po:Port) -> po.Id = portId) comp.OutputPorts - |> Option.map (fun port -> posAdd (getGlobalPortPos sym port) sym.Pos)) + |> Option.map (fun port ->((fst (getGlobalPortPos sym port)), posAdd (snd (getGlobalPortPos sym port)) sym.Pos))) -/// Returns the locations of a given input portId and output portId +/// Returns the locations of a given input portId and output portId let getTwoPortLocations (symModel: Model) (inPortId: InputPortId ) (outPortId: OutputPortId) = match inPortId, outPortId with | InputPortId inputId, OutputPortId outputId -> @@ -1317,6 +1319,9 @@ let update (msg : Msg) (model : Model): Model*Cmd<'a> = let extractComponent (symModel: Model) (sId:ComponentId) : Component = symModel.Symbols[sId].Compo +let extractSymbol (symModel: Model) (sId:ComponentId) : Symbol = + symModel.Symbols[sId] + let extractComponents (symModel: Model) : Component list = symModel.Symbols |> Map.toList diff --git a/src/Renderer/UI/SelectedComponentView.fs b/src/Renderer/UI/SelectedComponentView.fs index 4d292df..fc10f05 100644 --- a/src/Renderer/UI/SelectedComponentView.fs +++ b/src/Renderer/UI/SelectedComponentView.fs @@ -384,6 +384,8 @@ let private makeExtraInfo model (comp:Component) text dispatch = let viewSelectedComponent (model: ModelType.Model) dispatch = + + let sheetDispatch sMsg = dispatch (Sheet sMsg) let formatLabelText (txt: string) = txt.ToUpper() @@ -392,7 +394,12 @@ let viewSelectedComponent (model: ModelType.Model) dispatch = |> (fun chars -> match Seq.length chars with | 0 -> None | _ -> Some (String.concat "" (Seq.map string chars))) match model.Sheet.SelectedComponents with | [ compId ] -> - let comp = Symbol.extractComponent model.Sheet.Wire.Symbol compId + let comp = Symbol.extractComponent model.Sheet.Wire.Symbol compId // Extract Component : function in Symbol.fs + let sym = Symbol.extractSymbol model.Sheet.Wire.Symbol compId // Extract Symbol : function in Symbol.fs + let ports = + sym.APortOffsetsMap + |> Map.toList + |> List.map fst div [Key comp.Id] [ // let label' = extractLabelBase comp.Label // TODO: normalise labels so they only contain allowed chars all uppercase @@ -411,6 +418,24 @@ let viewSelectedComponent (model: ModelType.Model) dispatch = //updateNames model (fun _ _ -> model.WaveSim.Ports) |> StartWaveSim |> dispatch dispatch (ReloadSelectedComponent model.LastUsedDialogWidth) // reload the new component ) + let items = + List.map (fun i -> + textFormField required "Component Rent" i (fun text -> +// TODO: removed formatLabel for now + //setComponentLabel model sheetDispatch comp (formatLabel comp text) + match formatLabelText text with + | Some label -> + setComponentLabel model sheetDispatch comp label + dispatch <| SetPopupDialogText (Some label) + | None -> () + //updateNames model (fun _ _ -> model.WaveSim.Ports) |> StartWaveSim |> dispatch + dispatch (ReloadSelectedComponent model.LastUsedDialogWidth) // reload the new component + )) ports + + printf "%A" items + match items with + | [x] -> x + | _ -> nothing ] | _ -> div [] [ str "Select a component in the diagram to view or change its properties, for example number of bits." ]