* 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/>.
*
* Authors: Lorenzo Gil Sanchez <lgs@sicem.biz>
* Carlos Garnacho Parro <carlosg@gnome.org>
*/
-#include <config.h>
-#include <gdk/gdkkeysyms.h>
+#include "config.h"
+
+#include "gtkcellrendererspin.h"
+
+#include "gtkadjustment.h"
#include "gtkintl.h"
#include "gtkprivate.h"
#include "gtkspinbutton.h"
-#include "gtkcellrendererspin.h"
-#include "gtkalias.h"
-#define GTK_CELL_RENDERER_SPIN_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_CELL_RENDERER_SPIN, GtkCellRendererSpinPrivate))
+
+/**
+ * SECTION:gtkcellrendererspin
+ * @Short_description: Renders a spin button in a cell
+ * @Title: GtkCellRendererSpin
+ * @See_also: #GtkCellRendererText, #GtkSpinButton
+ *
+ * #GtkCellRendererSpin renders text in a cell like #GtkCellRendererText from
+ * which it is derived. But while #GtkCellRendererText offers a simple entry to
+ * edit the text, #GtkCellRendererSpin offers a #GtkSpinButton widget. Of course,
+ * that means that the text has to be parseable as a floating point number.
+ *
+ * The range of the spinbutton is taken from the adjustment property of the
+ * cell renderer, which can be set explicitly or mapped to a column in the
+ * tree model, like all properties of cell renders. #GtkCellRendererSpin
+ * also has properties for the #GtkCellRendererSpin:climb-rate and the number
+ * of #GtkCellRendererSpin:digits to display. Other #GtkSpinButton properties
+ * can be set in a handler for the #GtkCellRenderer::editing-started signal.
+ *
+ * The #GtkCellRendererSpin cell renderer was added in GTK+ 2.10.
+ */
+
struct _GtkCellRendererSpinPrivate
{
GdkEvent *event,
GtkWidget *widget,
const gchar *path,
- GdkRectangle *background_area,
- GdkRectangle *cell_area,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
GtkCellRendererState flags);
enum {
PROP_0,
PROP_ADJUSTMENT,
g_param_spec_object ("adjustment",
P_("Adjustment"),
- P_("The adjustment that holds the value of the spinbutton."),
+ P_("The adjustment that holds the value of the spin button"),
GTK_TYPE_ADJUSTMENT,
GTK_PARAM_READWRITE));
{
GtkCellRendererSpinPrivate *priv;
- priv = GTK_CELL_RENDERER_SPIN_GET_PRIVATE (self);
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
+ GTK_TYPE_CELL_RENDERER_SPIN,
+ GtkCellRendererSpinPrivate);
+ priv = self->priv;
priv->adjustment = NULL;
priv->climb_rate = 0.0;
{
GtkCellRendererSpinPrivate *priv;
- priv = GTK_CELL_RENDERER_SPIN_GET_PRIVATE (object);
+ priv = GTK_CELL_RENDERER_SPIN (object)->priv;
if (priv && priv->adjustment)
g_object_unref (priv->adjustment);
- if (G_OBJECT_CLASS (gtk_cell_renderer_spin_parent_class)->finalize)
- (* G_OBJECT_CLASS (gtk_cell_renderer_spin_parent_class)->finalize) (object);
+ G_OBJECT_CLASS (gtk_cell_renderer_spin_parent_class)->finalize (object);
}
static void
GtkCellRendererSpinPrivate *priv;
renderer = GTK_CELL_RENDERER_SPIN (object);
- priv = GTK_CELL_RENDERER_SPIN_GET_PRIVATE (renderer);
+ priv = renderer->priv;
switch (prop_id)
{
GObject *obj;
renderer = GTK_CELL_RENDERER_SPIN (object);
- priv = GTK_CELL_RENDERER_SPIN_GET_PRIVATE (renderer);
+ priv = renderer->priv;
switch (prop_id)
{
}
if (obj)
- priv->adjustment = g_object_ref (obj);
+ priv->adjustment = g_object_ref_sink (obj);
break;
case PROP_CLIMB_RATE:
priv->climb_rate = g_value_get_double (value);
const gchar *new_text;
gboolean canceled;
- canceled = GTK_ENTRY (widget)->editing_canceled;
+ g_object_get (widget,
+ "editing-canceled", &canceled,
+ NULL);
g_signal_handlers_disconnect_by_func (widget,
gtk_cell_renderer_spin_focus_out_event,
{
if (event->state == 0)
{
- if (event->keyval == GDK_Up)
+ if (event->keyval == GDK_KEY_Up)
{
gtk_spin_button_spin (GTK_SPIN_BUTTON (widget), GTK_SPIN_STEP_FORWARD, 1);
return TRUE;
}
- else if (event->keyval == GDK_Down)
+ else if (event->keyval == GDK_KEY_Down)
{
gtk_spin_button_spin (GTK_SPIN_BUTTON (widget), GTK_SPIN_STEP_BACKWARD, 1);
return TRUE;
return FALSE;
}
+static gboolean
+gtk_cell_renderer_spin_button_press_event (GtkWidget *widget,
+ GdkEventButton *event,
+ gpointer user_data)
+{
+ /* Block 2BUTTON and 3BUTTON here, so that they won't be eaten
+ * by tree view.
+ */
+ if (event->type == GDK_2BUTTON_PRESS
+ || event->type == GDK_3BUTTON_PRESS)
+ return TRUE;
+
+ return FALSE;
+}
+
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)
+gtk_cell_renderer_spin_start_editing (GtkCellRenderer *cell,
+ GdkEvent *event,
+ GtkWidget *widget,
+ const gchar *path,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags)
{
GtkCellRendererSpinPrivate *priv;
GtkCellRendererText *cell_text;
GtkWidget *spin;
+ gboolean editable;
+ gchar *text;
cell_text = GTK_CELL_RENDERER_TEXT (cell);
- priv = GTK_CELL_RENDERER_SPIN_GET_PRIVATE (cell);
+ priv = GTK_CELL_RENDERER_SPIN (cell)->priv;
- if (!cell_text->editable)
+ g_object_get (cell_text, "editable", &editable, NULL);
+ if (!editable)
return NULL;
if (!priv->adjustment)
return NULL;
- spin = gtk_spin_button_new (g_object_ref (priv->adjustment),
+ spin = gtk_spin_button_new (priv->adjustment,
priv->climb_rate, priv->digits);
- if (cell_text->text)
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin),
- g_ascii_strtod (cell_text->text, NULL));
+ g_signal_connect (spin, "button-press-event",
+ G_CALLBACK (gtk_cell_renderer_spin_button_press_event),
+ NULL);
+
+ g_object_get (cell_text, "text", &text, NULL);
+ if (text)
+ {
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin),
+ g_strtod (text, NULL));
+ g_free (text);
+ }
g_object_set_data_full (G_OBJECT (spin), GTK_CELL_RENDERER_SPIN_PATH,
g_strdup (path), g_free);
- g_signal_connect (G_OBJECT (spin), "focus_out_event",
+ g_signal_connect (G_OBJECT (spin), "focus-out-event",
G_CALLBACK (gtk_cell_renderer_spin_focus_out_event),
cell);
- g_signal_connect (G_OBJECT (spin), "key_press_event",
+ g_signal_connect (G_OBJECT (spin), "key-press-event",
G_CALLBACK (gtk_cell_renderer_spin_key_press_event),
cell);
{
return g_object_new (GTK_TYPE_CELL_RENDERER_SPIN, NULL);
}
-
-
-#define __GTK_CELL_RENDERER_SPIN_C__
-#include "gtkaliasdef.c"