cell renderer with spin button



Hi,

I made a cell renderer with a spin button as its cell editable and it
seems to work but I have some problems when the user clicks on the arrow
buttons of the spin button. If he/she clicks too fast the focus go back
to the TreeView and some weird behavior happens.

You can grab the source (it is just 3 small files) at
http://www.sicem.biz/personal/lgs/cosas/rendererspin.tgz and type make;
./demo_spin to see what I mean

Anyhow, the relevant part of the cell renderer is:

static GtkCellEditable *
gtk_cell_renderer_spin_start_editing (GtkCellRenderer     *cell,
                                      GdkEvent            *event,
                                      GtkWidget           *widget,
                                      const gchar         *path,
                                      GdkRectangle        *background_area,
                                      GdkRectangle        *cell_area,
                                      GtkCellRendererState flags)
{
  GtkCellRendererText *cell_text;
  GtkWidget *spin;

  cell_text = GTK_CELL_RENDERER_TEXT (cell);
  if (cell_text->editable == FALSE)
    return NULL;

  spin = gtk_spin_button_new_with_range (0, 100, 1);
  
  if (cell_text->text)
    gtk_spin_button_set_value (spin, g_ascii_strtod (cell_text->text,
NULL));

  g_object_set_data_full (G_OBJECT (spin), GTK_CELL_RENDERER_SPIN_PATH,
                          g_strdup (path), g_free);

  gtk_widget_show (spin);

  g_signal_connect (spin, "focus_out_event",
                    G_CALLBACK (gtk_cell_renderer_spin_focus_out_event),
                    cell);

  return GTK_CELL_EDITABLE (spin);
}

static gboolean
gtk_cell_renderer_spin_focus_out_event (GtkWidget *widget,
                                         GdkEvent  *event,
                                         gpointer   data)
{
  const gchar *path;
  const gchar *new_text;
  path = g_object_get_data (G_OBJECT (widget),
GTK_CELL_RENDERER_SPIN_PATH);

  new_text = gtk_entry_get_text (GTK_ENTRY (widget));
  g_signal_emit_by_name (data, "edited", path, new_text);
  g_signal_handlers_disconnect_by_func (widget,
                                        gtk_cell_renderer_spin_focus_out_event,
                                        data);
  return FALSE;
}



Can anybody help me on this? Thanks in advance

Lorenzo Gil





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