private void Initialize() { views.Clear(); // clear unwanted Widget references for GC to collect foreach (var(_, viewNode) in FilesystemUserPreferences.Instance.ViewRootPerProjectFile) { viewNode.Widget = null; } rootWidget?.UnlinkAndDispose(); var up = FilesystemUserPreferences.Instance; var q = new Queue <ViewNode>(); q.Enqueue(up.ViewRoot); while (q.Count != 0) { var n = q.Dequeue(); foreach (var child in n.Children) { child.Parent = n; q.Enqueue(child); } Widget w; if (n is FSViewNode) { var fsView = new FilesystemView(); views.Add(fsView); w = fsView.RootWidget; w.Components.Add(new ViewNodeComponent { ViewNode = n }); fsView.Initialize(); } else if (n is SplitterNode) { var type = (n as SplitterNode).Type; Splitter s = type.MakeSplitter(); s.Stretches = Splitter.GetStretchesList((n as SplitterNode).Stretches, 1, 1); w = s; w.Components.Add(new ViewNodeComponent { ViewNode = n }); // copy pasted line } else { throw new InvalidDataException(); } n.Widget = w; if (n.Parent != null) { n.Parent.Widget.AddNode(w); } else { rootWidget = w; } } dockPanelWidget.PushNode(rootWidget); rootWidget.SetFocus(); }
public void Close(FilesystemView fsView) { views.Remove(fsView); var RootWidget = fsView.RootWidget; ViewNode vn = RootWidget.Components.Get <ViewNodeComponent>().ViewNode; if (vn.Parent == null) { // oh noes can't close root! return; } if (vn.Parent is SplitterNode) { var sn = vn.Parent as SplitterNode; vn.Widget = null; // just in case? sn.Children.Remove(vn); RootWidget.UnlinkAndDispose(); if (sn.Children.Count == 1) { var ovn = sn.Children.First(); if (sn.Parent == null) { // Root => update up var up = FilesystemUserPreferences.Instance; up.ViewRoot = ovn; ovn.Parent = null; ovn.Widget.Unlink(); var pw = sn.Widget.ParentWidget; sn.Widget.UnlinkAndDispose(); pw.AddNode(ovn.Widget); } else { // remap ovn.Parent = sn.Parent; ovn.Widget.Unlink(); var pwIndex = sn.Widget.ParentWidget.Nodes.IndexOf(sn.Widget); var pw = sn.Widget.ParentWidget; sn.Widget.UnlinkAndDispose(); pw.Nodes.Insert(pwIndex, ovn.Widget); ovn.Parent.Children.Remove(sn); ovn.Parent.Children.Insert(pwIndex, ovn); } } else { // wat } } else { // wat } }
public FilesystemToolbar(FilesystemView view, Model model) { this.view = view; Nodes.AddRange( new Widget { Presenter = new SyncDelegatePresenter <Widget>((w) => { w.PrepareRendererState(); Renderer.DrawLine(0.0f, w.Size.Y, w.Size.X, w.Size.Y, Theme.Colors.SeparatorColor); }), Layout = new VBoxLayout(), Nodes = { new Widget { Layout = new HBoxLayout() { Spacing = 2 }, Nodes = { CreateGotoCurrentProjectDirectoryButton(), CreateUpButton(), CreateGoBackwardButton(), CreateGoForwardButton(), CreateToggleCookingRulesButton(), CreateTogglePreviewButton(), CreateSplitHButton(), CreateSplitVButton(), CreateSortByText(), CreateSortDropDownList(), CreateSortOrderDropDownList(), new Widget { LayoutCell = new LayoutCell{ Stretch = new Vector2(9999, 9999) } }, CreateCloseButton() } }, (AddressBar = new AddressBar(view.Open, model)), } } ); }
public FilesystemToolbar(FilesystemView view) { this.view = view; Nodes.AddRange( new Widget { Presenter = new DelegatePresenter <Widget>((w) => { w.PrepareRendererState(); Renderer.DrawLine(0.0f, w.Size.Y, w.Size.X, w.Size.Y, Theme.Colors.SeparatorColor); }), Layout = new VBoxLayout(), Nodes = { new Widget { Layout = new HBoxLayout(), Nodes = { CreateGotoCurrentProjectDirectoryButton(), CreateUpButton(), CreateGoBackwardButton(), CreateGoForwardButton(), CreateToggleCookingRulesButton(), CreateTogglePreviewButton(), CreateSplitHButton(), CreateSplitVButton(), new Widget { LayoutCell = new LayoutCell{ Stretch = new Vector2(9999, 9999) } }, CreateCloseButton() } }, (pathText = new ThemedSimpleText{ }), } } ); }
public void Split(FilesystemView fsView, SplitterType type) { var RootWidget = fsView.RootWidget; FSViewNode vn = RootWidget.Components.Get <ViewNodeComponent>().ViewNode as FSViewNode; var newFsView = new FilesystemView(); views.Add(newFsView); var newVn = new FSViewNode { Widget = newFsView.RootWidget, Path = vn.Path, ShowSelectionPreview = vn.ShowSelectionPreview, ShowCookingRulesEditor = vn.ShowCookingRulesEditor, }; // TODO: setup internal stretches of fsView here newFsView.RootWidget.Components.Add(new ViewNodeComponent { ViewNode = newVn }); newFsView.Initialize(); if (vn.Parent == null) { // Root node, need to replace on in UserPreferences Splitter s = type.MakeSplitter(); var up = FilesystemUserPreferences.Instance; var sn = new SplitterNode { Widget = s, Type = type }; up.ViewRoot = sn; newVn.Parent = sn; s.Stretches = Splitter.GetStretchesList(sn.Stretches, 1, 1); sn.Children.Add(vn); sn.Children.Add(newVn); var thisParent = RootWidget.ParentWidget; RootWidget.Unlink(); s.AddNode(RootWidget); s.AddNode(newFsView.RootWidget); s.Components.Add(new ViewNodeComponent { ViewNode = sn }); vn.Parent = sn; thisParent.Nodes.Add(s); // TODO setup stretches ^ } else if (vn.Parent is SplitterNode) { if ((vn.Parent as SplitterNode).Type == type) { var sn = vn.Parent as SplitterNode; var s = sn.Widget; s.Nodes.Insert(s.Nodes.IndexOf(RootWidget), newFsView.RootWidget); newVn.Parent = sn; sn.Children.Insert(sn.Children.IndexOf(vn), newVn); } else { Splitter s = type.MakeSplitter(); var sn = new SplitterNode { Widget = s, Type = type }; s.Components.Add(new ViewNodeComponent { ViewNode = sn }); s.Stretches = Splitter.GetStretchesList(sn.Stretches); var psn = vn.Parent as SplitterNode; // or vn.Parent.Widget int thisIndex = RootWidget.ParentWidget.Nodes.IndexOf(RootWidget); var thisParent = RootWidget.ParentWidget; RootWidget.Unlink(); s.AddNode(RootWidget); s.AddNode(newFsView.RootWidget); sn.Children.Add(vn); sn.Children.Add(newVn); vn.Parent = sn; newVn.Parent = sn; thisParent.Nodes.Insert(thisIndex, s); var ps = psn.Widget; sn.Parent = psn; psn.Children.RemoveAt(thisIndex); psn.Children.Insert(thisIndex, sn); } } else if (vn.Parent is FSViewNode) { // wat } }