diff options
author | Tristan Van Berkom <tvb@src.gnome.org> | 2009-01-15 02:19:41 +0000 |
---|---|---|
committer | Tristan Van Berkom <tvb@src.gnome.org> | 2009-01-15 02:19:41 +0000 |
commit | c641d481ae0574a53c489b5c2a470d7c0154d897 (patch) | |
tree | cb63fcb9457da6971520a092dc6a551d6b4c1449 | |
parent | 7919ef39fcdcc067b172b01d1019df009b08ac5a (diff) | |
download | glade-c641d481ae0574a53c489b5c2a470d7c0154d897.tar.gz |
Added new editor for GtkEntry with radio buttons for its mutually
* plugins/gtk+/Makefile.am, plugins/gtk+/gtk+.xml.in,
plugins/gtk+/glade-entry-editor.[ch]: Added new editor
for GtkEntry with radio buttons for its mutually exclusive
icon properties.
svn path=/trunk/; revision=2084
-rw-r--r-- | plugins/gtk+/Makefile.am | 4 | ||||
-rw-r--r-- | plugins/gtk+/glade-entry-editor.c | 622 | ||||
-rw-r--r-- | plugins/gtk+/glade-entry-editor.h | 72 | ||||
-rw-r--r-- | plugins/gtk+/glade-gtk.c | 128 | ||||
-rw-r--r-- | plugins/gtk+/gtk+.xml.in | 30 |
5 files changed, 852 insertions, 4 deletions
diff --git a/plugins/gtk+/Makefile.am b/plugins/gtk+/Makefile.am index 161c798c..fa616ad0 100644 --- a/plugins/gtk+/Makefile.am +++ b/plugins/gtk+/Makefile.am @@ -27,7 +27,7 @@ libgladegtk_la_SOURCES = glade-gtk.c glade-accels.c glade-attributes.c glade glade-column-types.c glade-model-data.c glade-text-button.c glade-cell-renderer-button.c \ glade-icon-sources.c glade-button-editor.c glade-tool-button-editor.c glade-image-editor.c \ glade-image-item-editor.c glade-icon-factory-editor.c glade-store-editor.c glade-label-editor.c \ - glade-cell-renderer-editor.c glade-treeview-editor.c + glade-cell-renderer-editor.c glade-treeview-editor.c glade-entry-editor.c libgladegtk_la_LDFLAGS = -module -avoid-version $(AM_LDFLAGS) libgladegtk_la_LIBADD = $(libgladeui) $(GTK_LIBS) @@ -36,7 +36,7 @@ libgladegtkincludedir= $(includedir)/libgladeui-1.0/gladeui libgladegtkinclude_HEADERS = glade-gtk.h glade-accels.h glade-attributes.h glade-column-types.h glade-model-data.h \ glade-text-button.h glade-cell-renderer-button.h glade-icon-sources.h glade-button-editor.h \ glade-tool-button-editor.h glade-image-editor.h glade-image-item-editor.h glade-icon-factory-editor.h \ - glade-store-editor.h glade-label-editor.h glade-cell-renderer-editor.h glade-treeview-editor.h + glade-store-editor.h glade-label-editor.h glade-cell-renderer-editor.h glade-treeview-editor.h glade-entry-editor.h if PLATFORM_WIN32 libgladegtk_la_LDFLAGS += -no-undefined diff --git a/plugins/gtk+/glade-entry-editor.c b/plugins/gtk+/glade-entry-editor.c new file mode 100644 index 00000000..25d9b7b1 --- /dev/null +++ b/plugins/gtk+/glade-entry-editor.c @@ -0,0 +1,622 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2008 Tristan Van Berkom. + * + * This library is free software; you can redistribute it and/or it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Authors: + * Tristan Van Berkom <tvb@gnome.org> + */ + +#include <config.h> +#include <gladeui/glade.h> +#include <glib/gi18n-lib.h> +#include <gdk/gdkkeysyms.h> + +#include "glade-entry-editor.h" +#include "glade-image-editor.h" // For GladeImageEditMode + + +static void glade_entry_editor_finalize (GObject *object); + +static void glade_entry_editor_editable_init (GladeEditableIface *iface); + +static void glade_entry_editor_grab_focus (GtkWidget *widget); + + +G_DEFINE_TYPE_WITH_CODE (GladeEntryEditor, glade_entry_editor, GTK_TYPE_VBOX, + G_IMPLEMENT_INTERFACE (GLADE_TYPE_EDITABLE, + glade_entry_editor_editable_init)); + + +static void +glade_entry_editor_class_init (GladeEntryEditorClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = glade_entry_editor_finalize; + widget_class->grab_focus = glade_entry_editor_grab_focus; +} + +static void +glade_entry_editor_init (GladeEntryEditor *self) +{ +} + +static void +project_changed (GladeProject *project, + GladeCommand *command, + gboolean execute, + GladeEntryEditor *entry_editor) +{ + if (entry_editor->modifying || + !GTK_WIDGET_MAPPED (entry_editor)) + return; + + /* Reload on all commands */ + glade_editable_load (GLADE_EDITABLE (entry_editor), entry_editor->loaded_widget); +} + + +static void +project_finalized (GladeEntryEditor *entry_editor, + GladeProject *where_project_was) +{ + entry_editor->loaded_widget = NULL; + + glade_editable_load (GLADE_EDITABLE (entry_editor), NULL); +} + +static void +glade_entry_editor_load (GladeEditable *editable, + GladeWidget *widget) +{ + GladeEntryEditor *entry_editor = GLADE_ENTRY_EDITOR (editable); + GladeWidget *gchild = NULL; + GtkWidget *child, *entry; + gboolean use_stock = FALSE; + GladeImageEditMode icon_mode; + GList *l; + + entry_editor->loading = TRUE; + + /* Since we watch the project*/ + if (entry_editor->loaded_widget) + { + /* watch custom-child and use-stock properties here for reloads !!! */ + + g_signal_handlers_disconnect_by_func (G_OBJECT (entry_editor->loaded_widget->project), + G_CALLBACK (project_changed), entry_editor); + + /* The widget could die unexpectedly... */ + g_object_weak_unref (G_OBJECT (entry_editor->loaded_widget->project), + (GWeakNotify)project_finalized, + entry_editor); + } + + /* Mark our widget... */ + entry_editor->loaded_widget = widget; + + if (entry_editor->loaded_widget) + { + /* This fires for undo/redo */ + g_signal_connect (G_OBJECT (entry_editor->loaded_widget->project), "changed", + G_CALLBACK (project_changed), entry_editor); + + /* The widget/project could die unexpectedly... */ + g_object_weak_ref (G_OBJECT (entry_editor->loaded_widget->project), + (GWeakNotify)project_finalized, + entry_editor); + } + + /* load the embedded editable... */ + if (entry_editor->embed) + glade_editable_load (GLADE_EDITABLE (entry_editor->embed), widget); + + for (l = entry_editor->properties; l; l = l->next) + glade_editor_property_load_by_widget (GLADE_EDITOR_PROPERTY (l->data), widget); + + + if (widget) + { + glade_widget_property_get (widget, "primary-icon-mode", &icon_mode); + + switch (icon_mode) + { + case GLADE_IMAGE_MODE_STOCK: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (entry_editor->primary_stock_radio), TRUE); + break; + case GLADE_IMAGE_MODE_ICON: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (entry_editor->primary_icon_name_radio), TRUE); + break; + case GLADE_IMAGE_MODE_FILENAME: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (entry_editor->primary_pixbuf_radio), TRUE); + break; + default: + break; + } + + glade_widget_property_get (widget, "secondary-icon-mode", &icon_mode); + + switch (icon_mode) + { + case GLADE_IMAGE_MODE_STOCK: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (entry_editor->secondary_stock_radio), TRUE); + break; + case GLADE_IMAGE_MODE_ICON: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (entry_editor->secondary_icon_name_radio), TRUE); + break; + case GLADE_IMAGE_MODE_FILENAME: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (entry_editor->secondary_pixbuf_radio), TRUE); + break; + default: + break; + } + } + entry_editor->loading = FALSE; +} + +static void +glade_entry_editor_set_show_name (GladeEditable *editable, + gboolean show_name) +{ + GladeEntryEditor *entry_editor = GLADE_ENTRY_EDITOR (editable); + + glade_editable_set_show_name (GLADE_EDITABLE (entry_editor->embed), show_name); +} + +static void +glade_entry_editor_editable_init (GladeEditableIface *iface) +{ + iface->load = glade_entry_editor_load; + iface->set_show_name = glade_entry_editor_set_show_name; +} + +static void +glade_entry_editor_finalize (GObject *object) +{ + GladeEntryEditor *entry_editor = GLADE_ENTRY_EDITOR (object); + + if (entry_editor->properties) + g_list_free (entry_editor->properties); + entry_editor->properties = NULL; + entry_editor->embed = NULL; + + glade_editable_load (GLADE_EDITABLE (object), NULL); + + G_OBJECT_CLASS (glade_entry_editor_parent_class)->finalize (object); +} + +static void +glade_entry_editor_grab_focus (GtkWidget *widget) +{ + GladeEntryEditor *entry_editor = GLADE_ENTRY_EDITOR (widget); + + gtk_widget_grab_focus (entry_editor->embed); +} + + +#define ICON_MODE_NAME(primary) ((primary) ? "primary-icon-mode" : "secondary-icon-mode") +#define PIXBUF_NAME(primary) ((primary) ? "pixbuf-primary" : "pixbuf-secondary") +#define ICON_NAME_NAME(primary) ((primary) ? "icon-name-primary" : "icon-name-secondary") +#define STOCK_NAME(primary) ((primary) ? "stock-primary" : "stock-secondary") + +static void +set_stock_mode (GladeEntryEditor *entry_editor, gboolean primary) +{ + GladeProperty *property; + GValue value = { 0, }; + + property = glade_widget_get_property (entry_editor->loaded_widget, ICON_NAME_NAME (primary)); + glade_command_set_property (property, NULL); + property = glade_widget_get_property (entry_editor->loaded_widget, PIXBUF_NAME (primary)); + glade_command_set_property (property, NULL); + + property = glade_widget_get_property (entry_editor->loaded_widget, STOCK_NAME (primary)); + glade_property_get_default (property, &value); + glade_command_set_property_value (property, &value); + g_value_unset (&value); + + property = glade_widget_get_property (entry_editor->loaded_widget, ICON_MODE_NAME (primary)); + glade_command_set_property (property, GLADE_IMAGE_MODE_STOCK); +} + +static void +set_icon_name_mode (GladeEntryEditor *entry_editor, gboolean primary) +{ + GladeProperty *property; + + property = glade_widget_get_property (entry_editor->loaded_widget, STOCK_NAME (primary)); + glade_command_set_property (property, NULL); + property = glade_widget_get_property (entry_editor->loaded_widget, PIXBUF_NAME (primary)); + glade_command_set_property (property, NULL); + property = glade_widget_get_property (entry_editor->loaded_widget, ICON_MODE_NAME (primary)); + glade_command_set_property (property, GLADE_IMAGE_MODE_ICON); +} + +static void +set_pixbuf_mode (GladeEntryEditor *entry_editor, gboolean primary) +{ + GladeProperty *property; + + property = glade_widget_get_property (entry_editor->loaded_widget, STOCK_NAME (primary)); + glade_command_set_property (property, NULL); + + property = glade_widget_get_property (entry_editor->loaded_widget, ICON_NAME_NAME (primary)); + glade_command_set_property (property, NULL); + + property = glade_widget_get_property (entry_editor->loaded_widget, ICON_MODE_NAME (primary)); + glade_command_set_property (property, GLADE_IMAGE_MODE_FILENAME); +} + +static void +primary_stock_toggled (GtkWidget *widget, + GladeEntryEditor *entry_editor) +{ + + if (entry_editor->loading || !entry_editor->loaded_widget) + return; + + if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (entry_editor->primary_stock_radio))) + return; + + entry_editor->modifying = TRUE; + + glade_command_push_group (_("Setting %s to use a primary icon from stock"), entry_editor->loaded_widget->name); + set_stock_mode (entry_editor, TRUE); + glade_command_pop_group (); + + entry_editor->modifying = FALSE; + + /* reload buttons and sensitivity and stuff... */ + glade_editable_load (GLADE_EDITABLE (entry_editor), + entry_editor->loaded_widget); +} + + +static void +primary_icon_name_toggled (GtkWidget *widget, + GladeEntryEditor *entry_editor) +{ + if (entry_editor->loading || !entry_editor->loaded_widget) + return; + + if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (entry_editor->primary_icon_name_radio))) + return; + + entry_editor->modifying = TRUE; + + glade_command_push_group (_("Setting %s to use a primary icon from the icon theme"), entry_editor->loaded_widget->name); + set_icon_name_mode (entry_editor, TRUE); + glade_command_pop_group (); + + entry_editor->modifying = FALSE; + + /* reload buttons and sensitivity and stuff... */ + glade_editable_load (GLADE_EDITABLE (entry_editor), + entry_editor->loaded_widget); +} + +static void +primary_pixbuf_toggled (GtkWidget *widget, + GladeEntryEditor *entry_editor) +{ + if (entry_editor->loading || !entry_editor->loaded_widget) + return; + + if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (entry_editor->primary_pixbuf_radio))) + return; + + entry_editor->modifying = TRUE; + + glade_command_push_group (_("Setting %s to use a primary icon from filename"), entry_editor->loaded_widget->name); + set_pixbuf_mode (entry_editor, TRUE); + glade_command_pop_group (); + + entry_editor->modifying = FALSE; + + /* reload buttons and sensitivity and stuff... */ + glade_editable_load (GLADE_EDITABLE (entry_editor), + entry_editor->loaded_widget); +} + + +static void +secondary_stock_toggled (GtkWidget *widget, + GladeEntryEditor *entry_editor) +{ + + if (entry_editor->loading || !entry_editor->loaded_widget) + return; + + if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (entry_editor->secondary_stock_radio))) + return; + + entry_editor->modifying = TRUE; + + glade_command_push_group (_("Setting %s to use a secondary icon from stock"), entry_editor->loaded_widget->name); + set_stock_mode (entry_editor, FALSE); + glade_command_pop_group (); + + entry_editor->modifying = FALSE; + + /* reload buttons and sensitivity and stuff... */ + glade_editable_load (GLADE_EDITABLE (entry_editor), + entry_editor->loaded_widget); +} + + +static void +secondary_icon_name_toggled (GtkWidget *widget, + GladeEntryEditor *entry_editor) +{ + if (entry_editor->loading || !entry_editor->loaded_widget) + return; + + if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (entry_editor->secondary_icon_name_radio))) + return; + + entry_editor->modifying = TRUE; + + glade_command_push_group (_("Setting %s to use a secondary icon from the icon theme"), entry_editor->loaded_widget->name); + set_icon_name_mode (entry_editor, FALSE); + glade_command_pop_group (); + + entry_editor->modifying = FALSE; + + /* reload buttons and sensitivity and stuff... */ + glade_editable_load (GLADE_EDITABLE (entry_editor), + entry_editor->loaded_widget); +} + +static void +secondary_pixbuf_toggled (GtkWidget *widget, + GladeEntryEditor *entry_editor) +{ + if (entry_editor->loading || !entry_editor->loaded_widget) + return; + + if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (entry_editor->secondary_pixbuf_radio))) + return; + + entry_editor->modifying = TRUE; + + glade_command_push_group (_("Setting %s to use a secondary icon from filename"), entry_editor->loaded_widget->name); + set_pixbuf_mode (entry_editor, FALSE); + glade_command_pop_group (); + + entry_editor->modifying = FALSE; + + /* reload buttons and sensitivity and stuff... */ + glade_editable_load (GLADE_EDITABLE (entry_editor), + entry_editor->loaded_widget); +} + +static void +table_attach (GtkWidget *table, + GtkWidget *child, + gint pos, gint row, + GtkSizeGroup *group) +{ + gtk_table_attach (GTK_TABLE (table), child, + pos, pos+1, row, row +1, + pos ? 0 : GTK_EXPAND | GTK_FILL, + GTK_EXPAND | GTK_FILL, + 3, 1); + + if (pos) + gtk_size_group_add_widget (group, child); +} + + +GtkWidget * +glade_entry_editor_new (GladeWidgetAdaptor *adaptor, + GladeEditable *embed) +{ + GladeEntryEditor *entry_editor; + GladeEditorProperty *eprop; + GtkWidget *table, *frame, *alignment, *label, *hbox; + GtkSizeGroup *group; + gchar *str; + + g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL); + g_return_val_if_fail (GLADE_IS_EDITABLE (embed), NULL); + + entry_editor = g_object_new (GLADE_TYPE_ENTRY_EDITOR, NULL); + entry_editor->embed = GTK_WIDGET (embed); + + /* Pack the parent on top... */ + gtk_box_pack_start (GTK_BOX (entry_editor), GTK_WIDGET (embed), FALSE, FALSE, 0); + + /* Progress... */ + str = g_strdup_printf ("<b>%s</b>", _("Progress")); + label = gtk_label_new (str); + gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + g_free (str); + frame = gtk_frame_new (NULL); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + gtk_box_pack_start (GTK_BOX (entry_editor), frame, FALSE, FALSE, 8); + + alignment = gtk_alignment_new (0.5F, 0.5F, 1.0F, 1.0F); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 0, 12, 0); + gtk_container_add (GTK_CONTAINER (frame), alignment); + + table = gtk_table_new (0, 0, FALSE); + gtk_container_add (GTK_CONTAINER (alignment), table); + + group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + + /* Fraction */ + eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "progress-fraction", FALSE, TRUE); + table_attach (table, eprop->item_label, 0, 0, group); + table_attach (table, GTK_WIDGET (eprop), 1, 0, group); + entry_editor->properties = g_list_prepend (entry_editor->properties, eprop); + + /* Pulse */ + eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "progress-pulse-step", FALSE, TRUE); + table_attach (table, eprop->item_label, 0, 1, group); + table_attach (table, GTK_WIDGET (eprop), 1, 1, group); + entry_editor->properties = g_list_prepend (entry_editor->properties, eprop); + + g_object_unref (group); + + /* Primary icon... */ + str = g_strdup_printf ("<b>%s</b>", _("Primary icon")); + label = gtk_label_new (str); + gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + g_free (str); + frame = gtk_frame_new (NULL); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + gtk_box_pack_start (GTK_BOX (entry_editor), frame, FALSE, FALSE, 8); + + alignment = gtk_alignment_new (0.5F, 0.5F, 1.0F, 1.0F); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 0, 12, 0); + gtk_container_add (GTK_CONTAINER (frame), alignment); + + table = gtk_table_new (0, 0, FALSE); + gtk_container_add (GTK_CONTAINER (alignment), table); + + group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + + /* Pixbuf */ + eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "pixbuf-primary", FALSE, TRUE); + hbox = gtk_hbox_new (FALSE, 0); + entry_editor->primary_pixbuf_radio = gtk_radio_button_new (NULL); + gtk_box_pack_start (GTK_BOX (hbox), entry_editor->primary_pixbuf_radio, FALSE, FALSE, 2); + gtk_box_pack_start (GTK_BOX (hbox), eprop->item_label, TRUE, TRUE, 2); + table_attach (table, hbox, 0, 0, group); + table_attach (table, GTK_WIDGET (eprop), 1, 0, group); + entry_editor->properties = g_list_prepend (entry_editor->properties, eprop); + + /* Stock */ + eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "stock-primary", FALSE, TRUE); + hbox = gtk_hbox_new (FALSE, 0); + entry_editor->primary_stock_radio = gtk_radio_button_new_from_widget + (GTK_RADIO_BUTTON (entry_editor->primary_pixbuf_radio)); + gtk_box_pack_start (GTK_BOX (hbox), entry_editor->primary_stock_radio, FALSE, FALSE, 2); + gtk_box_pack_start (GTK_BOX (hbox), eprop->item_label, TRUE, TRUE, 2); + table_attach (table, hbox, 0, 1, group); + table_attach (table, GTK_WIDGET (eprop), 1, 1, group); + entry_editor->properties = g_list_prepend (entry_editor->properties, eprop); + + /* Icon name */ + eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "icon-name-primary", FALSE, TRUE); + hbox = gtk_hbox_new (FALSE, 0); + entry_editor->primary_icon_name_radio = gtk_radio_button_new_from_widget + (GTK_RADIO_BUTTON (entry_editor->primary_pixbuf_radio)); + gtk_box_pack_start (GTK_BOX (hbox), entry_editor->primary_icon_name_radio, FALSE, FALSE, 2); + gtk_box_pack_start (GTK_BOX (hbox), eprop->item_label, TRUE, TRUE, 2); + table_attach (table, hbox, 0, 2, group); + table_attach (table, GTK_WIDGET (eprop), 1, 2, group); + entry_editor->properties = g_list_prepend (entry_editor->properties, eprop); + + eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "activatable-primary", FALSE, TRUE); + table_attach (table, eprop->item_label, 0, 3, group); + table_attach (table, GTK_WIDGET (eprop), 1, 3, group); + entry_editor->properties = g_list_prepend (entry_editor->properties, eprop); + + eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "sensitive-primary", FALSE, TRUE); + table_attach (table, eprop->item_label, 0, 4, group); + table_attach (table, GTK_WIDGET (eprop), 1, 4, group); + entry_editor->properties = g_list_prepend (entry_editor->properties, eprop); + + g_object_unref (group); + + /* Secondary icon... */ + str = g_strdup_printf ("<b>%s</b>", _("Secondary icon")); + label = gtk_label_new (str); + gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + g_free (str); + frame = gtk_frame_new (NULL); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + gtk_box_pack_start (GTK_BOX (entry_editor), frame, FALSE, FALSE, 8); + + alignment = gtk_alignment_new (0.5F, 0.5F, 1.0F, 1.0F); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 0, 12, 0); + gtk_container_add (GTK_CONTAINER (frame), alignment); + + table = gtk_table_new (0, 0, FALSE); + gtk_container_add (GTK_CONTAINER (alignment), table); + + group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + + /* Pixbuf */ + eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "pixbuf-secondary", FALSE, TRUE); + hbox = gtk_hbox_new (FALSE, 0); + entry_editor->secondary_pixbuf_radio = gtk_radio_button_new (NULL); + gtk_box_pack_start (GTK_BOX (hbox), entry_editor->secondary_pixbuf_radio, FALSE, FALSE, 2); + gtk_box_pack_start (GTK_BOX (hbox), eprop->item_label, TRUE, TRUE, 2); + table_attach (table, hbox, 0, 0, group); + table_attach (table, GTK_WIDGET (eprop), 1, 0, group); + entry_editor->properties = g_list_prepend (entry_editor->properties, eprop); + + /* Stock */ + eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "stock-secondary", FALSE, TRUE); + hbox = gtk_hbox_new (FALSE, 0); + entry_editor->secondary_stock_radio = gtk_radio_button_new_from_widget + (GTK_RADIO_BUTTON (entry_editor->secondary_pixbuf_radio)); + gtk_box_pack_start (GTK_BOX (hbox), entry_editor->secondary_stock_radio, FALSE, FALSE, 2); + gtk_box_pack_start (GTK_BOX (hbox), eprop->item_label, TRUE, TRUE, 2); + table_attach (table, hbox, 0, 1, group); + table_attach (table, GTK_WIDGET (eprop), 1, 1, group); + entry_editor->properties = g_list_prepend (entry_editor->properties, eprop); + + /* Icon name */ + eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "icon-name-secondary", FALSE, TRUE); + hbox = gtk_hbox_new (FALSE, 0); + entry_editor->secondary_icon_name_radio = gtk_radio_button_new_from_widget + (GTK_RADIO_BUTTON (entry_editor->secondary_pixbuf_radio)); + gtk_box_pack_start (GTK_BOX (hbox), entry_editor->secondary_icon_name_radio, FALSE, FALSE, 2); + gtk_box_pack_start (GTK_BOX (hbox), eprop->item_label, TRUE, TRUE, 2); + table_attach (table, hbox, 0, 2, group); + table_attach (table, GTK_WIDGET (eprop), 1, 2, group); + entry_editor->properties = g_list_prepend (entry_editor->properties, eprop); + + eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "activatable-secondary", FALSE, TRUE); + table_attach (table, eprop->item_label, 0, 3, group); + table_attach (table, GTK_WIDGET (eprop), 1, 3, group); + entry_editor->properties = g_list_prepend (entry_editor->properties, eprop); + + eprop = glade_widget_adaptor_create_eprop_by_name (adaptor, "sensitive-secondary", FALSE, TRUE); + table_attach (table, eprop->item_label, 0, 4, group); + table_attach (table, GTK_WIDGET (eprop), 1, 4, group); + entry_editor->properties = g_list_prepend (entry_editor->properties, eprop); + + g_object_unref (group); + + gtk_widget_show_all (GTK_WIDGET (entry_editor)); + + + /* Connect radio button signals... */ + g_signal_connect (G_OBJECT (entry_editor->primary_stock_radio), "toggled", + G_CALLBACK (primary_stock_toggled), entry_editor); + g_signal_connect (G_OBJECT (entry_editor->primary_icon_name_radio), "toggled", + G_CALLBACK (primary_icon_name_toggled), entry_editor); + g_signal_connect (G_OBJECT (entry_editor->primary_pixbuf_radio), "toggled", + G_CALLBACK (primary_pixbuf_toggled), entry_editor); + + g_signal_connect (G_OBJECT (entry_editor->secondary_stock_radio), "toggled", + G_CALLBACK (secondary_stock_toggled), entry_editor); + g_signal_connect (G_OBJECT (entry_editor->secondary_icon_name_radio), "toggled", + G_CALLBACK (secondary_icon_name_toggled), entry_editor); + g_signal_connect (G_OBJECT (entry_editor->secondary_pixbuf_radio), "toggled", + G_CALLBACK (secondary_pixbuf_toggled), entry_editor); + + return GTK_WIDGET (entry_editor); +} diff --git a/plugins/gtk+/glade-entry-editor.h b/plugins/gtk+/glade-entry-editor.h new file mode 100644 index 00000000..eaa6e9d9 --- /dev/null +++ b/plugins/gtk+/glade-entry-editor.h @@ -0,0 +1,72 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright (C) 2008 Tristan Van Berkom. + * + * This library is free software; you can redistribute it and/or it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Authors: + * Tristan Van Berkom <tvb@gnome.org> + */ +#ifndef _GLADE_ENTRY_EDITOR_H_ +#define _GLADE_ENTRY_EDITOR_H_ + +#include <gtk/gtk.h> + +G_BEGIN_DECLS + +#define GLADE_TYPE_ENTRY_EDITOR (glade_entry_editor_get_type ()) +#define GLADE_ENTRY_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_ENTRY_EDITOR, GladeEntryEditor)) +#define GLADE_ENTRY_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_ENTRY_EDITOR, GladeEntryEditorClass)) +#define GLADE_IS_ENTRY_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_ENTRY_EDITOR)) +#define GLADE_IS_ENTRY_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_ENTRY_EDITOR)) +#define GLADE_ENTRY_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_TYPE_ENTRY_EDITOR, GladeEntryEditorClass)) + +typedef struct _GladeEntryEditor GladeEntryEditor; +typedef struct _GladeEntryEditorClass GladeEntryEditorClass; + +struct _GladeEntryEditor +{ + GtkVBox parent; + + GladeWidget *loaded_widget; /* A handy pointer to the loaded widget ... */ + + GtkWidget *embed; + + GtkWidget *primary_pixbuf_radio; + GtkWidget *primary_stock_radio; + GtkWidget *primary_icon_name_radio; + + GtkWidget *secondary_pixbuf_radio; + GtkWidget *secondary_stock_radio; + GtkWidget *secondary_icon_name_radio; + + GList *properties; + + gboolean loading; + gboolean modifying; +}; + +struct _GladeEntryEditorClass +{ + GtkVBoxClass parent; +}; + +GType glade_entry_editor_get_type (void) G_GNUC_CONST; +GtkWidget *glade_entry_editor_new (GladeWidgetAdaptor *adaptor, + GladeEditable *editable); + +G_END_DECLS + +#endif /* _GLADE_ENTRY_EDITOR_H_ */ diff --git a/plugins/gtk+/glade-gtk.c b/plugins/gtk+/glade-gtk.c index 14f403f0..2dc92abf 100644 --- a/plugins/gtk+/glade-gtk.c +++ b/plugins/gtk+/glade-gtk.c @@ -41,6 +41,7 @@ #include "glade-label-editor.h" #include "glade-cell-renderer-editor.h" #include "glade-treeview-editor.h" +#include "glade-entry-editor.h" #include <gladeui/glade-editor-property.h> #include <gladeui/glade-base-editor.h> @@ -2205,6 +2206,8 @@ glade_gtk_box_replace_child (GladeWidgetAdaptor *adaptor, GladeWidget *gchild; GladeWidget *gbox; + g_object_ref (G_OBJECT (current)); + GWA_GET_CLASS (GTK_TYPE_CONTAINER)->replace_child (adaptor, container, current, @@ -2219,6 +2222,8 @@ glade_gtk_box_replace_child (GladeWidgetAdaptor *adaptor, gbox = glade_widget_get_from_gobject (container); fix_response_id_on_child (gbox, current, FALSE); fix_response_id_on_child (gbox, new_widget, TRUE); + + g_object_unref (G_OBJECT (current)); } @@ -4714,6 +4719,127 @@ glade_gtk_entry_post_create (GladeWidgetAdaptor *adaptor, G_CALLBACK (glade_gtk_entry_changed), gentry); } +GladeEditable * +glade_gtk_entry_create_editable (GladeWidgetAdaptor *adaptor, + GladeEditorPageType type) +{ + GladeEditable *editable; + + /* Get base editable */ + editable = GWA_GET_CLASS (GTK_TYPE_WIDGET)->create_editable (adaptor, type); + + if (type == GLADE_PAGE_GENERAL) + return (GladeEditable *)glade_entry_editor_new (adaptor, editable); + + return editable; +} + + +void +glade_gtk_entry_set_property (GladeWidgetAdaptor *adaptor, + GObject *object, + const gchar *id, + const GValue *value) +{ + GladeImageEditMode mode; + GladeWidget *gwidget = glade_widget_get_from_gobject (object); + + if (!strcmp (id, "primary-icon-mode")) + { + mode = g_value_get_int (value); + + glade_widget_property_set_sensitive (gwidget, "stock-primary", FALSE, NOT_SELECTED_MSG); + glade_widget_property_set_sensitive (gwidget, "icon-name-primary", FALSE, NOT_SELECTED_MSG); + glade_widget_property_set_sensitive (gwidget, "pixbuf-primary", FALSE, NOT_SELECTED_MSG); + + switch (mode) { + case GLADE_IMAGE_MODE_STOCK: + glade_widget_property_set_sensitive (gwidget, "stock-primary", TRUE, NULL); + break; + case GLADE_IMAGE_MODE_ICON: + glade_widget_property_set_sensitive (gwidget, "icon-name-primary", TRUE, NULL); + break; + case GLADE_IMAGE_MODE_FILENAME: + glade_widget_property_set_sensitive (gwidget, "pixbuf-primary", TRUE, NULL); + break; + } + } + else if (!strcmp (id, "secondary-icon-mode")) + { + mode = g_value_get_int (value); + + glade_widget_property_set_sensitive (gwidget, "stock-secondary", FALSE, NOT_SELECTED_MSG); + glade_widget_property_set_sensitive (gwidget, "icon-name-secondary", FALSE, NOT_SELECTED_MSG); + glade_widget_property_set_sensitive (gwidget, "pixbuf-secondary", FALSE, NOT_SELECTED_MSG); + + switch (mode) { + case GLADE_IMAGE_MODE_STOCK: + glade_widget_property_set_sensitive (gwidget, "stock-secondary", TRUE, NULL); + break; + case GLADE_IMAGE_MODE_ICON: + glade_widget_property_set_sensitive (gwidget, "icon-name-secondary", TRUE, NULL); + break; + case GLADE_IMAGE_MODE_FILENAME: + glade_widget_property_set_sensitive (gwidget, "pixbuf-secondary", TRUE, NULL); + break; + } + } + else + GWA_GET_CLASS (GTK_TYPE_WIDGET)->set_property (adaptor, object, id, value); +} + +void +glade_gtk_entry_read_widget (GladeWidgetAdaptor *adaptor, + GladeWidget *widget, + GladeXmlNode *node) +{ + GladeProperty *property; + + if (!glade_xml_node_verify + (node, GLADE_XML_TAG_WIDGET (glade_project_get_format (widget->project)))) + return; + + /* First chain up and read in all the normal properties.. */ + GWA_GET_CLASS (GTK_TYPE_WIDGET)->read_widget (adaptor, widget, node); + + if (glade_widget_property_original_default (widget, "icon-name-primary") == FALSE) + { + property = glade_widget_get_property (widget, "icon-name-primary"); + glade_widget_property_set (widget, "primary-icon-mode", GLADE_IMAGE_MODE_ICON); + } + else if (glade_widget_property_original_default (widget, "pixbuf-primary") == FALSE) + { + property = glade_widget_get_property (widget, "pixbuf-primary"); + glade_widget_property_set (widget, "primary-icon-mode", GLADE_IMAGE_MODE_FILENAME); + } + else/* if (glade_widget_property_original_default (widget, "stock") == FALSE) */ + { + property = glade_widget_get_property (widget, "stock-primary"); + glade_widget_property_set (widget, "primary-icon-mode", GLADE_IMAGE_MODE_STOCK); + } + + glade_property_sync (property); + + if (glade_widget_property_original_default (widget, "icon-name-secondary") == FALSE) + { + property = glade_widget_get_property (widget, "icon-name-secondary"); + glade_widget_property_set (widget, "secondary-icon-mode", GLADE_IMAGE_MODE_ICON); + } + else if (glade_widget_property_original_default (widget, "pixbuf-secondary") == FALSE) + { + property = glade_widget_get_property (widget, "pixbuf-secondary"); + glade_widget_property_set (widget, "secondary-icon-mode", GLADE_IMAGE_MODE_FILENAME); + } + else/* if (glade_widget_property_original_default (widget, "stock") == FALSE) */ + { + property = glade_widget_get_property (widget, "stock-secondary"); + glade_widget_property_set (widget, "secondary-icon-mode", GLADE_IMAGE_MODE_STOCK); + } + + glade_property_sync (property); +} + + /* ----------------------------- GtkFixed/GtkLayout ------------------------------ */ static void glade_gtk_fixed_layout_finalize(GdkPixmap *backing) @@ -5731,8 +5857,6 @@ glade_gtk_image_read_widget (GladeWidgetAdaptor *adaptor, } glade_property_sync (property); - - } diff --git a/plugins/gtk+/gtk+.xml.in b/plugins/gtk+/gtk+.xml.in index 75c0d824..d0df68cf 100644 --- a/plugins/gtk+/gtk+.xml.in +++ b/plugins/gtk+/gtk+.xml.in @@ -784,11 +784,41 @@ embedded in another object</_tooltip> <glade-widget-class name="GtkEntry" generic-name="entry" _title="Text Entry"> <post-create-function>glade_gtk_entry_post_create</post-create-function> + <create-editable-function>glade_gtk_entry_create_editable</create-editable-function> + <set-property-function>glade_gtk_entry_set_property</set-property-function> + <read-widget-function>glade_gtk_entry_read_widget</read-widget-function> <properties> <property id="text" translatable="True"/> <property id="inner-border" since="2.10"/> <property id="truncate-multiline" since="2.10"/> <property id="shadow-type" since="2.12"/> + <property id="gicon-primary" disabled="True"/> + <property id="gicon-secondary" disabled="True"/> + <property id="stock-primary" since="2.16" custom-layout="True" stock-icon="True"/> + <property id="stock-secondary" since="2.16" custom-layout="True" stock-icon="True"/> + <property id="pixbuf-primary" since="2.16" custom-layout="True"/> + <property id="pixbuf-secondary" since="2.16" custom-layout="True"/> + <property id="icon-name-primary" since="2.16" custom-layout="True" themed-icon="True"/> + <property id="icon-name-secondary" since="2.16" custom-layout="True" themed-icon="True"/> + <property id="activatable-primary" since="2.16" custom-layout="True"/> + <property id="activatable-secondary" since="2.16" custom-layout="True"/> + <property id="sensitive-primary" since="2.16" custom-layout="True"/> + <property id="sensitive-secondary" since="2.16" custom-layout="True"/> + <property id="progress-fraction" since="2.16" custom-layout="True"/> + <property id="progress-pulse-step" since="2.16" custom-layout="True"/> + + <!-- Virtual icon edit mode properties --> + <property id="primary-icon-mode" visible="False" save="False"> + <parameter-spec> + <type>GParamInt</type> + </parameter-spec> + </property> + <property id="secondary-icon-mode" visible="False" save="False"> + <parameter-spec> + <type>GParamInt</type> + </parameter-spec> + </property> + <!-- Atk activate property --> <property id="atk-activate" _name="Activate" ignore="True" atk-property="True" save="False"> <parameter-spec> |