GTK+ Forums

Discussion forum for GTK+ and Programming. Ask questions, troubleshoot problems, view and post example code, or express your opinions.
It is currently Wed Sep 24, 2014 12:25 am

All times are UTC




Post new topic Reply to topic  [ 1 post ] 
Author Message
 Post subject: Gtk Ruler extra tick
PostPosted: Sat Feb 23, 2013 10:31 am 
Offline
Familiar Face

Joined: Tue Nov 29, 2011 7:59 pm
Posts: 11
Hello, everyone. I write program which use plot to display data. And I need a good ruler for my plot. Gtk ruler is very simple and does not allow for additional ticks. Then I try new version of GtkDatabox 0.9.2.0 (http://sourceforge.net/projects/gtkdatabox/), but rulers.c example does not work (no additional ticks). What other libraries to set up additional ticks on GtkRuler?

rulers.c code:

Code:
#include <stdio.h>

#include <gtk/gtk.h>
#include <gtkdatabox.h>
#include <gtkdatabox_points.h>
#include <gtkdatabox_ruler.h>
#include <math.h>

#define POINTS 100000
/*
#define STEPS 50
#define BARS 25
#define MARKER 10
*/
#define NO_BOXES 4

/*----------------------------------------------------------------
*  databox rulers
*----------------------------------------------------------------*/

static void
create_rulers (void)
{
    GtkWidget *window = NULL;
    GtkWidget *hbox;
    GtkWidget *vbox;
    GtkWidget *close_button;
    GtkWidget *box[NO_BOXES];
    GtkWidget *label;
    GtkWidget *separator;
    GtkWidget *table;
    GtkDataboxGraph *graph;
    gfloat min_x, max_x;
    gfloat min_y, max_y;
    gfloat *X;
    gfloat *Y;
    GdkColor color;
    gint i;

    guint manual_tick_cnt=4;
    gfloat manual_ticks[]={100., 300., 500., 700.};

    guint manual_tick_cnt_box2=5;
    gfloat manual_ticks_box2[]={.01, .1, 1., 10., 100.};
    gchar *manual_tick_labels_box2[]={"these", "are", "manual", "tick", "labels"};


    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_size_request (window, 1000, 500);

    g_signal_connect (GTK_OBJECT (window), "destroy",
                      G_CALLBACK (gtk_main_quit), NULL);

    gtk_window_set_title (GTK_WINDOW (window),
                          "GtkDatabox: Ruler option example plots");
    gtk_container_set_border_width (GTK_CONTAINER (window), 0);

    vbox = gtk_vbox_new (FALSE, 0);
    gtk_container_add (GTK_CONTAINER (window), vbox);

    label = gtk_label_new
            ("demonstrates diferent ruler settings\n");
    gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
    separator = gtk_hseparator_new ();
    gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 0);

    hbox = gtk_hbox_new (FALSE, 0);
    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);

    label = gtk_label_new ("Rulers on the other side:");
    gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);

    label = gtk_label_new ("Horizontal y axis text\n manual x axis ticks example\n right aligned y text:");
    gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);

    label = gtk_label_new ("Subticks turned off on x and y,\n manual tick labels on x:");
    gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);

    label = gtk_label_new ("X ticks turned off, no shadow\n horizontal y axis text,\n altered y label format example:");
    gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);

    separator = gtk_hseparator_new ();
    gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 0);

    /* Create the databoxes */
    hbox = gtk_hbox_new (FALSE, 0);
    gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);

    for (i = 0; i < NO_BOXES; ++i)
    {
        if (i==0 | i==NO_BOXES-1) /* the first is normal but with the rulers on opposite sides to the default */
            gtk_databox_create_box_with_scrollbars_and_rulers_positioned (&box[i], &table,TRUE, TRUE, TRUE,TRUE,FALSE,FALSE);
        else
            gtk_databox_create_box_with_scrollbars_and_rulers (&box[i], &table,TRUE, TRUE, TRUE,TRUE);
        gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
    }

    /* set box 1's y ruler to have horizontal text */
    GtkDataboxRuler *ruler=gtk_databox_get_ruler_y(GTK_DATABOX (box[1]));
    gtk_databox_ruler_set_text_orientation(ruler, GTK_ORIENTATION_HORIZONTAL);
    gtk_databox_ruler_set_box_shadow(ruler, GTK_SHADOW_ETCHED_OUT);
    gtk_databox_ruler_set_text_alignment (ruler, PANGO_ALIGN_RIGHT);
    gtk_databox_set_ruler_y (GTK_DATABOX (box[1]), ruler);
    ruler=gtk_databox_get_ruler_x(GTK_DATABOX (box[1]));     /* set box 1's x ruler to have manual ticks */
    gtk_databox_ruler_set_manual_tick_cnt(ruler, manual_tick_cnt);
    gtk_databox_ruler_set_manual_ticks(ruler, manual_ticks);
    gtk_databox_set_ruler_x (GTK_DATABOX (box[1]), ruler);

    /* set box 2 to have no subticks */
    ruler=gtk_databox_get_ruler_y(GTK_DATABOX (box[2]));
    gtk_databox_ruler_set_draw_subticks(ruler, FALSE);
    gtk_databox_set_ruler_y (GTK_DATABOX (box[2]), ruler);
    ruler=gtk_databox_get_ruler_x(GTK_DATABOX (box[2])); /* put manual labels on x */
    gtk_databox_ruler_set_draw_subticks(ruler, FALSE);
    gtk_databox_ruler_set_manual_tick_cnt(ruler, manual_tick_cnt_box2);
    gtk_databox_ruler_set_manual_ticks(ruler, manual_ticks_box2);
    gtk_databox_ruler_set_manual_tick_labels(ruler, manual_tick_labels_box2);
    gtk_databox_set_ruler_x (GTK_DATABOX (box[2]), ruler);

    /* set box 3's y ruler to have horizontal text */
    ruler=gtk_databox_get_ruler_y(GTK_DATABOX (box[3]));
    gtk_databox_ruler_set_text_orientation(ruler, GTK_ORIENTATION_HORIZONTAL);
    gtk_databox_set_ruler_y (GTK_DATABOX (box[3]), ruler);
    /* set box 3 to have no x ticks */
    ruler=gtk_databox_get_ruler_x(GTK_DATABOX (box[3]));
    gtk_databox_ruler_set_draw_ticks(ruler, FALSE);
    /* box[3] to have different shadow on the ruler */
    gtk_databox_ruler_set_box_shadow(ruler, GTK_SHADOW_NONE);
    gtk_databox_set_ruler_x (GTK_DATABOX (box[3]), ruler);
    ruler=gtk_databox_get_ruler_y(GTK_DATABOX (box[3]));
    gtk_databox_ruler_set_draw_subticks(ruler, FALSE);
    /* set box[3] to have different formatting */
    gtk_databox_ruler_set_linear_label_format(ruler, "%%-%dg");
    gtk_databox_set_ruler_y (GTK_DATABOX (box[3]), ruler);

    /* set the background */
    color.red = 16383;
    color.green = 16383;
    color.blue = 16383;
    for (i = 0; i < NO_BOXES; ++i)
        gtk_widget_modify_bg (box[i], GTK_STATE_NORMAL, &color);

    /* add a sinus^2 */
    X = g_new0 (gfloat, POINTS);
    Y = g_new0 (gfloat, POINTS);

    for (i = 0; i < POINTS; i++)
    {
        X[i] = i / 100.;
        Y[i] = 0.01 + 1000 * pow (sin (i * G_PI / POINTS), 2);
    }

    color.red = 0;
    color.green = 65535;
    color.blue = 0;

    graph = gtk_databox_points_new (POINTS, X, Y, &color, 1);
    for (i = 0; i < NO_BOXES; ++i)
        gtk_databox_graph_add (GTK_DATABOX (box[i]), graph);

    /* add an exp function */
    X = g_new0 (gfloat, POINTS);
    Y = g_new0 (gfloat, POINTS);

    for (i = 0; i < POINTS; i++)
    {
        X[i] = i / 100.;
        Y[i] = exp (log (1000) * i / ((gfloat) POINTS));
    }

    color.red = 65535;
    color.green = 0;
    color.blue = 0;

    graph = gtk_databox_points_new (POINTS, X, Y, &color, 1);
    for (i = 0; i < NO_BOXES; ++i)
        gtk_databox_graph_add (GTK_DATABOX (box[i]), graph);

    /* add an 1/x function */
    X = g_new0 (gfloat, POINTS);
    Y = g_new0 (gfloat, POINTS);

    for (i = 0; i < POINTS; i++)
    {
        X[i] = i / 100.;
        Y[i] = 1000. / (100. * (gfloat) i / POINTS);
    }

    color.red = 65535;
    color.green = 0;
    color.blue = 65535;

    graph = gtk_databox_points_new (POINTS, X, Y, &color, 1);
    for (i = 0; i < NO_BOXES; ++i)
        gtk_databox_graph_add (GTK_DATABOX (box[i]), graph);

    /* add an x^2 function */
    X = g_new0 (gfloat, POINTS);
    Y = g_new0 (gfloat, POINTS);

    for (i = 0; i < POINTS; i++)
    {
        X[i] = i / 100.;
        Y[i] = 1000. * (gfloat) i / POINTS * (gfloat) i / POINTS;
    }

    color.red = 65535;
    color.green = 65535;
    color.blue = 0;

    graph = gtk_databox_points_new (POINTS, X, Y, &color, 1);
    for (i = 0; i < NO_BOXES; ++i)
        gtk_databox_graph_add (GTK_DATABOX (box[i]), graph);

    /* set the extrema */
    min_x = 0.01;
    max_x = 1000.;
    min_y = 1000.;
    max_y = 0.01;

    for (i = 0; i < NO_BOXES-1; ++i)
        gtk_databox_set_total_limits (GTK_DATABOX (box[i]), min_x, max_x, min_y,
                                      max_y);
    gtk_databox_set_total_limits (GTK_DATABOX (box[i]), 8, max_x, min_y,
                                  max_y);

    gtk_databox_set_scale_type_y (GTK_DATABOX (box[1]), GTK_DATABOX_SCALE_LOG);
    gtk_databox_set_scale_type_x (GTK_DATABOX (box[2]), GTK_DATABOX_SCALE_LOG);
    gtk_databox_set_scale_type_y (GTK_DATABOX (box[2]), GTK_DATABOX_SCALE_LOG);
    gtk_databox_set_scale_type_x (GTK_DATABOX (box[3]), GTK_DATABOX_SCALE_LOG2);

    separator = gtk_hseparator_new ();
    gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);

    close_button = gtk_button_new_with_label ("close");
    g_signal_connect (GTK_OBJECT (close_button), "clicked",
                      G_CALLBACK (gtk_main_quit), NULL);
    gtk_box_pack_start (GTK_BOX (vbox), close_button, FALSE, FALSE, 0);
    gtk_widget_set_can_default(close_button, GTK_CAN_DEFAULT);
    gtk_widget_grab_default (close_button);
    gtk_widget_grab_focus (close_button);

    gtk_widget_show_all (window);
    gdk_window_set_cursor (box[0]->window, gdk_cursor_new (GDK_CROSS));

}

gint
main (gint argc, char *argv[])
{
    gtk_init (&argc, &argv);

    create_rulers();
    gtk_main ();

    return 0;
}


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group