summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Van Berkom <tvb@cvs.gnome.org>2005-01-02 22:34:15 +0000
committerTristan Van Berkom <tvb@src.gnome.org>2005-01-02 22:34:15 +0000
commit00bf8f095d217c3f0c2a2e5736c5d2df04c0ba6d (patch)
tree0c2b6d86167d5e1a793cdcb7e976899ed0f7f815
parentf37299652f239c670af2ee31f392a9010ecfcddc (diff)
downloadglade-00bf8f095d217c3f0c2a2e5736c5d2df04c0ba6d.tar.gz
g_list_prepend in loops and glade_project_window_get_active_project to get
2005-01-01 Tristan Van Berkom <tvb@cvs.gnome.org> * src/glade-command.c: g_list_prepend in loops and glade_project_window_get_active_project to get the active project. * src/glade-placeholder.c: Fixed selection in placeholders and now create previously selected widget class objects with SHIFT->leftclick. * src/glade-popup.c: glade_project_window_get_active_project to get the active project, fixed paste in clipboard. * src/glade-project-window.[ch]: Fixed bug 162102, (no error messages when save fails) mostly in the patch to libglade sitting on bug 161903 which now offers fine grained error detection on save. Also implemented alt_class which is available to create widgets with SHIFT->leftclick. * src/glade-project.[ch]: Adaptation to upgraded glade-utils selection scheme plus some modifications pertaining to bug 162102. * src/glade-utils.[ch]: Upgraded selection scheme, fixed some bugs in the "cut/copy/paste/delete"-"selection/clipboard" helpers. * src/glade-palette.[ch]: Implemented "catalog-changed" signal so that glade-project-window can refresh add_class/alt_class when the currently selected catalog changes. * src/glade-gtk.c: Implemented alt_class and fixed brokenness that had went unnoticed (segfaults on child properties). * src/glade-project-view.[ch]: Fixed sorting for toplevels.
-rw-r--r--ChangeLog31
-rw-r--r--src/glade-command.c35
-rw-r--r--src/glade-command.h50
-rw-r--r--src/glade-gtk.c58
-rw-r--r--src/glade-palette.c20
-rw-r--r--src/glade-palette.h3
-rw-r--r--src/glade-placeholder.c24
-rw-r--r--src/glade-popup.c69
-rw-r--r--src/glade-project-view.c51
-rw-r--r--src/glade-project-window.c81
-rw-r--r--src/glade-project-window.h8
-rw-r--r--src/glade-project.c48
-rw-r--r--src/glade-project.h4
-rw-r--r--src/glade-utils.c154
-rw-r--r--src/glade-utils.h9
-rw-r--r--src/glade-widget.c1
16 files changed, 391 insertions, 255 deletions
diff --git a/ChangeLog b/ChangeLog
index dd076cca..07ceceb6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,34 @@
+2005-01-01 Tristan Van Berkom <tvb@cvs.gnome.org>
+
+ * src/glade-command.c: g_list_prepend in loops and
+ glade_project_window_get_active_project to get the active project.
+
+ * src/glade-placeholder.c: Fixed selection in placeholders and now create
+ previously selected widget class objects with SHIFT->leftclick.
+
+ * src/glade-popup.c: glade_project_window_get_active_project to get the
+ active project, fixed paste in clipboard.
+
+ * src/glade-project-window.[ch]: Fixed bug 162102, (no error messages
+ when save fails) mostly in the patch to libglade sitting on bug 161903
+ which now offers fine grained error detection on save. Also implemented
+ alt_class which is available to create widgets with SHIFT->leftclick.
+
+ * src/glade-project.[ch]: Adaptation to upgraded glade-utils selection
+ scheme plus some modifications pertaining to bug 162102.
+
+ * src/glade-utils.[ch]: Upgraded selection scheme, fixed some bugs in the
+ "cut/copy/paste/delete"-"selection/clipboard" helpers.
+
+ * src/glade-palette.[ch]: Implemented "catalog-changed" signal so that
+ glade-project-window can refresh add_class/alt_class when the currently
+ selected catalog changes.
+
+ * src/glade-gtk.c: Implemented alt_class and fixed brokenness that had went
+ unnoticed (segfaults on child properties).
+
+ * src/glade-project-view.[ch]: Fixed sorting for toplevels.
+
2004-12-31 Tristan Van Berkom <tvb@cvs.gnome.org>
* src/glade-project-view.c: Now treestore items are inserted sorted
diff --git a/src/glade-command.c b/src/glade-command.c
index 1c664990..2b3ee81e 100644
--- a/src/glade-command.c
+++ b/src/glade-command.c
@@ -750,7 +750,7 @@ glade_command_delete (GList *widgets)
g_object_ref (G_OBJECT (cdata->placeholder));
gtk_object_sink (GTK_OBJECT (cdata->placeholder));
}
- me->widgets = g_list_append (me->widgets, cdata);
+ me->widgets = g_list_prepend (me->widgets, cdata);
}
if (g_list_length (widgets) == 1)
@@ -775,8 +775,10 @@ glade_command_delete (GList *widgets)
*
* Creates a new widget of @class and put in place of the @placeholder
* in the @project
+ *
+ * Returns the newly created widget.
*/
-void
+GladeWidget *
glade_command_create (GladeWidgetClass *class,
GladeWidget *parent,
GladePlaceholder *placeholder,
@@ -784,11 +786,12 @@ glade_command_create (GladeWidgetClass *class,
{
GladeCommandCreateDelete *me;
CommandData *cdata;
+ GladeWidget *widget;
- g_return_if_fail (class != NULL);
- g_return_if_fail (GLADE_IS_PROJECT (project));
+ g_return_val_if_fail (class != NULL, NULL);
+ g_return_val_if_fail (GLADE_IS_PROJECT (project), NULL);
if (g_type_is_a (class->type, GTK_TYPE_WINDOW) == FALSE)
- g_return_if_fail (GLADE_IS_WIDGET (parent));
+ g_return_val_if_fail (GLADE_IS_WIDGET (parent), NULL);
me = g_object_new (GLADE_COMMAND_CREATE_DELETE_TYPE, NULL);
me->create = TRUE;
@@ -802,11 +805,12 @@ glade_command_create (GladeWidgetClass *class,
/* widget may be null, e.g. the user clicked cancel on a query */
- if ((cdata->widget = glade_widget_new (parent, class, project)) == NULL)
+ if ((widget = glade_widget_new (parent, class, project)) == NULL)
{
g_object_unref (G_OBJECT (me));
- return;
+ return NULL;
}
+ cdata->widget = widget;
GLADE_COMMAND (me)->description =
g_strdup_printf (_("Create %s"),
@@ -816,6 +820,8 @@ glade_command_create (GladeWidgetClass *class,
glade_command_push_undo (project, GLADE_COMMAND (me));
else
g_object_unref (G_OBJECT (me));
+
+ return widget;
}
typedef enum {
@@ -955,7 +961,7 @@ glade_command_copy_execute (GladeCommandCutCopyPaste *me)
GList *list, *add = NULL;
for (list = me->widgets; list && list->data; list = list->next)
- g_list_prepend (add, ((CommandData *)list->data)->widget);
+ add = g_list_prepend (add, ((CommandData *)list->data)->widget);
if (add)
{
@@ -972,7 +978,7 @@ glade_command_copy_undo (GladeCommandCutCopyPaste *me)
GList *list, *remove = NULL;
for (list = me->widgets; list && list->data; list = list->next)
- g_list_prepend (remove, ((CommandData *)list->data)->widget);
+ remove = g_list_prepend (remove, ((CommandData *)list->data)->widget);
if (remove)
{
@@ -1072,11 +1078,10 @@ glade_command_cut_copy_paste_common (GList *widgets,
GladeCommandCutCopyPaste *me;
CommandData *cdata;
GladeWidget *widget;
- GladeProject *project;
GList *list;
gchar *fmt;
- g_return_if_fail (widgets != NULL);
+ g_return_if_fail (widgets && widgets->data);
/* Some prelimenary error checking here */
switch (type) {
@@ -1127,8 +1132,6 @@ glade_command_cut_copy_paste_common (GList *widgets,
}
/* And now we feel safe enough to go on and create */
- widget = widgets->data;
- project = widget->project;
me = (GladeCommandCutCopyPaste *)
g_object_new (GLADE_COMMAND_CUT_COPY_PASTE_TYPE, NULL);
me->type = type;
@@ -1173,14 +1176,16 @@ glade_command_cut_copy_paste_common (GList *widgets,
else if (placeholder != NULL)
cdata->placeholder = g_object_ref (placeholder);
- me->widgets = g_list_append (me->widgets, cdata);
+ me->widgets = g_list_prepend (me->widgets, cdata);
}
/*
* Push it onto the undo stack only on success
*/
if (glade_command_cut_copy_paste_execute (GLADE_COMMAND (me)))
- glade_command_push_undo (project, GLADE_COMMAND (me));
+ glade_command_push_undo
+ (glade_project_window_get_active_project (gpw),
+ GLADE_COMMAND (me));
else
g_object_unref (G_OBJECT (me));
}
diff --git a/src/glade-command.h b/src/glade-command.h
index f491c25e..8e46fbca 100644
--- a/src/glade-command.h
+++ b/src/glade-command.h
@@ -39,31 +39,31 @@ struct _GladeCommandClass
};
-GType glade_command_get_type (void);
-
-void glade_command_undo (GladeProject *project);
-void glade_command_redo (GladeProject *project);
-
-void glade_command_set_property (GladeProperty *property, const GValue *value);
-void glade_command_set_name (GladeWidget *glade_widget, const gchar *name);
-
-void glade_command_delete (GList *widgets);
-void glade_command_create (GladeWidgetClass *widget_class,
- GladeWidget *parent,
- GladePlaceholder *placeholder,
- GladeProject *project);
-
-void glade_command_cut (GList *widgets);
-void glade_command_copy (GList *widgets);
-void glade_command_paste (GList *widgets,
- GladeWidget *parent,
- GladePlaceholder *placeholder);
-
-void glade_command_add_signal (GladeWidget *glade_widget, const GladeSignal *signal);
-void glade_command_remove_signal (GladeWidget *glade_widget, const GladeSignal *signal);
-void glade_command_change_signal (GladeWidget *glade_widget,
- const GladeSignal *old,
- const GladeSignal *new);
+GType glade_command_get_type (void);
+
+void glade_command_undo (GladeProject *project);
+void glade_command_redo (GladeProject *project);
+
+void glade_command_set_property (GladeProperty *property, const GValue *value);
+void glade_command_set_name (GladeWidget *glade_widget, const gchar *name);
+
+void glade_command_delete (GList *widgets);
+GladeWidget *glade_command_create (GladeWidgetClass *widget_class,
+ GladeWidget *parent,
+ GladePlaceholder *placeholder,
+ GladeProject *project);
+
+void glade_command_cut (GList *widgets);
+void glade_command_copy (GList *widgets);
+void glade_command_paste (GList *widgets,
+ GladeWidget *parent,
+ GladePlaceholder *placeholder);
+
+void glade_command_add_signal (GladeWidget *glade_widget, const GladeSignal *signal);
+void glade_command_remove_signal (GladeWidget *glade_widget, const GladeSignal *signal);
+void glade_command_change_signal (GladeWidget *glade_widget,
+ const GladeSignal *old,
+ const GladeSignal *new);
G_END_DECLS
diff --git a/src/glade-gtk.c b/src/glade-gtk.c
index 12e3de6a..f6b15a1f 100644
--- a/src/glade-gtk.c
+++ b/src/glade-gtk.c
@@ -1041,57 +1041,57 @@ glade_gtk_fixed_button_press (GtkWidget *widget,
gpointer user_data)
{
GladeProjectWindow *gpw;
+ GladeWidget *gwidget;
+ GladeWidget *fixed_gwidget;
+ GladeProperty *property;
+ GValue value = { 0, };
if (event->button == 1 && event->type == GDK_BUTTON_PRESS)
{
- gpw = glade_project_window_get ();
- if (gpw->add_class != NULL)
- {
- GtkWidget *new_widget;
- GladeWidget *new_gwidget;
- GladeWidget *fixed_gwidget;
- GladeProperty *property;
- GList *selection;
- GValue value = { 0, };
-
- fixed_gwidget = glade_widget_get_from_gobject (widget);
-
- glade_command_create (gpw->add_class, fixed_gwidget, NULL, NULL);
+ gpw = glade_project_window_get ();
+ fixed_gwidget = glade_widget_get_from_gobject (widget);
- selection = glade_project_selection_get
- (glade_project_window_get_active_project(gpw));
+ /* If there is a class to add and we successfully
+ * create a widget.
+ */
+ if (((gpw->add_class != NULL) ||
+ ((event->state & GDK_SHIFT_MASK) &&
+ gpw->alt_class != NULL)) &&
+ ((gwidget = glade_command_create
+ (gpw->add_class ? gpw->add_class : gpw->alt_class,
+ fixed_gwidget, NULL, fixed_gwidget->project)) != NULL))
+ {
+ /* reset the palette */
+ glade_palette_unselect_widget (gpw->palette);
- new_widget = GTK_WIDGET(selection->data);
- new_gwidget = glade_widget_get_from_gobject(new_widget);
-
g_value_init (&value, G_TYPE_INT);
-
- property = glade_widget_get_property (new_gwidget, "x");
+
+ property = glade_widget_get_property (gwidget, "x");
property->enabled = TRUE;
g_value_set_int (&value, event->x);
glade_property_set (property, &value);
-
- property = glade_widget_get_property (new_gwidget, "y");
+
+ property = glade_widget_get_property (gwidget, "y");
property->enabled = TRUE;
g_value_set_int (&value, event->y);
glade_property_set (property, &value);
- property = glade_widget_get_property (new_gwidget, "width-request");
+ property = glade_widget_get_property
+ (gwidget, "width-request");
property->enabled = TRUE;
g_value_set_int (&value, FIXED_DEFAULT_CHILD_WIDTH);
glade_property_set (property, &value);
-
- property = glade_widget_get_property (new_gwidget, "height-request");
+
+ property = glade_widget_get_property
+ (gwidget, "height-request");
property->enabled = TRUE;
g_value_set_int (&value, FIXED_DEFAULT_CHILD_HEIGHT);
glade_property_set (property, &value);
-
+
/* We need to resync the editor so that width-request/height-request
* are actualy enabled in the editor
*/
- glade_editor_load_widget (gpw->editor, NULL);
- glade_editor_load_widget (gpw->editor, new_gwidget);
-
+ glade_editor_refresh (gpw->editor);
}
return TRUE;
}
diff --git a/src/glade-palette.c b/src/glade-palette.c
index 27918114..3942765c 100644
--- a/src/glade-palette.c
+++ b/src/glade-palette.c
@@ -36,6 +36,7 @@
enum
{
TOGGLED,
+ CATALOG_CHANGED,
LAST_SIGNAL
};
@@ -54,6 +55,10 @@ glade_palette_class_init (GladePaletteClass *class)
parent_class = g_type_class_peek_parent (class);
+
+ class->toggled = NULL;
+ class->catalog_change = NULL;
+
glade_palette_signals[TOGGLED] =
g_signal_new ("toggled",
G_TYPE_FROM_CLASS (object_class),
@@ -63,6 +68,18 @@ glade_palette_class_init (GladePaletteClass *class)
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE,
0);
+
+ glade_palette_signals[CATALOG_CHANGED] =
+ g_signal_new ("catalog-changed",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GladePaletteClass, catalog_change),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+
}
static void
@@ -108,6 +125,9 @@ glade_palette_on_catalog_selector_changed (GtkWidget *combo_box,
/* Select that catalog in the notebook. */
gtk_notebook_set_current_page (GTK_NOTEBOOK (palette->notebook), page);
+
+ g_signal_emit (G_OBJECT (palette), glade_palette_signals[CATALOG_CHANGED], 0);
+
}
static GtkWidget *
diff --git a/src/glade-palette.h b/src/glade-palette.h
index 1bc92e94..d85a3585 100644
--- a/src/glade-palette.h
+++ b/src/glade-palette.h
@@ -64,7 +64,8 @@ struct _GladePaletteClass
{
GtkVBoxClass parent_class;
- void (*toggled) (GladePalette *palette);
+ void (*toggled) (GladePalette *palette);
+ void (*catalog_change) (GladePalette *palette);
};
GType glade_palette_get_type (void);
diff --git a/src/glade-placeholder.c b/src/glade-placeholder.c
index cf45052a..64a64a75 100644
--- a/src/glade-placeholder.c
+++ b/src/glade-placeholder.c
@@ -311,21 +311,35 @@ glade_placeholder_button_press (GtkWidget *widget, GdkEventButton *event)
if (event->button == 1 && event->type == GDK_BUTTON_PRESS)
{
- if (gpw->add_class != NULL)
+ if (event->state & GDK_CONTROL_MASK)
+ {
+ if (glade_util_has_selection (widget))
+ glade_util_remove_selection (widget);
+ else
+ glade_util_add_selection (widget);
+ }
+ else if ((gpw->add_class != NULL) ||
+ ((event->state & GDK_SHIFT_MASK) &&
+ gpw->alt_class != NULL))
{
/* A widget type is selected in the palette.
* Add a new widget of that type.
*/
- glade_command_create (gpw->add_class,
- glade_placeholder_get_parent (placeholder),
- placeholder, project);
+ glade_command_create
+ (gpw->add_class ? gpw->add_class : gpw->alt_class,
+ glade_placeholder_get_parent (placeholder),
+ placeholder, project);
/* reset the palette */
glade_palette_unselect_widget (gpw->palette);
}
else
{
- glade_project_selection_set (project, G_OBJECT (placeholder), TRUE);
+ glade_project_selection_clear
+ (glade_project_window_get_active_project
+ (gpw), TRUE);
+ glade_util_clear_selection ();
+ glade_util_add_selection (widget);
}
}
else if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
diff --git a/src/glade-popup.c b/src/glade-popup.c
index d9602b82..b2a89e53 100644
--- a/src/glade-popup.c
+++ b/src/glade-popup.c
@@ -33,23 +33,21 @@
static void
glade_popup_select_cb (GtkMenuItem *item, GladeWidget *widget)
{
- if (widget)
- glade_project_selection_set
- (widget->project, glade_widget_get_object (widget), TRUE);
+ glade_project_selection_set
+ (widget->project, glade_widget_get_object (widget), TRUE);
}
static void
glade_popup_cut_cb (GtkMenuItem *item, GladeWidget *widget)
{
- GladeProjectWindow *gpw = glade_project_window_get ();
- GList *list;
-
- list = glade_project_selection_get (gpw->active_project);
+ GladeProjectWindow *gpw = glade_project_window_get ();
+ GladeProject *project = glade_project_window_get_active_project (gpw);
/* Assign selection first */
- if (g_list_find (list, glade_widget_get_object (widget)) == NULL)
- glade_project_selection_set (gpw->active_project,
- glade_widget_get_object (widget), FALSE);
+ if (glade_project_is_selected
+ (project, glade_widget_get_object (widget)) == FALSE)
+ glade_project_selection_set
+ (project, glade_widget_get_object (widget), FALSE);
glade_util_cut_selection ();
}
@@ -57,15 +55,14 @@ glade_popup_cut_cb (GtkMenuItem *item, GladeWidget *widget)
static void
glade_popup_copy_cb (GtkMenuItem *item, GladeWidget *widget)
{
- GladeProjectWindow *gpw = glade_project_window_get ();
- GList *list;
-
- list = glade_project_selection_get (gpw->active_project);
+ GladeProjectWindow *gpw = glade_project_window_get ();
+ GladeProject *project = glade_project_window_get_active_project (gpw);
/* Assign selection first */
- if (g_list_find (list, glade_widget_get_object (widget)) == NULL)
- glade_project_selection_set (gpw->active_project,
- glade_widget_get_object (widget), FALSE);
+ if (glade_project_is_selected
+ (project, glade_widget_get_object (widget)) == FALSE)
+ glade_project_selection_set
+ (project, glade_widget_get_object (widget), FALSE);
glade_util_copy_selection ();
}
@@ -73,46 +70,42 @@ glade_popup_copy_cb (GtkMenuItem *item, GladeWidget *widget)
static void
glade_popup_paste_cb (GtkMenuItem *item, GladeWidget *widget)
{
- GladeProjectWindow *gpw;
-
- gpw = glade_project_window_get ();
+ GladeProjectWindow *gpw = glade_project_window_get ();
+ GladeProject *project = glade_project_window_get_active_project (gpw);
/* The selected widget is the paste destination
*/
- glade_project_selection_set (gpw->active_project,
- glade_widget_get_object (widget), FALSE);
- glade_util_paste_clipboard ();
+ glade_project_selection_set
+ (project, glade_widget_get_object (widget), FALSE);
+
+ glade_util_paste_clipboard (NULL);
}
static void
glade_popup_delete_cb (GtkMenuItem *item, GladeWidget *widget)
{
- GladeProjectWindow *gpw;
- GList *list;
-
- gpw = glade_project_window_get ();
-
- list = glade_project_selection_get (gpw->active_project);
+ GladeProjectWindow *gpw = glade_project_window_get ();
+ GladeProject *project = glade_project_window_get_active_project (gpw);
/* Assign selection first */
- if (g_list_find (list, glade_widget_get_object (widget)) == NULL)
- glade_project_selection_set (gpw->active_project,
- glade_widget_get_object (widget), FALSE);
+ if (glade_project_is_selected
+ (project, glade_widget_get_object (widget)) == FALSE)
+ glade_project_selection_set
+ (project, glade_widget_get_object (widget), FALSE);
glade_util_delete_selection ();
}
static void
-glade_popup_placeholder_paste_cb (GtkMenuItem *item,
+glade_popup_placeholder_paste_cb (GtkMenuItem *item,
GladePlaceholder *placeholder)
{
- GladeProjectWindow *gpw;
+ GladeProjectWindow *gpw = glade_project_window_get ();
+ GladeProject *project = glade_project_window_get_active_project (gpw);
- gpw = glade_project_window_get ();
- glade_project_selection_set (gpw->active_project,
- G_OBJECT (placeholder), FALSE);
+ glade_project_selection_clear (project, FALSE);
- glade_util_paste_clipboard ();
+ glade_util_paste_clipboard (placeholder);
}
static void
diff --git a/src/glade-project-view.c b/src/glade-project-view.c
index cb6d64a1..5d008cde 100644
--- a/src/glade-project-view.c
+++ b/src/glade-project-view.c
@@ -205,32 +205,39 @@ gpv_find_preceeding_sibling (GtkTreeModel *model,
GtkTreeIter *retval = NULL, next;
GladeWidget *w, *sibling = NULL;
- if (gtk_tree_model_iter_has_child (model, parent_iter))
+ g_return_val_if_fail (GTK_IS_TREE_MODEL (model), NULL);
+
+ if (!parent_iter)
+ gtk_tree_model_get_iter_first (model, &next);
+ else
{
+ g_return_val_if_fail
+ (gtk_tree_model_iter_has_child (model,
+ parent_iter), NULL);
gtk_tree_model_iter_children (model, &next, parent_iter);
- while (42)
- {
- gtk_tree_model_get (model, &next,
- WIDGET_COLUMN, &w, -1);
+ }
- /* If this sibling (w) is less than widget and
- * the last found sibling is less then this one
- */
- if ((strcmp (glade_widget_get_name (w),
- glade_widget_get_name (widget)) < 0) &&
- (sibling == NULL ||
- strcmp (glade_widget_get_name (sibling),
- glade_widget_get_name (w)) < 0))
- {
- sibling = widget;
- if (retval)
- gtk_tree_iter_free (retval);
- retval = gtk_tree_iter_copy (&next);
- }
-
- if (!gtk_tree_model_iter_next (model, &next))
- break;
+ while (42)
+ {
+ gtk_tree_model_get (model, &next, WIDGET_COLUMN, &w, -1);
+
+ /* If this sibling (w) is less than widget and
+ * the last found sibling is less then this one
+ */
+ if ((strcmp (glade_widget_get_name (w),
+ glade_widget_get_name (widget)) < 0) &&
+ (sibling == NULL ||
+ strcmp (glade_widget_get_name (sibling),
+ glade_widget_get_name (w)) < 0))
+ {
+ sibling = widget;
+ if (retval)
+ gtk_tree_iter_free (retval);
+ retval = gtk_tree_iter_copy (&next);
}
+
+ if (!gtk_tree_model_iter_next (model, &next))
+ break;
}
return retval;
}
diff --git a/src/glade-project-window.c b/src/glade-project-window.c
index 2afa0001..d6ddc906 100644
--- a/src/glade-project-window.c
+++ b/src/glade-project-window.c
@@ -154,16 +154,15 @@ gpw_open_cb (void)
static void
gpw_save (GladeProject *project, const gchar *path)
{
- GladeProjectWindow *gpw;
+ GladeProjectWindow *gpw = glade_project_window_get ();
+ GError *error = NULL;
gpw = glade_project_window_get ();
- if (!glade_project_save (project, path))
+ if (!glade_project_save (project, path, &error))
{
- GladeProjectWindow *gpw;
-
- gpw = glade_project_window_get ();
- glade_util_ui_warn (gpw->window, _("Invalid file name"));
+ glade_util_ui_warn (gpw->window, error->message);
+ g_error_free (error);
return;
}
@@ -177,28 +176,29 @@ gpw_save (GladeProject *project, const gchar *path)
static void
gpw_save_cb (void)
{
- GladeProjectWindow *gpw;
- GladeProject *project;
- GtkWidget *filechooser;
- const gchar *path = NULL;
+ GladeProjectWindow *gpw = glade_project_window_get ();
+ GladeProject *project;
+ GtkWidget *filechooser;
+ const gchar *path = NULL;
+ GError *error = NULL;
- gpw = glade_project_window_get ();
project = gpw->active_project;
- if (project->path != NULL) {
- if (glade_project_save (project, project->path)) {
- glade_util_flash_message (gpw->statusbar,
- gpw->statusbar_actions_context_id,
- _("Project '%s' saved"),
- project->name);
- } else {
- GladeProjectWindow *gpw;
-
- gpw = glade_project_window_get ();
- glade_util_ui_warn (gpw->window,
- _("Invalid file name"));
+ if (project->path != NULL)
+ {
+ if (glade_project_save (project, project->path, &error))
+ {
+ glade_util_flash_message
+ (gpw->statusbar,
+ gpw->statusbar_actions_context_id,
+ _("Project '%s' saved"),
+ project->name);
+ }
+ else
+ {
+ glade_util_ui_warn (gpw->window, error->message);
+ g_error_free (error);
}
-
return;
}
@@ -251,6 +251,7 @@ gpw_confirm_close_project (GladeProject *project)
gboolean close = FALSE;
char *msg;
gint ret;
+ GError *error = NULL;
g_return_val_if_fail (GLADE_IS_PROJECT (project), FALSE);
@@ -284,7 +285,12 @@ gpw_confirm_close_project (GladeProject *project)
*/
if (project->path != NULL)
{
- close = glade_project_save (project, project->path);
+ if ((close = glade_project_save
+ (project, project->path, &error)) == FALSE)
+ {
+ glade_util_ui_warn (gpw->window, error->message);
+ g_error_free (error);
+ }
}
else
{
@@ -433,7 +439,7 @@ gpw_cut_cb (void)
static void
gpw_paste_cb (void)
{
- glade_util_paste_clipboard ();
+ glade_util_paste_clipboard (NULL);
}
static void
@@ -511,13 +517,24 @@ gpw_palette_button_clicked (GladePalette *palette, gpointer not_used)
glade_palette_unselect_widget (gpw->palette);
gpw->add_class = NULL;
}
- else
- {
- gpw->add_class = class;
- }
+ else if ((gpw->add_class = class) != NULL)
+ gpw->alt_class = class;
+
}
static void
+gpw_palette_catalog_changed (GladePalette *palette, gpointer not_used)
+{
+ GladeProjectWindow *gpw = glade_project_window_get ();
+
+ g_return_if_fail (GLADE_IS_PALETTE (palette));
+
+ glade_palette_unselect_widget (gpw->palette);
+ gpw->alt_class = gpw->add_class = NULL;
+}
+
+
+static void
gpw_create_palette (GladeProjectWindow *gpw)
{
GtkWidget *palette_item;
@@ -543,6 +560,9 @@ gpw_create_palette (GladeProjectWindow *gpw)
g_signal_connect (G_OBJECT (gpw->palette), "toggled",
G_CALLBACK (gpw_palette_button_clicked), NULL);
+ g_signal_connect (G_OBJECT (gpw->palette), "catalog-changed",
+ G_CALLBACK (gpw_palette_catalog_changed), NULL);
+
palette_item = gtk_item_factory_get_item (gpw->item_factory,
"<main>/View/Palette");
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (palette_item), TRUE);
@@ -1247,6 +1267,7 @@ glade_project_window_new (GList *catalogs)
gpw = g_new0 (GladeProjectWindow, 1);
gpw->catalogs = catalogs;
gpw->add_class = NULL;
+ gpw->alt_class = NULL;
glade_project_window = gpw;
diff --git a/src/glade-project-window.h b/src/glade-project-window.h
index 6b51f470..0a5c5c8c 100644
--- a/src/glade-project-window.h
+++ b/src/glade-project-window.h
@@ -37,6 +37,7 @@ struct _GladeProjectWindow
GList *catalogs; /* See glade-catalog */
GtkWidget *toolbar_undo; /* undo item on the toolbar */
GtkWidget *toolbar_redo; /* redo item on the toolbar */
+
GladeWidgetClass *add_class; /* The GladeWidgetClass that we are about
* to add to a container. NULL if no
* class is to be added. This also has to
@@ -44,6 +45,13 @@ struct _GladeProjectWindow
* in the GladePalette
*/
+ GladeWidgetClass *alt_class; /* The alternate class is always the same as
+ * add_class except when add_class is NULL. (This is
+ * so that the user can enter many of the same widget
+ * without having to reselect widgets in the palette).
+ */
+
+
GList *views; /* A list of GladeProjectView item */
GList *projects; /* The list of Projects */
};
diff --git a/src/glade-project.c b/src/glade-project.c
index c20e4c3a..a621be22 100644
--- a/src/glade-project.c
+++ b/src/glade-project.c
@@ -291,28 +291,21 @@ glade_project_add_object (GladeProject *project, GObject *object)
if (GLADE_IS_PLACEHOLDER (object))
return;
+ /* Only widgets accounted for in the catalog or widgets declared
+ * in the plugin with glade_widget_new_for_internal_child () are
+ * usefull in the project.
+ */
if ((gwidget = glade_widget_get_from_gobject (object)) == NULL)
return;
- if ((children = glade_widget_class_container_get_children (gwidget->widget_class,
- gwidget->object)) != NULL)
+ if ((children = glade_widget_class_container_get_children
+ (gwidget->widget_class, gwidget->object)) != NULL)
{
for (list = children; list && list->data; list = list->next)
glade_project_add_object (project, G_OBJECT (list->data));
g_list_free (children);
}
- /* The internal widgets (e.g. the label of a GtkButton) are handled
- * by gtk and don't have an associated GladeWidget: we don't want to
- * add these to our list. It would be nicer to have a flag to check
- * (as we do for placeholders) instead of checking for the associated
- * GladeWidget, so that we can assert that if a widget is _not_ internal,
- * it _must_ have a corresponding GladeWidget... Anyway this suffice
- * for now.
- */
- if (!gwidget)
- return;
-
glade_widget_set_project (gwidget, project);
g_hash_table_insert (project->widget_old_names,
gwidget, g_strdup (glade_widget_get_name (gwidget)));
@@ -553,19 +546,11 @@ glade_project_is_selected (GladeProject *project,
void
glade_project_selection_clear (GladeProject *project, gboolean emit_signal)
{
- GObject *object;
- GList *list;
-
g_return_if_fail (GLADE_IS_PROJECT (project));
-
if (project->selection == NULL)
return;
- for (list = project->selection; list; list = list->next)
- {
- object = list->data;
- glade_util_remove_selection (object);
- }
+ glade_util_clear_selection ();
g_list_free (project->selection);
project->selection = NULL;
@@ -594,7 +579,8 @@ glade_project_selection_remove (GladeProject *project,
if (glade_project_is_selected (project, object))
{
- glade_util_remove_selection (object);
+ if (GTK_IS_WIDGET (object))
+ glade_util_remove_selection (GTK_WIDGET (object));
project->selection = g_list_remove (project->selection, object);
if (emit_signal)
glade_project_selection_changed (project);
@@ -618,10 +604,12 @@ glade_project_selection_add (GladeProject *project,
{
g_return_if_fail (GLADE_IS_PROJECT (project));
g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (g_list_find (project->objects, object) != NULL);
if (glade_project_is_selected (project, object) == FALSE)
{
- glade_util_add_selection (object);
+ if (GTK_IS_WIDGET (object))
+ glade_util_add_selection (GTK_WIDGET (object));
project->selection = g_list_prepend (project->selection, object);
if (emit_signal)
glade_project_selection_changed (project);
@@ -645,6 +633,7 @@ glade_project_selection_set (GladeProject *project,
{
g_return_if_fail (GLADE_IS_PROJECT (project));
g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (g_list_find (project->objects, object) != NULL);
if (glade_project_is_selected (project, object) == FALSE ||
g_list_length (project->selection) != 1)
@@ -791,16 +780,18 @@ glade_project_open (const gchar *path)
/**
* glade_project_save:
* @project: a #GladeProject
- * @path:
+ * @path: location to save glade file
+ * @error: an error from the G_FILE_ERROR domain.
*
* Saves @project to the given path.
*
* Returns: %TRUE on success, %FALSE on failure
*/
gboolean
-glade_project_save (GladeProject *project, const gchar *path)
+glade_project_save (GladeProject *project, const gchar *path, GError **error)
{
GladeInterface *interface;
+ gboolean ret;
interface = glade_project_write (project);
if (!interface)
@@ -808,7 +799,8 @@ glade_project_save (GladeProject *project, const gchar *path)
g_warning ("Could not write glade document\n");
return FALSE;
}
- glade_interface_dump (interface, path);
+
+ ret = glade_interface_dump_full (interface, path, error);
glade_interface_destroy (interface);
if (path != project->path)
@@ -821,7 +813,7 @@ glade_project_save (GladeProject *project, const gchar *path)
project->changed = FALSE;
- return TRUE;
+ return ret;
}
/**
diff --git a/src/glade-project.h b/src/glade-project.h
index b2d33534..8dbc01f7 100644
--- a/src/glade-project.h
+++ b/src/glade-project.h
@@ -68,7 +68,9 @@ GType glade_project_get_type (void);
GladeProject *glade_project_new (gboolean untitled);
GladeProject *glade_project_open (const gchar *path);
-gboolean glade_project_save (GladeProject *project, const gchar *path);
+gboolean glade_project_save (GladeProject *project,
+ const gchar *path,
+ GError **error);
void glade_project_add_object (GladeProject *project, GObject *object);
void glade_project_remove_object (GladeProject *project, GObject *object);
GladeWidget *glade_project_get_widget_by_name (GladeProject *project, const char *name);
diff --git a/src/glade-utils.c b/src/glade-utils.c
index feb992ee..05d8a547 100644
--- a/src/glade-utils.c
+++ b/src/glade-utils.c
@@ -37,9 +37,13 @@
#include "glade-property-class.h"
#include "glade-clipboard.h"
-#define GLADE_UTIL_HAS_NODES "glade_util_has_nodes"
#define GLADE_UTIL_SELECTION_NODE_SIZE 7
+/* List of widgets that have selection
+ */
+static GList *glade_util_selection = NULL;
+
+
/**
* glade_util_widget_set_tooltip:
* @widget: a #GtkWidget
@@ -687,20 +691,17 @@ glade_util_draw_nodes_idle (GdkWindow *expose_win)
GtkWidget *expose_widget;
gint expose_win_x, expose_win_y;
gint expose_win_w, expose_win_h;
- GladeWidget *expose_gwidget;
GdkWindow *expose_toplevel;
GdkGC *gc;
GList *elem;
- /* Find the corresponding GtkWidget and GladeWidget. */
- gdk_window_get_user_data (expose_win, (gpointer *)&expose_widget);
- if ((expose_gwidget = glade_widget_get_from_gobject(expose_widget)) == NULL)
- goto out;
-
/* Check that the window is still alive. */
if (!gdk_window_is_viewable (expose_win))
goto out;
+ /* Find the corresponding GtkWidget */
+ gdk_window_get_user_data (expose_win, (gpointer *)&expose_widget);
+
gc = expose_widget->style->black_gc;
/* Calculate the offset of the expose window within its toplevel. */
@@ -712,8 +713,8 @@ glade_util_draw_nodes_idle (GdkWindow *expose_win)
gdk_drawable_get_size (expose_win,
&expose_win_w, &expose_win_h);
- /* Step through all the selected widgets in the project. */
- for (elem = expose_gwidget->project->selection; elem; elem = elem->next) {
+ /* Step through all the selected widgets. */
+ for (elem = glade_util_selection; elem; elem = elem->next) {
GtkWidget *sel_widget;
GdkWindow *sel_win, *sel_toplevel;
@@ -721,9 +722,6 @@ glade_util_draw_nodes_idle (GdkWindow *expose_win)
sel_widget = elem->data;
- if (!GTK_IS_WIDGET (sel_widget))
- continue;
-
if ((sel_win = glade_util_get_window_positioned_in (sel_widget)) == NULL)
continue;
@@ -787,47 +785,76 @@ glade_util_queue_draw_nodes (GdkWindow *window)
* glade_util_add_selection:
* @widget: a #GtkWidget
*
- * TODO: write me
+ * Add visual selection to this GtkWidget
*/
void
-glade_util_add_selection (GObject *object)
+glade_util_add_selection (GtkWidget *widget)
{
- g_object_set_data (object, GLADE_UTIL_HAS_NODES,
- GINT_TO_POINTER (1));
- if (GTK_IS_WIDGET (object))
- gtk_widget_queue_draw (GTK_WIDGET (object));
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ if (glade_util_has_selection (widget))
+ return;
+
+ glade_util_selection =
+ g_list_prepend (glade_util_selection, widget);
+ gtk_widget_queue_draw (widget);
}
/**
* glade_util_remove_selection:
* @widget: a #GtkWidget
*
- * TODO: write me
+ * Remove visual selection from this GtkWidget
*/
void
-glade_util_remove_selection (GObject *object)
+glade_util_remove_selection (GtkWidget *widget)
{
- g_object_set_data (object, GLADE_UTIL_HAS_NODES, GINT_TO_POINTER (0));
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ if (!glade_util_has_selection (widget))
+ return;
+
+ glade_util_selection =
+ g_list_remove (glade_util_selection, widget);
/* We redraw the parent, since the selection rectangle may not be
cleared if we just redraw the widget itself. */
- if (GTK_IS_WIDGET (object))
- gtk_widget_queue_draw (GTK_WIDGET (object)->parent ?
- GTK_WIDGET (object)->parent :
- GTK_WIDGET (object));
+ gtk_widget_queue_draw (widget->parent ?
+ widget->parent : widget);
+}
+
+/**
+ * glade_util_clear_selection:
+ *
+ * Clear all visual selections
+ */
+void
+glade_util_clear_selection (void)
+{
+ GtkWidget *widget;
+ GList *list;
+
+ for (list = glade_util_selection;
+ list && list->data;
+ list = list->next)
+ {
+ widget = list->data;
+ gtk_widget_queue_draw (widget->parent ?
+ widget->parent : widget);
+ }
+ glade_util_selection =
+ (g_list_free (glade_util_selection), NULL);
}
/**
* glade_util_has_selectoin:
* @widget: a #GtkWidget
*
- * Returns: %TRUE if @widget has nodes, %FALSE otherwise
+ * Returns: %TRUE if @widget has visual selection, %FALSE otherwise
*/
gboolean
-glade_util_has_selection (GObject *object)
+glade_util_has_selection (GtkWidget *widget)
{
- return GPOINTER_TO_INT (g_object_get_data
- (object, GLADE_UTIL_HAS_NODES)) != 0;
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
+ return g_list_find (glade_util_selection, widget) != NULL;
}
/*
@@ -995,39 +1022,47 @@ glade_util_widget_pastable (GladeWidget *child,
/**
* glade_util_paste_clipboard:
+ * @placeholder: The #GladePlaceholder to paste the clipboard item to,
+ * if NULL; paste to the selected object in the active project.
*
* Paste the clipboard selection to the active project's
* selection (the project must have only one object selected).
*/
void
-glade_util_paste_clipboard (void)
+glade_util_paste_clipboard (GladePlaceholder *placeholder)
{
- GladeProjectWindow *gpw;
+ GladeProjectWindow *gpw = glade_project_window_get ();
+ GladeProject *project = glade_project_window_get_active_project (gpw);
GList *widgets = NULL, *list;
GladeWidget *widget, *parent;
- GladePlaceholder *placeholder = NULL;
-
- gpw = glade_project_window_get ();
- if ((list = glade_project_selection_get (gpw->active_project)) == NULL)
+
+ if ((list = glade_project_selection_get (project)) != NULL)
{
- glade_util_ui_warn (gpw->window, _("No widget selected!"));
- return;
+ if (placeholder == NULL &&
+ g_list_length (list) != 1)
+ {
+ glade_util_ui_warn
+ (gpw->window, _("Unable to paste to multiple widgets"));
+ return;
+ }
}
- else if (g_list_length (list) > 1)
+ else if (placeholder == NULL)
{
- glade_util_ui_warn
- (gpw->window, _("Unable to paste to multiple widgets"));
+ glade_util_ui_warn (gpw->window, _("No target widget selected"));
return;
}
- if (GLADE_IS_PLACEHOLDER (list->data))
+ if (g_list_length (gpw->clipboard->selection) == 0)
{
- placeholder = list->data;
- parent = glade_placeholder_get_parent (placeholder);
+ glade_util_ui_warn (gpw->window, _("No widget selected on the clipboard"));
+ return;
}
+
+ if (placeholder)
+ parent = glade_placeholder_get_parent (placeholder);
else
- parent = glade_widget_get_from_gobject (GTK_WIDGET (list->data));
+ parent = glade_widget_get_from_gobject (list->data);
for (list = gpw->clipboard->selection;
list && list->data; list = list->next)
@@ -1058,13 +1093,12 @@ glade_util_paste_clipboard (void)
void
glade_util_cut_selection (void)
{
- GladeProjectWindow *gpw;
+ GladeProjectWindow *gpw = glade_project_window_get ();
+ GladeProject *project = glade_project_window_get_active_project (gpw);
GList *widgets = NULL, *list;
GladeWidget *widget;
-
- gpw = glade_project_window_get ();
- for (list = glade_project_selection_get (gpw->active_project);
+ for (list = glade_project_selection_get (project);
list && list->data; list = list->next)
{
widget = glade_widget_get_from_gobject (GTK_WIDGET (list->data));
@@ -1090,17 +1124,17 @@ glade_util_cut_selection (void)
void
glade_util_copy_selection (void)
{
- GladeProjectWindow *gpw;
+ GladeProjectWindow *gpw = glade_project_window_get ();
+ GladeProject *project = glade_project_window_get_active_project (gpw);
GList *widgets = NULL, *list;
GladeWidget *widget;
-
- gpw = glade_project_window_get ();
- for (list = glade_project_selection_get (gpw->active_project);
+ for (list = glade_project_selection_get (project);
list && list->data; list = list->next)
{
- widget = glade_widget_get_from_gobject (GTK_WIDGET (list->data));
- widgets = g_list_prepend (widgets, widget);
+ if ((widget =
+ glade_widget_get_from_gobject (list->data)) != NULL)
+ widgets = g_list_prepend (widgets, widget);
}
if (widgets)
@@ -1155,8 +1189,14 @@ glade_util_find_iter (GtkTreeModel *model,
{
GtkTreeIter *retval = NULL;
GladeWidget *widget;
- GtkTreeIter *next = gtk_tree_iter_copy (iter);
-
+ GtkTreeIter *next;
+
+ g_return_val_if_fail (GTK_IS_TREE_MODEL (model), NULL);
+ g_return_val_if_fail (iter != NULL, NULL);
+
+ next = gtk_tree_iter_copy (iter);
+ g_return_val_if_fail (next != NULL, NULL);
+
while (retval == NULL)
{
gtk_tree_model_get (model, next, column, &widget, -1);
@@ -1205,7 +1245,7 @@ glade_util_find_iter_by_widget (GtkTreeModel *model,
gint column)
{
GtkTreeIter iter;
- if (gtk_tree_model_get_iter_root (model, &iter))
+ if (gtk_tree_model_get_iter_first (model, &iter))
{
return glade_util_find_iter (model, &iter, findme, column);
}
diff --git a/src/glade-utils.h b/src/glade-utils.h
index a349bc13..6a0229f0 100644
--- a/src/glade-utils.h
+++ b/src/glade-utils.h
@@ -41,9 +41,10 @@ void glade_util_file_dialog_set_filename (GtkWidget *file_dialog, gch
void glade_util_replace (char *str, char a, char b);
gchar *glade_util_duplicate_underscores (const char *name);
-void glade_util_add_selection (GObject *object);
-void glade_util_remove_selection (GObject *object);
-gboolean glade_util_has_selection (GObject *object);
+void glade_util_add_selection (GtkWidget *widget);
+void glade_util_remove_selection (GtkWidget *widget);
+gboolean glade_util_has_selection (GtkWidget *widget);
+void glade_util_clear_selection (void);
void glade_util_queue_draw_nodes (GdkWindow *window);
GladeWidget *glade_util_get_parent (GtkWidget *w);
@@ -59,7 +60,7 @@ gboolean glade_util_any_gtkcontainer_relation (GladeWidget *parent,
gboolean glade_util_widget_pastable (GladeWidget *child,
GladeWidget *parent);
-void glade_util_paste_clipboard (void);
+void glade_util_paste_clipboard (GladePlaceholder *placeholder);
void glade_util_cut_selection (void);
void glade_util_copy_selection (void);
void glade_util_delete_selection (void);
diff --git a/src/glade-widget.c b/src/glade-widget.c
index 24999577..da7441d8 100644
--- a/src/glade-widget.c
+++ b/src/glade-widget.c
@@ -1226,6 +1226,7 @@ glade_widget_button_press (GtkWidget *widget,
(glade_widget->project, glade_widget->object) == FALSE ||
g_list_length (glade_widget->project->selection) != 1)
{
+ glade_util_clear_selection ();
glade_project_selection_set (glade_widget->project,
glade_widget->object, TRUE);
handled = TRUE;