Re: Lucky B.C.'s reply to GtkDrawingArea "width" and "height" <properties>



Okay, I see you really want to know how to resize the GtkDrawingArea by
GtkSpinButton. Here It's my demo
<https://github.com/LuckyBC/Resize_GtkDrawingArea.git> about resizing the
GtkDrawingArea by 2 width and height GtkSpinButtons.

On Wed, Mar 7, 2018 at 6:15 AM, Eric Cashon via gtk-app-devel-list <
gtk-app-devel-list gnome org> wrote:



Hi Roger,

Not sure about your builder question and setting the width and height of
the drawing area there. For drawing lines though it looks like you are
trying to get the width and height of the GtkWindow instead of the drawing
area. The drawing area widget is passed to your "draw" callback so you can
get the width and height there. For updating the drawing with the spin
buttons you would need to send the drawing area to those callbacks and call
gtk_widget_queue_draw(da) to update your drawing.

Can you put gtk_widget_set_size_request() right after

drawing1 = gtk_builder_get_object (builder1, "drawing1");

in your code? Will that work?

Eric

Some test code.

//gcc -Wall grid_da1.c -o grid_da1 `pkg-config --cflags --libs gtk+-3.0`

#include<gtk/gtk.h>

static gint rows=4;
static gint columns=5;

static void rows_spin_changed(GtkSpinButton *spin_button, GtkWidget *da);
static void columns_spin_changed(GtkSpinButton *spin_button, GtkWidget
*da);
static gboolean draw_lines(GtkWidget *widget, cairo_t *cr, gpointer data);

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

    GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 600, 400);
    gtk_window_set_title(GTK_WINDOW(window), "Draw Grid");
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    GtkWidget *da=gtk_drawing_area_new();
    gtk_widget_set_size_request(da, 600, 600);
    g_signal_connect(da, "draw", G_CALLBACK(draw_lines), NULL);

    GtkWidget *view=gtk_viewport_new(NULL, NULL);
    gtk_container_add(GTK_CONTAINER(view), da);
    GtkWidget *scroll=gtk_scrolled_window_new(NULL, NULL);
    gtk_container_add(GTK_CONTAINER(scroll), view);

    GtkAdjustment *adjustment1=gtk_adjustment_new(4, 3, 15, 1, 0, 0);
    GtkAdjustment *adjustment2=gtk_adjustment_new(5, 3, 15, 1, 0, 0);

    GtkWidget *rows_spin_label=gtk_label_new("Rows");

    GtkWidget *rows_spin=gtk_spin_button_new(adjustment1, 1, 0);
    g_signal_connect(rows_spin, "value-changed",
G_CALLBACK(rows_spin_changed), da);

    GtkWidget *columns_spin_label=gtk_label_new("Columns");

    GtkWidget *columns_spin=gtk_spin_button_new(adjustment2, 1, 0);
    g_signal_connect(columns_spin, "value-changed",
G_CALLBACK(columns_spin_changed), da);

    GtkWidget *grid=gtk_grid_new();
    gtk_grid_set_row_spacing(GTK_GRID(grid), 8);
    gtk_grid_attach(GTK_GRID(grid), rows_spin_label, 0, 0, 1, 1);
    gtk_grid_attach(GTK_GRID(grid), rows_spin, 0, 1, 1, 1);
    gtk_grid_attach(GTK_GRID(grid), columns_spin_label, 0, 2, 1, 1);
    gtk_grid_attach(GTK_GRID(grid), columns_spin, 0, 3, 1, 1);

    GtkWidget *paned1=gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
    gtk_paned_pack1(GTK_PANED(paned1), grid, FALSE, TRUE);
    gtk_paned_pack2(GTK_PANED(paned1), scroll, TRUE, TRUE);
    gtk_paned_set_position(GTK_PANED(paned1), 200);

    gtk_container_add(GTK_CONTAINER(window), paned1);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
  }
static void rows_spin_changed(GtkSpinButton *spin_button, GtkWidget *da)
  {
    rows=gtk_spin_button_get_value_as_int(spin_button);
    gtk_widget_queue_draw(da);
  }
static void columns_spin_changed(GtkSpinButton *spin_button, GtkWidget
*da)
  {
    columns=gtk_spin_button_get_value_as_int(spin_button);
    gtk_widget_queue_draw(da);
  }
static gboolean draw_lines(GtkWidget *da, cairo_t *cr, gpointer data)
  {
    g_print("Drawing Area Width %i, Height %i\n", gtk_widget_get_allocated_width(da),
gtk_widget_get_allocated_height(da));
    gint i=0;
    gdouble width=(gdouble)gtk_widget_get_allocated_width(da);
    gdouble height=(gdouble)gtk_widget_get_allocated_height(da);
    gdouble w1=width/10.0;
    gdouble h1=height/10.0;
    gdouble w2=8.0*w1/(gdouble)columns;
    gdouble h2=8.0*h1/(gdouble)rows;

    cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0);
    cairo_paint(cr);

    cairo_set_line_width(cr, 3.0);
    cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 1.0);
    for(i=0;i<rows+1;i++)
      {
        cairo_move_to(cr, w1, h1+(gdouble)i*h2);
        cairo_line_to(cr, 9.0*w1, h1+(gdouble)i*h2);
        cairo_stroke(cr);
      }

    cairo_set_source_rgba(cr, 0.0, 1.0, 0.0, 1.0);
    for(i=0;i<columns+1;i++)
      {
        cairo_move_to(cr, w1+(gdouble)i*w2, h1);
        cairo_line_to(cr, w1+(gdouble)i*w2, 9.0*h1);
        cairo_stroke(cr);
      }

    return FALSE;
  }



_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]