Exemple #1
0
        public void DockPlacementTo(Placement placement, Placement target, DockSite site, float stretch)
        {
            if (site == DockSite.Fill)
            {
                target.SwitchType(
                    targetPanelPlacement => {
                    if (placement is TabBarPlacement tabBarPlacement)
                    {
                        DockPlacementTo(tabBarPlacement, targetPanelPlacement);
                    }
                    if (placement is PanelPlacement panelPlacement)
                    {
                        DockPlacementTo(panelPlacement, targetPanelPlacement);
                    }
                },
                    targetTabBarPlacement => {
                    if (placement is TabBarPlacement tabBarPlacement)
                    {
                        DockPlacementTo(tabBarPlacement, targetTabBarPlacement);
                    }
                    if (placement is PanelPlacement panelPlacement)
                    {
                        targetTabBarPlacement.Placements.Add(panelPlacement);
                    }
                },
                    targetSplitPlacement => targetSplitPlacement.Append(placement)
                    );
                return;
            }
            if (target.Parent is TabBarPlacement)
            {
                target = target.Parent;
            }
            var parent         = (SplitPlacement)target.Parent;
            var splitPlacement = new SplitPlacement();
            var isFirst        = site == DockSite.Left || site == DockSite.Top;
            var wasFirst       = parent.FirstChild == target;

            target.Unlink();
            if (isFirst)
            {
                splitPlacement.Initialize(placement, target, site.GetSeparator(), stretch);
            }
            else
            {
                splitPlacement.Initialize(target, placement, site.GetSeparator(), 1 - stretch);
            }
            if (wasFirst)
            {
                parent.FirstChild = splitPlacement;
            }
            else
            {
                parent.SecondChild = splitPlacement;
            }
        }
Exemple #2
0
        private void CreateSplitWidget(Splitter container, SplitPlacement placement, float stretch, int insertAt)
        {
            var splitter = placement.Separator == DockSeparator.Vertical ? (Splitter) new ThemedHSplitter() : new ThemedVSplitter();

            splitter.DragEnded += RefreshDockedSize(placement, splitter);
            container.Stretches.Insert(insertAt, stretch);
            CreateWidgetForPlacement(splitter, placement.FirstChild, placement.Stretch);
            CreateWidgetForPlacement(splitter, placement.SecondChild, 1 - placement.Stretch, false);
            container.Nodes.Insert(insertAt, splitter);
        }
Exemple #3
0
 private Action RefreshDockedSize(SplitPlacement placement, Splitter splitter)
 {
     return(() => {
         var overal = Vector2.Zero;
         foreach (var w in splitter.Nodes)
         {
             overal += w.AsWidget.LayoutCell.Stretch;
         }
         var first = splitter.Nodes.First().AsWidget.LayoutCell.Stretch;
         var value = first / overal;
         placement.Stretch = placement.Separator == DockSeparator.Horizontal ? value.Y : value.X;
     });
 }
Exemple #4
0
        public PanelPlacement AppendPanelToPlacement(Panel panel, SplitPlacement target)
        {
            var placement = new PanelPlacement {
                Id = panel.Id, Title = panel.Title
            };

            if (target.FirstChild == null)
            {
                target.FirstChild = placement;
            }
            else if (target.SecondChild == null)
            {
                target.SecondChild = placement;
            }
            else
            {
                throw new System.Exception("Unable to append placement to another one; There is no space");
            }
            Panels.Add(panel);
            return(placement);
        }
Exemple #5
0
        private void ResolveInconsistency()
        {
            var floatingWindowDefaultSize = new Vector2(200, 300);
            var descendantPanelsList      = GetDescendantPanelPlacements().ToList();

            // Remove all placements which not refered to existing panels
            foreach (var panel in descendantPanelsList.ToList())
            {
                if (!Model.Panels.Any(p => p.Id == panel.Id))
                {
                    var windowPlacement = Model.GetWindowByPlacement(panel);
                    windowPlacement.RemovePanel(panel.Id);
                    descendantPanelsList.Remove(panel);
                    windowPlacement.Root.RemoveRedundantNodes();
                    if (!windowPlacement.GetDescendantPanels().Any())
                    {
                        Model.WindowPlacements.Remove(windowPlacement);
                    }
                }
            }
            foreach (var panel in Model.Panels)
            {
                // If there is no placement for panel, create new one in new window and hide.
                if (!descendantPanelsList.Any(placement => placement.Id == panel.Id))
                {
                    var windowPlacement = new WindowPlacement {
                        Position = Model.WindowPlacements[0].Position + Model.WindowPlacements[0].Size / 2 - floatingWindowDefaultSize / 2,
                        Size     = floatingWindowDefaultSize
                    };
                    var splitPlacement = new SplitPlacement();
                    splitPlacement.Append(new PanelPlacement {
                        Title  = panel.Title,
                        Id     = panel.Id,
                        Hidden = true
                    });
                    windowPlacement.Append(splitPlacement);
                    Model.WindowPlacements.Add(windowPlacement);
                }
            }
        }
Exemple #6
0
 public PanelPlacement AppendPanelTo(Panel panel, SplitPlacement targetPlacement)
 {
     return(Model.AppendPanelToPlacement(panel, targetPlacement));
 }