Closes #140: Move feature.
This commit is contained in:
parent
42b846fa75
commit
d4d092c376
|
@ -102,6 +102,11 @@ namespace Gtk.CairoChart {
|
||||||
return new_series;
|
return new_series;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double rel_zoom_x_min = 0.0;
|
||||||
|
double rel_zoom_x_max = 1.0;
|
||||||
|
double rel_zoom_y_min = 0.0;
|
||||||
|
double rel_zoom_y_max = 1.0;
|
||||||
|
|
||||||
public virtual void zoom_in (double x0, double y0, double x1, double y1) {
|
public virtual void zoom_in (double x0, double y0, double x1, double y1) {
|
||||||
for (var i = 0, max_i = zoom_series.length; i < max_i; ++i) {
|
for (var i = 0, max_i = zoom_series.length; i < max_i; ++i) {
|
||||||
var s = zoom_series[i];
|
var s = zoom_series[i];
|
||||||
|
@ -142,6 +147,15 @@ namespace Gtk.CairoChart {
|
||||||
s.place.zoom_y_high = (s.axis_y.zoom_max - real_y1) / (real_y0 - real_y1);
|
s.place.zoom_y_high = (s.axis_y.zoom_max - real_y1) / (real_y0 - real_y1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var new_rel_zoom_x_min = rel_zoom_x_min + (x0 - plot_area_x_min) / (plot_area_x_max - plot_area_x_min) * (rel_zoom_x_max - rel_zoom_x_min);
|
||||||
|
var new_rel_zoom_x_max = rel_zoom_x_min + (x1 - plot_area_x_min) / (plot_area_x_max - plot_area_x_min) * (rel_zoom_x_max - rel_zoom_x_min);
|
||||||
|
var new_rel_zoom_y_min = rel_zoom_y_min + (y0 - plot_area_y_min) / (plot_area_y_max - plot_area_y_min) * (rel_zoom_y_max - rel_zoom_y_min);
|
||||||
|
var new_rel_zoom_y_max = rel_zoom_y_min + (y1 - plot_area_y_min) / (plot_area_y_max - plot_area_y_min) * (rel_zoom_y_max - rel_zoom_y_min);
|
||||||
|
rel_zoom_x_min = new_rel_zoom_x_min;
|
||||||
|
rel_zoom_x_max = new_rel_zoom_x_max;
|
||||||
|
rel_zoom_y_min = new_rel_zoom_y_min;
|
||||||
|
rel_zoom_y_max = new_rel_zoom_y_max;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void zoom_out () {
|
public virtual void zoom_out () {
|
||||||
|
@ -160,6 +174,34 @@ namespace Gtk.CairoChart {
|
||||||
s.place.zoom_y_low = s.place.y_low;
|
s.place.zoom_y_low = s.place.y_low;
|
||||||
s.place.zoom_y_high = s.place.y_high;
|
s.place.zoom_y_high = s.place.y_high;
|
||||||
}
|
}
|
||||||
|
rel_zoom_x_min = 0;
|
||||||
|
rel_zoom_x_max = 1;
|
||||||
|
rel_zoom_y_min = 0;
|
||||||
|
rel_zoom_y_max = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void move (double delta_x, double delta_y) {
|
||||||
|
delta_x /= plot_area_x_max - plot_area_x_min; delta_x *= - 1.0;
|
||||||
|
delta_y /= plot_area_y_max - plot_area_y_min; delta_y *= - 1.0;
|
||||||
|
var rzxmin = rel_zoom_x_min, rzxmax = rel_zoom_x_max, rzymin = rel_zoom_y_min, rzymax = rel_zoom_y_max;
|
||||||
|
zoom_out();
|
||||||
|
draw(); // TODO: optimize here
|
||||||
|
delta_x *= plot_area_x_max - plot_area_x_min;
|
||||||
|
delta_y *= plot_area_y_max - plot_area_y_min;
|
||||||
|
var xmin = plot_area_x_min + (plot_area_x_max - plot_area_x_min) * rzxmin;
|
||||||
|
var xmax = plot_area_x_min + (plot_area_x_max - plot_area_x_min) * rzxmax;
|
||||||
|
var ymin = plot_area_y_min + (plot_area_y_max - plot_area_y_min) * rzymin;
|
||||||
|
var ymax = plot_area_y_min + (plot_area_y_max - plot_area_y_min) * rzymax;
|
||||||
|
|
||||||
|
delta_x *= rzxmax - rzxmin; delta_y *= rzymax - rzymin;
|
||||||
|
|
||||||
|
if (xmin + delta_x < plot_area_x_min) delta_x = plot_area_x_min - xmin;
|
||||||
|
if (xmax + delta_x > plot_area_x_max) delta_x = plot_area_x_max - xmax;
|
||||||
|
if (ymin + delta_y < plot_area_y_min) delta_y = plot_area_y_min - ymin;
|
||||||
|
if (ymax + delta_y > plot_area_y_max) delta_y = plot_area_y_max - ymax;
|
||||||
|
|
||||||
|
zoom_in (xmin + delta_x, ymin + delta_y, xmax + delta_x, ymax + delta_y);
|
||||||
|
draw(); // TODO: optimize here
|
||||||
}
|
}
|
||||||
|
|
||||||
protected double title_width = 0.0;
|
protected double title_width = 0.0;
|
||||||
|
@ -1142,6 +1184,10 @@ namespace Gtk.CairoChart {
|
||||||
chart.plot_area_x_min = this.plot_area_x_min;
|
chart.plot_area_x_min = this.plot_area_x_min;
|
||||||
chart.plot_area_y_max = this.plot_area_y_max;
|
chart.plot_area_y_max = this.plot_area_y_max;
|
||||||
chart.plot_area_y_min = this.plot_area_y_min;
|
chart.plot_area_y_min = this.plot_area_y_min;
|
||||||
|
chart.rel_zoom_x_min = this.rel_zoom_x_min;
|
||||||
|
chart.rel_zoom_x_max = this.rel_zoom_x_max;
|
||||||
|
chart.rel_zoom_y_min = this.rel_zoom_y_min;
|
||||||
|
chart.rel_zoom_y_max = this.rel_zoom_y_max;
|
||||||
chart.selection_style = this.selection_style;
|
chart.selection_style = this.selection_style;
|
||||||
chart.zoom_series = this.zoom_series.copy();
|
chart.zoom_series = this.zoom_series.copy();
|
||||||
chart.show_legend = this.show_legend;
|
chart.show_legend = this.show_legend;
|
||||||
|
|
|
@ -336,6 +336,8 @@ int main (string[] args) {
|
||||||
|
|
||||||
bool draw_selection = false;
|
bool draw_selection = false;
|
||||||
double sel_x0 = 0, sel_x1 = 0, sel_y0 = 0, sel_y1 = 0;
|
double sel_x0 = 0, sel_x1 = 0, sel_y0 = 0, sel_y1 = 0;
|
||||||
|
bool moving_chart = false;
|
||||||
|
double mov_x0 = 0, mov_y0 = 0;
|
||||||
|
|
||||||
da.draw.connect((context) => {
|
da.draw.connect((context) => {
|
||||||
// user's pre draw operations here...
|
// user's pre draw operations here...
|
||||||
|
@ -362,8 +364,6 @@ int main (string[] args) {
|
||||||
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
||||||
|
|
||||||
da.button_press_event.connect((event) => {
|
da.button_press_event.connect((event) => {
|
||||||
// user's pre button_press_event operations here...
|
|
||||||
//stdout.puts("pre_press\n");
|
|
||||||
|
|
||||||
if (event.button == 2 && point_in_chart(chart, event.x, event.y)) {
|
if (event.button == 2 && point_in_chart(chart, event.x, event.y)) {
|
||||||
draw_selection = true;
|
draw_selection = true;
|
||||||
|
@ -372,14 +372,16 @@ int main (string[] args) {
|
||||||
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
||||||
}
|
}
|
||||||
|
|
||||||
// user's post button_press_event operations here...
|
if (event.button == 3 && point_in_chart(chart, event.x, event.y)) {
|
||||||
//stdout.puts("post_press\n");
|
moving_chart = true;
|
||||||
|
mov_x0 = event.x;
|
||||||
|
mov_y0 = event.y;
|
||||||
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
||||||
|
}
|
||||||
|
|
||||||
return true; // return ret;
|
return true; // return ret;
|
||||||
});
|
});
|
||||||
da.button_release_event.connect((event) => {
|
da.button_release_event.connect((event) => {
|
||||||
// user's pre button_release_event operations here...
|
|
||||||
//stdout.puts("pre_release\n");
|
|
||||||
|
|
||||||
//var ret = chart.button_release_event(event);
|
//var ret = chart.button_release_event(event);
|
||||||
if (event.button == 2) {
|
if (event.button == 2) {
|
||||||
|
@ -393,37 +395,38 @@ int main (string[] args) {
|
||||||
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
||||||
}
|
}
|
||||||
|
|
||||||
// user's post button_release_event operations here...
|
if (event.button == 3 && point_in_chart(chart, event.x, event.y)) {
|
||||||
//stdout.puts("post_release\n");
|
moving_chart = false;
|
||||||
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
||||||
|
}
|
||||||
|
|
||||||
return true; // return ret;
|
return true; // return ret;
|
||||||
});
|
});
|
||||||
da.motion_notify_event.connect((event) => {
|
da.motion_notify_event.connect((event) => {
|
||||||
// user's pre motion_notify_event operations here...
|
|
||||||
//stdout.puts("pre_motion\n");
|
|
||||||
|
|
||||||
//var ret = chart.motion_notify_event(event);
|
//var ret = chart.motion_notify_event(event);
|
||||||
|
|
||||||
// user's post motion_notify_event operations here...
|
|
||||||
//stdout.puts("post_motion\n");
|
|
||||||
if (draw_selection && point_in_chart(chart, event.x, event.y)) {
|
if (draw_selection && point_in_chart(chart, event.x, event.y)) {
|
||||||
sel_x1 = event.x;
|
sel_x1 = event.x;
|
||||||
sel_y1 = event.y;
|
sel_y1 = event.y;
|
||||||
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (moving_chart && point_in_chart(chart, event.x, event.y)) {
|
||||||
|
var delta_x = event.x - mov_x0, delta_y = event.y - mov_y0;
|
||||||
|
chart.move (delta_x, delta_y);
|
||||||
|
mov_x0 = event.x;
|
||||||
|
mov_y0 = event.y;
|
||||||
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
||||||
|
}
|
||||||
|
|
||||||
return true; // return ret;
|
return true; // return ret;
|
||||||
});
|
});
|
||||||
da.add_events(Gdk.EventMask.SCROLL_MASK);
|
da.add_events(Gdk.EventMask.SCROLL_MASK);
|
||||||
da.scroll_event.connect((event) => {
|
da.scroll_event.connect((event) => {
|
||||||
// user's pre scroll_notify_event operations here...
|
|
||||||
//stdout.puts("pre_scroll\n");
|
|
||||||
|
|
||||||
//var ret = chart.scroll_notify_event(event);
|
//var ret = chart.scroll_notify_event(event);
|
||||||
|
|
||||||
// user's post scroll_notify_event operations here...
|
|
||||||
//stdout.puts("post_scroll\n");
|
|
||||||
|
|
||||||
return true; // return ret;
|
return true; // return ret;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue