summaryrefslogtreecommitdiff
path: root/src/glade-gtk.c
diff options
context:
space:
mode:
authorTristan Van Berkom <tristan.van.berkom@gmail.com>2004-11-03 05:53:05 +0000
committerDavid Hoover <dhoover@src.gnome.org>2004-11-03 05:53:05 +0000
commit9051dfb92a56467cae5a0783fac58963c9b8b7b4 (patch)
tree407d61573ef25c618714c706019333fb4462695f /src/glade-gtk.c
parentb9a1931ed5275262304b07d0d7c8551ca10e9aa6 (diff)
downloadglade-9051dfb92a56467cae5a0783fac58963c9b8b7b4.tar.gz
Removed GladePropertyType completely from the source in favor of
2004-11-02 Tristan Van Berkom <tristan.van.berkom@gmail.com> * Removed GladePropertyType completely from the source in favor of GParamSpec. * Removed GladeChoice code, and replaced all references thereof * Custom types must now provide a function to retrieve a GParamSpec for that type (xml files and glade-gtk backend updated accordingly). * Removed "child" member from GladePropertyType in order to avoid confusion (Note, I will add support for non-widget types + all types allowed to have children, in a more flexable way, for now I got rid of all mention of "child" since it wasn't implemented and mostly `#if 0'd out anyway) * Implemented <VerifyFunction> in xml files and in the glade-gtk backend. * Added support for numerical types long/ulong/int64/uint64 to the editor. * src/glade-project.c: glade_project_remove_widget() Now removes nodes on widget to remove, this fixes bug 156515. * src/glade-editor.c: Fixed popup name to g_strdup_printf(_("Create a %s"), type);
Diffstat (limited to 'src/glade-gtk.c')
-rw-r--r--src/glade-gtk.c309
1 files changed, 218 insertions, 91 deletions
diff --git a/src/glade-gtk.c b/src/glade-gtk.c
index 9292424d..3e0dd4f1 100644
--- a/src/glade-gtk.c
+++ b/src/glade-gtk.c
@@ -63,6 +63,67 @@
#define FIXED_DEFAULT_CHILD_WIDTH 100
#define FIXED_DEFAULT_CHILD_HEIGHT 60
+
+
+/* ---------------------------- Custom Property definitions ------------------------ */
+static GType
+glade_gtk_stock_get_type (void)
+{
+ static GType etype = 0;
+ if (etype == 0) {
+ static const GEnumValue values[] = {
+ { 0, "None", "glade-none" },
+ { 1, "Ok", "gtk-ok" },
+ { 2, "Cancel", "gtk-cancel" },
+ { 3, "Apply", "gtk-apply" },
+ { 4, "Close", "gtk-close" },
+ { 0, NULL, NULL }
+ };
+ etype = g_enum_register_static ("GtkTtScrollType", values);
+ }
+ return etype;
+}
+
+GParamSpec *GLADEGTK_API
+glade_gtk_stock_spec (void)
+{
+ return g_param_spec_enum ("stock", "stock", "stock",
+ glade_gtk_stock_get_type (),
+ 0, G_PARAM_READWRITE);
+}
+
+GParamSpec *GLADEGTK_API
+glade_gtk_standard_int_spec (void)
+{
+ static GParamSpec *int_spec = NULL;
+ if (!int_spec)
+ int_spec = g_param_spec_int ("int", "int", "int",
+ 0, G_MAXINT,
+ 0, G_PARAM_READWRITE);
+ return int_spec;
+}
+
+GParamSpec *GLADEGTK_API
+glade_gtk_standard_string_spec (void)
+{
+ static GParamSpec *str_spec = NULL;
+ if (!str_spec)
+ str_spec = g_param_spec_string ("string", "string", "string",
+ "", G_PARAM_READWRITE);
+ return str_spec;
+}
+
+GParamSpec *GLADEGTK_API
+glade_gtk_standard_float_spec (void)
+{
+ static GParamSpec *float_spec = NULL;
+ if (!float_spec)
+ float_spec = g_param_spec_float ("float", "float", "float",
+ 0.0F, G_MAXFLOAT, 0.0F,
+ G_PARAM_READWRITE);
+ return float_spec;
+}
+
/* ------------------------------------ Custom Properties ------------------------------ */
/**
* glade_gtk_option_menu_set_items:
@@ -329,10 +390,9 @@ glade_gtk_box_set_size (GObject *object, GValue *value)
*/
for (i = 0; i < new_size; i++)
{
- if (i + 1 < g_list_length(box->children))
- continue;
- gtk_container_add (GTK_CONTAINER (box),
- GTK_WIDGET (glade_placeholder_new ()));
+ if (g_list_length(box->children) < (i + 1))
+ gtk_container_add (GTK_CONTAINER (box),
+ GTK_WIDGET (glade_placeholder_new ()));
}
/* The box has shrunk. Remove the widgets that are on those slots */
@@ -343,8 +403,7 @@ glade_gtk_box_set_size (GObject *object, GValue *value)
GtkWidget *child_widget = ((GtkBoxChild *) (child->data))->widget;
GladeWidget *glade_widget;
- glade_widget = glade_widget_get_from_gtk_widget (child_widget);
- if (glade_widget)
+ if ((glade_widget = glade_widget_get_from_gtk_widget (child_widget)) != NULL)
/* In this case, refuse to shrink */
break;
@@ -352,6 +411,26 @@ glade_gtk_box_set_size (GObject *object, GValue *value)
}
}
+gboolean GLADEGTK_API
+glade_gtk_box_verify_size (GObject *object, GValue *value)
+{
+ GtkBox *box = GTK_BOX(object);
+ GList *child;
+ gint old_size = g_list_length (box->children);
+ gint new_size = g_value_get_int (value);
+
+ for (child = g_list_last (box->children);
+ child && old_size > new_size;
+ child = g_list_previous (child), old_size--)
+ {
+ GtkWidget *widget = ((GtkBoxChild *) (child->data))->widget;
+ if (glade_widget_get_from_gtk_widget (widget) != NULL)
+ /* In this case, refuse to shrink */
+ return FALSE;
+ }
+ return TRUE;
+}
+
/**
* glade_gtk_toolbar_get_size:
* @object:
@@ -382,47 +461,53 @@ glade_gtk_toolbar_get_size (GObject *object, GValue *value)
void GLADEGTK_API
glade_gtk_toolbar_set_size (GObject *object, GValue *value)
{
- GladeWidget *widget;
- GtkToolbar *toolbar;
- gint new_size;
- gint old_size;
-
- g_return_if_fail (GTK_IS_TOOLBAR (object));
-
- toolbar = GTK_TOOLBAR (object);
- widget = glade_widget_get_from_gtk_widget (GTK_WIDGET (toolbar));
- g_return_if_fail (widget != NULL);
+ GtkToolbar *toolbar = GTK_TOOLBAR (object);
+ gint new_size = g_value_get_int (value);
+ gint old_size = toolbar->num_children;
+ GList *child;
- old_size = toolbar->num_children;
- new_size = g_value_get_int (value);
-
- if (new_size == old_size)
- return;
+ g_print ("Toolbar (set) old size: %d, new size %d\n", old_size, new_size);
+ /* Ensure base size
+ */
+ while (new_size > old_size) {
+ gtk_toolbar_append_widget (toolbar, glade_placeholder_new (), NULL, NULL);
+ old_size++;
+ }
- if (new_size > old_size) {
- while (new_size > old_size) {
- GtkWidget *placeholder = glade_placeholder_new ();
- gtk_toolbar_append_widget (toolbar, placeholder, NULL, NULL);
- old_size++;
- }
- } else {
- GList *child = g_list_last (toolbar->children);
+ for (child = g_list_last (toolbar->children);
+ child && old_size > new_size;
+ child = g_list_last (toolbar->children), old_size--)
+ {
+ GtkWidget *child_widget = ((GtkToolbarChild *) child->data)->widget;
+
+ if (glade_widget_get_from_gtk_widget (child_widget))
+ break;
- while (child && old_size > new_size) {
- GtkWidget *child_widget = ((GtkToolbarChild *) child->data)->widget;
- GladeWidget *glade_widget;
+ gtk_container_remove (GTK_CONTAINER (toolbar), child_widget);
+ }
+ g_print ("Toolbar (set) now size %d\n", toolbar->num_children);
+}
- glade_widget = glade_widget_get_from_gtk_widget (child_widget);
- if (glade_widget)
- glade_project_remove_widget
- (glade_widget->project, child_widget);
+gboolean GLADEGTK_API
+glade_gtk_toolbar_verify_size (GObject *object, GValue *value)
+{
+ GtkToolbar *toolbar = GTK_TOOLBAR (object);
+ gint new_size = g_value_get_int (value);
+ gint old_size = toolbar->num_children;
+ GList *child;
- gtk_container_remove (GTK_CONTAINER (toolbar), child_widget);
+ g_print ("Toolbar (verify) old size: %d, new size %d\n", old_size, new_size);
- child = g_list_last (toolbar->children);
- old_size--;
- }
+ for (child = g_list_last (toolbar->children);
+ child && old_size > new_size;
+ child = g_list_previous (child), old_size--)
+ {
+ GtkWidget *child_widget = ((GtkToolbarChild *) child->data)->widget;
+
+ if (glade_widget_get_from_gtk_widget (child_widget))
+ return FALSE;
}
+ return TRUE;
}
/**
@@ -457,7 +542,8 @@ glade_gtk_notebook_set_n_pages (GObject *object, GValue *value)
{
GladeWidget *widget;
GtkNotebook *notebook;
- gint new_size;
+ GtkWidget *child_widget;
+ gint new_size, i;
gint old_size;
notebook = GTK_NOTEBOOK (object);
@@ -466,51 +552,62 @@ glade_gtk_notebook_set_n_pages (GObject *object, GValue *value)
widget = glade_widget_get_from_gtk_widget (GTK_WIDGET (notebook));
g_return_if_fail (widget != NULL);
- old_size = g_list_length (notebook->children);
new_size = g_value_get_int (value);
- if (new_size == old_size)
- return;
- if (new_size > old_size) {
- /* The notebook has grown. Add a page. */
- while (new_size > old_size) {
- GladePlaceholder *placeholder =
- GLADE_PLACEHOLDER (glade_placeholder_new ());
- gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
- GTK_WIDGET (placeholder),
- NULL);
- old_size++;
- }
- } else {/* new_size < old_size */
- /* The notebook has shrunk. Remove pages */
- GladeWidget *child_gwidget;
- GtkWidget *child_widget;
-
- /*
- * Thing to remember is that GtkNotebook starts the
- * page numbers from 0, not 1 (C-style). So we need to do
- * old_size-1, where we're referring to "nth" widget.
+ /* Ensure base size of notebook */
+ for (i = gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)); i < new_size; i++)
+ {
+ gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
+ glade_placeholder_new (),
+ NULL);
+ }
+
+ old_size = gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook));
+
+
+ /*
+ * Thing to remember is that GtkNotebook starts the
+ * page numbers from 0, not 1 (C-style). So we need to do
+ * old_size-1, where we're referring to "nth" widget.
+ */
+ while (old_size > new_size) {
+ /* Get the last widget. */
+ child_widget = gtk_notebook_get_nth_page (notebook, old_size-1);
+
+ /*
+ * If we got it, and its not a placeholder, remove it
+ * from project.
*/
- while (old_size > new_size) {
- /* Get the last widget. */
- child_widget = gtk_notebook_get_nth_page (notebook, old_size-1);
- child_gwidget = glade_widget_get_from_gtk_widget (child_widget);
-
- /*
- * If we got it, and its not a placeholder, remove it
- * from project.
- */
- if (child_gwidget)
- glade_project_remove_widget
- (child_gwidget->project, child_widget);
+ if (glade_widget_get_from_gtk_widget (child_widget))
+ break;
- gtk_notebook_remove_page (notebook, old_size-1);
- old_size--;
- }
+ gtk_notebook_remove_page (notebook, old_size-1);
+ old_size--;
}
}
+gboolean GLADEGTK_API
+glade_gtk_notebook_verify_n_pages (GObject *object, GValue *value)
+{
+ GtkNotebook *notebook = GTK_NOTEBOOK(object);
+ GtkWidget *child_widget;
+ gint old_size, new_size = g_value_get_int (value);
+
+ for (old_size = gtk_notebook_get_n_pages (notebook);
+ old_size > new_size; old_size--) {
+ /* Get the last widget. */
+ child_widget = gtk_notebook_get_nth_page (notebook, old_size-1);
+
+ /*
+ * If we got it, and its not a placeholder, remove it
+ * from project.
+ */
+ if (glade_widget_get_from_gtk_widget (child_widget))
+ return FALSE;
+ }
+ return TRUE;
+}
static gboolean
glade_gtk_table_has_child (GtkTable *table,
@@ -561,14 +658,14 @@ glade_gtk_table_set_n_common (GObject *object, GValue *value, gboolean for_rows)
{
GladeWidget *widget;
GtkTable *table;
- gint new_size;
- gint old_size;
+ guint new_size;
+ guint old_size;
gint i, j;
table = GTK_TABLE (object);
g_return_if_fail (GTK_IS_TABLE (table));
- new_size = g_value_get_int (value);
+ new_size = g_value_get_uint (value);
old_size = for_rows ? table->nrows : table->ncols;
if (new_size < 1)
@@ -668,6 +765,34 @@ glade_gtk_table_set_n_columns (GObject *object, GValue *value)
glade_gtk_table_set_n_common (object, value, FALSE);
}
+static gboolean
+glade_gtk_table_verify_n_common (GObject *object, GValue *value, gboolean for_rows)
+{
+ GtkTable *table = GTK_TABLE(object);
+ guint new_size = g_value_get_uint (value);
+
+ if (glade_gtk_table_widget_exceeds_bounds
+ (table,
+ for_rows ? new_size : table->nrows,
+ for_rows ? table->ncols : new_size))
+ /* Refuse to shrink if it means orphaning widgets */
+ return FALSE;
+
+ return TRUE;
+}
+
+gboolean GLADEGTK_API
+glade_gtk_table_verify_n_rows (GObject *object, GValue *value)
+{
+ return glade_gtk_table_verify_n_common (object, value, TRUE);
+}
+
+gboolean GLADEGTK_API
+glade_gtk_table_verify_n_columns (GObject *object, GValue *value)
+{
+ return glade_gtk_table_verify_n_common (object, value, FALSE);
+}
+
/**
* glade_gtk_button_set_stock:
* @object:
@@ -681,11 +806,10 @@ glade_gtk_button_set_stock (GObject *object, GValue *value)
GladeWidget *glade_widget;
GtkWidget *button;
GtkStockItem item;
- GladeChoice *choice = NULL;
GladeProperty *property;
GladeProperty *text;
- GList *list;
- gint val;
+ GEnumClass *eclass;
+ gint val, i;
val = g_value_get_enum (value);
@@ -696,23 +820,24 @@ glade_gtk_button_set_stock (GObject *object, GValue *value)
property = glade_widget_get_property (glade_widget, "stock");
text = glade_widget_get_property (glade_widget, "label");
+
+ eclass = g_type_class_ref (property->class->pspec->value_type);
g_return_if_fail (property != NULL);
g_return_if_fail (text != NULL);
- list = property->class->choices;
- for (; list; list = list->next)
+ for (i = 0; i < eclass->n_values; i++)
{
- choice = list->data;
- if (val == choice->value)
+ if (val == eclass->values[i].value)
break;
}
- g_return_if_fail (list != NULL);
+
+ g_return_if_fail (i < eclass->n_values);
if (GTK_BIN (button)->child)
gtk_container_remove (GTK_CONTAINER (button),
GTK_BIN (button)->child);
- if (!gtk_stock_lookup (choice->id, &item))
+ if (!gtk_stock_lookup (eclass->values[i].value_nick, &item))
{
GtkWidget *label;
@@ -728,7 +853,7 @@ glade_gtk_button_set_stock (GObject *object, GValue *value)
hbox = gtk_hbox_new (FALSE, 1);
label = gtk_label_new_with_mnemonic (item.label);
- image = gtk_image_new_from_stock (choice->id,
+ image = gtk_image_new_from_stock (eclass->values[i].value_nick,
GTK_ICON_SIZE_BUTTON);
gtk_label_set_mnemonic_widget (GTK_LABEL (label),
@@ -740,6 +865,8 @@ glade_gtk_button_set_stock (GObject *object, GValue *value)
gtk_widget_show_all (button);
}
+
+ g_type_class_unref (eclass);
}
/**