psppire-cell-renderer-button: Add "slash" property.
[pspp] / src / ui / gui / psppire-button-editable.c
index cefc7a594d92e2fe0f52c41324fab2281b192fca..2e6335053fb06279750273b86dd678fa45ab1843 100644 (file)
@@ -40,7 +40,8 @@ G_DEFINE_TYPE_EXTENDED (PsppireButtonEditable,
 enum
   {
     PROP_0,
-    PROP_PATH
+    PROP_PATH,
+    PROP_SLASH
   };
 
 static void
@@ -58,6 +59,10 @@ psppire_button_editable_set_property (GObject      *object,
       obj->path = g_value_dup_string (value);
       break;
 
+    case PROP_SLASH:
+      psppire_button_editable_set_slash (obj, g_value_get_boolean (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -78,6 +83,10 @@ psppire_button_editable_get_property (GObject      *object,
       g_value_set_string (value, obj->path);
       break;
 
+    case PROP_SLASH:
+      g_value_set_boolean (value, psppire_button_editable_get_slash (obj));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -110,6 +119,28 @@ psppire_button_editable_button_release (GtkWidget      *widget,
   return TRUE;
 }
 
+static gboolean
+psppire_button_editable_expose_event (GtkWidget      *widget,
+                                      GdkEventExpose *event)
+{
+  GtkWidgetClass *widget_class;
+  GtkStyle *style = gtk_widget_get_style (widget);
+  GtkAllocation allocation;
+  gboolean retval;
+
+  widget_class = GTK_WIDGET_CLASS (psppire_button_editable_parent_class);
+  retval = widget_class->expose_event (widget, event);
+
+  gtk_widget_get_allocation (widget, &allocation);
+  if (PSPPIRE_BUTTON_EDITABLE (widget)->slash)
+    gdk_draw_line (gtk_widget_get_window (widget), style->black_gc,
+                   allocation.x,
+                   allocation.y + allocation.height,
+                   allocation.x + allocation.width,
+                   allocation.y);
+  return retval;
+}
+
 static void
 psppire_button_editable_class_init (PsppireButtonEditableClass *class)
 {
@@ -124,20 +155,31 @@ psppire_button_editable_class_init (PsppireButtonEditableClass *class)
   gobject_class->dispose = psppire_button_editable_dispose;
 
   widget_class->button_release_event = psppire_button_editable_button_release;
+  widget_class->expose_event = psppire_button_editable_expose_event;
 
-  g_object_class_install_property (G_OBJECT_CLASS (class),
+  g_object_class_install_property (gobject_class,
                                    PROP_PATH,
                                    g_param_spec_string ("path",
                                                        _("TreeView path"),
                                                        _("The path to the row in the GtkTreeView, as a string"),
                                                        "",
                                                        G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_SLASH,
+                                   g_param_spec_boolean ("slash",
+                                                         _("Diagonal slash"),
+                                                         _("Whether to draw a diagonal slash across the button."),
+                                                         FALSE,
+                                                         G_PARAM_READWRITE));
+
 }
 
 static void
 psppire_button_editable_init (PsppireButtonEditable *obj)
 {
   obj->path = g_strdup ("");
+  obj->slash = FALSE;
 }
 
 PsppireButtonEditable *
@@ -145,6 +187,25 @@ psppire_button_editable_new (void)
 {
   return PSPPIRE_BUTTON_EDITABLE (g_object_new (PSPPIRE_TYPE_BUTTON_EDITABLE, NULL));
 }
+
+void
+psppire_button_editable_set_slash (PsppireButtonEditable *button,
+                                   gboolean slash)
+{
+  g_return_if_fail (button != NULL);
+  if ((button->slash != 0) != (slash != 0))
+    {
+      button->slash = slash;
+      gtk_widget_queue_draw (GTK_WIDGET (button));
+    }
+}
+
+gboolean
+psppire_button_editable_get_slash (const PsppireButtonEditable *button)
+{
+  g_return_val_if_fail (button != NULL, FALSE);
+  return button->slash;
+}
 \f
 /* GtkCellEditable interface. */