summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlex Valavanis <valavanisalex@gmail.com>2012-12-26 10:39:35 +0000
committerAlex Valavanis <valavanisalex@googlemail.com>2012-12-26 10:39:35 +0000
commitadfcf364bc0b66fdb4ac8f3cc19344337a00bf97 (patch)
treedac89ea433fc2509887710d0aa25755312a5f80c /src
parentConvert a load more C-style pointer casts to GObject or C++ casts (merry chri... (diff)
downloadinkscape-adfcf364bc0b66fdb4ac8f3cc19344337a00bf97.tar.gz
inkscape-adfcf364bc0b66fdb4ac8f3cc19344337a00bf97.zip
ruler: (GIMP merge) Allow label size to be specified as a style property
(bzr r11987)
Diffstat (limited to 'src')
-rw-r--r--src/widgets/ruler.cpp149
-rw-r--r--src/widgets/widget-sizes.h5
2 files changed, 111 insertions, 43 deletions
diff --git a/src/widgets/ruler.cpp b/src/widgets/ruler.cpp
index e26b13fa7..851af640a 100644
--- a/src/widgets/ruler.cpp
+++ b/src/widgets/ruler.cpp
@@ -1,5 +1,20 @@
/*
- * Customized ruler class for inkscape
+ * Customized ruler class for inkscape. Note that this is a fork of
+ * the GimpRuler widget from GIMP: libgimpwidgets/gimpruler.c.
+ * The GIMP code is released under the GPL 3. The GIMP code itself
+ * is a fork of the now-obsolete GtkRuler widget from GTK+ 2.
+ *
+ * Major differences between implementations in Inkscape and GIMP are
+ * as follows:
+ * - We use values from a table of ruler metrics to set sizing depending
+ * on the desired unit for the ruler scale. GIMP uses the same metrics
+ * for all units, but allows the unit to be specified.
+ *
+ * - We use a default font size of PANGO_SCALE_X_SMALL for labels,
+ * GIMP uses PANGO_SCALE_SMALL (i.e., a bit larger than ours).
+ *
+ * - In GIMP, the ruler position follows "track widgets" by connecting
+ * to their GtkWidget:motion-notify-event.
*
* Authors:
* Lauris Kaplinski <lauris@kaplinski.com>
@@ -7,6 +22,7 @@
* bulia byak <buliabyak@users.sf.net>
* Diederik van Lierop <mail@diedenrezi.nl>
* Jon A. Cruz <jon@joncruz.org>
+ * Alex Valavanis <valavanisalex@gmail.com>
*
* Copyright (C) 1999-2011 authors
*
@@ -18,17 +34,29 @@
#include <cstdio>
#include "widget-sizes.h"
-#include "desktop-widget.h"
#include "ruler.h"
#include "unit-constants.h"
#include "round.h"
#include <glibmm/i18n.h>
+#define ROUND(x) ((int) ((x) + 0.5))
+
#define GTK_PARAM_READWRITE G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB
-#define MINIMUM_INCR 5
+#define DEFAULT_RULER_FONT_SCALE PANGO_SCALE_X_SMALL
+#define MINIMUM_INCR 5
+
+
+enum {
+ PROP_0,
+ PROP_ORIENTATION,
+ PROP_LOWER,
+ PROP_UPPER,
+ PROP_POSITION,
+ PROP_MAX_SIZE,
+ PROP_METRIC
+};
-#define ROUND(x) ((int) ((x) + 0.5))
/* All distances below are in 1/72nd's of an inch. (According to
* Adobe, that's a point, but points are really 1/72.27 in.)
@@ -44,6 +72,7 @@ typedef struct
GdkWindow *input_window;
cairo_surface_t *backing_store;
PangoLayout *layout;
+ gdouble font_scale;
SPRulerMetric *metric;
@@ -51,16 +80,25 @@ typedef struct
gint ysrc;
} SPRulerPrivate;
-enum {
- PROP_0,
- PROP_ORIENTATION,
- PROP_LOWER,
- PROP_UPPER,
- PROP_POSITION,
- PROP_MAX_SIZE,
- PROP_METRIC
+#define SP_RULER_GET_PRIVATE(ruler) \
+ G_TYPE_INSTANCE_GET_PRIVATE (ruler, SP_TYPE_RULER, SPRulerPrivate)
+
+
+/// Ruler metrics.
+static SPRulerMetric const sp_ruler_metrics[] = {
+ // NOTE: the order of records in this struct must correspond to the SPMetric enum.
+ {1, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_NONE
+ {PX_PER_MM, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_MM
+ {PX_PER_CM, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_CM
+ {PX_PER_IN, { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 }, { 1, 2, 4, 8, 16 }}, // SP_IN
+ {PX_PER_FT, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_FT
+ {PX_PER_PT, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_PT
+ {PX_PER_PC, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_PC
+ {PX_PER_PX, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_PX
+ {PX_PER_M, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_M
};
+
static void sp_ruler_set_property (GObject *object,
guint prop_id,
const GValue *value,
@@ -69,12 +107,13 @@ static void sp_ruler_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
+
static void sp_ruler_realize (GtkWidget *widget);
static void sp_ruler_unrealize (GtkWidget *widget);
static void sp_ruler_map (GtkWidget *widget);
static void sp_ruler_unmap (GtkWidget *widget);
-static void sp_ruler_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
+static void sp_ruler_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation);
#if GTK_CHECK_VERSION(3,0,0)
static void sp_ruler_get_preferred_width (GtkWidget *widget,
@@ -84,10 +123,14 @@ static void sp_ruler_get_preferred_width (GtkWidget *widget,
static void sp_ruler_get_preferred_height (GtkWidget *widget,
gint *minimum_height,
gint *natural_height);
+static void sp_ruler_style_updated (GtkWidget *widget);
+#else
+static void sp_ruler_size_request (GtkWidget *widget,
+ GtkRequisition *requisition);
+static void sp_ruler_style_set (GtkWidget *widget,
+ GtkStyle *prev_style);
#endif
-static void sp_ruler_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
static gboolean sp_ruler_motion_notify (GtkWidget *widget,
GdkEventMotion *event);
static gboolean sp_ruler_draw (GtkWidget *widget,
@@ -103,25 +146,11 @@ static void sp_ruler_make_pixmap (SPRuler *ruler);
static PangoLayout * sp_ruler_get_layout (GtkWidget *widget,
const gchar *text);
-#define SP_RULER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), SP_TYPE_RULER, SPRulerPrivate))
-/// Ruler metrics.
-static SPRulerMetric const sp_ruler_metrics[] = {
- // NOTE: the order of records in this struct must correspond to the SPMetric enum.
- {1, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_NONE
- {PX_PER_MM, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_MM
- {PX_PER_CM, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_CM
- {PX_PER_IN, { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 }, { 1, 2, 4, 8, 16 }}, // SP_IN
- {PX_PER_FT, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_FT
- {PX_PER_PT, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_PT
- {PX_PER_PC, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_PC
- {PX_PER_PX, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_PX
- {PX_PER_M, { 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000 }, { 1, 5, 10, 50, 100 }}, // SP_M
-};
+G_DEFINE_TYPE (SPRuler, sp_ruler, GTK_TYPE_WIDGET)
+
+#define parent_class sp_ruler_parent_class
-G_DEFINE_TYPE_WITH_CODE (SPRuler, sp_ruler, GTK_TYPE_WIDGET,
- G_IMPLEMENT_INTERFACE (GTK_TYPE_ORIENTABLE,
- NULL))
static void
sp_ruler_class_init (SPRulerClass *klass)
@@ -140,18 +169,25 @@ sp_ruler_class_init (SPRulerClass *klass)
#if GTK_CHECK_VERSION(3,0,0)
widget_class->get_preferred_width = sp_ruler_get_preferred_width;
widget_class->get_preferred_height = sp_ruler_get_preferred_height;
+ widget_class->style_updated = sp_ruler_style_updated;
widget_class->draw = sp_ruler_draw;
#else
widget_class->size_request = sp_ruler_size_request;
+ widget_class->style_set = sp_ruler_style_set;
widget_class->expose_event = sp_ruler_expose;
#endif
widget_class->motion_notify_event = sp_ruler_motion_notify;
g_type_class_add_private (object_class, sizeof (SPRulerPrivate));
- g_object_class_override_property (object_class,
- PROP_ORIENTATION,
- "orientation");
+ g_object_class_install_property (object_class,
+ PROP_ORIENTATION,
+ g_param_spec_enum ("orientation",
+ _("Orientation"),
+ _("The orientation of the ruler"),
+ GTK_TYPE_ORIENTATION,
+ GTK_ORIENTATION_HORIZONTAL,
+ static_cast<GParamFlags>(GTK_PARAM_READWRITE)));
g_object_class_install_property (object_class,
PROP_LOWER,
@@ -206,7 +242,15 @@ sp_ruler_class_init (SPRulerClass *klass)
_("The metric used for the ruler"),
0, 8,
SP_PX,
- static_cast<GParamFlags>(GTK_PARAM_READWRITE)));
+ static_cast<GParamFlags>(GTK_PARAM_READWRITE)));
+
+ gtk_widget_class_install_style_property (widget_class,
+ g_param_spec_double ("font-scale",
+ NULL, NULL,
+ 0.0,
+ G_MAXDOUBLE,
+ DEFAULT_RULER_FONT_SCALE,
+ G_PARAM_READABLE));
}
static void
@@ -224,6 +268,7 @@ sp_ruler_init (SPRuler *ruler)
priv->position = 0;
priv->max_size = 0;
priv->backing_store = NULL;
+ priv->font_scale = DEFAULT_RULER_FONT_SCALE;
sp_ruler_set_metric(ruler, SP_PX);
}
@@ -572,6 +617,33 @@ sp_ruler_size_request (GtkWidget *widget,
}
}
+static void
+#if GTK_CHECK_VERSION(3,0,0)
+sp_ruler_style_updated (GtkWidget *widget)
+#else
+sp_ruler_style_set (GtkWidget *widget,
+ GtkStyle *prev_style)
+#endif
+{
+ SPRulerPrivate *priv = SP_RULER_GET_PRIVATE (widget);
+
+#if GTK_CHECK_VERSION(3,0,0)
+ GTK_WIDGET_CLASS (sp_ruler_parent_class)->style_updated (widget);
+#else
+ GTK_WIDGET_CLASS (sp_ruler_parent_class)->style_set (widget, prev_style);
+#endif
+
+ gtk_widget_style_get (widget,
+ "font-scale", &priv->font_scale,
+ NULL);
+
+ if (priv->layout)
+ {
+ g_object_unref (priv->layout);
+ priv->layout = NULL;
+ }
+}
+
#if GTK_CHECK_VERSION(3,0,0)
static void
sp_ruler_get_preferred_width (GtkWidget *widget,
@@ -1199,6 +1271,7 @@ static PangoLayout*
sp_ruler_create_layout (GtkWidget *widget,
const gchar *text)
{
+ SPRulerPrivate *priv = SP_RULER_GET_PRIVATE (widget);
PangoLayout *layout;
PangoAttrList *attrs;
PangoAttribute *attr;
@@ -1207,7 +1280,7 @@ sp_ruler_create_layout (GtkWidget *widget,
attrs = pango_attr_list_new ();
- attr = pango_attr_scale_new (PANGO_SCALE_X_SMALL);
+ attr = pango_attr_scale_new (priv->font_scale);
attr->start_index = 0;
attr->end_index = -1;
pango_attr_list_insert (attrs, attr);
diff --git a/src/widgets/widget-sizes.h b/src/widgets/widget-sizes.h
index fe89d4574..87c7ca2e0 100644
--- a/src/widgets/widget-sizes.h
+++ b/src/widgets/widget-sizes.h
@@ -35,11 +35,6 @@
#define STATUS_LAYER_FONT_SIZE 7700
-#define RULER_WIDTH 12
-#define RULER_HEIGHT 12
-#define RULER_FONT_SIZE 6500
-#define RULER_FONT_VERTICAL_SPACING 1.2
-
/*
Local Variables:
mode:c++