Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/12/12 23:04:40 (11 years ago)
Author:
bburlacu
Message:

#1763: Fixed chart visual node coloring issues and some corner-case tree editing bugs.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/InteractiveSymbolicExpressionTreeChart.cs

    r9006 r9043  
    2929namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Views {
    3030  internal delegate void
    31   ModifyTree(ISymbolicExpressionTree tree, ISymbolicExpressionTreeNode node, ISymbolicExpressionTreeNode oldChild, ISymbolicExpressionTreeNode newChild,
    32              bool removeSubtree = true);
     31  ModifyTree(ISymbolicExpressionTree tree, ISymbolicExpressionTreeNode node, ISymbolicExpressionTreeNode oldChild, ISymbolicExpressionTreeNode newChild, bool removeSubtree = true);
    3332
    3433  internal sealed partial class InteractiveSymbolicExpressionTreeChart : SymbolicExpressionTreeChart {
    3534    private ISymbolicExpressionTreeNode tempNode; // node in clipboard (to be cut/copy/pasted etc)
    3635    private VisualSymbolicExpressionTreeNode currSelected; // currently selected node
    37     public enum EditOp { NoOp, CopySubtree, CutSubtree, ChangeNode, InsertNode, InsertSubtree, RemoveNode, RemoveSubtree }
     36    private enum EditOp { NoOp, CopySubtree, CutSubtree }
    3837    private EditOp lastOp = EditOp.NoOp;
    3938
     
    5251      var ea = new MouseEventArgs(MouseButtons.Left, 1, point.X, point.Y, 0);
    5352      var visualNode = FindVisualSymbolicExpressionTreeNodeAt(ea.X, ea.Y);
    54       if (visualNode != null) { OnSymbolicExpressionTreeNodeClicked(visualNode, ea); };
     53      if (visualNode != null) {
     54        OnSymbolicExpressionTreeNodeClicked(visualNode, ea);
     55      } else {
     56        currSelected = null;
     57      }
    5558
    5659      if (currSelected == null) {
     
    7679
    7780    protected override void OnSymbolicExpressionTreeNodeClicked(object sender, MouseEventArgs e) {
    78       var visualTreeNode = (VisualSymbolicExpressionTreeNode)sender;
    79       var lastSelected = currSelected;
    80       currSelected = visualTreeNode;
    8181      if (currSelected != null) {
    82         currSelected.LineColor = Color.LightGreen;
     82        currSelected.LineColor = Color.FromArgb(255, currSelected.LineColor);
    8383        RepaintNode(currSelected);
    8484      }
    85       if (lastSelected != null)
    86         base.OnSymbolicExpressionTreeNodeClicked(lastSelected, e);
     85      currSelected = (VisualSymbolicExpressionTreeNode)sender; ;
     86      if (currSelected != null) {
     87        currSelected.LineColor = Color.FromArgb(130, currSelected.LineColor);
     88        RepaintNode(currSelected);
     89      }
     90    }
     91
     92    protected override void SymbolicExpressionTreeChart_MouseClick(object sender, MouseEventArgs e) {
     93      var visualTreeNode = FindVisualSymbolicExpressionTreeNodeAt(e.X, e.Y);
     94      if (visualTreeNode != null) {
     95        OnSymbolicExpressionTreeNodeClicked(visualTreeNode, e);
     96      } else if (currSelected != null) {
     97        currSelected.LineColor = Color.FromArgb(255, currSelected.LineColor);
     98        RepaintNode(currSelected);
     99        currSelected = null;
     100      }
    87101    }
    88102
     
    124138      currSelected = null;
    125139    }
    126 
    127140    private void changeNodeToolStripMenuItem_Click(object sender, EventArgs e) {
    128141      if (currSelected == null) return;
     
    150163      currSelected = null;
    151164    }
    152 
    153165    private void cutToolStripMenuItem_Click(object sender, EventArgs e) {
    154166      lastOp = EditOp.CutSubtree;
     167      copySubtree();
     168    }
     169    private void copyToolStripMenuItem_Click(object sender, EventArgs e) {
     170      lastOp = EditOp.CopySubtree;
     171      copySubtree();
     172    }
     173    private void copySubtree() {
    155174      if (tempNode != null) {
    156175        foreach (var subtree in tempNode.IterateNodesBreadth()) {
    157176          var vNode = GetVisualSymbolicExpressionTreeNode(subtree);
    158           base.OnSymbolicExpressionTreeNodeClicked(vNode, null);
     177          vNode.LineColor = Color.FromArgb(255, vNode.LineColor); // reset the alpha value to 255
    159178          if (subtree.Parent != null) {
    160179            var vArc = GetVisualSymbolicExpressionTreeNodeConnection(subtree.Parent, subtree);
    161             vArc.LineColor = Color.Black;
     180            vArc.LineColor = Color.FromArgb(255, vArc.LineColor);
    162181          }
    163182        }
     
    166185      foreach (var node in tempNode.IterateNodesPostfix()) {
    167186        var visualNode = GetVisualSymbolicExpressionTreeNode(node);
    168         visualNode.LineColor = Color.LightGray;
    169         visualNode.TextColor = Color.LightGray;
    170         if (node.SubtreeCount > 0) {
    171           foreach (var subtree in node.Subtrees) {
    172             var visualLine = GetVisualSymbolicExpressionTreeNodeConnection(node, subtree);
    173             visualLine.LineColor = Color.LightGray;
    174           }
    175         }
    176       }
    177       currSelected = null;
    178       Repaint();
    179     }
    180     private void copyToolStripMenuItem_Click(object sender, EventArgs e) {
    181       lastOp = EditOp.CopySubtree;
    182       if (tempNode != null) {
    183         foreach (var subtree in tempNode.IterateNodesBreadth()) {
    184           var vNode = GetVisualSymbolicExpressionTreeNode(subtree);
    185           base.OnSymbolicExpressionTreeNodeClicked(vNode, null);
    186           if (subtree.Parent != null) {
    187             var vArc = GetVisualSymbolicExpressionTreeNodeConnection(subtree.Parent, subtree);
    188             vArc.LineColor = Color.Black;
    189           }
    190         }
    191       }
    192       tempNode = currSelected.SymbolicExpressionTreeNode;
    193       foreach (var node in tempNode.IterateNodesPostfix()) {
    194         var visualNode = GetVisualSymbolicExpressionTreeNode(node);
    195         visualNode.LineColor = Color.LightGray;
    196         visualNode.TextColor = Color.LightGray;
    197         if (node.SubtreeCount <= 0) continue;
     187        visualNode.LineColor = Color.FromArgb(100, visualNode.LineColor);
     188        visualNode.TextColor = Color.FromArgb(100, visualNode.TextColor);
    198189        foreach (var subtree in node.Subtrees) {
    199190          var visualLine = GetVisualSymbolicExpressionTreeNodeConnection(node, subtree);
    200           visualLine.LineColor = Color.LightGray;
     191          visualLine.LineColor = Color.FromArgb(100, visualLine.LineColor);
    201192        }
    202193      }
     
    205196    }
    206197    private void removeNodeToolStripMenuItem_Click(object sender, EventArgs e) {
    207       lastOp = EditOp.RemoveNode;
    208198      var node = currSelected.SymbolicExpressionTreeNode;
    209199      ModifyTree(Tree, node.Parent, node, null, removeSubtree: false);
     
    211201    }
    212202    private void removeSubtreeToolStripMenuItem_Click(object sender, EventArgs e) {
    213       lastOp = EditOp.RemoveNode;
    214203      var node = currSelected.SymbolicExpressionTreeNode;
    215204      ModifyTree(Tree, node.Parent, node, null, removeSubtree: true);
     
    227216      switch (lastOp) {
    228217        case EditOp.CutSubtree: {
     218            if (tempNode.IterateNodesBreadth().Contains(node))
     219              goto case EditOp.CopySubtree; // a subtree cannot be cut/pasted onto itself
    229220            ModifyTree(Tree, tempNode.Parent, tempNode, null); //remove node from its original parent
    230             ModifyTree(Tree, node, null, tempNode);//insert it as a child to the new parent
     221            ModifyTree(Tree, node, null, tempNode); //insert it as a child to the new parent
    231222            lastOp = EditOp.CopySubtree; //do this so the next paste will actually perform a copy   
    232223            break;
     
    241232      }
    242233      currSelected = null; // because the tree will have changed
     234      tempNode = null; // clear the clipboard after one paste
    243235    }
    244236  }
Note: See TracChangeset for help on using the changeset viewer.