Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
09/14/08 10:13:32 (16 years ago)
Author:
gkronber
Message:

implemented 'brushing' and cleaned up code a little bit. #270 (Selection of multiple points)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.CEDMA.Charting/BubbleChart.cs

    r562 r566  
    5252    private ResultList results;
    5353    private Dictionary<IPrimitive, Record> primitiveToRecordDictionary;
     54    private Dictionary<Record, IPrimitive> recordToPrimitiveDictionary;
    5455    private Random random = new Random();
    5556    private Group points;
     
    5960      records = new List<Record>();
    6061      primitiveToRecordDictionary = new Dictionary<IPrimitive, Record>();
     62      recordToPrimitiveDictionary = new Dictionary<Record, IPrimitive>();
    6163      this.results = results;
     64      foreach(Record r in results.Records) {
     65        records.Add(r);
     66        r.OnSelectionChanged += new EventHandler(Record_OnSelectionChanged);
     67      }
    6268      results.OnRecordAdded += new EventHandler<RecordAddedEventArgs>(results_OnRecordAdded);
     69      results.Changed += new EventHandler(results_Changed);
     70    }
     71
     72    void results_Changed(object sender, EventArgs e) {
     73      Repaint();
     74      EnforceUpdate();
    6375    }
    6476
     
    7688    void Record_OnSelectionChanged(object sender, EventArgs e) {
    7789      Record r = (Record)sender;
    78       foreach(KeyValuePair<IPrimitive, Record> pair in primitiveToRecordDictionary) {
    79         if(pair.Value == r) {
    80           IPrimitive primitive = pair.Key;
    81           if(r.Selected) {
    82             int alpha = primitive.Pen.Color.A;
    83             primitive.Pen.Color = Color.FromArgb(alpha, selectionColor);
    84             primitive.Brush = primitive.Pen.Brush;
    85             primitive.IntoForeground();
    86           } else {
    87             int alpha = primitive.Pen.Color.A;
    88             primitive.Pen.Color = Color.FromArgb(alpha, defaultColor);
    89             primitive.Brush = primitive.Pen.Brush;
    90             primitive.IntoBackground();
    91           }
    92           primitive.EnforceUpdate();
    93         }
    94       }
    95     }
    96 
    97     //public void AddDimension(string name) {
    98     //  dimensions.Add(name);
    99     //  values.Add(name, new List<double>());
    100     //}
    101     //public void RemoveDimension(string name) {
    102     //  dimensions.Remove(name);
    103     //  values.Remove(name);
    104     //}
    105 
    106     //public void AddDataPoint(string dimension, double value) {
    107     //  values[dimension].Add(value);
    108     //}
     90      IPrimitive primitive;
     91      recordToPrimitiveDictionary.TryGetValue(r, out primitive);
     92      if(primitive != null) {
     93        ((FixedSizeCircle)primitive).UpdateEnabled = false;
     94        points.UpdateEnabled = false;
     95        if(r.Selected) {
     96          int alpha = primitive.Pen.Color.A;
     97          primitive.Pen.Color = Color.FromArgb(alpha, selectionColor);
     98          primitive.Brush = primitive.Pen.Brush;
     99          primitive.IntoForeground();
     100        } else {
     101          int alpha = primitive.Pen.Color.A;
     102          primitive.Pen.Color = Color.FromArgb(alpha, defaultColor);
     103          primitive.Brush = primitive.Pen.Brush;
     104          primitive.IntoBackground();
     105        }
     106        ((FixedSizeCircle)primitive).UpdateEnabled = true;
     107        points.UpdateEnabled = true;
     108      }
     109    }
    109110
    110111    public void SetBubbleSizeDimension(string dimension, bool inverted) {
     
    133134
    134135    private void Repaint() {
     136      if(xDimension == null || yDimension == null) return;
    135137      lock(records) {
    136138        double maxSize = 1;
     
    144146        Group.Clear();
    145147        primitiveToRecordDictionary.Clear();
     148        recordToPrimitiveDictionary.Clear();
    146149        points = new Group(this);
    147150        Group.Add(new Axis(this, 0, 0, AxisType.Both));
    148151        UpdateViewSize(0, 0, 5);
    149152        foreach(Record r in records) {
    150           double x = r.Get(xDimension) + (random.NextDouble() * 2.0 - 1.0) * xJitterFactor;
    151           double y = r.Get(yDimension) + (random.NextDouble() * 2.0 - 1.0) * yJitterFactor;
     153          double x = r.Get(xDimension) + r.Get(Record.X_JITTER) * xJitterFactor;
     154          double y = r.Get(yDimension) + r.Get(Record.Y_JITTER) * yJitterFactor;
    152155          int size = CalculateSize(r.Get(sizeDimension), minSize, maxSize);
    153156
     
    157160            UpdateViewSize(x, y, size);
    158161            int alpha = CalculateAlpha(size);
    159             Pen pen = new Pen(Color.FromArgb(alpha, defaultColor));
     162            Pen pen = new Pen(Color.FromArgb(alpha, r.Selected ? selectionColor: defaultColor));
    160163            Brush brush = pen.Brush;
    161164            FixedSizeCircle c = new FixedSizeCircle(this, x, y, size, pen, brush);
     
    163166            points.Add(c);
    164167            primitiveToRecordDictionary[c] = r;
     168            recordToPrimitiveDictionary[r] = c;
    165169          }
    166170        }
     
    223227          primitiveToRecordDictionary.TryGetValue(p, out r);
    224228          if(r != null) r.ToggleSelected();
     229          results.FireChanged();
    225230        }
    226231      } else base.MouseClick(point, button);
     
    237242      } else base.MouseDoubleClick(point, button);
    238243    }
     244
     245    public override void MouseDrag(Point start, Point end, MouseButtons button) {
     246      if(button == MouseButtons.Left && Mode == ChartMode.Select) {
     247        PointD a = TransformPixelToWorld(start);
     248        PointD b = TransformPixelToWorld(end);
     249        double minX = Math.Min(a.X, b.X);
     250        double minY = Math.Min(a.Y, b.Y);
     251        double maxX = Math.Max(a.X, b.X);
     252        double maxY = Math.Max(a.Y, b.Y);
     253        HeuristicLab.Charting.Rectangle r = new HeuristicLab.Charting.Rectangle(this, minX, minY, maxX, maxY);
     254
     255        List<IPrimitive> primitives = new List<IPrimitive>();
     256        primitives.AddRange(points.Primitives);
     257
     258        foreach(FixedSizeCircle p in primitives) {
     259          if(r.ContainsPoint(p.Point)) {
     260            primitiveToRecordDictionary[p].ToggleSelected();
     261          }
     262        }
     263        results.FireChanged();
     264      } else {
     265        base.MouseDrag(start, end, button);
     266      }
     267    }
    239268  }
    240269}
Note: See TracChangeset for help on using the changeset viewer.