예제 #1
0
        /// <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);
        }
예제 #2
0
        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();
            }
        }
예제 #7
0
 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();
     }
 }
예제 #8
0
 public void SerializeControls(HeliosVisualCollection controls, XmlWriter xmlWriter)
 {   
     xmlWriter.WriteStartElement("Children");
     foreach (HeliosVisual control in controls)
     {
         SerializeControl(control, xmlWriter);
     }
     xmlWriter.WriteEndElement();  // Controls
 }
예제 #9
0
        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);
                }
            }
        }