gboolean gwy_graph_curve_model_save_curve(GwyGraphCurveModel *gcmodel, GwyGraph *graph, gint index_) { GwyGraphAreaCurve *curve; GwyGraphAreaCurveParams *params; GString *str; gint n; gwy_debug(""); g_return_val_if_fail(GWY_IS_GRAPH_CURVE_MODEL(gcmodel), FALSE); g_return_val_if_fail(GWY_IS_GRAPH(graph), FALSE); n = gwy_graph_get_number_of_curves(graph); if (index_ < 0 || index_ >= n) return FALSE; /* data */ n = gwy_graph_get_data_size(graph, index_); if (n != gcmodel->n) { gcmodel->n = n; gcmodel->xdata = g_renew(gdouble, gcmodel->xdata, n); gcmodel->ydata = g_renew(gdouble, gcmodel->ydata, n); } gwy_graph_get_data(graph, gcmodel->xdata, gcmodel->ydata, index_); /* properties */ str = gwy_graph_get_label(graph, index_); g_string_assign(gcmodel->description, str->str); /* FIXME: direct access */ curve = (GwyGraphAreaCurve*)g_ptr_array_index(graph->area->curves, index_); params = &curve->params; /* XXX FIXME: this now uses some random unitialized memory as the color. * Fix the graph! */ gwy_rgba_from_gdk_color(&gcmodel->color, ¶ms->color); gcmodel->type = GWY_GRAPH_CURVE_HIDDEN; if (params->is_point) gcmodel->type |= GWY_GRAPH_CURVE_POINTS; if (params->is_line) gcmodel->type |= GWY_GRAPH_CURVE_LINE; gcmodel->point_type = params->point_type; gcmodel->point_size = params->point_size; gcmodel->line_style = params->line_style; gcmodel->line_size = params->line_size; return TRUE; }
/** * gwy_graph_func_run: * @name: Graph function name. * @graph: Graph (a #GwyGraph). * * Runs a graph function identified by @name. **/ void gwy_graph_func_run(const gchar *name, GwyGraph *graph) { GwyGraphFuncInfo *func_info; func_info = g_hash_table_lookup(graph_funcs, name); g_return_if_fail(func_info); g_return_if_fail(GWY_IS_GRAPH(graph)); g_ptr_array_add(call_stack, func_info); func_info->func(graph, name); g_return_if_fail(call_stack->len); g_ptr_array_set_size(call_stack, call_stack->len-1); }
/** * gwy_graph_func_run: * @name: Graph function name. * @graph: Graph (a #GwyGraph). * * Runs a graph function identified by @name. * * Returns: %TRUE on success, %FALSE on failure. XXX: whatever it means. **/ gboolean gwy_graph_func_run(const guchar *name, GwyGraph *graph) { GraphFuncInfo *func_info; gboolean status; func_info = g_hash_table_lookup(graph_funcs, name); g_return_val_if_fail(func_info, FALSE); g_return_val_if_fail(GWY_IS_GRAPH(graph), FALSE); g_object_ref(graph); status = func_info->info.graph(graph, name); g_object_unref(graph); return status; }
void gwy_graph_add_curve_from_model(GwyGraph *graph, GwyGraphCurveModel *gcmodel) { GwyGraphAreaCurveParams params; g_return_if_fail(GWY_IS_GRAPH(graph)); g_return_if_fail(GWY_IS_GRAPH_CURVE_MODEL(gcmodel)); gwy_rgba_to_gdk_color(&gcmodel->color, ¶ms.color); params.is_point = (gcmodel->type & GWY_GRAPH_CURVE_POINTS) != 0; params.point_type = gcmodel->point_type; params.point_size = gcmodel->point_size; params.is_line = (gcmodel->type & GWY_GRAPH_CURVE_LINE) != 0; params.line_style = gcmodel->line_style; params.line_size = gcmodel->line_size; gwy_graph_add_datavalues(graph, gcmodel->xdata, gcmodel->ydata, gcmodel->n, gcmodel->description, ¶ms); }
/** * gwy_graph_window_new: * @graph: A GwyGraph object containing the graph. * * Creates a new window showing @graph. * * Returns: A newly created graph window as #GtkWidget. **/ GtkWidget* gwy_graph_window_new(GwyGraph *graph) { GwyGraphWindow *graphwindow; GwyGraphArea *area; GwySelection *selection; GtkScrolledWindow *swindow; GtkWidget *vbox, *hbox; GtkWidget *label; gwy_debug(""); g_return_val_if_fail(GWY_IS_GRAPH(graph), NULL); graphwindow = (GwyGraphWindow*)g_object_new(GWY_TYPE_GRAPH_WINDOW, NULL); gtk_window_set_wmclass(GTK_WINDOW(graphwindow), "data", g_get_application_name()); gtk_window_set_resizable(GTK_WINDOW(graphwindow), TRUE); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(GTK_WINDOW(graphwindow)), vbox); graphwindow->graph = GTK_WIDGET(graph); graphwindow->last_status = gwy_graph_get_status(graph); /*add notebook with graph and text matrix*/ graphwindow->notebook = gtk_notebook_new(); graph_title_changed(graphwindow); label = gtk_label_new(_("Graph")); gtk_notebook_append_page(GTK_NOTEBOOK(graphwindow->notebook), GTK_WIDGET(graph), label); swindow = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); graphwindow->data = gwy_graph_data_new(gwy_graph_get_model(graph)); gtk_container_add(GTK_CONTAINER(swindow), graphwindow->data); label = gtk_label_new(_("Data")); gtk_notebook_append_page(GTK_NOTEBOOK(graphwindow->notebook), GTK_WIDGET(swindow), label); gtk_container_add(GTK_CONTAINER(vbox), graphwindow->notebook); /*add buttons*/ hbox = gtk_hbox_new(FALSE, 0); graphwindow->button_measure_points = gtk_toggle_button_new(); gtk_container_add(GTK_CONTAINER(graphwindow->button_measure_points), gtk_image_new_from_stock(GWY_STOCK_GRAPH_MEASURE, GTK_ICON_SIZE_LARGE_TOOLBAR)); gtk_box_pack_start(GTK_BOX(hbox), graphwindow->button_measure_points, FALSE, FALSE, 0); gwy_graph_window_set_tooltip(graphwindow->button_measure_points, _("Measure distances in graph")); g_signal_connect_swapped(graphwindow->button_measure_points, "clicked", G_CALLBACK(gwy_graph_window_measure), graphwindow); graphwindow->button_zoom_in = gtk_toggle_button_new(); gtk_container_add(GTK_CONTAINER(graphwindow->button_zoom_in), gtk_image_new_from_stock(GWY_STOCK_GRAPH_ZOOM_IN, GTK_ICON_SIZE_LARGE_TOOLBAR)); gtk_box_pack_start(GTK_BOX(hbox), graphwindow->button_zoom_in, FALSE, FALSE, 0); gwy_graph_window_set_tooltip(graphwindow->button_zoom_in, _("Zoom in by mouse selection")); g_signal_connect_swapped(graphwindow->button_zoom_in, "toggled", G_CALLBACK(gwy_graph_window_zoom_in), graphwindow); graphwindow->button_zoom_to_fit = gtk_button_new(); gtk_container_add(GTK_CONTAINER(graphwindow->button_zoom_to_fit), gtk_image_new_from_stock(GWY_STOCK_GRAPH_ZOOM_FIT, GTK_ICON_SIZE_LARGE_TOOLBAR)); gtk_box_pack_start(GTK_BOX(hbox), graphwindow->button_zoom_to_fit, FALSE, FALSE, 0); gwy_graph_window_set_tooltip(graphwindow->button_zoom_to_fit, _("Zoom out to full curve")); g_signal_connect_swapped(graphwindow->button_zoom_to_fit, "clicked", G_CALLBACK(gwy_graph_window_zoom_to_fit), graphwindow); graphwindow->button_x_log = gtk_toggle_button_new(); gtk_container_add(GTK_CONTAINER(graphwindow->button_x_log), gtk_image_new_from_stock(GWY_STOCK_LOGSCALE_HORIZONTAL, GTK_ICON_SIZE_LARGE_TOOLBAR)); gtk_box_pack_start(GTK_BOX(hbox), graphwindow->button_x_log, FALSE, FALSE, 0); gwy_graph_window_set_tooltip(graphwindow->button_x_log, _("Toggle logarithmic x axis")); g_signal_connect_swapped(graphwindow->button_x_log, "clicked", G_CALLBACK(gwy_graph_window_x_log), graphwindow); gtk_widget_set_sensitive(graphwindow->button_x_log, gwy_graph_model_x_data_can_be_logarithmed(graph->graph_model)); graphwindow->button_y_log = gtk_toggle_button_new(); gtk_container_add(GTK_CONTAINER(graphwindow->button_y_log), gtk_image_new_from_stock(GWY_STOCK_LOGSCALE_VERTICAL, GTK_ICON_SIZE_LARGE_TOOLBAR)); gtk_box_pack_start(GTK_BOX(hbox), graphwindow->button_y_log, FALSE, FALSE, 0); gwy_graph_window_set_tooltip(graphwindow->button_x_log, _("Toggle logarithmic y axis")); g_signal_connect_swapped(graphwindow->button_y_log, "clicked", G_CALLBACK(gwy_graph_window_y_log), graphwindow); gtk_widget_set_sensitive(graphwindow->button_y_log, gwy_graph_model_y_data_can_be_logarithmed(graph->graph_model)); graphwindow->statusbar = gwy_statusbar_new(); gtk_widget_set_name(graphwindow->statusbar, "gwyflatstatusbar"); gtk_box_pack_start(GTK_BOX(hbox), graphwindow->statusbar, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); graphwindow->measure_dialog = _gwy_graph_window_measure_dialog_new(graph); g_signal_connect_swapped(graphwindow->measure_dialog, "response", G_CALLBACK(gwy_graph_window_measure_finished), graphwindow); g_signal_connect_swapped(gwy_graph_get_area(graph), "motion-notify-event", G_CALLBACK(gwy_graph_cursor_motion), graphwindow); area = GWY_GRAPH_AREA(gwy_graph_get_area(graph)); selection = gwy_graph_area_get_selection(area, GWY_GRAPH_STATUS_ZOOM); g_signal_connect_swapped(selection, "finished", G_CALLBACK(gwy_graph_window_zoom_finished), graphwindow); if (gwy_graph_get_model(GWY_GRAPH(graphwindow->graph))) g_signal_connect_swapped(gwy_graph_get_model(graph), "notify::title", G_CALLBACK(graph_title_changed), graphwindow); return GTK_WIDGET(graphwindow); }