[gnome-builder] glade: reload editor buffer when designer view is saved
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] glade: reload editor buffer when designer view is saved
- Date: Mon, 22 Oct 2018 23:28:58 +0000 (UTC)
commit 320c6a70e2c1ce76b9d142d3fd2fe351cd57a50a
Author: Christian Hergert <chergert redhat com>
Date: Mon Oct 22 16:28:37 2018 -0700
glade: reload editor buffer when designer view is saved
When saving the designer view, we want to reload the editor source for the
user so that they don't need to get a "modified on disk" warning. This
requires a bit more manual state tracking, but it's worth it.
src/plugins/glade/gbp-glade-view.c | 75 ++++++++++++++++++++++++++++++--------
1 file changed, 60 insertions(+), 15 deletions(-)
---
diff --git a/src/plugins/glade/gbp-glade-view.c b/src/plugins/glade/gbp-glade-view.c
index 096a505a7..2707abde5 100644
--- a/src/plugins/glade/gbp-glade-view.c
+++ b/src/plugins/glade/gbp-glade-view.c
@@ -50,6 +50,18 @@ gbp_glade_view_new (void)
return g_object_new (GBP_TYPE_GLADE_VIEW, NULL);
}
+static void
+gbp_glade_view_notify_modified_cb (GbpGladeView *self,
+ GParamSpec *pspec,
+ GladeProject *project)
+{
+ g_assert (GBP_IS_GLADE_VIEW (self));
+ g_assert (GLADE_IS_PROJECT (project));
+
+ ide_layout_view_set_modified (IDE_LAYOUT_VIEW (self),
+ glade_project_get_modified (project));
+}
+
static void
gbp_glade_view_changed_cb (GbpGladeView *self,
GladeCommand *command,
@@ -70,6 +82,8 @@ static void
gbp_glade_view_set_project (GbpGladeView *self,
GladeProject *project)
{
+ GladeProject *old_project = NULL;
+
g_assert (GBP_IS_GLADE_VIEW (self));
g_assert (GLADE_IS_PROJECT (project));
@@ -81,20 +95,31 @@ gbp_glade_view_set_project (GbpGladeView *self,
if (self->project != NULL)
{
+ old_project = g_object_ref (self->project);
g_signal_handlers_disconnect_by_func (self->project,
G_CALLBACK (gbp_glade_view_changed_cb),
self);
+ g_signal_handlers_disconnect_by_func (self->project,
+ G_CALLBACK (gbp_glade_view_notify_modified_cb),
+ self);
+ glade_app_remove_project (self->project);
g_clear_object (&self->project);
}
if (project != NULL)
{
self->project = g_object_ref (project);
+ glade_app_add_project (self->project);
g_signal_connect_object (self->project,
"changed",
G_CALLBACK (gbp_glade_view_changed_cb),
self,
G_CONNECT_SWAPPED);
+ g_signal_connect_object (self->project,
+ "notify::modified",
+ G_CALLBACK (gbp_glade_view_notify_modified_cb),
+ self,
+ G_CONNECT_SWAPPED);
}
if (self->designer != NULL)
@@ -124,6 +149,11 @@ gbp_glade_view_set_project (GbpGladeView *self,
if (self->chooser != NULL)
glade_adaptor_chooser_set_project (self->chooser, self->project);
+ ide_layout_view_set_modified (IDE_LAYOUT_VIEW (self),
+ self->project != NULL && glade_project_get_modified (self->project));
+
+ g_clear_object (&old_project);
+
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_PROJECT]);
}
@@ -180,7 +210,32 @@ _gbp_glade_view_save (GbpGladeView *self,
return FALSE;
}
- return glade_project_save (self->project, path, error);
+ if (glade_project_save (self->project, path, error))
+ {
+ IdeBufferManager *bufmgr;
+ IdeContext *context;
+ IdeBuffer *buffer;
+
+ context = ide_widget_get_context (GTK_WIDGET (self));
+ bufmgr = ide_context_get_buffer_manager (context);
+
+ /* We successfully wrote the file, so trigger a full reload of the
+ * IdeBuffer if there is one already currently open.
+ */
+
+ if ((buffer = ide_buffer_manager_find_buffer (bufmgr, self->file)))
+ {
+ ide_buffer_manager_load_file_async (bufmgr,
+ ide_buffer_get_file (buffer),
+ TRUE,
+ IDE_WORKBENCH_OPEN_FLAGS_NO_VIEW,
+ NULL, NULL, NULL, NULL);
+ }
+
+ return TRUE;
+ }
+
+ return FALSE;
}
static void
@@ -345,6 +400,7 @@ gbp_glade_view_init (GbpGladeView *self)
GtkBox *box;
GtkViewport *viewport;
GtkStyleContext *style_context;
+ GladeProject *project = NULL;
static const struct {
const gchar *action_target;
const gchar *icon_name;
@@ -364,12 +420,9 @@ gbp_glade_view_init (GbpGladeView *self)
ide_widget_set_context_handler (self, gbp_glade_view_context_set);
- self->project = glade_project_new ();
- g_signal_connect_object (self->project,
- "changed",
- G_CALLBACK (gbp_glade_view_changed_cb),
- self,
- G_CONNECT_SWAPPED);
+ project = glade_project_new ();
+ gbp_glade_view_set_project (self, project);
+ g_clear_object (&project);
self->main_box = g_object_new (GTK_TYPE_BOX,
"orientation", GTK_ORIENTATION_VERTICAL,
@@ -447,14 +500,6 @@ gbp_glade_view_init (GbpGladeView *self)
gtk_container_add (GTK_CONTAINER (box), GTK_WIDGET (button));
}
- /* Setup project and bindings. */
-
- glade_app_add_project (self->project);
-
- g_object_bind_property (G_OBJECT (self->project), "modified",
- self, "modified",
- G_BINDING_DEFAULT);
-
/* Setup action state and shortcuts */
_gbp_glade_view_init_actions (self);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]