method to erase a drawing area

2009-04-17 Thread frederico schardong
Hi,

I have a drawing area, and a window with 2 gtk_range, and them
variable form 1 to 10, and this values go to posH and posV. I'm doing
this to can draw a rectangular with my specification.. max width: 10,
min: 1, max henght:10, min: 1.

This event is called when drawing area is clicked:

static gboolean button_pressed (GtkWidget *a, GdkEventButton *event)
{
gint x = event-x, y = event-y, x1, y1;

for(x1 = (0-posH); x1  posH; x1++)
{
for(y1 = (0-posV); y1  posV; y1++)
{
gdk_draw_point(desenho-drawingArea-window,
desenho-drawingArea-style-fg_gc[GTK_WIDGET_STATE(desenho-drawingArea)],
x+x1, y+y1);
}
}

g_print(\ndrawing x: %d y: %d tamH: %d tamV: %d, x, y, posH, posV);

g_ptr_array_add(desenho-parray, GINT_TO_POINTER(x));
g_ptr_array_add(desenho-parray, GINT_TO_POINTER(y));
g_ptr_array_add(desenho-parray, GINT_TO_POINTER(posH));
g_ptr_array_add(desenho-parray, GINT_TO_POINTER(posV));
}

But now I must do a eraser function... I do a simple for:
gint x1, x = event-x, y = event-y;

for (x1 = 0; x1  desenho-parray-len; x1 = x1 + 4)
{
if((GPOINTER_TO_INT(desenho-parray-pdata[x1]) == x) 
(GPOINTER_TO_INT(desenho-parray-pdata[x1+1]) == y))
{   g_print(\nta no lugar certo mano!);
g_ptr_array_remove_index(desenho-parray, x1);
g_ptr_array_remove_index(desenho-parray, x1);
g_ptr_array_remove_index(desenho-parray, x1);
g_ptr_array_remove_index(desenho-parray, x1);
}


 it's work, but not fine... it's only work when i click exactly where
I clicked before to draw this point... but I need to delete from
GPtrArray when I click on somewhere of this rectangle area... not only
center... Can help me list?
___
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list


Re: method to erase a drawing area

2009-04-17 Thread Dov Grobgeld
Hello Frederico,

What you are doing is basically hit detection. What I wonder is why you are
doing it the hard way. Why don't you use one of the canvas widgets, e.g.
goocanvas? It allows you to tie events to specific geometric objects.

If you want to do it on your own I first of all suggest that you use cairo,
using gdk_draw_* is considered obsolete. Second you can use the idea of
keeping a second non-visible image as a label image. I've described this
multiple times on the net:

   - http://www.mail-archive.com/gtk-perl-l...@gnome.org/msg01428.html
   - http://www.mail-archive.com/gtk-l...@gnome.org/msg27934.html

Regarding your approach you can still salvage it by instead of checking for

 if((GPOINTER_TO_INT(desenho-parray-pdata[x1]) == x) 
(GPOINTER_TO_INT(desenho-parray-pdata[x1+1]) == y))

you check for

  int xp = GPOINTER_TO_INT(desenho-parray-pdata[x1]);
  int yp = GPOINTER_TO_INT(desenho-parray-pdata[x1+1]);
  int posH = GPOINTER_TO_INT(desenho-parray-pdata[x1+2]);
  int posV = GPOINTER_TO_INT(desenho-parray-pdata[x1+3]);

if (abs(xp-x)posH  abs(yp-y)posV) ...

Regards,
Dov


2009/4/17 frederico schardong frede@gmail.com

 Hi,

 I have a drawing area, and a window with 2 gtk_range, and them
 variable form 1 to 10, and this values go to posH and posV. I'm doing
 this to can draw a rectangular with my specification.. max width: 10,
 min: 1, max henght:10, min: 1.

 This event is called when drawing area is clicked:

 static gboolean button_pressed (GtkWidget *a, GdkEventButton *event)
 {
gint x = event-x, y = event-y, x1, y1;

for(x1 = (0-posH); x1  posH; x1++)
{
for(y1 = (0-posV); y1  posV; y1++)
{
gdk_draw_point(desenho-drawingArea-window,
 desenho-drawingArea-style-fg_gc[GTK_WIDGET_STATE(desenho-drawingArea)],
 x+x1, y+y1);
}
}

g_print(\ndrawing x: %d y: %d tamH: %d tamV: %d, x, y, posH,
 posV);

g_ptr_array_add(desenho-parray, GINT_TO_POINTER(x));
g_ptr_array_add(desenho-parray, GINT_TO_POINTER(y));
g_ptr_array_add(desenho-parray, GINT_TO_POINTER(posH));
g_ptr_array_add(desenho-parray, GINT_TO_POINTER(posV));
 }

 But now I must do a eraser function... I do a simple for:
 gint x1, x = event-x, y = event-y;

 for (x1 = 0; x1  desenho-parray-len; x1 = x1 + 4)
{
if((GPOINTER_TO_INT(desenho-parray-pdata[x1]) == x) 
 (GPOINTER_TO_INT(desenho-parray-pdata[x1+1]) == y))
{   g_print(\nta no lugar certo mano!);
g_ptr_array_remove_index(desenho-parray, x1);
g_ptr_array_remove_index(desenho-parray, x1);
g_ptr_array_remove_index(desenho-parray, x1);
g_ptr_array_remove_index(desenho-parray, x1);
}


  it's work, but not fine... it's only work when i click exactly where
 I clicked before to draw this point... but I need to delete from
 GPtrArray when I click on somewhere of this rectangle area... not only
 center... Can help me list?
 ___
 gtk-app-devel-list mailing list
 gtk-app-devel-list@gnome.org
 http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

___
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list