summaryrefslogtreecommitdiff
path: root/src/CurveEditor.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/CurveEditor.cxx')
-rw-r--r--src/CurveEditor.cxx80
1 files changed, 72 insertions, 8 deletions
diff --git a/src/CurveEditor.cxx b/src/CurveEditor.cxx
index 699261d..ad73758 100644
--- a/src/CurveEditor.cxx
+++ b/src/CurveEditor.cxx
@@ -6,6 +6,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <math.h>
#include <FL/Fl.H>
#include <FL/fl_draw.H>
@@ -15,18 +16,17 @@
CurveEditor::CurveEditor(int my_x, int my_y, int my_w, int my_h) :
Fl_Widget(my_x, my_y, my_w, my_h) {
- n = 3;
+ marked_point = -1;
+
+ n = 5;
X = (double*) calloc(n, sizeof(double));
Y = (double*) calloc(n, sizeof(double));
- X[0] = 0.0;
- Y[0] = 0.0;
-
- X[1] = 0.2;
- Y[1] = 0.4;
- X[2] = 0.8;
- Y[2] = 0.6;
+ for (int i = 0; i < n; i++) {
+ X[i] = (double) i / (n - 1);
+ Y[i] = (double) i / (n - 1);
+ }
acc = gsl_interp_accel_alloc ();
spline = gsl_spline_alloc (gsl_interp_cspline, n);
@@ -48,6 +48,70 @@ CurveEditor::draw() {
fl_end_line();
for (int i = 0; i < n; i++) {
+ if (i == marked_point) {
+ fl_color(FL_RED);
+ } else {
+ fl_color(FL_WHITE);
+ }
fl_rect(x() + w() * X[i] - 2, y() + h() * Y[i] - 2, 4, 4);
}
}
+
+
+int
+CurveEditor::handle(int event) {
+ int mark_x = Fl::event_x() - x();
+ int mark_y = Fl::event_y() - y();
+
+ switch(event) {
+
+ case FL_PUSH:
+ if (Fl::event_button() == 1) {
+ for (int i = 0; i < n; i++) {
+ int x_i = (int) rint(X[i] * w());
+ int y_i = (int) rint(Y[i] * h());
+
+ if (mark_x >= x_i - 2 && mark_x <= x_i + 2 &&
+ mark_y >= y_i - 2 && mark_y <= y_i + 2) {
+ marked_point = i;
+ redraw();
+ break;
+ }
+ }
+ }
+ Fl::focus(this);
+ return 1;
+ break;
+ case FL_DRAG:
+ set(marked_point, (double) mark_x / w(), (double) mark_y / h());
+
+ return 1;
+ break;
+ case FL_RELEASE:
+ marked_point = -1;
+ return 1;
+ break;
+ case FL_FOCUS:
+ return 1;
+ break;
+ case FL_UNFOCUS:
+ return 0;
+ break;
+ }
+ return 0;
+}
+
+void
+CurveEditor::set(int i, double _x, double _y) {
+ if (i >= n ||
+ (_x < 0.0 || _x > 1.0 || _y < 0.0 || _y > 1.0) ||
+ (i < n - 1 && _x >= X[i + 1]) ||
+ (i > 0 && _x <= X[i - 1])) {
+ return;
+ }
+
+ X[i] = _x;
+ Y[i] = _y;
+ gsl_spline_init (spline, X, Y, n);
+ redraw();
+}