/// <summary> /// 删除节点 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 除节点ToolStripMenuItem_Click(object sender, EventArgs e) { if (iSelectedControlNow != null) { IDialoguePointID iDialoguePointID = iSelectedControlNow as IDialoguePointID; Control parentControl = iSelectedControlNow.GetParent(); if (iDialoguePointID.GetType().Equals(typeof(DialogueConditionControl))) { FlowLayoutPanel_Main.Controls.Remove(parentControl); iSelectedControlNow = null; } else { DialogueConditionControl dialogueConditionControl = parentControl.Controls.OfType <DialogueConditionControl>().FirstOrDefault(); if (dialogueConditionControl != null) { IDialoguePointID parentIDialoguePointID = GetParentDialoguePointID(iDialoguePointID, dialogueConditionControl); if (parentIDialoguePointID != null) { parentIDialoguePointID.RemovNextPointID(iDialoguePointID); RemoveDialoguePointIDControl(parentControl, iDialoguePointID); List <Control> tagControlList = (parentIDialoguePointID as Control).Tag as List <Control>; if (tagControlList != null) { tagControlList.Remove(iDialoguePointID as Control); } //移除所有子节点 iSelectedControlNow = null; ResetControlRect(parentControl); } } } } }
/// <summary> /// 创建一个顶级节点 /// </summary> /// <param name="conditionData">关系数据</param> /// <param name="updateControl">是否立即更新</param> private DialogueConditionControl CreateNewTopNode(DialogueCondition conditionData = null, bool updateControl = true) { Panel p = new Panel(); FlowLayoutPanel_Main.Controls.Add(p); DialogueConditionControl dialogueConditionControl = new DialogueConditionControl(conditionData); dialogueConditionControl.Size = dialogueConditionControl.StopSize; dialogueConditionControl.SetListenControlSelected(ListenControlSelected); dialogueConditionControl.SetLiestenOpenStop(AddListenOpenStop); dialogueConditionControl.Tag = new List <Control>(); p.Controls.Add(dialogueConditionControl); p.Paint += (sender, e) => { Graphics g = e.Graphics; g.Clear(p.BackColor); //绘制连接线 Pen pen = new Pen(Color.Red); foreach (Control control in p.Controls.OfType <Control>()) { if (control.Tag == null) { continue; } Size parentSize = control.Size; Point parentLocation = control.Location; List <Control> childControls = control.Tag as List <Control>; if (parentLocation.X >= 0 && parentLocation.Y >= 0) { foreach (Control childControl in childControls) { Size childSize = childControl.Size; Point childLocation = childControl.Location; if (childLocation.X >= 0 && childLocation.Y >= 0) { g.DrawBezier(pen, new Point(parentLocation.X + parentSize.Width, parentLocation.Y + parentSize.Height / 2), new Point(parentLocation.X + parentSize.Width + 20, parentLocation.Y + parentSize.Height / 2), new Point(childLocation.X - 20, childLocation.Y + childSize.Height / 2), new Point(childLocation.X, childLocation.Y + childSize.Height / 2)); } } } } }; if (updateControl) { ResetControlRect(p); } if (searchNodeForm != null) { searchNodeForm.NodeChanged = true; } return(dialogueConditionControl); }
/// <summary> /// 将panel的数据设置到TreeNode中 /// </summary> /// <param name="treeNode">树节点</param> /// <param name="panel">对应的panel</param> private void SetPanelToTreeNode(TreeNode treeNode, Panel panel) { treeNode.Tag = panel; DialogueConditionControl dialogueConditionControl = panel.Controls.OfType <DialogueConditionControl>().FirstOrDefault(); DialogueCondition dialogueCondition = dialogueConditionControl.GetDialogueCondition(); treeNode.Text = "Text:[" + dialogueCondition.text + "];Type:[" + dialogueCondition.enumDialogueType + "]"; if (dialogueConditionControl.Tag != null && (dialogueConditionControl.Tag as List <Control>) != null && (dialogueConditionControl.Tag as List <Control>).Count > 0) { SetControlToTreeNode(treeNode, (dialogueConditionControl.Tag as List <Control>).ToArray()); } }
/// <summary> /// 根据现有数据创建控件 /// </summary> private void CreateControlByData() { int[] dialogueConditionIDs = dialogueAnalysisData.GetDialogueConditionAllID; foreach (int dialogueConditionID in dialogueConditionIDs) { DialogueCondition dialogueCondition = dialogueAnalysisData.GetDialogueConditionIDByID(dialogueConditionID); if (dialogueCondition == null) { continue; } DialogueConditionControl dialogueConditionControl = CreateNewTopNode(dialogueCondition, false); DialoguePoint dialoguePoint = dialogueCondition.topPoint; CreateControlByData(dialogueConditionControl, dialoguePoint); ResetControlRect(dialogueConditionControl.Parent); dialogueConditionControl.Parent.Refresh(); } ResetBackRect(); }
/// <summary> /// 将选择的控件移动到父控件指定位置以显示控件 /// </summary> /// <param name="panel">选择显示的控件</param> private void ShowSearchPanel(Panel panel) { if (panel != null) { int locationY = panel.Location.Y; int allHeight = FlowLayoutPanel_Main.Size.Height; int windowHeigth = Panel_Main.Size.Height; float bili = (float)locationY / (float)allHeight; Panel_Main.VerticalScroll.Value = (int)(Panel_Main.VerticalScroll.Maximum * bili); Panel_Main.VerticalScroll.Value = (int)(Panel_Main.VerticalScroll.Maximum * bili); DialogueConditionControl dialogueConditionControl = panel.Controls.OfType <DialogueConditionControl>().FirstOrDefault(); if (dialogueConditionControl != null) { if (iSelectedControlNow != null) { iSelectedControlNow.NoSelectedControl(); } dialogueConditionControl.SelectedControl(); iSelectedControlNow = dialogueConditionControl; } } }
/// <summary> /// 保存方案 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 保存方案ToolStripMenuItem_Click(object sender, EventArgs e) { //重建对话关系数据集合以及对话数据字典 List <DialogueCondition> dialogueConditionList = new List <DialogueCondition>(); Dictionary <int, DialogueValue> dialogueValueDic = new Dictionary <int, DialogueValue>(); foreach (Panel panel in FlowLayoutPanel_Main.Controls.OfType <Panel>()) { DialogueConditionControl dialogueConditionContorl = panel.Controls.OfType <DialogueConditionControl>().FirstOrDefault(); if (dialogueConditionContorl == null) { continue; } //对话条件 DialogueCondition dialogueCondition = dialogueConditionContorl.GetDialogueCondition(); //对话关系 if (dialogueConditionContorl.Tag != null && dialogueConditionContorl.Tag.GetType().Equals(typeof(List <Control>)) && (dialogueConditionContorl.Tag as List <Control>).Count > 0) { List <Control> childControlList = dialogueConditionContorl.Tag as List <Control>; DialoguePointControl topPointControl = childControlList[0] as DialoguePointControl; if (topPointControl != null) { DialoguePoint topPoint = new DialoguePoint(); topPoint.dialogueID = topPointControl.GetDialogueValue().dialogueID; if (childControlList[0].Tag != null && childControlList[0].Tag.GetType().Equals(typeof(List <Control>)) && (childControlList[0].Tag as List <Control>).Count > 0) { SetDialoguePointData_Child(topPoint, (childControlList[0].Tag as List <Control>).ToArray()); } dialogueCondition.topPoint = topPoint; } } else { dialogueCondition.topPoint = null; } dialogueConditionList.Add(dialogueCondition); //对话数据 foreach (DialoguePointControl dialoguePointControl in panel.Controls.OfType <DialoguePointControl>()) { DialoguePointControl topPointControl = dialoguePointControl as DialoguePointControl; if (topPointControl != null) { if (!dialogueValueDic.ContainsKey(topPointControl.GetDialogueValue().dialogueID)) { dialogueValueDic.Add(topPointControl.GetDialogueValue().dialogueID, topPointControl.GetDialogueValue()); } } } } dialogueAnalysisData.ResetData(dialogueConditionList, dialogueValueDic); string dialogueConditionStr, dialogueValueStr; dialogueAnalysisData.GetData(out dialogueConditionStr, out dialogueValueStr); //保存 string folderPath = Path.GetDirectoryName(projectPath); File.WriteAllText(folderPath + "\\" + dialogueConditionFileName + ".txt", dialogueConditionStr, Encoding.UTF8); File.WriteAllText(folderPath + "\\" + dialogueValueFileName + ".txt", dialogueValueStr, Encoding.UTF8); }
/// <summary> /// 重新设置控件尺寸 /// </summary> /// <param name="parent"></param> private void ResetControlRect(Control parent) { if (parent == null) { return; } try { DialogueConditionControl topControl = parent.Controls.OfType <DialogueConditionControl>().FirstOrDefault(); #region 构建一个深度结构并计算 //初步构建 List <IDialoguePointID> nextChilds = new List <IDialoguePointID>(); List <List <DeepControlStruct> > deepControlStructLists = new List <List <DeepControlStruct> >(); int tempDeep = 0; nextChilds.Add(topControl); while (nextChilds.Count > 0) { IDialoguePointID[] tempChilds = nextChilds.ToArray(); nextChilds.Clear(); if (deepControlStructLists.Count == tempDeep) { List <DeepControlStruct> deepControlStructList = new List <DeepControlStruct>(); deepControlStructLists.Add(deepControlStructList); deepControlStructList.AddRange(tempChilds.Select(temp => new DeepControlStruct() { deep = tempDeep, iOpenStop = temp as IOpenStop, childs = new List <DeepControlStruct>() })); } foreach (IDialoguePointID tempChild in tempChilds) { IOpenStop iOpenStop = tempChild as IOpenStop; if (iOpenStop != null && iOpenStop.OpenStopState) //如果该节点是展开节点并且该节点时展开的 { nextChilds.AddRange(tempChild.GetDialogueNextPointID); //用于下次计算 } } tempDeep++; } //计算父子关系 for (int i = 0; i < deepControlStructLists.Count - 1; i++) { foreach (DeepControlStruct deepControlStruct in deepControlStructLists[i]) { IDialoguePointID iDialoguePointID = deepControlStruct.iOpenStop as IDialoguePointID; IDialoguePointID[] childIDialoguePointIDs = iDialoguePointID.GetDialogueNextPointID; DeepControlStruct[] childs = deepControlStructLists[i + 1].Where(temp => childIDialoguePointIDs.Contains(temp.iOpenStop as IDialoguePointID)).ToArray(); foreach (DeepControlStruct child in childs) { child.parent = deepControlStruct; deepControlStruct.childs.Add(child); } } } //初始化对象的BoundY foreach (DeepControlStruct deepControlStruct in deepControlStructLists[0]) { deepControlStruct.InitBoundY(); } //计算每个节点的x轴坐标 int tempLocationX = 0; for (int i = 0; i < deepControlStructLists.Count; i++) { int maxLocationX = 0; foreach (DeepControlStruct deepControlStruct in deepControlStructLists[i]) { deepControlStruct.location_x = tempLocationX; int thisWidth = deepControlStruct.iOpenStop.OpenStopState ? deepControlStruct.iOpenStop.OpenSize.Width : deepControlStruct.iOpenStop.StopSize.Width; maxLocationX = maxLocationX > thisWidth ? maxLocationX : thisWidth; } tempLocationX += maxLocationX + 50; } //计算每个节点的y轴坐标 foreach (List <DeepControlStruct> deepControlStructList in deepControlStructLists) { int tempY = 0; DeepControlStruct parentDeep = null; foreach (DeepControlStruct deepControlStruct in deepControlStructList) { if (deepControlStruct.parent == null) { deepControlStruct.location_y = tempY; tempY += deepControlStruct.boundY; } else { if (parentDeep != deepControlStruct.parent) { tempY = 0; parentDeep = deepControlStruct.parent; } deepControlStruct.location_y = parentDeep.location_y + tempY; tempY += deepControlStruct.boundY; } } } //设置父控件大小 List <int> deepWidthList = new List <int>(); deepWidthList = deepControlStructLists.Select(temp => temp.Select(deepControl => deepControl.iOpenStop). Select(iOpenStop => iOpenStop.OpenStopState ? iOpenStop.OpenSize.Width : iOpenStop.StopSize.Width). Max() + 50 ).ToList(); int panelWidth = deepWidthList.Sum(); int panelHeight = deepControlStructLists[0].Select(temp => temp.boundY).Sum(); parent.Size = new Size(panelWidth, panelHeight); //设置每个节点的大小以及隐藏节点的位置与大小 Action <IDialoguePointID> HideChild = null;//隐藏子节点 HideChild = (target) => { IDialoguePointID[] childs = target.GetDialogueNextPointID; foreach (IDialoguePointID child in childs) { (child as Control).Location = new Point(-1000, -1000); HideChild(child); } }; foreach (List <DeepControlStruct> deepControlStructList in deepControlStructLists) { foreach (DeepControlStruct deepControlStruct in deepControlStructList) { Control thisControl = deepControlStruct.iOpenStop as Control; thisControl.Location = new Point(deepControlStruct.location_x, deepControlStruct.location_y); thisControl.Size = deepControlStruct.iOpenStop.OpenStopState ? deepControlStruct.iOpenStop.OpenSize : deepControlStruct.iOpenStop.StopSize; if (!deepControlStruct.iOpenStop.OpenStopState) { HideChild(deepControlStruct.iOpenStop as IDialoguePointID); } } } //重置背景控件大小 ResetBackRect(); #endregion } catch { } }