private void onUINodeToggleChange(object sender, NodeToggleChangeEventArgs e) { UIElement element = e.Node.DataKey as UIElement; if (element != null) { m_layout_mng.CurEditLayout.SetDirty(); CmdManager.Instance.AddCmd(new UITreeNodePropChangeCmd(element, e.Node, e.Toggle, m_layout_mng.CurEditLayout)); } }
private void onLayoutNodeToggleChange(object sender, NodeToggleChangeEventArgs e) { int index = (int)e.Node.DataKey; switch (e.Toggle) { case "可见": if (m_layout_mng.CurEditLayoutIndex == index) { Debug.Log("处于编辑状态的layout不可设置为不可见!"); e.Cancel = true; } else { m_layout_mng.SetLayoutVisible(index, e.Node.ToggleList["可见"]); RequestRepaint(); //CmdManager.Instance.AddCmd(new LayoutTreeNodeVisibleChangeCmd(index, e.Node, m_layout_mng)); } break; case "编辑": if (m_layout_mng.CurEditLayoutIndex == index) { e.Cancel = true; } else { if (m_layout_mng.CurEditLayout.Dirty) { switch (EditorUtility.DisplayDialogComplex("", "当前编辑的layout已被修改,是否保存?", "是", "否", " 取消")) { // 是 case 0: Layout cur_layout = m_layout_mng.CurEditLayout; if (cur_layout != null) { cur_layout.Save(); } ClearUndos(); m_layout_mng.SetLayoutVisible(index, true); m_layout_mng.SetCurEditLayout(index); ResetLayoutTree(); ResetUITree(); RequestRepaint(); break; // 否 case 1: ClearUndos(); m_layout_mng.CurEditLayout.Reload(); m_layout_mng.SetLayoutVisible(index, true); m_layout_mng.SetCurEditLayout(index); ResetLayoutTree(); ResetUITree(); RequestRepaint(); break; // 取消 case 2: e.Cancel = true; break; default: break; } } else { m_layout_mng.SetCurEditLayout(index); m_layout_mng.SetLayoutVisible(index, true); ResetLayoutTree(); ResetUITree(); RequestRepaint(); } } break; default: break; } }
private void DrawNode(TreeNode node) { if (node == null) { return; } GUIStyle foldoutStyle = null; GUIStyle labelStyle = null; if (!node.UseDefaultColor) { foldoutStyle = node.FoldoutStyle; labelStyle = node.LabelStyle; } else { foldoutStyle = _foldoutStyle; labelStyle = _labelStyle; } if (node.selected) { GUILayout.BeginHorizontal(_marginStyle); } else { GUILayout.BeginHorizontal(); } bool childrenAllHide = true; foreach (TreeNode child in node.Children) { if (!child.Hide) { childrenAllHide = false; break; } } bool showAsLabel = node.Children.Count == 0 || (HideFoldOutWhenAllChildrenHide && childrenAllHide); GUILayout.Space(showAsLabel ? 12 + 16 * node.getLayerLevel() : 16 * node.getLayerLevel()); if (showAsLabel) { EditorGUILayout.LabelField(node.NodeName, labelStyle, GUILayout.Width(labelStyle.CalcSize(new GUIContent(node.NodeName)).x)); } else { node.Foldout = EditorGUILayout.Foldout(node.Foldout, node.NodeName, foldoutStyle); } if (Event.current.type == EventType.repaint) { node.x = GUILayoutUtility.GetLastRect().x + (node.Children.Count == 0 ? 0 : 12); } GUILayout.FlexibleSpace(); if (Event.current.type == EventType.repaint) { node.xMax = GUILayoutUtility.GetLastRect().width + GUILayoutUtility.GetLastRect().x; } if (node.ToggleList != null && node.ToggleList.Count > 0) { List <string> toggles = new List <string>(); foreach (string toggleName in node.ToggleList.Keys) { toggles.Add(toggleName); } foreach (string toggleName in toggles) { bool b = node.ToggleList[toggleName]; node.ToggleList[toggleName] = GUILayout.Toggle(b, toggleName, _toggleStyle); NodeToggleChangeEventArgs arg = new NodeToggleChangeEventArgs(node, toggleName); if (b != node.ToggleList[toggleName] && OnNodeToggleChange != null) { OnNodeToggleChange(this, arg); if (arg.Cancel) { node.ToggleList[toggleName] = b; } } } } if (Event.current.type == EventType.repaint) { node.y = GUILayoutUtility.GetLastRect().y; } if (Event.current.type == EventType.repaint) { node.yMax = GUILayoutUtility.GetLastRect().yMax; } bool inThisNode = Event.current.mousePosition.x < node.xMax && Event.current.mousePosition.y <= node.yMax && Event.current.mousePosition.y >= node.y; if (findNodeToScroll && !hasFoundNodeToScroll && nodeToScroll.Contains(node)) { hasFoundNodeToScroll = true; yToScroll = node.y; } if (!multiSelEnd && leftDown && node.selected && Event.current.type == EventType.repaint && shiftDown && !mutilSelectDown) { if (!inShiftSelRange) { inShiftSelRange = true; } else { foreach (TreeNode n in multiSelCache) { n.selected = true; if (selectChangeDic.ContainsKey(n)) { selectChangeDic.Remove(n); } else { selectChangeDic.Add(n, true); } } multiSelCache.Clear(); } } else if (!inThisNode && !multiSelEnd && leftDown && inShiftSelRange && !mutilSelectDown && shiftDown && Event.current.type == EventType.repaint) { if (!node.selected) { multiSelCache.Add(node); } } if (!inThisNode && multiSelEnd && inShiftSelRange && leftDown && /*node == lastSelNode*/ node.selected && Event.current.type == EventType.repaint && shiftDown && !mutilSelectDown) { if (selectChangeDic.ContainsKey(node)) { selectChangeDic[node] = false; } else { selectChangeDic.Add(node, false); } } if ((leftDown || rightUp) && inThisNode && Event.current.type == EventType.repaint) { if (!ctrlDown && !shiftDown) { singleSelectNode(node); } else if (!mutilSelectDown && ctrlDown) { multiSelectNode(node); } else if (!mutilSelectDown && shiftDown && !multiSelEnd) { if (!node.selected) { multiSelCache.Add(node); } if (inShiftSelRange) { multiSelEnd = true; foreach (TreeNode n in multiSelCache) { n.selected = true; if (selectChangeDic.ContainsKey(n)) { selectChangeDic.Remove(n); } else { selectChangeDic.Add(n, true); } } multiSelCache.Clear(); } else { inShiftSelRange = true; } } if (!shiftDown) { curNode = node; } if (leftDown && nodeToRenameList.Contains(node) && Event.current.mousePosition.x > node.x && !ctrlDown && !shiftDown) { nodeToRename = node; } } if (rightUp && inThisNode) { menuNode = node; } if (leftUp && curNode != null) { if (inThisNode) { dragDestNode = node; } } GUILayout.EndHorizontal(); if (node.Foldout) { foreach (TreeNode subNode in node.Children) { if (!subNode.Hide) { DrawNode(subNode); } } } }