Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        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
            }
        }