예제 #1
0
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, &params->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;
}
예제 #2
0
/**
 * 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);
}
예제 #3
0
/**
 * 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;
}
예제 #4
0
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, &params.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,
                             &params);
}
예제 #5
0
/**
 * 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);
}