]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkcellrendererspinner.c
filechooserbutton: Update the button/combo whenever the selection is changed programm...
[~andy/gtk] / gtk / gtkcellrendererspinner.c
index 6501b267c8a696bb2f7a744f530c132c2803ead6..35f87609324959ba2ef589aea969966e2aa141ca 100644 (file)
@@ -15,9 +15,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA  02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 /*
 
 #include "config.h"
 
-#include "gtkintl.h"
-#include <gtk/gtk.h>
 #include "gtkcellrendererspinner.h"
-#include "gtkalias.h"
+#include "gtkiconfactory.h"
+#include "gtkicontheme.h"
+#include "gtkintl.h"
+#include "gtksettings.h"
+#include "gtktypebuiltins.h"
+
+#undef GDK_DEPRECATED
+#undef GDK_DEPRECATED_FOR
+#define GDK_DEPRECATED
+#define GDK_DEPRECATED_FOR(f)
+
+#include "deprecated/gtkstyle.h"
+
+
+/**
+ * SECTION:gtkcellrendererspinner
+ * @Short_description: Renders a spinning animation in a cell
+ * @Title: GtkCellRendererSpinner
+ * @See_also: #GtkSpinner, #GtkCellRendererProgress
+ *
+ * GtkCellRendererSpinner renders a spinning animation in a cell, very
+ * similar to #GtkSpinner. It can often be used as an alternative
+ * to a #GtkCellRendererProgress for displaying indefinite activity,
+ * instead of actual progress.
+ *
+ * To start the animation in a cell, set the #GtkCellRendererSpinner:active
+ * property to %TRUE and increment the #GtkCellRendererSpinner:pulse property
+ * at regular intervals. The usual way to set the cell renderer properties
+ * for each cell is to bind them to columns in your tree model using e.g.
+ * gtk_tree_view_column_add_attribute().
+ */
+
 
 enum {
   PROP_0,
@@ -49,33 +76,28 @@ struct _GtkCellRendererSpinnerPrivate
   gint size;
 };
 
-#define GTK_CELL_RENDERER_SPINNER_GET_PRIVATE(object)        \
-                (G_TYPE_INSTANCE_GET_PRIVATE ((object),        \
-                        GTK_TYPE_CELL_RENDERER_SPINNER, \
-                        GtkCellRendererSpinnerPrivate))
-
-static void gtk_cell_renderer_spinner_get_property        (GObject                *object,
-                                                         guint                         param_id,
-                                                         GValue                        *value,
-                                                         GParamSpec                *pspec);
-static void gtk_cell_renderer_spinner_set_property        (GObject                *object,
-                                                         guint                         param_id,
-                                                         const GValue                *value,
-                                                         GParamSpec                *pspec);
-static void gtk_cell_renderer_spinner_get_size                (GtkCellRenderer        *cell,
-                                                         GtkWidget                *widget,
-                                                         GdkRectangle                *cell_area,
-                                                         gint                        *x_offset,
-                                                         gint                        *y_offset,
-                                                         gint                        *width,
-                                                         gint                        *height);
-static void gtk_cell_renderer_spinner_render                (GtkCellRenderer        *cell,
-                                                         GdkWindow                *window,
-                                                         GtkWidget                *widget,
-                                                         GdkRectangle                *background_area,
-                                                         GdkRectangle                *cell_area,
-                                                         GdkRectangle                *expose_area,
-                                                         guint                         flags);
+
+static void gtk_cell_renderer_spinner_get_property (GObject         *object,
+                                                    guint            param_id,
+                                                    GValue          *value,
+                                                    GParamSpec      *pspec);
+static void gtk_cell_renderer_spinner_set_property (GObject         *object,
+                                                    guint            param_id,
+                                                    const GValue    *value,
+                                                    GParamSpec      *pspec);
+static void gtk_cell_renderer_spinner_get_size     (GtkCellRenderer *cell,
+                                                    GtkWidget          *widget,
+                                                    const GdkRectangle *cell_area,
+                                                    gint               *x_offset,
+                                                    gint               *y_offset,
+                                                    gint               *width,
+                                                    gint               *height);
+static void gtk_cell_renderer_spinner_render       (GtkCellRenderer      *cell,
+                                                    cairo_t              *cr,
+                                                    GtkWidget            *widget,
+                                                    const GdkRectangle   *background_area,
+                                                    const GdkRectangle   *cell_area,
+                                                    GtkCellRendererState  flags);
 
 G_DEFINE_TYPE (GtkCellRendererSpinner, gtk_cell_renderer_spinner, GTK_TYPE_CELL_RENDERER)
 
@@ -91,11 +113,11 @@ gtk_cell_renderer_spinner_class_init (GtkCellRendererSpinnerClass *klass)
   cell_class->get_size = gtk_cell_renderer_spinner_get_size;
   cell_class->render = gtk_cell_renderer_spinner_render;
 
-  /* GtkCellRendererSpinner::active:
+  /* GtkCellRendererSpinner:active:
    *
    * Whether the spinner is active (ie. shown) in the cell
    *
-   * Since 2.20
+   * Since: 2.20
    */
   g_object_class_install_property (object_class,
                                    PROP_ACTIVE,
@@ -104,13 +126,16 @@ gtk_cell_renderer_spinner_class_init (GtkCellRendererSpinnerClass *klass)
                                                          P_("Whether the spinner is active (ie. shown) in the cell"),
                                                          FALSE,
                                                          G_PARAM_READWRITE));
-  /* GtkCellRendererSpinner::pulse:
+  /**
+   * GtkCellRendererSpinner:pulse:
+   *
+   * Pulse of the spinner. Increment this value to draw the next frame of the
+   * spinner animation. Usually, you would update this value in a timeout.
    *
-   * Pulse of the spinner. Increment this value to draw the next frame of the spinner animation.
-   * Usually, you would update this value in a timeout, every 80 milliseconds to show a full
-   * animation within one second.
+   * By default, the #GtkSpinner widget draws one full cycle of the animation,
+   * consisting of 12 frames, in 750 milliseconds.
    *
-   * Since 2.20
+   * Since: 2.20
    */
   g_object_class_install_property (object_class,
                                    PROP_PULSE,
@@ -119,17 +144,18 @@ gtk_cell_renderer_spinner_class_init (GtkCellRendererSpinnerClass *klass)
                                                       P_("Pulse of the spinner"),
                                                       0, G_MAXUINT, 0,
                                                       G_PARAM_READWRITE));
-  /* GtkCellRendererSpinner::size:
+  /**
+   * GtkCellRendererSpinner:size:
    *
    * The #GtkIconSize value that specifies the size of the rendered spinner.
    *
-   * Since 2.20
+   * Since: 2.20
    */
   g_object_class_install_property (object_class,
                                    PROP_SIZE,
                                    g_param_spec_enum ("size",
                                                       P_("Size"),
-                                                      P_("The #GtkIconSize value that specifies the size of the rendered spinner"),
+                                                      P_("The GtkIconSize value that specifies the size of the rendered spinner"),
                                                       GTK_TYPE_ICON_SIZE, GTK_ICON_SIZE_MENU,
                                                       G_PARAM_READWRITE));
 
@@ -140,14 +166,17 @@ gtk_cell_renderer_spinner_class_init (GtkCellRendererSpinnerClass *klass)
 static void
 gtk_cell_renderer_spinner_init (GtkCellRendererSpinner *cell)
 {
-  cell->priv = GTK_CELL_RENDERER_SPINNER_GET_PRIVATE (cell);
+  cell->priv = G_TYPE_INSTANCE_GET_PRIVATE (cell,
+                                            GTK_TYPE_CELL_RENDERER_SPINNER,
+                                            GtkCellRendererSpinnerPrivate);
+
   cell->priv->pulse = 0;
   cell->priv->old_icon_size = GTK_ICON_SIZE_INVALID;
   cell->priv->icon_size = GTK_ICON_SIZE_MENU;
 }
 
 /**
- * gtk_cell_renderer_spinner_new
+ * gtk_cell_renderer_spinner_new:
  *
  * Returns a new cell renderer which will show a spinner to indicate
  * activity.
@@ -164,18 +193,16 @@ gtk_cell_renderer_spinner_new (void)
 
 static void
 gtk_cell_renderer_spinner_update_size (GtkCellRendererSpinner *cell,
-                                       GtkWidget *widget)
+                                       GtkWidget              *widget)
 {
   GtkCellRendererSpinnerPrivate *priv = cell->priv;
   GdkScreen *screen;
-  GtkIconTheme *icon_theme;
   GtkSettings *settings;
 
-  if (cell->priv->old_icon_size == cell->priv->icon_size)
+  if (priv->old_icon_size == priv->icon_size)
     return;
 
   screen = gtk_widget_get_screen (GTK_WIDGET (widget));
-  icon_theme = gtk_icon_theme_get_for_screen (screen);
   settings = gtk_settings_get_for_screen (screen);
 
   if (!gtk_icon_size_lookup_for_settings (settings, priv->icon_size, &priv->size, NULL))
@@ -237,13 +264,13 @@ gtk_cell_renderer_spinner_set_property (GObject      *object,
 }
 
 static void
-gtk_cell_renderer_spinner_get_size (GtkCellRenderer *cellr,
-                                    GtkWidget *widget,
-                                    GdkRectangle *cell_area,
-                                    gint *x_offset,
-                                    gint *y_offset,
-                                    gint *width,
-                                    gint *height)
+gtk_cell_renderer_spinner_get_size (GtkCellRenderer    *cellr,
+                                    GtkWidget          *widget,
+                                    const GdkRectangle *cell_area,
+                                    gint               *x_offset,
+                                    gint               *y_offset,
+                                    gint               *width,
+                                    gint               *height)
 {
   GtkCellRendererSpinner *cell = GTK_CELL_RENDERER_SPINNER (cellr);
   GtkCellRendererSpinnerPrivate *priv = cell->priv;
@@ -295,13 +322,12 @@ gtk_cell_renderer_spinner_get_size (GtkCellRenderer *cellr,
 }
 
 static void
-gtk_cell_renderer_spinner_render (GtkCellRenderer *cellr,
-                                  GdkWindow *window,
-                                  GtkWidget *widget,
-                                  GdkRectangle *background_area,
-                                  GdkRectangle *cell_area,
-                                  GdkRectangle *expose_area,
-                                  guint flags)
+gtk_cell_renderer_spinner_render (GtkCellRenderer      *cellr,
+                                  cairo_t              *cr,
+                                  GtkWidget            *widget,
+                                  const GdkRectangle   *background_area,
+                                  const GdkRectangle   *cell_area,
+                                  GtkCellRendererState  flags)
 {
   GtkCellRendererSpinner *cell = GTK_CELL_RENDERER_SPINNER (cellr);
   GtkCellRendererSpinnerPrivate *priv = cell->priv;
@@ -313,7 +339,7 @@ gtk_cell_renderer_spinner_render (GtkCellRenderer *cellr,
   if (!priv->active)
     return;
 
-  gtk_cell_renderer_spinner_get_size (cellr, widget, cell_area,
+  gtk_cell_renderer_spinner_get_size (cellr, widget, (GdkRectangle *) cell_area,
                                       &pix_rect.x, &pix_rect.y,
                                       &pix_rect.width, &pix_rect.height);
 
@@ -326,14 +352,12 @@ gtk_cell_renderer_spinner_render (GtkCellRenderer *cellr,
   pix_rect.width -= xpad * 2;
   pix_rect.height -= ypad * 2;
 
-  if (!gdk_rectangle_intersect (cell_area, &pix_rect, &draw_rect) ||
-      !gdk_rectangle_intersect (expose_area, &pix_rect, &draw_rect))
-    {
-      return;
-    }
+  if (!gdk_rectangle_intersect (cell_area, &pix_rect, &draw_rect))
+    return;
 
   state = GTK_STATE_NORMAL;
-  if (GTK_WIDGET_STATE (widget) == GTK_STATE_INSENSITIVE || !cellr->sensitive)
+  if (gtk_widget_get_state (widget) == GTK_STATE_INSENSITIVE ||
+      !gtk_cell_renderer_get_sensitive (cellr))
     {
       state = GTK_STATE_INSENSITIVE;
     }
@@ -341,7 +365,7 @@ gtk_cell_renderer_spinner_render (GtkCellRenderer *cellr,
     {
       if ((flags & GTK_CELL_RENDERER_SELECTED) != 0)
         {
-          if (GTK_WIDGET_HAS_FOCUS (widget))
+          if (gtk_widget_has_focus (widget))
             state = GTK_STATE_SELECTED;
           else
             state = GTK_STATE_ACTIVE;
@@ -350,13 +374,19 @@ gtk_cell_renderer_spinner_render (GtkCellRenderer *cellr,
         state = GTK_STATE_PRELIGHT;
     }
 
-  gtk_paint_spinner (widget->style,
-                     window,
-                     state,
-                     priv->pulse,
-                     draw_rect.x, draw_rect.y,
-                     draw_rect.width, draw_rect.height);
-}
+  cairo_save (cr);
+
+  gdk_cairo_rectangle (cr, cell_area);
+  cairo_clip (cr);
 
-#define __GTK_CELL_RENDERER_SPINNER_C__
-#include "gtkaliasdef.c"
+  gtk_paint_spinner (gtk_widget_get_style (widget),
+                           cr,
+                           state,
+                           widget,
+                           "cell",
+                           priv->pulse,
+                           draw_rect.x, draw_rect.y,
+                           draw_rect.width, draw_rect.height);
+
+  cairo_restore (cr);
+}