[gtk+] shortcuts: Add set properties for optional things
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] shortcuts: Add set properties for optional things
- Date: Mon, 23 Nov 2015 03:42:50 +0000 (UTC)
commit 50abc8b5259b174d4c325f11d6b701431f29d449
Author: Matthias Clasen <mclasen redhat com>
Date: Sun Nov 22 15:27:05 2015 -0500
shortcuts: Add set properties for optional things
This makes it possible to switch between gesture and accelerator
types and override the builtin icons and subtitles for predefined
gestures.
gtk/gtkshortcutsshortcut.c | 255 ++++++++++++++++++++++++++++++++++----------
1 files changed, 196 insertions(+), 59 deletions(-)
---
diff --git a/gtk/gtkshortcutsshortcut.c b/gtk/gtkshortcutsshortcut.c
index 6825c6c..6b5bdca 100644
--- a/gtk/gtkshortcutsshortcut.c
+++ b/gtk/gtkshortcutsshortcut.c
@@ -46,6 +46,8 @@ struct _GtkShortcutsShortcut
GtkSizeGroup *accel_size_group;
GtkSizeGroup *title_size_group;
+ gboolean subtitle_set;
+ gboolean icon_set;
GtkTextDirection direction;
GtkShortcutType shortcut_type;
};
@@ -61,8 +63,10 @@ enum {
PROP_0,
PROP_ACCELERATOR,
PROP_ICON,
+ PROP_ICON_SET,
PROP_TITLE,
PROP_SUBTITLE,
+ PROP_SUBTITLE_SET,
PROP_ACCEL_SIZE_GROUP,
PROP_TITLE_SIZE_GROUP,
PROP_DIRECTION,
@@ -73,6 +77,13 @@ enum {
static GParamSpec *properties[LAST_PROP];
static void
+gtk_shortcuts_shortcut_set_accelerator (GtkShortcutsShortcut *self,
+ const gchar *accelerator)
+{
+ gtk_shortcut_label_set_accelerator (self->accelerator, accelerator);
+}
+
+static void
gtk_shortcuts_shortcut_set_accel_size_group (GtkShortcutsShortcut *self,
GtkSizeGroup *group)
{
@@ -104,19 +115,123 @@ gtk_shortcuts_shortcut_set_title_size_group (GtkShortcutsShortcut *self,
}
static void
+update_subtitle_from_type (GtkShortcutsShortcut *self)
+{
+ const gchar *subtitle;
+
+ if (self->subtitle_set)
+ return;
+
+ switch (self->shortcut_type)
+ {
+ case GTK_SHORTCUT_ACCELERATOR:
+ case GTK_SHORTCUT_GESTURE:
+ subtitle = NULL;
+ break;
+
+ case GTK_SHORTCUT_GESTURE_PINCH:
+ subtitle = _("Two finger pinch");
+ break;
+
+ case GTK_SHORTCUT_GESTURE_STRETCH:
+ subtitle = _("Two finger stretch");
+ break;
+
+ case GTK_SHORTCUT_GESTURE_ROTATE_CLOCKWISE:
+ subtitle = _("Rotate clockwise");
+ break;
+
+ case GTK_SHORTCUT_GESTURE_ROTATE_COUNTERCLOCKWISE:
+ subtitle = _("Rotate counterclockwise");
+ break;
+
+ case GTK_SHORTCUT_GESTURE_TWO_FINGER_SWIPE_LEFT:
+ subtitle = _("Two finger swipe left");
+ break;
+
+ case GTK_SHORTCUT_GESTURE_TWO_FINGER_SWIPE_RIGHT:
+ subtitle = _("Two finger swipe right");
+ break;
+
+ default:
+ subtitle = NULL;
+ break;
+ }
+
+ gtk_label_set_label (self->subtitle, subtitle);
+ gtk_widget_set_visible (GTK_WIDGET (self->subtitle), subtitle != NULL);
+ g_object_notify (G_OBJECT (self), "subtitle");
+}
+
+static void
+gtk_shortcuts_shortcut_set_subtitle_set (GtkShortcutsShortcut *self,
+ gboolean subtitle_set)
+{
+ if (self->subtitle_set != subtitle_set)
+ {
+ self->subtitle_set = subtitle_set;
+ g_object_notify (G_OBJECT (self), "subtitle-set");
+ }
+ update_subtitle_from_type (self);
+}
+
+static void
gtk_shortcuts_shortcut_set_subtitle (GtkShortcutsShortcut *self,
const gchar *subtitle)
{
gtk_label_set_label (self->subtitle, subtitle);
- gtk_widget_set_visible (GTK_WIDGET (self->subtitle), subtitle != NULL);
+ gtk_widget_set_visible (GTK_WIDGET (self->subtitle), subtitle && subtitle[0]);
+ gtk_shortcuts_shortcut_set_subtitle_set (self, subtitle && subtitle[0]);
+
g_object_notify (G_OBJECT (self), "subtitle");
}
static void
-gtk_shortcuts_shortcut_set_accelerator (GtkShortcutsShortcut *self,
- const gchar *accelerator)
+update_icon_from_type (GtkShortcutsShortcut *self)
{
- gtk_shortcut_label_set_accelerator (self->accelerator, accelerator);
+ if (self->icon_set)
+ return;
+
+ switch (self->shortcut_type)
+ {
+ case GTK_SHORTCUT_GESTURE_PINCH:
+ gtk_image_set_from_resource (self->image, "/org/gtk/libgtk/gesture/pinch.png");
+ break;
+
+ case GTK_SHORTCUT_GESTURE_STRETCH:
+ gtk_image_set_from_resource (self->image, "/org/gtk/libgtk/gesture/stretch.png");
+ break;
+
+ case GTK_SHORTCUT_GESTURE_ROTATE_CLOCKWISE:
+ gtk_image_set_from_resource (self->image, "/org/gtk/libgtk/gesture/rotate-clockwise.png");
+ break;
+
+ case GTK_SHORTCUT_GESTURE_ROTATE_COUNTERCLOCKWISE:
+ gtk_image_set_from_resource (self->image, "/org/gtk/libgtk/gesture/rotate-anticlockwise.png");
+ break;
+
+ case GTK_SHORTCUT_GESTURE_TWO_FINGER_SWIPE_LEFT:
+ gtk_image_set_from_resource (self->image, "/org/gtk/libgtk/gesture/two-finger-swipe-left.png");
+ break;
+
+ case GTK_SHORTCUT_GESTURE_TWO_FINGER_SWIPE_RIGHT:
+ gtk_image_set_from_resource (self->image, "/org/gtk/libgtk/gesture/two-finger-swipe-right.png");
+ break;
+
+ default: ;
+ }
+}
+
+static void
+gtk_shortcuts_shortcut_set_icon_set (GtkShortcutsShortcut *self,
+ gboolean icon_set)
+{
+ if (self->icon_set != icon_set)
+ {
+ self->icon_set = icon_set;
+ g_object_notify (G_OBJECT (self), "icon-set");
+ }
+ update_icon_from_type (self);
}
static void
@@ -124,10 +239,12 @@ gtk_shortcuts_shortcut_set_icon (GtkShortcutsShortcut *self,
GIcon *gicon)
{
gtk_image_set_from_gicon (self->image, gicon, GTK_ICON_SIZE_DIALOG);
+ gtk_shortcuts_shortcut_set_icon_set (self, gicon != NULL);
+ g_object_notify (G_OBJECT (self), "icon");
}
static void
-update_visible (GtkShortcutsShortcut *self)
+update_visible_from_direction (GtkShortcutsShortcut *self)
{
if (self->direction == GTK_TEXT_DIR_NONE ||
self->direction == gtk_widget_get_direction (GTK_WIDGET (self)))
@@ -145,7 +262,7 @@ gtk_shortcuts_shortcut_set_direction (GtkShortcutsShortcut *self,
self->direction = direction;
- update_visible (self);
+ update_visible_from_direction (self);
g_object_notify (G_OBJECT (self), "direction");
}
@@ -154,7 +271,7 @@ static void
gtk_shortcuts_shortcut_direction_changed (GtkWidget *widget,
GtkTextDirection previous_dir)
{
- update_visible (GTK_SHORTCUTS_SHORTCUT (widget));
+ update_visible_from_direction (GTK_SHORTCUTS_SHORTCUT (widget));
GTK_WIDGET_CLASS (gtk_shortcuts_shortcut_parent_class)->direction_changed (widget, previous_dir);
}
@@ -168,40 +285,8 @@ gtk_shortcuts_shortcut_set_type (GtkShortcutsShortcut *self,
self->shortcut_type = type;
- switch (type)
- {
- case GTK_SHORTCUT_GESTURE_PINCH:
- gtk_image_set_from_resource (self->image, "/org/gtk/libgtk/gesture/pinch.png");
- gtk_shortcuts_shortcut_set_subtitle (self, _("Two finger pinch"));
- break;
-
- case GTK_SHORTCUT_GESTURE_STRETCH:
- gtk_image_set_from_resource (self->image, "/org/gtk/libgtk/gesture/stretch.png");
- gtk_shortcuts_shortcut_set_subtitle (self, _("Two finger stretch"));
- break;
-
- case GTK_SHORTCUT_GESTURE_ROTATE_CLOCKWISE:
- gtk_image_set_from_resource (self->image, "/org/gtk/libgtk/gesture/rotate-clockwise.png");
- gtk_shortcuts_shortcut_set_subtitle (self, _("Rotate clockwise"));
- break;
-
- case GTK_SHORTCUT_GESTURE_ROTATE_COUNTERCLOCKWISE:
- gtk_image_set_from_resource (self->image, "/org/gtk/libgtk/gesture/rotate-anticlockwise.png");
- gtk_shortcuts_shortcut_set_subtitle (self, _("Rotate counterclockwise"));
- break;
-
- case GTK_SHORTCUT_GESTURE_TWO_FINGER_SWIPE_LEFT:
- gtk_image_set_from_resource (self->image, "/org/gtk/libgtk/gesture/two-finger-swipe-left.png");
- gtk_shortcuts_shortcut_set_subtitle (self, _("Two finger swipe left"));
- break;
-
- case GTK_SHORTCUT_GESTURE_TWO_FINGER_SWIPE_RIGHT:
- gtk_image_set_from_resource (self->image, "/org/gtk/libgtk/gesture/two-finger-swipe-right.png");
- gtk_shortcuts_shortcut_set_subtitle (self, _("Two finger swipe right"));
- break;
-
- default: ;
- }
+ update_subtitle_from_type (self);
+ update_icon_from_type (self);
gtk_widget_set_visible (GTK_WIDGET (self->accelerator), type == GTK_SHORTCUT_ACCELERATOR);
gtk_widget_set_visible (GTK_WIDGET (self->image), type != GTK_SHORTCUT_ACCELERATOR);
@@ -228,6 +313,10 @@ gtk_shortcuts_shortcut_get_property (GObject *object,
g_value_set_string (value, gtk_label_get_label (self->subtitle));
break;
+ case PROP_SUBTITLE_SET:
+ g_value_set_boolean (value, self->subtitle_set);
+ break;
+
case PROP_ACCELERATOR:
g_value_set_string (value, gtk_shortcut_label_get_accelerator (self->accelerator));
break;
@@ -241,6 +330,10 @@ gtk_shortcuts_shortcut_get_property (GObject *object,
}
break;
+ case PROP_ICON_SET:
+ g_value_set_boolean (value, self->icon_set);
+ break;
+
case PROP_DIRECTION:
g_value_set_enum (value, self->direction);
break;
@@ -272,6 +365,10 @@ gtk_shortcuts_shortcut_set_property (GObject *object,
gtk_shortcuts_shortcut_set_icon (self, g_value_get_object (value));
break;
+ case PROP_ICON_SET:
+ gtk_shortcuts_shortcut_set_icon_set (self, g_value_get_boolean (value));
+ break;
+
case PROP_ACCEL_SIZE_GROUP:
gtk_shortcuts_shortcut_set_accel_size_group (self, GTK_SIZE_GROUP (g_value_get_object (value)));
break;
@@ -284,6 +381,10 @@ gtk_shortcuts_shortcut_set_property (GObject *object,
gtk_shortcuts_shortcut_set_subtitle (self, g_value_get_string (value));
break;
+ case PROP_SUBTITLE_SET:
+ gtk_shortcuts_shortcut_set_subtitle_set (self, g_value_get_boolean (value));
+ break;
+
case PROP_TITLE_SIZE_GROUP:
gtk_shortcuts_shortcut_set_title_size_group (self, GTK_SIZE_GROUP (g_value_get_object (value)));
break;
@@ -345,15 +446,16 @@ gtk_shortcuts_shortcut_class_init (GtkShortcutsShortcutClass *klass)
/**
* GtkShortcutsShortcut:accelerator:
*
- * The accelerator(s) represented by this object in (an extension of)
- * the syntax understood by gtk_accelerator_parse(). Multiple accelerators
- * can be specified by separating them with a space, but keep in
- * mind that the available width is limited. It is also possible
- * to specify ranges of shortcuts, using ... between the keys. Sequences
- * of keys can be specified using a + between the keys.
+ * The accelerator(s) represented by this object. This property is used
+ * if #GtkShorcutsShortcut:shortcut-type is set to #GTK_SHORTCUT_ACCELERATOR.
*
- * Examples:
+ * The syntax of this property is (an extension of) the syntax understood by
+ * gtk_accelerator_parse(). Multiple accelerators can be specified by separating
+ * them with a space, but keep in mind that the available width is limited.
+ * It is also possible to specify ranges of shortcuts, using ... between the keys.
+ * Sequences of keys can be specified using a + between the keys.
*
+ * Examples:
* - A single shortcut: <ctl><alt>delete
* - Two alternative shortcuts: <shift>a Home
* - A range of shortcuts: <alt>1...<alt>9
@@ -365,36 +467,46 @@ gtk_shortcuts_shortcut_class_init (GtkShortcutsShortcutClass *klass)
properties[PROP_ACCELERATOR] =
g_param_spec_string ("accelerator",
P_("Accelerator"),
- P_("Accelerator"),
+ P_("The accelerator keys for shortcuts of type 'Accelerator'"),
NULL,
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* GtkShortcutsShortcut:icon:
*
- * An icon to represent the shortcut or gesture. This is used if
- * #GtkShortcutsShortcut:accelerator is not set.
- *
- * Typically used for gestures.
+ * An icon to represent the shortcut or gesture. This property is used if
+ * #GtkShortcutsShortcut:shortcut-type is set to #GTK_SHORTCUT_GESTURE.
+ * For the other predefined gesture types, GTK+ provides an icon on its own.
*/
properties[PROP_ICON] =
g_param_spec_object ("icon",
P_("Icon"),
- P_("Icon"),
+ P_("The icon to show for shortcuts of type 'Other Gesture'"),
G_TYPE_ICON,
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
+ * GtkShortcutsShortcut:icon-set:
+ *
+ * %TRUE if an icon has been set.
+ */
+ properties[PROP_ICON_SET] =
+ g_param_spec_boolean ("icon-set",
+ P_("Icon Set"),
+ P_("Whether an icon has been set"),
+ FALSE,
+ (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
* GtkShortcutsShortcut:title:
*
* The textual description for the shortcut or gesture represented by
- * this object. This should be a short string that can fit in
- * a single line.
+ * this object. This should be a short string that can fit in a single line.
*/
properties[PROP_TITLE] =
g_param_spec_string ("title",
P_("Title"),
- P_("Title"),
+ P_("A short description for the shortcut"),
"",
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
@@ -404,16 +516,29 @@ gtk_shortcuts_shortcut_class_init (GtkShortcutsShortcutClass *klass)
* The subtitle for the shortcut or gesture.
*
* This is typically used for gestures and should be a short, one-line
- * text that describes the gesture itself, e.g. "Two-finger swipe".
+ * text that describes the gesture itself. For the predefined gesture
+ * types, GTK+ provides a subtitle on its own.
*/
properties[PROP_SUBTITLE] =
g_param_spec_string ("subtitle",
P_("Subtitle"),
- P_("Subtitle"),
+ P_("A short description for the gesture"),
"",
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
+ * GtkShortcutsShortcut:subtitle-set:
+ *
+ * %TRUE if a subtitle has been set.
+ */
+ properties[PROP_SUBTITLE_SET] =
+ g_param_spec_boolean ("subtitle-set",
+ P_("Subtitle Set"),
+ P_("Whether a subtitle has been set"),
+ FALSE,
+ (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
* GtkShortcutsShortcut:accel-size-group:
*
* The size group for the accelerator portion of this shortcut.
@@ -441,6 +566,13 @@ gtk_shortcuts_shortcut_class_init (GtkShortcutsShortcutClass *klass)
GTK_TYPE_SIZE_GROUP,
(G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GtkShortcutsShortcut:direction:
+ *
+ * The text direction for which this shortcut is active. If the shortcut
+ * is used regardless of the text direction, set this property to
+ * #GTK_TEXT_DIR_NONE.
+ */
properties[PROP_DIRECTION] =
g_param_spec_enum ("direction",
P_("Direction"),
@@ -449,6 +581,11 @@ gtk_shortcuts_shortcut_class_init (GtkShortcutsShortcutClass *klass)
GTK_TEXT_DIR_NONE,
(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY));
+ /**
+ * GtkShortcutsShortcut:shortcut-type:
+ *
+ * The type of shortcut that is represented.
+ */
properties[PROP_SHORTCUT_TYPE] =
g_param_spec_enum ("shortcut-type",
P_("Shortcut Type"),
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]