/// <summary> /// Base constructor for a HeliosVisual. /// </summary> /// <param name="name">Default name for this object.</param> /// <param name="nativeSize">Native size that this control renderes at.</param> protected HeliosVisual(string name, Size nativeSize) : base(name) { _rectangle = new Rect(nativeSize); _nativeSize = nativeSize; UpdateRectangle(); _children = new HeliosVisualCollection(); HeliosAction toggleVisibleAction = new HeliosAction(this, "", "hidden", "toggle", "Toggles whether this control is displayed on screen."); toggleVisibleAction.Execute += new HeliosActionHandler(ToggleVisibleAction_Execute); Actions.Add(toggleVisibleAction); _hiddenValue = new HeliosValue(this, new BindingValue(false), "", "hidden", "Indicates if this control is hidden and off screen.", "True if this panel is not displayed.", BindingValueUnits.Boolean); _hiddenValue.Execute += new HeliosActionHandler(SetHiddenAction_Execute); Values.Add(_hiddenValue); Actions.Add(_hiddenValue); Children.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Children_CollectionChanged); }
private void ScaleVisuals(HeliosVisualCollection visuals, Rect selectionRectangle, Vector offset, double scaleX, double scaleY, bool forceProportions) { foreach (HeliosVisual visual in visuals) { double lScaleX = scaleX; double lScaleY = scaleY; if (visual.Rotation != HeliosVisualRotation.None & visual.Rotation != HeliosVisualRotation.ROT180) { lScaleX = scaleY; lScaleY = scaleX; } if (visual.Left - selectionRectangle.Left > 0.1) { double locXDif = visual.Left - selectionRectangle.Left; visual.Left += (locXDif * lScaleX) - locXDif; } visual.Left += offset.X; if (visual.Top - selectionRectangle.Top > 0.1) { double locYDif = visual.Top - selectionRectangle.Top; visual.Top += (locYDif * scaleY) - locYDif; } visual.Top += offset.Y; visual.Width = Math.Max(visual.Width * lScaleX, 1d); visual.Height = Math.Max(visual.Height * lScaleY, 1d); if (forceProportions) { visual.ScaleChildren(lScaleX, lScaleY); } } }
public HeliosVisualContainerEditor() { Focusable = true; _view = new HeliosVisualView(); _view.IgnoreHidden = true; _view.DisplayRotation = false; AddVisualChild(_view); SelectedItems = new HeliosVisualCollection(); _zoomCalibration = new CalibrationPointCollectionDouble(-4d, 0.25d, 4d, 4d); _zoomCalibration.Add(new CalibrationPointDouble(0d, 1d)); SelectedItems.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(SelectedItems_CollectionChanged); DrawingGroup checkerGroup = new DrawingGroup(); checkerGroup.Children.Add(new GeometryDrawing(Brushes.White, null, new RectangleGeometry(new Rect(0, 0, 100, 100)))); DrawingGroup grayGroup = new DrawingGroup(); grayGroup.Children.Add(new GeometryDrawing(Brushes.LightGray, null, new RectangleGeometry(new Rect(0, 0, 50, 50)))); grayGroup.Children.Add(new GeometryDrawing(Brushes.LightGray, null, new RectangleGeometry(new Rect(50, 50, 50, 50)))); checkerGroup.Children.Add(grayGroup); checkerGroup.Freeze(); _checkerBrush = new DrawingBrush(checkerGroup); _checkerBrush.Viewport = new Rect(0, 0, 10, 10); _checkerBrush.ViewportUnits = BrushMappingMode.Absolute; _checkerBrush.TileMode = TileMode.Tile; _checkerBrush.Freeze(); }
private void ScaleVisuals(HeliosVisualCollection visuals, Rect selectionRectangle, Vector offset, double scaleX, double scaleY) { foreach (HeliosVisual visual in visuals) { if (visual.Left > selectionRectangle.Left) { double locXDif = visual.Left - selectionRectangle.Left; visual.Left = (locXDif * scaleX) - locXDif; } else { visual.Left += offset.X; } if (visual.Top > selectionRectangle.Top) { double locYDif = visual.Top - selectionRectangle.Top; visual.Top += (locYDif * scaleY) - locYDif; } else { visual.Top += offset.Y; } visual.Width = Math.Max(visual.Width * scaleX, 1d); visual.Height = Math.Max(visual.Height * scaleY, 1d); if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift)) { visual.ScaleChildren(scaleX, scaleY); } } }
private static void CopySelection(HeliosVisualContainer root, HeliosVisualCollection controls) { XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; // Loop through controls and add them in the proper visual order for serialization to the copy buffer. HeliosVisualCollection copiedControls = new HeliosVisualCollection(); foreach (HeliosVisual visual in root.Children) { if (controls.Contains(visual)) { copiedControls.Add(visual); } } StringBuilder sb = new StringBuilder(); XmlWriter xmlWriter = XmlWriter.Create(sb, settings); xmlWriter.WriteStartElement("HeliosCopyBuffer"); xmlWriter.WriteElementString("CopyRoot", HeliosSerializer.GetVisualPath(root)); HeliosSerializer serializer = new HeliosSerializer(null); serializer.SerializeControls(copiedControls, xmlWriter); HeliosBindingCollection serializedBindings = new HeliosBindingCollection(); xmlWriter.WriteStartElement("Bindings"); foreach (HeliosVisual control in copiedControls) { SerializeBindings(serializer, control, xmlWriter, serializedBindings); } xmlWriter.WriteEndElement(); xmlWriter.WriteEndElement(); xmlWriter.Close(); SetClipboard("Helios.Visuals", sb.ToString()); }
private static void Paste_Executed(object target, ExecutedRoutedEventArgs e) { HeliosVisualContainerEditor editor = target as HeliosVisualContainerEditor; if (editor != null && Clipboard.ContainsData("Helios.Visuals")) { XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreComments = true; settings.IgnoreWhitespace = true; settings.CloseInput = true; StringReader reader = new StringReader(Clipboard.GetText()); XmlReader xmlReader = XmlReader.Create(reader, settings); HeliosSerializer serialzier = new HeliosSerializer(editor.Dispatcher); ConfigManager.UndoManager.StartBatch(); xmlReader.ReadStartElement("HeliosCopyBuffer"); string copyRoot = xmlReader.ReadElementString("CopyRoot"); HeliosVisualCollection newControls = new HeliosVisualCollection(); serialzier.DeserializeControls(newControls, xmlReader); List<HeliosVisual> localObjects = new List<HeliosVisual>(); foreach (HeliosVisual control in newControls) { localObjects.Add(control); } HeliosBindingCollection bindings = serialzier.DeserializeBindings(editor.VisualContainer, copyRoot, localObjects, xmlReader); xmlReader.ReadEndElement(); newControls.Clear(); if (localObjects.Count > 0) { editor.SelectedItems.Clear(); foreach (HeliosVisual control in localObjects) { if (control.Left + control.Width > editor.VisualContainer.Width) { control.Left = Math.Max(0d, editor.VisualContainer.Width - control.DisplayRectangle.Width); } if (control.Top + control.Height > editor.VisualContainer.Height) { control.Top = Math.Max(0d, editor.VisualContainer.Height - control.DisplayRectangle.Height); } control.Name = editor.VisualContainer.Children.GetUniqueName(control); editor.VisualContainer.Children.Add(control); ConfigManager.UndoManager.AddUndoItem(new ControlAddUndoEvent(editor.VisualContainer, control)); editor.SelectedItems.Add(control); } foreach (HeliosBinding binding in bindings) { ConfigManager.UndoManager.AddUndoItem(new BindingAddUndoEvent(binding)); binding.Trigger.Source.OutputBindings.Add(binding); binding.Action.Target.InputBindings.Add(binding); } } ConfigManager.UndoManager.CloseBatch(); xmlReader.Close(); } }
public void DeserializeControls(HeliosVisualCollection controls, XmlReader xmlReader) { if (!xmlReader.IsEmptyElement) { xmlReader.ReadStartElement("Children"); while (xmlReader.NodeType != XmlNodeType.EndElement) { HeliosVisual control = DeserializeControl(xmlReader); if (control != null) { controls.Add(control); } } xmlReader.ReadEndElement(); } else { xmlReader.Read(); } }
public void SerializeControls(HeliosVisualCollection controls, XmlWriter xmlWriter) { xmlWriter.WriteStartElement("Children"); foreach (HeliosVisual control in controls) { SerializeControl(control, xmlWriter); } xmlWriter.WriteEndElement(); // Controls }
private void ScaleVisuals(HeliosVisualCollection visuals, Rect selectionRectangle, Vector offset, double scaleX, double scaleY, bool forceProportions) { foreach (HeliosVisual visual in visuals) { double lScaleX = scaleX; double lScaleY = scaleY; if (visual.Rotation != HeliosVisualRotation.None) { lScaleX = scaleY; lScaleY = scaleX; } if (visual.Left - selectionRectangle.Left > 0.1) { double locXDif = visual.Left - selectionRectangle.Left; visual.Left += (locXDif * lScaleX) - locXDif; } visual.Left += offset.X; if (visual.Top - selectionRectangle.Top > 0.1) { double locYDif = visual.Top - selectionRectangle.Top; visual.Top += (locYDif * scaleY) - locYDif; } visual.Top += offset.Y; visual.Width = Math.Max(visual.Width * lScaleX, 1d); visual.Height = Math.Max(visual.Height * lScaleY, 1d); if (forceProportions) { visual.ScaleChildren(lScaleX, lScaleY); } } }