Merge branch '#144_delta_cursors' into develop

This commit is contained in:
Kolan Sh 2017-12-18 15:47:58 +03:00
commit 998b013039
2 changed files with 77 additions and 3 deletions

View File

@ -75,7 +75,7 @@ namespace Gtk.CairoChart {
return true;
}
protected virtual void set_source_rgba (Color color) {
public virtual void set_source_rgba (Color color) {
context.set_source_rgba (color.red, color.green, color.blue, color.alpha);
}
@ -522,8 +522,8 @@ namespace Gtk.CairoChart {
public double plot_area_y_min = 0;
public double plot_area_y_max = 0;
bool common_x_axes = false;
bool common_y_axes = false;
public bool common_x_axes { get; protected set; default = false; }
public bool common_y_axes { get; protected set; default = false; }
public Color common_axis_color = Color (0, 0, 0, 1);
bool are_intersect (double a_min, double a_max, double b_min, double b_max) {
@ -1625,6 +1625,62 @@ namespace Gtk.CairoChart {
}
}
public bool get_cursors_delta (out Float128 delta) {
delta = 0.0;
if (series.length == 0) return false;
if (cursors.length() + (is_cursor_active ? 1 : 0) != 2) return false;
if (common_x_axes && cursors_orientation == CursorOrientation.VERTICAL) {
Float128 val1 = get_real_x (series[zoom_first_show], rel2scr_x(cursors.nth_data(0).x));
Float128 val2 = 0;
if (is_cursor_active)
val2 = get_real_x (series[zoom_first_show], rel2scr_x(active_cursor.x));
else
val2 = get_real_x (series[zoom_first_show], rel2scr_x(cursors.nth_data(1).x));
if (val2 > val1)
delta = val2 - val1;
else
delta = val1 - val2;
return true;
}
if (common_y_axes && cursors_orientation == CursorOrientation.HORIZONTAL) {
Float128 val1 = get_real_y (series[zoom_first_show], rel2scr_y(cursors.nth_data(0).y));
Float128 val2 = 0;
if (is_cursor_active)
val2 = get_real_y (series[zoom_first_show], rel2scr_y(active_cursor.y));
else
val2 = get_real_y (series[zoom_first_show], rel2scr_y(cursors.nth_data(1).y));
if (val2 > val1)
delta = val2 - val1;
else
delta = val1 - val2;
return true;
}
return false;
}
public string get_cursors_delta_str () {
Float128 delta = 0.0;
if (!get_cursors_delta(out delta)) return "";
var str = "";
var s = series[zoom_first_show];
if (common_x_axes)
switch (s.axis_x.type) {
case Axis.Type.NUMBERS:
str = s.axis_x.format.printf((LongDouble)delta);
break;
case Axis.Type.DATE_TIME:
var date = "", time = "";
int64 days = (int64)(delta / 24 / 3600);
format_date_time(s.axis_x, delta, out date, out time);
str = days.to_string() + " + " + time;
break;
}
if (common_y_axes) {
str = s.axis_y.format.printf((LongDouble)delta);
}
return str;
}
public Chart copy () {
var chart = new Chart ();
chart.active_cursor = this.active_cursor;

View File

@ -85,6 +85,7 @@ void plot_chart2 (Chart chart) {
//s1.axis_x.position = s2.axis_x.position = s3.axis_x.position = Axis.Position.HIGH;
//s1.axis_x.type = s2.axis_x.type = s3.axis_x.type = Axis.Type.DATE_TIME;
//s1.axis_x.max = s2.axis_x.max = s3.axis_x.max = 5*24*3600;
chart.series = { s1, s2, s3 };
}
@ -423,6 +424,23 @@ int main (string[] args) {
if (mouse_state == MouseState.DRAW_SELECTION)
chart.draw_selection (sel_x0, sel_y0, sel_x1, sel_y1);
// show delta
var str = chart.get_cursors_delta_str();
if (str != "") {
var text = "Δ = " + str;
var text_t = new Text(text);
var w = text_t.get_width(context);
var h = text_t.get_height(context);
var x0 = chart.plot_area_x_max - w - 5;
var y0 = chart.plot_area_y_min + h + 5;
chart.set_source_rgba(chart.legend.bg_color);
context.rectangle (x0, y0 - h, w, h);
context.fill();
context.move_to (x0, y0);
chart.set_source_rgba(chart.common_axis_color);
context.show_text(text);
}
return true;//ret;
});