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; } }
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); }
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; }); }
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); }
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); } } }
public PanelPlacement AppendPanelTo(Panel panel, SplitPlacement targetPlacement) { return(Model.AppendPanelToPlacement(panel, targetPlacement)); }