X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-cell-renderer-button.c;h=e81180c469f9fb6223065d31ffb657852a98842a;hb=f7f44a1961d1f95629cf2944129ea32822c50c1a;hp=ac90984a3d233c35823a86dfde80f2d6e92481d4;hpb=f481fd69631024bcdc7dc2369bbc1592d7a43ac7;p=pspp diff --git a/src/ui/gui/psppire-cell-renderer-button.c b/src/ui/gui/psppire-cell-renderer-button.c index ac90984a3d..e81180c469 100644 --- a/src/ui/gui/psppire-cell-renderer-button.c +++ b/src/ui/gui/psppire-cell-renderer-button.c @@ -70,15 +70,14 @@ psppire_cell_renderer_button_set_property (GObject *object, GParamSpec *pspec) { PsppireCellRendererButton *obj = PSPPIRE_CELL_RENDERER_BUTTON (object); - switch (prop_id) { case PROP_EDITABLE: obj->editable = g_value_get_boolean (value); if (obj->editable) - GTK_CELL_RENDERER (obj)->mode = GTK_CELL_RENDERER_MODE_EDITABLE; + g_object_set (obj, "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL); else - GTK_CELL_RENDERER (obj)->mode = GTK_CELL_RENDERER_MODE_INERT; + g_object_set (obj, "mode", GTK_CELL_RENDERER_MODE_INERT, NULL); break; case PROP_LABEL: @@ -182,17 +181,18 @@ update_style_cache (PsppireCellRendererButton *button, static void psppire_cell_renderer_button_render (GtkCellRenderer *cell, - GdkDrawable *window, + GdkWindow *window, GtkWidget *widget, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, GtkCellRendererState flags) { - PsppireCellRendererButton *button = PSPPIRE_CELL_RENDERER_BUTTON (cell); GtkStateType state_type; - - if (!button->editable || !cell->sensitive) + PsppireCellRendererButton *button = PSPPIRE_CELL_RENDERER_BUTTON (cell); + gfloat xalign, yalign; + + if (!button->editable || ! gtk_cell_renderer_get_sensitive (cell)) state_type = GTK_STATE_INSENSITIVE; else if (flags & GTK_CELL_RENDERER_SELECTED) { @@ -211,19 +211,30 @@ psppire_cell_renderer_button_render (GtkCellRenderer *cell, state_type = GTK_STATE_NORMAL; } + gtk_cell_renderer_get_alignment (cell, &xalign, &yalign); + update_style_cache (button, widget); facade_button_render (widget, window, expose_area, cell_area, button->border_width, button->button_style, state_type, button->label_style, button->label, button->xpad, - button->ypad, cell->xalign, cell->yalign); + button->ypad, xalign, yalign); if (button->slash) - gdk_draw_line (window, button->button_style->black_gc, - cell_area->x, - cell_area->y + cell_area->height, - cell_area->x + cell_area->width, - cell_area->y); + { + cairo_t *cr = gdk_cairo_create (window); + + cairo_set_line_width (cr, 1.0); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + cairo_move_to (cr, + cell_area->x, + cell_area->y + cell_area->height); + + cairo_line_to (cr, + cell_area->x + cell_area->width, + cell_area->y); + cairo_stroke (cr); + } } static void @@ -292,25 +303,6 @@ psppire_cell_renderer_button_clicked (GtkButton *button, g_free (path); } -static gboolean -psppire_cell_renderer_button_focus_out_event (GtkWidget *widget, - GdkEvent *event, - gpointer data) -{ - PsppireCellRendererButton *cell_button = data; - - g_signal_handlers_disconnect_by_func (widget, - psppire_cell_renderer_button_focus_out_event, - data); - g_signal_handlers_disconnect_by_func (widget, - psppire_cell_renderer_button_clicked, - data); - - gtk_cell_renderer_stop_editing (GTK_CELL_RENDERER (cell_button), FALSE); - - return FALSE; -} - #define IDLE_ID_STRING "psppire-cell-renderer-button-idle-id" static gboolean @@ -318,8 +310,8 @@ psppire_cell_renderer_button_initial_click (gpointer data) { GtkButton *button = data; - gtk_button_clicked (button); g_object_steal_data (G_OBJECT (button), IDLE_ID_STRING); + gtk_button_clicked (button); return FALSE; } @@ -359,7 +351,17 @@ psppire_cell_renderer_button_press_event (GtkButton *button, /* Allow right-click events to propagate upward in the widget hierarchy. Otherwise right-click menus, that trigger on a button-press-event on the containing PsppSheetView, will pop up if the button is rendered as - a facade but not if the button widget exists. */ + a facade but not if the button widget exists. + + We have to translate the event's data by hand to be relative to the + parent window, because the normal GObject signal propagation mechanism + won't do it for us. (This might be a hint that we're doing this + wrong.) */ + gint x, y; + + gdk_window_get_position (event->window, &x, &y); + event->x += x; + event->y += y; g_signal_stop_emission_by_name (button, "button-press-event"); return FALSE; } @@ -416,12 +418,8 @@ psppire_cell_renderer_button_start_editing (GtkCellRenderer *cell, "xalign", xalign, "yalign", yalign, "path", path, - "slash", cell_button->slash, NULL); - g_signal_connect (G_OBJECT (cell_button->button), "focus-out-event", - G_CALLBACK (psppire_cell_renderer_button_focus_out_event), - cell); g_signal_connect (G_OBJECT (cell_button->button), "clicked", G_CALLBACK (psppire_cell_renderer_button_clicked), cell);