[gthumb] make the accel dialog a gobject type to allow reuse in other places
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] make the accel dialog a gobject type to allow reuse in other places
- Date: Sun, 24 Nov 2019 12:28:50 +0000 (UTC)
commit 0ec6839233200d1f4a66640f6c8efcd428f59f19
Author: Paolo Bacchilega <paobac src gnome org>
Date: Sat Nov 9 18:07:02 2019 +0100
make the accel dialog a gobject type to allow reuse in other places
gthumb/gth-accel-button.c | 72 +++++--------------
gthumb/gth-accel-dialog.c | 180 ++++++++++++++++++++++++++++++++++++++++++++++
gthumb/gth-accel-dialog.h | 65 +++++++++++++++++
gthumb/meson.build | 2 +
4 files changed, 264 insertions(+), 55 deletions(-)
---
diff --git a/gthumb/gth-accel-button.c b/gthumb/gth-accel-button.c
index 53b0f480..1542d857 100644
--- a/gthumb/gth-accel-button.c
+++ b/gthumb/gth-accel-button.c
@@ -24,6 +24,7 @@
#include <glib.h>
#include <gtk/gtk.h>
#include "gth-accel-button.h"
+#include "gth-accel-dialog.h"
#include "gtk-utils.h"
@@ -182,13 +183,20 @@ accel_dialog_response_cb (GtkDialog *dialog,
gint response_id,
gpointer user_data)
{
- GthAccelButton *accel_button = user_data;
+ GthAccelButton *accel_button = user_data;
+ guint keycode;
+ GdkModifierType modifiers;
switch (response_id) {
+ case GTK_RESPONSE_OK:
+ if (gth_accel_dialog_get_accel (GTH_ACCEL_DIALOG (dialog), &keycode, &modifiers))
+ gth_accel_button_set_accelerator (accel_button, keycode, modifiers);
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ break;
case GTK_RESPONSE_CANCEL:
gtk_widget_destroy (GTK_WIDGET (dialog));
break;
- case _RESPONSE_RESET:
+ case GTH_ACCEL_BUTTON_RESPONSE_DELETE:
gth_accel_button_set_accelerator (accel_button, 0, 0);
gtk_widget_destroy (GTK_WIDGET (dialog));
break;
@@ -196,68 +204,22 @@ accel_dialog_response_cb (GtkDialog *dialog,
}
-static gboolean
-accel_dialog_keypress_cb (GtkWidget *widget,
- GdkEventKey *event,
- gpointer user_data)
-{
- GthAccelButton *accel_button = user_data;
- GdkModifierType modifiers;
-
- if (event->keyval == GDK_KEY_Escape)
- return FALSE;
-
- modifiers = event->state & gtk_accelerator_get_default_mod_mask ();
- if (gth_accel_button_set_accelerator (accel_button, event->keyval, modifiers))
- gtk_widget_destroy (widget);
-
- return TRUE;
-}
-
-
static void
button_clicked_cb (GtkButton *button,
gpointer user_data)
{
- GtkWidget *dialog, *box, *label, *secondary_label, *content_area;
-
- dialog = g_object_new (GTK_TYPE_DIALOG,
- "use-header-bar", _gtk_settings_get_dialogs_use_header (),
- "modal", TRUE,
- "transient-for", _gtk_widget_get_toplevel_if_window (GTK_WIDGET (button)),
- "resizable", FALSE,
- "title", _("Shortcut"),
- NULL);
- gtk_dialog_add_buttons (GTK_DIALOG (dialog),
- _GTK_LABEL_CANCEL, GTK_RESPONSE_CANCEL,
- ! gth_accel_button_get_valid (GTH_ACCEL_BUTTON (button)) ? NULL :
_GTK_LABEL_DELETE,
- _RESPONSE_RESET,
- NULL);
-
- content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
-
- label = gtk_label_new (_("Press a combination of keys to use as shortcut."));
- secondary_label = gtk_label_new (_("Press Esc to cancel"));
- gtk_style_context_add_class (gtk_widget_get_style_context (secondary_label), "dim-label");
- box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 50);
- gtk_widget_set_margin_top (box, 50);
- gtk_widget_set_margin_bottom (box, 50);
- gtk_widget_set_margin_start (box, 50);
- gtk_widget_set_margin_end (box, 50);
- gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (box), secondary_label, TRUE, TRUE, 0);
+ GthAccelButton *accel_button = GTH_ACCEL_BUTTON (button);
+ GtkWidget *dialog;
+ dialog = gth_accel_dialog_new (_("Shortcut"),
+ _gtk_widget_get_toplevel_if_window (GTK_WIDGET (button)),
+ accel_button->priv->keyval,
+ accel_button->priv->modifiers);
g_signal_connect (dialog,
"response",
G_CALLBACK (accel_dialog_response_cb),
button);
- g_signal_connect (dialog,
- "key-press-event",
- G_CALLBACK (accel_dialog_keypress_cb),
- button);
-
- gtk_container_add (GTK_CONTAINER (content_area), box);
- gtk_widget_show_all (dialog);
+ gtk_widget_show (dialog);
}
diff --git a/gthumb/gth-accel-dialog.c b/gthumb/gth-accel-dialog.c
new file mode 100644
index 00000000..9e748e4f
--- /dev/null
+++ b/gthumb/gth-accel-dialog.c
@@ -0,0 +1,180 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2019 The Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include "gth-accel-dialog.h"
+#include "gtk-utils.h"
+#include "gth-shortcut.h"
+
+
+struct _GthAccelDialogPrivate {
+ guint keycode;
+ GdkModifierType modifiers;
+ gboolean valid;
+};
+
+
+G_DEFINE_TYPE_WITH_CODE (GthAccelDialog,
+ gth_accel_dialog,
+ GTK_TYPE_DIALOG,
+ G_ADD_PRIVATE (GthAccelDialog))
+
+
+static void
+gth_accel_dialog_finalize (GObject *object)
+{
+ /*GthAccelDialog *self;
+
+ self = GTH_ACCEL_DIALOG (object);*/
+
+ G_OBJECT_CLASS (gth_accel_dialog_parent_class)->finalize (object);
+}
+
+
+static void
+gth_accel_dialog_class_init (GthAccelDialogClass *class)
+{
+ GObjectClass *object_class;
+
+ object_class = (GObjectClass*) class;
+ object_class->finalize = gth_accel_dialog_finalize;
+}
+
+
+static void
+gth_accel_dialog_init (GthAccelDialog *self)
+{
+ self->priv = gth_accel_dialog_get_instance_private (self);
+ self->priv->keycode = 0;
+ self->priv->modifiers = 0;
+ self->priv->valid = FALSE;
+}
+
+
+static gboolean
+accel_dialog_keypress_cb (GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer user_data)
+{
+ GthAccelDialog *self = user_data;
+ GdkModifierType modifiers;
+
+ if (event->keyval == GDK_KEY_Escape)
+ return FALSE;
+
+ modifiers = event->state & gtk_accelerator_get_default_mod_mask ();
+ if (gth_shortcut_valid (event->keyval, modifiers)) {
+ self->priv->keycode = event->keyval;
+ self->priv->modifiers = modifiers;
+ self->priv->valid = TRUE;
+ gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_OK);
+ }
+ else
+ self->priv->valid = FALSE;
+
+ return TRUE;
+}
+
+
+static void
+gth_accel_dialog_construct (GthAccelDialog *self,
+ const char *title,
+ GtkWindow *parent,
+ guint keycode,
+ GdkModifierType modifiers)
+{
+ gboolean valid;
+ GtkWidget *box;
+ GtkWidget *label;
+ GtkWidget *secondary_label;
+ GtkWidget *content_area;
+
+ valid = gth_shortcut_valid (keycode, modifiers);
+ gtk_dialog_add_buttons (GTK_DIALOG (self),
+ _GTK_LABEL_CANCEL, GTK_RESPONSE_CANCEL,
+ ! valid ? NULL : _GTK_LABEL_DELETE, GTH_ACCEL_BUTTON_RESPONSE_DELETE,
+ NULL);
+
+ content_area = gtk_dialog_get_content_area (GTK_DIALOG (self));
+
+ label = gtk_label_new (_("Press a combination of keys to use as shortcut."));
+ secondary_label = gtk_label_new (_("Press Esc to cancel"));
+ gtk_style_context_add_class (gtk_widget_get_style_context (secondary_label), "dim-label");
+ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 50);
+ gtk_widget_set_margin_top (box, 50);
+ gtk_widget_set_margin_bottom (box, 50);
+ gtk_widget_set_margin_start (box, 50);
+ gtk_widget_set_margin_end (box, 50);
+ gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (box), secondary_label, TRUE, TRUE, 0);
+
+ g_signal_connect (self,
+ "key-press-event",
+ G_CALLBACK (accel_dialog_keypress_cb),
+ self);
+
+ gtk_widget_show (box);
+ gtk_widget_show (label);
+ gtk_widget_show (secondary_label);
+ gtk_container_add (GTK_CONTAINER (content_area), box);
+}
+
+
+GtkWidget *
+gth_accel_dialog_new (const char *title,
+ GtkWindow *parent,
+ guint keycode,
+ GdkModifierType modifiers)
+{
+ GthAccelDialog *self;
+
+ self = g_object_new (GTH_TYPE_ACCEL_DIALOG,
+ "use-header-bar", _gtk_settings_get_dialogs_use_header (),
+ "modal", TRUE,
+ "transient-for", parent,
+ "resizable", FALSE,
+ "title", title,
+ NULL);
+ gth_accel_dialog_construct (self, title, parent, keycode, modifiers);
+
+ return (GtkWidget *) self;
+}
+
+
+gboolean
+gth_accel_dialog_get_accel (GthAccelDialog *self,
+ guint *keycode,
+ GdkModifierType *modifiers)
+{
+ if (self->priv->valid) {
+ *keycode = self->priv->keycode;
+ *modifiers = self->priv->modifiers;
+ }
+ else {
+ *keycode = 0;
+ *modifiers = 0;
+ }
+
+ return self->priv->valid;
+}
diff --git a/gthumb/gth-accel-dialog.h b/gthumb/gth-accel-dialog.h
new file mode 100644
index 00000000..5834f99f
--- /dev/null
+++ b/gthumb/gth-accel-dialog.h
@@ -0,0 +1,65 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2019 Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GTH_ACCEL_DIALOG_H
+#define GTH_ACCEL_DIALOG_H
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+enum {
+ GTH_ACCEL_BUTTON_RESPONSE_DELETE
+};
+
+#define GTH_TYPE_ACCEL_DIALOG (gth_accel_dialog_get_type ())
+#define GTH_ACCEL_DIALOG(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GTH_TYPE_ACCEL_DIALOG,
GthAccelDialog))
+#define GTH_ACCEL_DIALOG_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GTH_TYPE_ACCEL_DIALOG,
GthAccelDialogClass))
+#define GTH_IS_ACCEL_DIALOG(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GTH_TYPE_ACCEL_DIALOG))
+#define GTH_IS_ACCEL_DIALOG_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GTH_TYPE_ACCEL_DIALOG))
+#define GTH_ACCEL_DIALOG_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GTH_TYPE_ACCEL_DIALOG,
GthAccelDialogClass))
+
+typedef struct _GthAccelDialog GthAccelDialog;
+typedef struct _GthAccelDialogPrivate GthAccelDialogPrivate;
+typedef struct _GthAccelDialogClass GthAccelDialogClass;
+
+struct _GthAccelDialog {
+ GtkDialog __parent;
+ GthAccelDialogPrivate *priv;
+};
+
+struct _GthAccelDialogClass {
+ GtkDialogClass __parent_class;
+};
+
+GType gth_accel_dialog_get_type (void) G_GNUC_CONST;
+GtkWidget * gth_accel_dialog_new (const char *title,
+ GtkWindow *parent,
+ guint keycode,
+ GdkModifierType modifiers);
+gboolean gth_accel_dialog_get_accel (GthAccelDialog *self,
+ guint *keycode,
+ GdkModifierType *modifiers);
+
+G_END_DECLS
+
+#endif /* GTH_ACCEL_DIALOG_H */
diff --git a/gthumb/meson.build b/gthumb/meson.build
index 2f9065dd..56c0db27 100644
--- a/gthumb/meson.build
+++ b/gthumb/meson.build
@@ -12,6 +12,7 @@ public_header_files = [
'gnome-desktop-thumbnail.h',
'gsignature.h',
'gth-accel-button.h',
+ 'gth-accel-dialog.h',
'gth-auto-paned.h',
'gth-async-task.h',
'gth-buffer-data.h',
@@ -167,6 +168,7 @@ source_files = files(
'glib-utils.c',
'gsignature.c',
'gth-accel-button.c',
+ 'gth-accel-dialog.c',
'gth-application.c',
'gth-auto-paned.c',
'gth-async-task.c',
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]