app, po: show proper instructions in GimpShortcutButton.

When no accelerator was set yet, display relevant information, and when
the button is toggled (waiting for shortcut input), display also
relevant info.
This commit is contained in:
Jehan 2022-04-05 21:48:24 +02:00
parent fe65b4d4c6
commit 924dea3a35
2 changed files with 78 additions and 6 deletions

View file

@ -30,6 +30,8 @@
#include "gimpshortcutbutton.h"
#include "gimp-intl.h"
enum
{
@ -41,7 +43,7 @@ struct _GimpShortcutButtonPrivate
{
gchar *accelerator;
GtkWidget *label;
GtkWidget *stack;
gboolean modifier_only_accepted;
gboolean single_modifier;
@ -69,6 +71,10 @@ static gboolean gimp_shortcut_button_key_press_event (GtkWidget *button,
static gboolean gimp_shortcut_button_focus_out_event (GimpShortcutButton* button,
GdkEventFocus event,
gpointer user_data);
static void gimp_shortcut_button_toggled (GimpShortcutButton* button,
gpointer user_data);
static void gimp_shortcut_button_update_label (GimpShortcutButton *button);
static gboolean gimp_shortcut_button_timeout (GimpShortcutButton *button);
@ -99,13 +105,25 @@ gimp_shortcut_button_class_init (GimpShortcutButtonClass *klass)
static void
gimp_shortcut_button_init (GimpShortcutButton *button)
{
GtkWidget *label;
button->priv = gimp_shortcut_button_get_instance_private (button);
button->priv->timer = 0;
button->priv->label = gtk_shortcut_label_new (NULL);
gtk_container_add (GTK_CONTAINER (button), button->priv->label);
gtk_widget_show (button->priv->label);
button->priv->stack = gtk_stack_new ();
gtk_container_add (GTK_CONTAINER (button), button->priv->stack);
gtk_widget_show (button->priv->stack);
label = gtk_shortcut_label_new (NULL);
gtk_stack_add_named (GTK_STACK (button->priv->stack), label,
"shortcut-label");
gtk_widget_show (label);
label = gtk_label_new (_("No shortcut"));
gtk_stack_add_named (GTK_STACK (button->priv->stack), label,
"label");
gtk_widget_show (label);
}
static void
@ -119,6 +137,11 @@ gimp_shortcut_button_constructed (GObject *object)
g_signal_connect (object, "focus-out-event",
G_CALLBACK (gimp_shortcut_button_focus_out_event),
NULL);
g_signal_connect (object, "toggled",
G_CALLBACK (gimp_shortcut_button_toggled),
NULL);
gimp_shortcut_button_toggled (GIMP_SHORTCUT_BUTTON (object), NULL);
}
static void
@ -206,11 +229,15 @@ gimp_shortcut_button_set_accelerator (GimpShortcutButton *button,
if (g_strcmp0 (accelerator, button->priv->accelerator) != 0)
{
GtkWidget *label;
label = gtk_stack_get_child_by_name (GTK_STACK (button->priv->stack),
"shortcut-label");
g_free (button->priv->accelerator);
button->priv->accelerator = accelerator ? g_strdup (accelerator) : NULL;
if (accelerator)
gtk_shortcut_label_set_accelerator (GTK_SHORTCUT_LABEL (button->priv->label), accelerator);
gtk_shortcut_label_set_accelerator (GTK_SHORTCUT_LABEL (label), accelerator);
g_object_notify (G_OBJECT (button), "accelerator");
}
@ -240,6 +267,8 @@ gimp_shortcut_button_accepts_modifier (GimpShortcutButton *button,
button->priv->modifier_only_accepted = accepted;
button->priv->single_modifier = unique;
gimp_shortcut_button_update_label (button);
}
/* Private functions. */
@ -319,6 +348,48 @@ gimp_shortcut_button_focus_out_event (GimpShortcutButton* button,
return FALSE;
}
static void
gimp_shortcut_button_toggled (GimpShortcutButton* button,
gpointer user_data)
{
gimp_shortcut_button_update_label (button);
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) ||
button->priv->accelerator == NULL)
gtk_stack_set_visible_child_name (GTK_STACK (button->priv->stack), "label");
else
gtk_stack_set_visible_child_name (GTK_STACK (button->priv->stack), "shortcut-label");
}
static void
gimp_shortcut_button_update_label (GimpShortcutButton *button)
{
GtkWidget *label;
gchar *markup;
g_return_if_fail (GIMP_IS_SHORTCUT_BUTTON (button));
label = gtk_stack_get_child_by_name (GTK_STACK (button->priv->stack),
"label");
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
{
if (button->priv->modifier_only_accepted)
markup = g_strdup_printf ("<b>%s</b>", _("Set modifier"));
else
markup = g_strdup_printf ("<b>%s</b>", _("Set shortcut"));
}
else
{
if (button->priv->modifier_only_accepted)
markup = g_strdup_printf ("<i>%s</i>", _("No modifier"));
else
markup = g_strdup_printf ("<i>%s</i>", _("No shortcut"));
}
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
}
static gboolean
gimp_shortcut_button_timeout (GimpShortcutButton *button)
{

View file

@ -608,6 +608,7 @@ app/widgets/gimpselectiondata.c
app/widgets/gimpselectioneditor.c
app/widgets/gimpsettingsbox.c
app/widgets/gimpsettingseditor.c
app/widgets/gimpshortcutbutton.c
app/widgets/gimpsizebox.c
app/widgets/gimpstrokeeditor.c
app/widgets/gimpsymmetryeditor.c