private void SavePanel(XmlWriter writer, DockPanel panel) { writer.WriteAttributeString("SelectedTab", panel.SelectedTabIndex.ToString()); for (int i = 0; i < panel.TabsCount; i++) { var win = panel.Tabs[i]; writer.WriteStartElement("Window"); writer.WriteAttributeString("Typename", win.SerializationTypename); if (win.UseLayoutData) { writer.WriteStartElement("Data"); win.OnLayoutSerialize(writer); writer.WriteEndElement(); } writer.WriteEndElement(); } for (int i = 0; i < panel.ChildPanelsCount; i++) { var p = panel.ChildPanels[i]; // Skip empty panels if (p.TabsCount == 0) { continue; } writer.WriteStartElement("Panel"); float splitterValue; DockState state = p.TryGetDockState(out splitterValue); writer.WriteAttributeString("DockState", ((int)state).ToString()); writer.WriteAttributeString("SplitterValue", splitterValue.ToString(CultureInfo.InvariantCulture)); SavePanel(writer, p); writer.WriteEndElement(); } }
private void LoadPanel(XmlElement node, DockPanel panel) { int selectedTab = int.Parse(node.GetAttribute("SelectedTab"), CultureInfo.InvariantCulture); // Load docked windows var windows = node.SelectNodes("Window"); if (windows != null) { foreach (XmlElement child in windows) { if (child == null) { continue; } var typename = child.GetAttribute("Typename"); var window = GetWindow(typename); if (window != null) { if (child.SelectSingleNode("Data") is XmlElement data) { window.OnLayoutDeserialize(data); } else { window.OnLayoutDeserialize(); } window.Show(DockState.DockFill, panel); } } } // Load child panels var panels = node.SelectNodes("Panel"); if (panels != null) { foreach (XmlElement child in panels) { if (child == null) { continue; } // Create child panel DockState state = (DockState)int.Parse(child.GetAttribute("DockState"), CultureInfo.InvariantCulture); float splitterValue = float.Parse(child.GetAttribute("SplitterValue"), CultureInfo.InvariantCulture); var p = panel.CreateChildPanel(state, splitterValue); LoadPanel(child, p); // Check if panel has no docked window (due to loading problems or sth) if (p.TabsCount == 0 && p.ChildPanelsCount == 0) { // Remove empty panel Editor.LogWarning("Empty panel inside layout."); p.RemoveIt(); } } } panel.SelectTab(selectedTab); }