]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-cell-renderer-activatable.c
Change Finnish translation team web page to l10n.gnome.org
[empathy.git] / libempathy-gtk / empathy-cell-renderer-activatable.c
index 6c7982682bcedac72269639d9f44dd51d087b803..bdbf1cb095ed0a67149aa4bd20946b059c312cd0 100644 (file)
@@ -1,7 +1,6 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
  * Copyright (C) 2007 Raphael Slinckx <raphael@slinckx.net>
- * Copyright (C) 2007-2008 Collabora Ltd.
+ * Copyright (C) 2007-2009 Collabora Ltd.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *
  * Authors: Raphael Slinckx <raphael@slinckx.net>
+ *          Cosimo Cecchi   <cosimo.cecchi@collabora.co.uk>
  */
 
-#include <gtk/gtk.h>
-
+#include "config.h"
 #include "empathy-cell-renderer-activatable.h"
 
-static void     empathy_cell_renderer_activatable_init       (EmpathyCellRendererActivatable      *cell);
-static void     empathy_cell_renderer_activatable_class_init (EmpathyCellRendererActivatableClass *klass);
-static gboolean cell_renderer_activatable_activate           (GtkCellRenderer                     *cell,
-                                                             GdkEvent                            *event,
-                                                             GtkWidget                           *widget,
-                                                             const gchar                         *path,
-                                                             GdkRectangle                        *background_area,
-                                                             GdkRectangle                        *cell_area,
-                                                             GtkCellRendererState                 flags);
+#include "empathy-utils.h"
 
 enum {
-       PATH_ACTIVATED,
-       LAST_SIGNAL
+  PATH_ACTIVATED,
+  LAST_SIGNAL
 };
 
+enum {
+  PROP_SHOW_ON_SELECT = 1
+};
+
+typedef struct {
+  gboolean show_on_select;
+} EmpathyCellRendererActivatablePriv;
+
 static guint signals[LAST_SIGNAL];
 
-G_DEFINE_TYPE (EmpathyCellRendererActivatable, empathy_cell_renderer_activatable, GTK_TYPE_CELL_RENDERER_PIXBUF)
+G_DEFINE_TYPE (EmpathyCellRendererActivatable,
+    empathy_cell_renderer_activatable, GTK_TYPE_CELL_RENDERER_PIXBUF)
+
+#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyCellRendererActivatable)
 
 static void
 empathy_cell_renderer_activatable_init (EmpathyCellRendererActivatable *cell)
 {
-       g_object_set (cell,
-                     "xpad", 0,
-                     "ypad", 0,
-                     "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE,
-                     "follow-state", TRUE,
-                     NULL);
+  cell->priv = G_TYPE_INSTANCE_GET_PRIVATE (cell,
+      EMPATHY_TYPE_CELL_RENDERER_ACTIVATABLE,
+      EmpathyCellRendererActivatablePriv);
+
+  g_object_set (cell,
+      "xpad", 0,
+      "ypad", 0,
+      "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE,
+      "follow-state", TRUE,
+      NULL);
+}
+
+static void
+cell_renderer_activatable_get_property (GObject *object,
+    guint prop_id,
+    GValue *value,
+    GParamSpec *pspec)
+{
+  EmpathyCellRendererActivatablePriv *priv = GET_PRIV (object);
+
+  switch (prop_id)
+    {
+      case PROP_SHOW_ON_SELECT:
+        g_value_set_boolean (value, priv->show_on_select);
+        break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        break;
+    }
 }
 
 static void
-empathy_cell_renderer_activatable_class_init (EmpathyCellRendererActivatableClass *klass)
+cell_renderer_activatable_set_property (GObject *object,
+    guint prop_id,
+    const GValue *value,
+    GParamSpec *pspec)
 {
-       GtkCellRendererClass *cell_class;
-
-       cell_class = GTK_CELL_RENDERER_CLASS (klass);
-       cell_class->activate = cell_renderer_activatable_activate;
-
-       signals[PATH_ACTIVATED] =
-               g_signal_new ("path-activated",
-                             G_TYPE_FROM_CLASS (klass),
-                             G_SIGNAL_RUN_LAST,
-                             0,
-                             NULL, NULL,
-                             g_cclosure_marshal_VOID__STRING,
-                             G_TYPE_NONE,
-                             1, G_TYPE_STRING);
+  EmpathyCellRendererActivatablePriv *priv = GET_PRIV (object);
+
+  switch (prop_id)
+    {
+      case PROP_SHOW_ON_SELECT:
+        priv->show_on_select = g_value_get_boolean (value);
+        break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        break;
+    }
 }
 
 GtkCellRenderer *
 empathy_cell_renderer_activatable_new (void)
 {
-       return g_object_new (EMPATHY_TYPE_CELL_RENDERER_ACTIVATABLE, NULL);
+  return g_object_new (EMPATHY_TYPE_CELL_RENDERER_ACTIVATABLE, NULL);
 }
 
 static gboolean
 cell_renderer_activatable_activate (GtkCellRenderer      *cell,
-                                   GdkEvent             *event,
-                                   GtkWidget            *widget,
-                                   const gchar          *path_string,
-                                   GdkRectangle         *background_area,
-                                   GdkRectangle         *cell_area,
-                                   GtkCellRendererState  flags)
+    GdkEvent *event,
+    GtkWidget *widget,
+    const gchar *path_string,
+    const GdkRectangle *background_area,
+    const GdkRectangle *cell_area,
+    GtkCellRendererState  flags)
 {
-       EmpathyCellRendererActivatable *activatable;
-       gint                            ex, ey, bx, by, bw, bh;
+  EmpathyCellRendererActivatable *activatable;
+  gint ex, ey, bx, by, bw, bh;
 
-       activatable = EMPATHY_CELL_RENDERER_ACTIVATABLE (cell);
+  activatable = EMPATHY_CELL_RENDERER_ACTIVATABLE (cell);
 
-       if (!GTK_IS_TREE_VIEW (widget) || event == NULL ||
-           event->type != GDK_BUTTON_PRESS) {
-               return FALSE;
-       }
+  if (!GTK_IS_TREE_VIEW (widget) || event == NULL ||
+      event->type != GDK_BUTTON_PRESS) {
+    return FALSE;
+  }
 
-       ex  = (gint) ((GdkEventButton *) event)->x;
-       ey  = (gint) ((GdkEventButton *) event)->y;
-       bx = background_area->x;
-       by = background_area->y;
-       bw = background_area->width;
-       bh = background_area->height;
+  ex  = (gint) ((GdkEventButton *) event)->x;
+  ey  = (gint) ((GdkEventButton *) event)->y;
+  bx = background_area->x;
+  by = background_area->y;
+  bw = background_area->width;
+  bh = background_area->height;
 
-       if (ex < bx || ex > (bx+bw) || ey < by || ey > (by+bh)){
-               /* Click wasn't on the icon */
-               return FALSE;
-       }
+  if (ex < bx || ex > (bx+bw) || ey < by || ey > (by+bh)){
+    /* Click wasn't on the icon */
+    return FALSE;
+  }
 
-       g_signal_emit (activatable, signals[PATH_ACTIVATED], 0, path_string);
+  g_signal_emit (activatable, signals[PATH_ACTIVATED], 0, path_string);
 
-       return TRUE;
+  return TRUE;
 }
 
+static void
+cell_renderer_activatable_render (
+    GtkCellRenderer *cell,
+    cairo_t *cr,
+    GtkWidget *widget,
+    const GdkRectangle *background_area,
+    const GdkRectangle *cell_area,
+    GtkCellRendererState flags)
+{
+  EmpathyCellRendererActivatablePriv *priv = GET_PRIV (cell);
+
+  if (priv->show_on_select && !(flags & (GTK_CELL_RENDERER_SELECTED)))
+    return;
+
+  GTK_CELL_RENDERER_CLASS
+    (empathy_cell_renderer_activatable_parent_class)->render (
+        cell, cr, widget, background_area, cell_area, flags);
+}
+
+static void
+empathy_cell_renderer_activatable_class_init (
+    EmpathyCellRendererActivatableClass *klass)
+{
+  GtkCellRendererClass *cell_class;
+  GObjectClass *oclass;
+
+  oclass = G_OBJECT_CLASS (klass);
+  oclass->get_property = cell_renderer_activatable_get_property;
+  oclass->set_property = cell_renderer_activatable_set_property;
+
+  cell_class = GTK_CELL_RENDERER_CLASS (klass);
+  cell_class->activate = cell_renderer_activatable_activate;
+  cell_class->render = cell_renderer_activatable_render;
+
+  signals[PATH_ACTIVATED] =
+    g_signal_new ("path-activated",
+        G_TYPE_FROM_CLASS (klass),
+        G_SIGNAL_RUN_LAST,
+        0,
+        NULL, NULL,
+        g_cclosure_marshal_generic,
+        G_TYPE_NONE,
+        1, G_TYPE_STRING);
+
+  g_object_class_install_property (oclass, PROP_SHOW_ON_SELECT,
+      g_param_spec_boolean ("show-on-select",
+          "Show on select",
+          "Whether the cell renderer should be shown only when it's selected",
+          FALSE,
+          G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE));
+
+  g_type_class_add_private (klass,
+      sizeof (EmpathyCellRendererActivatablePriv));
+}