private ShQuestion _Question; //reference to question //constructor //declares with an empty list for Answers public ShGroup(ShQuestion ref_question, string new_text) { Text = new_text; Correct = true; GroupBonus = 0; _Question = ref_question; Answers = new List <ShAnswer>(ref_question.Game.Players.Count); }
//nicely delete a question public void NiceDeleteQuestion(ShQuestion que) { foreach (ShGroup grp in que.Groups) { foreach (ShAnswer ans in grp.Answers) { ans.Player.Answers.Remove(ans); } grp.Answers.Clear(); } que.Groups.Clear(); Questions.Remove(que); }
//nicely add a question, giving each player a blank answer //and making one group public ShQuestion NiceAddQuestion(string qtxt) { ShQuestion newQ = new ShQuestion(this, qtxt); Questions.Add(newQ); if (Players.Count > 0) { ShGroup newG = new ShGroup(newQ, "(blank)"); newQ.Groups.Add(newG); foreach (ShPlayer ply in Players) { ShAnswer newA = new ShAnswer(newG, ply, "(blank)"); ply.Answers.Add(newA); newG.Answers.Add(newA); } } return(newQ); }
//Redraw all current groups/answers on the listview private void redrawTreeView() { treeView1.Nodes.Clear(); //give instructions if no questions loaded if (sg == null || sg.Questions.Count == 0) { label_question.Text = "Click " + sheepToolStripMenuItem.Text + " > " + editQuestionsToolStripMenuItem.Text + " to begin."; return; } //make sure we're on a valid question if (cur_q_index > sg.Questions.Count - 1) { cur_q_index = sg.Questions.Count - 1; } if (cur_q_index < 0) { cur_q_index = 0; } ShQuestion curQuestion = sg.Questions[cur_q_index]; //make sure the updown and label is right numericUpDown_question.Minimum = 1; numericUpDown_question.Maximum = sg.Questions.Count; label_question.Text = curQuestion.Text; //give instructions if no players loaded if (sg.Players.Count == 0) { treeView1.Nodes.Add("Click " + sheepToolStripMenuItem.Text + " > " + addRemovePlayersToolStripMenuItem.Text + " to add entries."); return; } TreeNode curGroup; TreeNode curItem; //loop through each group //text will be added later so don't bother with it in this function foreach (ShGroup grp in curQuestion.Groups) { //add group to listview. //use tag to keep track of group curGroup = new TreeNode(""); curGroup.Tag = grp; treeView1.Nodes.Add(curGroup); //add each player's answer to listview. //use tag to keep track of answer foreach (ShAnswer ans in grp.Answers) { curItem = new TreeNode(""); curItem.Tag = ans; curGroup.Nodes.Add(curItem); } //alternate colors each group //curGroup.Expand(); } treeView1.TreeViewNodeSorter = new TreeNodeSorter(); SetTextForAllTreenodes(); }
//main drag/drop function private void treeView1_DragDrop(object sender, DragEventArgs e) { //stop sorting while dragging treeView1.TreeViewNodeSorter = null; Point cp = treeView1.PointToClient(new Point(e.X, e.Y)); TreeNode destNode = treeView1.GetNodeAt(cp); //don't continue if not a valid node if (!e.Data.GetDataPresent(typeof(TreeNode))) { return; } // treeView1.BeginUpdate(); TreeNode movingNode = (TreeNode)e.Data.GetData(typeof(TreeNode)); TreeNode prevParent, newParent; ShQuestion curQuestion = sg.Questions[cur_q_index]; //different code depending on what type of thing we're dragging/dragging to if (movingNode.Tag.GetType() == typeof(ShAnswer) && destNode.Tag.GetType() == typeof(ShAnswer)) { //moving an answer to another answer ShAnswer ansToMove = (ShAnswer)movingNode.Tag; ShAnswer destAnswer = (ShAnswer)destNode.Tag; ansToMove.ChangeGroup(destAnswer.Group); prevParent = movingNode.Parent; newParent = destNode.Parent; prevParent.Nodes.Remove(movingNode); newParent.Nodes.Add(movingNode); } else if (movingNode.Tag.GetType() == typeof(ShAnswer) && destNode.Tag.GetType() == typeof(ShGroup)) { //moving an answer to another group ShAnswer ansToMove = (ShAnswer)movingNode.Tag; ShGroup destGroup = (ShGroup)destNode.Tag; ansToMove.ChangeGroup(destGroup); prevParent = movingNode.Parent; newParent = destNode; prevParent.Nodes.Remove(movingNode); newParent.Nodes.Add(movingNode); } else if (movingNode.Tag.GetType() == typeof(ShGroup) && destNode.Tag.GetType() == typeof(ShAnswer)) { //moving a group to an answer ShGroup grpToMove = (ShGroup)movingNode.Tag; ShAnswer destAnswer = (ShAnswer)destNode.Tag; grpToMove.MergeToGroup(destAnswer.Group); prevParent = movingNode; newParent = destNode.Parent; List <TreeNode> ansNodes = new List <TreeNode>(prevParent.Nodes.Cast <TreeNode>()); foreach (TreeNode nod in ansNodes) { prevParent.Nodes.Remove(nod); newParent.Nodes.Add(nod); } } else if (movingNode.Tag.GetType() == typeof(ShGroup) && destNode.Tag.GetType() == typeof(ShGroup)) { //moving a group to a group ShGroup grpToMove = (ShGroup)movingNode.Tag; ShGroup destGroup = (ShGroup)destNode.Tag; grpToMove.MergeToGroup(destGroup); prevParent = movingNode; newParent = destNode; List <TreeNode> ansNodes = new List <TreeNode>(prevParent.Nodes.Cast <TreeNode>()); foreach (TreeNode nod in ansNodes) { prevParent.Nodes.Remove(nod); newParent.Nodes.Add(nod); } } else { treeView1.EndUpdate(); return; } //if prevParent is empty, delete it if (prevParent.Nodes.Count == 0) { prevParent.Remove(); } SetTextForAllTreenodes(); sheep_modified = true; treeView1.EndUpdate(); }