2017-02-16 15:10:53 +03:00
|
|
|
using Gtk, CairoChart;
|
|
|
|
|
|
|
|
void plot_chart1 (Chart chart) {
|
2018-01-16 14:29:24 +03:00
|
|
|
var s1 = new Series (chart);
|
|
|
|
var s2 = new Series (chart);
|
|
|
|
var s3 = new Series (chart);
|
2017-02-16 15:10:53 +03:00
|
|
|
|
2017-08-22 11:54:18 +03:00
|
|
|
s1.title = new Text("Series 1"); s1.color = Color (1, 0, 0);
|
2018-01-16 13:39:17 +03:00
|
|
|
s1.points = {Point128(0, 0), Point128(2, 1), Point128(1, 3)};
|
2017-08-28 14:47:31 +03:00
|
|
|
s1.axis_x.position = Axis.Position.HIGH;
|
2017-02-16 15:10:53 +03:00
|
|
|
s1.axis_x.format = "%.3Lf";
|
2017-08-22 11:54:18 +03:00
|
|
|
s2.title = new Text("Series 2"); s2.color = Color (0, 1, 0);
|
2018-01-16 13:39:17 +03:00
|
|
|
s2.points = {Point128(5, -3), Point128(25, -18), Point128(-11, 173)};
|
2017-08-22 11:54:18 +03:00
|
|
|
s3.title = new Text("Series 3"); s3.color = Color (0, 0, 1);
|
2018-01-16 13:39:17 +03:00
|
|
|
s3.points = {Point128(9, 17), Point128(2, 10), Point128(122, 31)};
|
2017-08-28 14:47:31 +03:00
|
|
|
s3.axis_y.position = Axis.Position.HIGH;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s1.axis_x.min = 0; s1.axis_x.max = 2;
|
|
|
|
s1.axis_y.min = 0; s1.axis_y.max = 3;
|
2018-01-08 23:33:13 +03:00
|
|
|
s1.place.x_min = 0.25; s1.place.x_max = 0.75;
|
|
|
|
s1.place.y_min = 0.3; s1.place.y_max = 0.9;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s2.axis_x.min = -15; s2.axis_x.max = 30;
|
|
|
|
s2.axis_y.min = -20; s2.axis_y.max = 200;
|
2018-01-08 23:33:13 +03:00
|
|
|
s2.place.x_min = 0.5; s2.place.x_max = 1;
|
|
|
|
s2.place.y_min = 0.0; s2.place.y_max = 0.5;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s3.axis_x.min = 0; s3.axis_x.max = 130;
|
|
|
|
s3.axis_y.min = 15; s3.axis_y.max = 35;
|
2018-01-08 23:33:13 +03:00
|
|
|
s3.place.x_min = 0; s3.place.x_max = 0.5;
|
|
|
|
s3.place.y_min = 0.5; s3.place.y_max = 1.0;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
2018-01-15 11:21:44 +03:00
|
|
|
s1.marker.type = Marker.Type.SQUARE;
|
2018-01-10 12:58:35 +03:00
|
|
|
s2.marker.type = Marker.Type.CIRCLE;
|
|
|
|
s3.marker.type = Marker.Type.PRICLE_TRIANGLE;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s1.axis_x.title = new Text("Series 1: Axis X.");
|
|
|
|
s1.axis_y.title = new Text("Series 1: Axis Y.");
|
|
|
|
s2.axis_x.title = new Text("Series 2: Axis X.");
|
|
|
|
s2.axis_y.title = new Text("Series 2: Axis Y.");
|
|
|
|
s3.axis_x.title = new Text("Series 3: Axis X.");
|
|
|
|
s3.axis_y.title = new Text("Series 3: Axis Y.");
|
|
|
|
|
|
|
|
chart.series = { s1, s2, s3 };
|
|
|
|
}
|
|
|
|
|
|
|
|
void plot_chart2 (Chart chart) {
|
2018-01-16 14:29:24 +03:00
|
|
|
var s1 = new Series (chart);
|
|
|
|
var s2 = new Series (chart);
|
|
|
|
var s3 = new Series (chart);
|
2017-02-16 15:10:53 +03:00
|
|
|
|
2017-08-22 11:54:18 +03:00
|
|
|
s1.title = new Text("Series 1"); s1.color = Color (1, 0, 0);
|
2018-01-16 13:39:17 +03:00
|
|
|
s1.points = {Point128(-12, 0), Point128(2, 1), Point128(20, 3)};
|
2017-08-28 14:47:31 +03:00
|
|
|
s2.axis_y.position = Axis.Position.HIGH;
|
2017-02-16 15:10:53 +03:00
|
|
|
s1.axis_x.format = "%.3Lf";
|
2017-08-22 11:54:18 +03:00
|
|
|
s2.title = new Text("Series 2"); s2.color = Color (0, 1, 0);
|
2018-01-16 13:39:17 +03:00
|
|
|
s2.points = {Point128(5, -3), Point128(25, -18), Point128(-11, 173)};
|
2017-08-22 11:54:18 +03:00
|
|
|
s3.title = new Text("Series 3"); s3.color = Color (0, 0, 1);
|
2018-01-16 13:39:17 +03:00
|
|
|
s3.points = {Point128(9, 17), Point128(2, 10), Point128(-15, 31)};
|
2017-08-28 14:47:31 +03:00
|
|
|
s3.axis_y.position = Axis.Position.HIGH;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s1.axis_x.min = -15; s1.axis_x.max = 30;
|
|
|
|
s1.axis_y.min = 0; s1.axis_y.max = 3;
|
2018-01-08 23:33:13 +03:00
|
|
|
s1.place.x_min = 0.0; s1.place.x_max = 1.0;
|
|
|
|
s1.place.y_min = 0.3; s1.place.y_max = 0.9;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s2.axis_x.min = -15; s2.axis_x.max = 30;
|
|
|
|
s2.axis_y.min = -20; s2.axis_y.max = 200;
|
2018-01-08 23:33:13 +03:00
|
|
|
s2.place.x_min = 0.0; s2.place.x_max = 1.0;
|
|
|
|
s2.place.y_min = 0.0; s2.place.y_max = 0.5;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s3.axis_x.min = -15; s3.axis_x.max = 30;
|
|
|
|
s3.axis_y.min = 15; s3.axis_y.max = 35;
|
2018-01-08 23:33:13 +03:00
|
|
|
s3.place.x_min = 0.0; s3.place.x_max = 1.0;
|
|
|
|
s3.place.y_min = 0.5; s3.place.y_max = 1.0;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
2018-01-10 12:58:35 +03:00
|
|
|
s1.marker.type = Marker.Type.PRICLE_CIRCLE;
|
|
|
|
s2.marker.type = Marker.Type.PRICLE_SQUARE;
|
2018-01-15 11:21:44 +03:00
|
|
|
s3.marker.type = Marker.Type.SQUARE;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s1.axis_x.title = new Text("All Series: Axis X.");
|
|
|
|
s1.axis_y.title = new Text("Series 1: Axis Y.");
|
|
|
|
s2.axis_x.title = new Text("All Series: Axis X.");
|
|
|
|
s2.axis_y.title = new Text("Series 2: Axis Y.");
|
|
|
|
s3.axis_x.title = new Text("All Series: Axis X.");
|
|
|
|
s3.axis_y.title = new Text("Series 3: Axis Y.");
|
|
|
|
|
2017-12-04 16:07:59 +03:00
|
|
|
//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;
|
2017-12-17 17:21:39 +03:00
|
|
|
//s1.axis_x.max = s2.axis_x.max = s3.axis_x.max = 5*24*3600;
|
2017-12-04 16:07:59 +03:00
|
|
|
|
2017-02-16 15:10:53 +03:00
|
|
|
chart.series = { s1, s2, s3 };
|
|
|
|
}
|
|
|
|
|
|
|
|
void plot_chart3 (Chart chart) {
|
2018-01-16 14:29:24 +03:00
|
|
|
var s1 = new Series (chart);
|
|
|
|
var s2 = new Series (chart);
|
|
|
|
var s3 = new Series (chart);
|
2017-02-16 15:10:53 +03:00
|
|
|
|
2017-08-22 11:54:18 +03:00
|
|
|
s1.title = new Text("Series 1"); s1.color = Color (1, 0, 0);
|
2018-01-16 13:39:17 +03:00
|
|
|
s1.points = {Point128(0, 70), Point128(2, 155), Point128(1, -3)};
|
2017-08-28 14:47:31 +03:00
|
|
|
s1.axis_x.position = Axis.Position.HIGH;
|
|
|
|
s1.axis_y.position = Axis.Position.HIGH;
|
2017-02-16 15:10:53 +03:00
|
|
|
s1.axis_x.format = "%.3Lf";
|
2017-08-22 11:54:18 +03:00
|
|
|
s2.title = new Text("Series 2"); s2.color = Color (0, 1, 0);
|
2018-01-16 13:39:17 +03:00
|
|
|
s2.points = {Point128(5, -3), Point128(25, -18), Point128(-11, 173)};
|
2017-08-28 14:47:31 +03:00
|
|
|
s2.axis_y.position = Axis.Position.HIGH;
|
2017-08-22 11:54:18 +03:00
|
|
|
s3.title = new Text("Series 3"); s3.color = Color (0, 0, 1);
|
2018-01-16 13:39:17 +03:00
|
|
|
s3.points = {Point128(9, -17), Point128(2, 10), Point128(122, 31)};
|
2017-08-28 14:47:31 +03:00
|
|
|
s3.axis_y.position = Axis.Position.HIGH;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s1.axis_x.min = 0; s1.axis_x.max = 2;
|
|
|
|
s1.axis_y.min = -20; s1.axis_y.max = 200;
|
2018-01-08 23:33:13 +03:00
|
|
|
s1.place.x_min = 0.25; s1.place.x_max = 0.75;
|
|
|
|
s1.place.y_min = 0.0; s1.place.y_max = 1.0;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s2.axis_x.min = -15; s2.axis_x.max = 30;
|
|
|
|
s2.axis_y.min = -20; s2.axis_y.max = 200;
|
2018-01-08 23:33:13 +03:00
|
|
|
s2.place.x_min = 0.5; s2.place.x_max = 1;
|
|
|
|
s2.place.y_min = 0.0; s2.place.y_max = 1.0;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s3.axis_x.min = 0; s3.axis_x.max = 130;
|
|
|
|
s3.axis_y.min = -20; s3.axis_y.max = 200;
|
2018-01-08 23:33:13 +03:00
|
|
|
s3.place.x_min = 0; s3.place.x_max = 0.5;
|
|
|
|
s3.place.y_min = 0.0; s3.place.y_max = 1.0;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
2018-01-15 11:21:44 +03:00
|
|
|
s1.marker.type = Marker.Type.SQUARE;
|
2018-01-10 12:58:35 +03:00
|
|
|
s2.marker.type = Marker.Type.PRICLE_CIRCLE;
|
|
|
|
s3.marker.type = Marker.Type.TRIANGLE;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s1.axis_x.title = new Text("Series 1: Axis X.");
|
|
|
|
s1.axis_y.title = new Text("Series 1: Axis Y.");
|
|
|
|
s2.axis_x.title = new Text("Series 2: Axis X.");
|
|
|
|
s2.axis_y.title = new Text("Series 2: Axis Y.");
|
|
|
|
s3.axis_x.title = new Text("Series 3: Axis X.");
|
|
|
|
s3.axis_y.title = new Text("Series 3: Axis Y.");
|
|
|
|
|
2017-12-07 04:21:27 +03:00
|
|
|
//s1.axis_y.position = s2.axis_y.position = s3.axis_y.position = Axis.Position.LOW;
|
|
|
|
|
2017-02-16 15:10:53 +03:00
|
|
|
chart.series = { s1, s2, s3 };
|
|
|
|
}
|
|
|
|
|
|
|
|
void plot_chart4 (Chart chart) {
|
2018-01-16 14:29:24 +03:00
|
|
|
var s1 = new Series (chart);
|
|
|
|
var s2 = new Series (chart);
|
|
|
|
var s3 = new Series (chart);
|
|
|
|
var s4 = new Series (chart);
|
2017-02-16 15:10:53 +03:00
|
|
|
|
2017-08-28 14:47:31 +03:00
|
|
|
s1.axis_x.type = Axis.Type.DATE_TIME;
|
|
|
|
s3.axis_x.type = Axis.Type.DATE_TIME;
|
|
|
|
s4.axis_x.type = Axis.Type.DATE_TIME;
|
2017-02-16 15:10:53 +03:00
|
|
|
s4.axis_x.dsec_signs = 5;
|
|
|
|
|
|
|
|
var now = new DateTime.now_local().to_unix();
|
|
|
|
var high = (uint64) (253000000000L);
|
|
|
|
|
2017-08-22 11:54:18 +03:00
|
|
|
s1.title = new Text("Series 1"); s1.color = Color (1, 0, 0);
|
2018-01-16 13:39:17 +03:00
|
|
|
s1.points = {Point128(now, 70), Point128(now - 100000, 155), Point128(now + 100000, 30)};
|
2017-08-28 14:47:31 +03:00
|
|
|
s1.axis_x.position = Axis.Position.HIGH;
|
|
|
|
s1.axis_y.position = Axis.Position.HIGH;
|
2017-08-22 11:54:18 +03:00
|
|
|
s2.title = new Text("Series 2"); s2.color = Color (0, 1, 0);
|
2018-01-16 13:39:17 +03:00
|
|
|
s2.points = {Point128(5, -3), Point128(25, -18), Point128(-11, 173)};
|
2017-08-28 14:47:31 +03:00
|
|
|
s2.axis_y.position = Axis.Position.HIGH;
|
2017-08-22 11:54:18 +03:00
|
|
|
s3.title = new Text("Series 3"); s3.color = Color (0, 0, 1);
|
2018-01-16 13:39:17 +03:00
|
|
|
s3.points = {Point128(high - 2 + 0.73, -17), Point128(high - 1 + 0.234, 10), Point128(high + 1 + 0.411, 31)};
|
2017-08-28 14:47:31 +03:00
|
|
|
s3.axis_y.position = Axis.Position.HIGH;
|
2017-08-22 11:54:18 +03:00
|
|
|
s4.title = new Text("Series 4"); s4.color = Color (0.5, 0.3, 0.9);
|
2018-01-16 13:39:17 +03:00
|
|
|
s4.points = {Point128(high + 0.005, -19.05), Point128(high + 0.0051, 28), Point128(high + 0.0052, 55), Point128(high + 0.0053, 44)};
|
2017-08-28 14:47:31 +03:00
|
|
|
s4.axis_y.position = Axis.Position.HIGH;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s1.axis_x.min = now - 100000; s1.axis_x.max = now + 100000;
|
|
|
|
s1.axis_y.min = -20; s1.axis_y.max = 200;
|
2018-01-08 23:33:13 +03:00
|
|
|
s1.place.x_min = 0.25; s1.place.x_max = 0.75;
|
|
|
|
s1.place.y_min = 0.0; s1.place.y_max = 1.0;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s2.axis_x.min = -15; s2.axis_x.max = 30;
|
|
|
|
s2.axis_y.min = -20; s2.axis_y.max = 200;
|
2018-01-08 23:33:13 +03:00
|
|
|
s2.place.x_min = 0.2; s2.place.x_max = 1;
|
|
|
|
s2.place.y_min = 0.0; s2.place.y_max = 1.0;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s3.axis_x.min = high - 2; s3.axis_x.max = high + 1;
|
|
|
|
s3.axis_y.min = -20; s3.axis_y.max = 200;
|
2018-01-08 23:33:13 +03:00
|
|
|
s3.place.x_min = 0; s3.place.x_max = 0.8;
|
|
|
|
s3.place.y_min = 0.0; s3.place.y_max = 1.0;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s4.axis_x.min = high + 0.0049; s4.axis_x.max = high + 0.0054;
|
|
|
|
s4.axis_y.min = -20; s4.axis_y.max = 200;
|
2018-01-08 23:33:13 +03:00
|
|
|
s4.place.x_min = 0.2; s4.place.x_max = 1.0;
|
|
|
|
s4.place.y_min = 0.0; s4.place.y_max = 1.0;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
2018-01-15 11:21:44 +03:00
|
|
|
s1.marker.type = Marker.Type.SQUARE;
|
2018-01-10 12:58:35 +03:00
|
|
|
s2.marker.type = Marker.Type.PRICLE_CIRCLE;
|
|
|
|
s3.marker.type = Marker.Type.TRIANGLE;
|
|
|
|
s4.marker.type = Marker.Type.PRICLE_SQUARE;
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
s1.axis_x.title = new Text("Series 1: Axis X.");
|
|
|
|
s1.axis_y.title = new Text("Series 1: Axis Y.");
|
|
|
|
s2.axis_x.title = new Text("Series 2: Axis X.");
|
|
|
|
s2.axis_y.title = new Text("Series 2: Axis Y.");
|
|
|
|
s3.axis_x.title = new Text("Series 3: Axis X.");
|
|
|
|
s3.axis_y.title = new Text("Series 3: Axis Y.");
|
|
|
|
s4.axis_x.title = new Text("Series 4: Axis X.");
|
|
|
|
s4.axis_y.title = new Text("Series 4: Axis Y.");
|
|
|
|
|
|
|
|
chart.series = { s1, s2, s3, s4 };
|
|
|
|
}
|
2017-02-09 13:23:16 +03:00
|
|
|
|
2017-08-22 11:54:18 +03:00
|
|
|
bool point_in_chart (Chart chart, double x, double y) {
|
2018-01-08 23:33:13 +03:00
|
|
|
if (x < chart.plot_x_min) return false;
|
|
|
|
if (x > chart.plot_x_max) return false;
|
|
|
|
if (y < chart.plot_y_min) return false;
|
|
|
|
if (y > chart.plot_y_max) return false;
|
2017-08-22 11:54:18 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2017-11-28 21:41:25 +03:00
|
|
|
enum MouseState {
|
|
|
|
FREE = 0, // default
|
|
|
|
DRAW_SELECTION,
|
|
|
|
MOVING_CHART,
|
|
|
|
CURSOR_SELECTION
|
|
|
|
}
|
|
|
|
|
2017-02-09 13:23:16 +03:00
|
|
|
int main (string[] args) {
|
2017-02-16 15:10:53 +03:00
|
|
|
init (ref args);
|
2017-02-09 13:23:16 +03:00
|
|
|
|
2017-02-16 15:10:53 +03:00
|
|
|
var window = new Window ();
|
|
|
|
window.title = "Chart Test.";
|
|
|
|
window.border_width = 5;
|
|
|
|
window.window_position = WindowPosition.CENTER;
|
|
|
|
window.set_default_size (640, 480);
|
|
|
|
window.destroy.connect (main_quit);
|
2017-02-09 13:23:16 +03:00
|
|
|
|
2017-02-16 15:10:53 +03:00
|
|
|
var chart1 = new Chart();
|
|
|
|
var chart2 = new Chart();
|
|
|
|
var chart3 = new Chart();
|
|
|
|
var chart4 = new Chart();
|
2018-01-08 23:33:13 +03:00
|
|
|
var label = new Gtk.Label ("Chart Test!");
|
2017-02-16 15:10:53 +03:00
|
|
|
var button1 = new Button.with_label("Separate axes");
|
2018-01-08 23:33:13 +03:00
|
|
|
var button2 = new Button.with_label("Joint X axes");
|
|
|
|
var button3 = new Button.with_label("Joint Y axes");
|
2017-02-16 15:10:53 +03:00
|
|
|
var button4 = new Button.with_label("Dates/Times");
|
|
|
|
var button5 = new Button.with_label("rm Axis Titles");
|
2017-10-25 19:31:30 +03:00
|
|
|
var button6 = new Button.with_label("Dates only");
|
|
|
|
var button7 = new Button.with_label("Times only");
|
2017-10-27 18:51:45 +03:00
|
|
|
var button8 = new Button.with_label("Date+Time");
|
2017-02-09 13:23:16 +03:00
|
|
|
|
2017-02-16 15:10:53 +03:00
|
|
|
plot_chart1 (chart1);
|
|
|
|
plot_chart2 (chart2);
|
|
|
|
plot_chart3 (chart3);
|
|
|
|
plot_chart4 (chart4);
|
|
|
|
|
2018-01-08 23:33:13 +03:00
|
|
|
chart1.selection_style = Line.Style(Color(0.3, 0.3, 0.3, 0.7), 1);
|
2017-12-17 01:20:07 +03:00
|
|
|
|
2017-02-16 15:10:53 +03:00
|
|
|
var da = new DrawingArea();
|
|
|
|
da.set_events ( Gdk.EventMask.BUTTON_PRESS_MASK
|
|
|
|
|Gdk.EventMask.BUTTON_RELEASE_MASK
|
|
|
|
|Gdk.EventMask.POINTER_MOTION_MASK
|
|
|
|
);
|
|
|
|
|
|
|
|
var chart = chart1;
|
|
|
|
|
|
|
|
var radio_button1 = new RadioButton.with_label (null, "Top Legend");
|
|
|
|
var radio_button2 = new RadioButton.with_label (radio_button1.get_group(), "Right Legend");
|
|
|
|
var radio_button3 = new RadioButton.with_label_from_widget (radio_button1, "Left Legend");
|
|
|
|
var radio_button4 = new RadioButton.with_label_from_widget (radio_button1, "Bottom Legend");
|
2017-11-28 21:51:58 +03:00
|
|
|
var radio_button7 = new RadioButton.with_label (null, "Vertical Cursors");
|
|
|
|
var radio_button8 = new RadioButton.with_label_from_widget (radio_button7, "Horizontal Cursors");
|
2017-02-16 15:10:53 +03:00
|
|
|
|
|
|
|
button1.clicked.connect (() => {
|
|
|
|
chart = chart1; da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
switch (chart.legend.position) {
|
2017-08-28 14:47:31 +03:00
|
|
|
case Legend.Position.TOP: radio_button1.set_active(true); break;
|
|
|
|
case Legend.Position.RIGHT: radio_button2.set_active(true); break;
|
|
|
|
case Legend.Position.LEFT: radio_button3.set_active(true); break;
|
|
|
|
case Legend.Position.BOTTOM: radio_button4.set_active(true); break;
|
2017-02-16 15:10:53 +03:00
|
|
|
}
|
2018-01-16 19:38:43 +03:00
|
|
|
switch (chart.cursors.cursor_style.orientation) {
|
2018-01-16 11:44:44 +03:00
|
|
|
case Cursors.Orientation.VERTICAL: radio_button7.set_active(true); break;
|
|
|
|
case Cursors.Orientation.HORIZONTAL: radio_button8.set_active(true); break;
|
2017-11-28 21:51:58 +03:00
|
|
|
}
|
2017-02-16 15:10:53 +03:00
|
|
|
});
|
|
|
|
button2.clicked.connect (() => {
|
|
|
|
chart = chart2; da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
switch (chart.legend.position) {
|
2017-08-28 14:47:31 +03:00
|
|
|
case Legend.Position.TOP: radio_button1.set_active(true); break;
|
|
|
|
case Legend.Position.RIGHT: radio_button2.set_active(true); break;
|
|
|
|
case Legend.Position.LEFT: radio_button3.set_active(true); break;
|
|
|
|
case Legend.Position.BOTTOM: radio_button4.set_active(true); break;
|
2017-02-16 15:10:53 +03:00
|
|
|
}
|
2018-01-16 19:38:43 +03:00
|
|
|
switch (chart.cursors.cursor_style.orientation) {
|
2018-01-16 11:44:44 +03:00
|
|
|
case Cursors.Orientation.VERTICAL: radio_button7.set_active(true); break;
|
|
|
|
case Cursors.Orientation.HORIZONTAL: radio_button8.set_active(true); break;
|
2017-11-28 21:51:58 +03:00
|
|
|
}
|
2017-02-16 15:10:53 +03:00
|
|
|
});
|
|
|
|
button3.clicked.connect (() => {
|
|
|
|
chart = chart3; da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
switch (chart.legend.position) {
|
2017-08-28 14:47:31 +03:00
|
|
|
case Legend.Position.TOP: radio_button1.set_active(true); break;
|
|
|
|
case Legend.Position.RIGHT: radio_button2.set_active(true); break;
|
|
|
|
case Legend.Position.LEFT: radio_button3.set_active(true); break;
|
|
|
|
case Legend.Position.BOTTOM: radio_button4.set_active(true); break;
|
2017-02-16 15:10:53 +03:00
|
|
|
}
|
2018-01-16 19:38:43 +03:00
|
|
|
switch (chart.cursors.cursor_style.orientation) {
|
2018-01-16 11:44:44 +03:00
|
|
|
case Cursors.Orientation.VERTICAL: radio_button7.set_active(true); break;
|
|
|
|
case Cursors.Orientation.HORIZONTAL: radio_button8.set_active(true); break;
|
2017-11-28 21:51:58 +03:00
|
|
|
}
|
2017-02-16 15:10:53 +03:00
|
|
|
});
|
|
|
|
button4.clicked.connect (() => {
|
|
|
|
chart = chart4; da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
switch (chart.legend.position) {
|
2017-08-28 14:47:31 +03:00
|
|
|
case Legend.Position.TOP: radio_button1.set_active(true); break;
|
|
|
|
case Legend.Position.RIGHT: radio_button2.set_active(true); break;
|
|
|
|
case Legend.Position.LEFT: radio_button4.set_active(true); break;
|
|
|
|
case Legend.Position.BOTTOM: radio_button4.set_active(true); break;
|
2017-02-16 15:10:53 +03:00
|
|
|
}
|
2018-01-16 19:38:43 +03:00
|
|
|
switch (chart.cursors.cursor_style.orientation) {
|
2018-01-16 11:44:44 +03:00
|
|
|
case Cursors.Orientation.VERTICAL: radio_button7.set_active(true); break;
|
|
|
|
case Cursors.Orientation.HORIZONTAL: radio_button8.set_active(true); break;
|
2017-11-28 21:51:58 +03:00
|
|
|
}
|
2017-02-16 15:10:53 +03:00
|
|
|
});
|
|
|
|
button5.clicked.connect (() => {
|
|
|
|
for (var i = 0; i < chart.series.length; ++i) {
|
|
|
|
var s = chart.series[i];
|
|
|
|
s.axis_x.title.text = "";
|
|
|
|
s.axis_y.title.text = "";
|
|
|
|
}
|
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
});
|
|
|
|
button6.clicked.connect (() => {
|
|
|
|
for (var i = 0; i < chart.series.length; ++i) {
|
|
|
|
var s = chart.series[i];
|
2017-10-25 19:31:30 +03:00
|
|
|
s.axis_x.date_format = "%Y.%m.%d";
|
|
|
|
s.axis_x.time_format = "";
|
2017-02-16 15:10:53 +03:00
|
|
|
}
|
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
});
|
|
|
|
|
|
|
|
button7.clicked.connect (() => {
|
|
|
|
for (var i = 0; i < chart.series.length; ++i) {
|
|
|
|
var s = chart.series[i];
|
2017-10-27 18:51:45 +03:00
|
|
|
s.axis_x.date_format = "";
|
|
|
|
s.axis_x.time_format = "%H:%M:%S";
|
|
|
|
}
|
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
});
|
|
|
|
|
|
|
|
button8.clicked.connect (() => {
|
|
|
|
for (var i = 0; i < chart.series.length; ++i) {
|
|
|
|
var s = chart.series[i];
|
|
|
|
s.axis_x.date_format = "%Y.%m.%d";
|
|
|
|
s.axis_x.time_format = "%H:%M:%S";
|
2017-02-16 15:10:53 +03:00
|
|
|
}
|
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
radio_button1.toggled.connect ((button) => {
|
|
|
|
if (button.get_active()) {
|
2017-08-28 14:47:31 +03:00
|
|
|
chart.legend.position = Legend.Position.TOP;
|
2017-02-16 15:10:53 +03:00
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
radio_button2.toggled.connect ((button) => {
|
|
|
|
if (button.get_active()) {
|
2017-08-28 14:47:31 +03:00
|
|
|
chart.legend.position = Legend.Position.RIGHT;
|
2017-02-16 15:10:53 +03:00
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
radio_button3.toggled.connect ((button) => {
|
|
|
|
if (button.get_active()) {
|
2017-08-28 14:47:31 +03:00
|
|
|
chart.legend.position = Legend.Position.LEFT;
|
2017-02-16 15:10:53 +03:00
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
radio_button4.toggled.connect ((button) => {
|
|
|
|
if (button.get_active()) {
|
2017-08-28 14:47:31 +03:00
|
|
|
chart.legend.position = Legend.Position.BOTTOM;
|
2017-02-16 15:10:53 +03:00
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2017-11-28 21:41:25 +03:00
|
|
|
|
|
|
|
/* var radio_button5 = new RadioButton.with_label (null, "Labels");
|
|
|
|
var radio_button6 = new RadioButton.with_label_from_widget (radio_button5, "Cursors");
|
|
|
|
radio_button5.toggled.connect ((button) => {
|
|
|
|
// TODO: set labels
|
|
|
|
if (button.get_active()) {
|
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
radio_button6.toggled.connect ((button) => {
|
|
|
|
// TODO: set cursors
|
|
|
|
if (button.get_active()) {
|
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
}
|
|
|
|
});*/
|
|
|
|
|
|
|
|
radio_button7.toggled.connect ((button) => {
|
|
|
|
if (button.get_active()) {
|
2018-01-16 19:38:43 +03:00
|
|
|
chart.cursors.cursor_style.orientation = Cursors.Orientation.VERTICAL;
|
2017-11-28 21:41:25 +03:00
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
radio_button8.toggled.connect ((button) => {
|
|
|
|
if (button.get_active()) {
|
2018-01-16 19:38:43 +03:00
|
|
|
chart.cursors.cursor_style.orientation = Cursors.Orientation.HORIZONTAL;
|
2017-11-28 21:41:25 +03:00
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
MouseState mouse_state = MouseState.FREE;
|
|
|
|
|
2017-08-22 11:54:18 +03:00
|
|
|
double sel_x0 = 0, sel_x1 = 0, sel_y0 = 0, sel_y1 = 0;
|
2017-10-06 22:46:51 +03:00
|
|
|
double mov_x0 = 0, mov_y0 = 0;
|
2017-08-22 11:54:18 +03:00
|
|
|
|
2017-02-16 15:10:53 +03:00
|
|
|
da.draw.connect((context) => {
|
|
|
|
chart.context = context;
|
2017-10-06 22:46:28 +03:00
|
|
|
chart.width = da.get_allocated_width();
|
|
|
|
chart.height = da.get_allocated_height();
|
2017-10-13 16:39:07 +03:00
|
|
|
chart.clear();
|
|
|
|
|
|
|
|
// user's pre draw operations here...
|
|
|
|
// ...
|
|
|
|
|
2017-08-22 11:54:18 +03:00
|
|
|
/*var ret = */chart.draw();
|
|
|
|
|
2017-02-16 15:10:53 +03:00
|
|
|
// user's post draw operations here...
|
2017-12-17 01:20:07 +03:00
|
|
|
if (mouse_state == MouseState.DRAW_SELECTION)
|
2018-01-16 13:39:17 +03:00
|
|
|
chart.draw_selection (Cairo.Rectangle() {x = sel_x0, y = sel_y0, width = sel_x1 - sel_x0, height = sel_y1 - sel_y0});
|
2017-08-22 11:54:18 +03:00
|
|
|
|
2017-12-17 17:21:39 +03:00
|
|
|
// show delta
|
2018-01-16 19:38:43 +03:00
|
|
|
var str = chart.cursors.get_cursors_delta_str(chart);
|
2017-12-17 17:21:39 +03:00
|
|
|
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);
|
2018-01-08 23:33:13 +03:00
|
|
|
var x0 = chart.plot_x_max - w - 5;
|
|
|
|
var y0 = chart.plot_y_min + h + 5;
|
2018-01-16 20:39:59 +03:00
|
|
|
chart.color = chart.legend.bg_color;
|
2017-12-17 17:21:39 +03:00
|
|
|
context.rectangle (x0, y0 - h, w, h);
|
|
|
|
context.fill();
|
|
|
|
context.move_to (x0, y0);
|
2018-01-16 20:39:59 +03:00
|
|
|
chart.color = chart.joint_axis_color;
|
2017-12-17 17:21:39 +03:00
|
|
|
context.show_text(text);
|
|
|
|
}
|
|
|
|
|
2017-08-22 11:54:18 +03:00
|
|
|
return true;//ret;
|
2017-02-16 15:10:53 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
da.button_press_event.connect((event) => {
|
2017-10-21 20:56:08 +03:00
|
|
|
if (!point_in_chart(chart, event.x, event.y)) return true;
|
2017-08-22 11:54:18 +03:00
|
|
|
|
2017-11-28 21:41:25 +03:00
|
|
|
switch (event.button) {
|
|
|
|
case 1: // start cursor position selection
|
|
|
|
if ((event.state & Gdk.ModifierType.SHIFT_MASK) != 0) { // remove cursor
|
2018-01-16 20:09:14 +03:00
|
|
|
chart.cursors.set_active_cursor (chart, Point(event.x, event.y), true);
|
|
|
|
chart.cursors.remove_active_cursor(chart);
|
2017-11-28 21:51:58 +03:00
|
|
|
mouse_state = MouseState.FREE;
|
2017-11-28 21:41:25 +03:00
|
|
|
} else { // add cursor
|
2018-01-16 20:09:14 +03:00
|
|
|
chart.cursors.set_active_cursor (chart, Point(event.x, event.y));
|
2017-11-28 21:51:58 +03:00
|
|
|
mouse_state = MouseState.CURSOR_SELECTION;
|
2017-11-28 21:41:25 +03:00
|
|
|
}
|
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 2: // start zoom area selection
|
2017-08-22 11:54:18 +03:00
|
|
|
sel_x0 = sel_x1 = event.x;
|
|
|
|
sel_y0 = sel_y1 = event.y;
|
2017-11-28 21:41:25 +03:00
|
|
|
mouse_state = MouseState.DRAW_SELECTION;
|
|
|
|
break;
|
2017-08-22 11:54:18 +03:00
|
|
|
|
2017-11-28 21:41:25 +03:00
|
|
|
case 3: // start moving
|
2017-10-06 22:46:51 +03:00
|
|
|
mov_x0 = event.x;
|
|
|
|
mov_y0 = event.y;
|
2017-11-28 21:41:25 +03:00
|
|
|
mouse_state = MouseState.MOVING_CHART;
|
|
|
|
break;
|
2017-10-06 22:46:51 +03:00
|
|
|
}
|
2017-08-22 11:54:18 +03:00
|
|
|
|
|
|
|
return true; // return ret;
|
|
|
|
});
|
|
|
|
da.button_release_event.connect((event) => {
|
|
|
|
|
2017-10-21 20:56:08 +03:00
|
|
|
if (!point_in_chart(chart, event.x, event.y)) return true;
|
|
|
|
|
2017-11-28 21:41:25 +03:00
|
|
|
switch (event.button) {
|
|
|
|
case 1: // start cursor position selection
|
|
|
|
if ((event.state & Gdk.ModifierType.SHIFT_MASK) != 0) { // remove cursor
|
2017-11-28 21:51:58 +03:00
|
|
|
//chart.remove_active_cursor ();
|
|
|
|
//da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
//mouse_state = MouseState.FREE;
|
2017-11-28 21:41:25 +03:00
|
|
|
} else { // add cursor
|
2018-01-16 20:09:14 +03:00
|
|
|
chart.cursors.add_active_cursor ();
|
2017-11-28 21:41:25 +03:00
|
|
|
mouse_state = MouseState.FREE;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 2:
|
2017-08-22 11:54:18 +03:00
|
|
|
sel_x1 = event.x;
|
|
|
|
sel_y1 = event.y;
|
|
|
|
if (sel_x1 > sel_x0 && sel_y1 > sel_y0)
|
2018-01-16 13:11:25 +03:00
|
|
|
chart.zoom_in (Cairo.Rectangle(){x = sel_x0, y = sel_y0, width = sel_x1 - sel_x0, height = sel_y1 - sel_y0});
|
2017-08-22 11:54:18 +03:00
|
|
|
else
|
|
|
|
chart.zoom_out ();
|
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
2017-11-28 21:41:25 +03:00
|
|
|
mouse_state = MouseState.FREE;
|
|
|
|
break;
|
2017-08-22 11:54:18 +03:00
|
|
|
|
2017-11-28 21:41:25 +03:00
|
|
|
case 3:
|
|
|
|
mouse_state = MouseState.FREE;
|
|
|
|
break;
|
2017-10-06 22:46:51 +03:00
|
|
|
}
|
2017-08-22 11:54:18 +03:00
|
|
|
|
|
|
|
return true; // return ret;
|
2017-02-16 15:10:53 +03:00
|
|
|
});
|
|
|
|
da.motion_notify_event.connect((event) => {
|
2017-10-21 20:56:08 +03:00
|
|
|
if (!point_in_chart(chart, event.x, event.y)) return true;
|
2017-08-22 11:54:18 +03:00
|
|
|
|
2017-11-28 21:41:25 +03:00
|
|
|
switch (mouse_state) {
|
|
|
|
case MouseState.DRAW_SELECTION:
|
2017-08-22 11:54:18 +03:00
|
|
|
sel_x1 = event.x;
|
|
|
|
sel_y1 = event.y;
|
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
2017-11-28 21:41:25 +03:00
|
|
|
break;
|
2017-08-22 11:54:18 +03:00
|
|
|
|
2017-11-28 21:41:25 +03:00
|
|
|
case MouseState.MOVING_CHART:
|
2017-10-06 22:46:51 +03:00
|
|
|
var delta_x = event.x - mov_x0, delta_y = event.y - mov_y0;
|
2018-01-16 13:39:17 +03:00
|
|
|
chart.move (Point(){x = delta_x, y = delta_y});
|
2017-10-06 22:46:51 +03:00
|
|
|
mov_x0 = event.x;
|
|
|
|
mov_y0 = event.y;
|
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
2017-11-28 21:41:25 +03:00
|
|
|
break;
|
|
|
|
|
|
|
|
case MouseState.CURSOR_SELECTION:
|
2018-01-16 20:09:14 +03:00
|
|
|
chart.cursors.set_active_cursor (chart, Point(event.x, event.y));
|
2017-11-28 21:41:25 +03:00
|
|
|
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());
|
|
|
|
break;
|
2017-10-06 22:46:51 +03:00
|
|
|
}
|
|
|
|
|
2017-08-22 11:54:18 +03:00
|
|
|
return true; // return ret;
|
2017-02-09 13:23:16 +03:00
|
|
|
});
|
2017-08-22 12:07:32 +03:00
|
|
|
da.add_events(Gdk.EventMask.SCROLL_MASK);
|
|
|
|
da.scroll_event.connect((event) => {
|
|
|
|
|
2017-08-22 11:54:18 +03:00
|
|
|
//var ret = chart.scroll_notify_event(event);
|
2017-08-22 12:07:32 +03:00
|
|
|
|
2017-08-22 11:54:18 +03:00
|
|
|
return true; // return ret;
|
2017-08-22 12:07:32 +03:00
|
|
|
});
|
2017-02-09 13:23:16 +03:00
|
|
|
|
2017-02-16 15:10:53 +03:00
|
|
|
var vbox2 = new Box(Orientation.VERTICAL, 0);
|
|
|
|
vbox2.pack_start(button1, false, false, 0);
|
|
|
|
vbox2.pack_start(button2, false, false, 0);
|
|
|
|
vbox2.pack_start(button3, false, false, 0);
|
|
|
|
vbox2.pack_start(button4, false, false, 0);
|
|
|
|
vbox2.pack_start(button5, false, false, 0);
|
|
|
|
vbox2.pack_start(button6, false, false, 0);
|
|
|
|
vbox2.pack_start(button7, false, false, 0);
|
2017-10-27 18:51:45 +03:00
|
|
|
vbox2.pack_start(button8, false, false, 0);
|
2017-02-16 15:10:53 +03:00
|
|
|
vbox2.pack_start(radio_button1, false, false, 0);
|
|
|
|
vbox2.pack_start(radio_button2, false, false, 0);
|
|
|
|
vbox2.pack_start(radio_button3, false, false, 0);
|
|
|
|
vbox2.pack_start(radio_button4, false, false, 0);
|
2017-11-28 21:41:25 +03:00
|
|
|
//vbox2.pack_start(radio_button5, false, false, 0);
|
|
|
|
//vbox2.pack_start(radio_button6, false, false, 0);
|
|
|
|
vbox2.pack_start(radio_button7, false, false, 0);
|
|
|
|
vbox2.pack_start(radio_button8, false, false, 0);
|
2017-02-09 13:23:16 +03:00
|
|
|
|
2017-02-16 15:10:53 +03:00
|
|
|
var hbox = new Box(Orientation.HORIZONTAL, 0);
|
|
|
|
hbox.pack_start(da, true, true, 0);
|
|
|
|
hbox.pack_end(vbox2, false, false, 0);
|
2017-02-09 13:23:16 +03:00
|
|
|
|
2017-02-16 15:10:53 +03:00
|
|
|
var vbox = new Box(Orientation.VERTICAL, 0);
|
|
|
|
vbox.pack_start(label, false, false, 0);
|
|
|
|
vbox.pack_end(hbox, true, true, 0);
|
2017-02-09 13:23:16 +03:00
|
|
|
|
2017-02-16 15:10:53 +03:00
|
|
|
window.add(vbox);
|
2017-02-09 13:23:16 +03:00
|
|
|
|
2017-02-16 15:10:53 +03:00
|
|
|
window.show_all();
|
2017-02-09 13:23:16 +03:00
|
|
|
|
2017-02-16 15:10:53 +03:00
|
|
|
Gtk.main();
|
|
|
|
return 0;
|
2017-02-09 13:23:16 +03:00
|
|
|
}
|