[gnome-builder/gnome-builder-3-26] command-bar: add [filename] to sp/split



commit 1093b4089203c0ab59e04fa2b1e7dcdfd1cc6db6
Author: Sebastien Lafargue <slafargue gnome org>
Date:   Tue Sep 19 17:45:06 2017 +0200

    command-bar: add [filename] to  sp/split

 data/gtk/menus.ui                        |    1 +
 libide/layout/ide-layout-stack-actions.c |   49 +++++++---
 plugins/command-bar/gb-vim.c             |  160 +++++++++++++++++++++---------
 3 files changed, 148 insertions(+), 62 deletions(-)
---
diff --git a/data/gtk/menus.ui b/data/gtk/menus.ui
index 89758b9..235f050 100644
--- a/data/gtk/menus.ui
+++ b/data/gtk/menus.ui
@@ -290,6 +290,7 @@
       <item>
         <attribute name="label" translatable="yes">Split</attribute>
         <attribute name="action">layoutstack.split-view</attribute>
+        <attribute name="target" type="s">""</attribute>
         <attribute name="verb-icon-name">builder-split-tab-symbolic</attribute>
       </item>
       <item>
diff --git a/libide/layout/ide-layout-stack-actions.c b/libide/layout/ide-layout-stack-actions.c
index b1678e1..c2be9a6 100644
--- a/libide/layout/ide-layout-stack-actions.c
+++ b/libide/layout/ide-layout-stack-actions.c
@@ -131,9 +131,7 @@ ide_layout_stack_actions_open_in_new_frame (GSimpleAction *action,
                                             gpointer       user_data)
 {
   IdeLayoutStack *self = user_data;
-
   const gchar *filepath;
-
   IdeLayoutView *view;
   IdeLayoutStack *dest;
   GtkWidget *grid;
@@ -211,12 +209,14 @@ ide_layout_stack_actions_split_view (GSimpleAction *action,
   IdeLayoutStack *dest;
   IdeLayoutView *view;
   IdeLayoutView *split_view;
+  const gchar *filepath;
   GtkWidget *column;
   GtkWidget *grid;
   gint index = 0;
 
   g_assert (G_IS_SIMPLE_ACTION (action));
   g_assert (IDE_IS_LAYOUT_STACK (self));
+  g_assert (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING));
 
   column = gtk_widget_get_parent (GTK_WIDGET (self));
 
@@ -234,22 +234,43 @@ ide_layout_stack_actions_split_view (GSimpleAction *action,
       return;
     }
 
-  view = ide_layout_stack_get_visible_child (self);
-
-  if (view == NULL)
+  filepath = g_variant_get_string (variant, NULL);
+  if (!ide_str_empty0 (filepath))
     {
-      g_warning ("No view available to split");
-      return;
-    }
+      IdeContext *context;
+      IdeBufferManager *buffer_manager;
+      g_autoptr (GFile) file = NULL;
+      IdeBuffer *buffer;
 
-  if (!ide_layout_view_get_can_split (view))
+      context = ide_widget_get_context (GTK_WIDGET (self));
+      buffer_manager = ide_context_get_buffer_manager (context);
+      file = g_file_new_for_path (filepath);
+      if (NULL != (buffer = ide_buffer_manager_find_buffer (buffer_manager, file)))
+        split_view = g_object_new (IDE_TYPE_EDITOR_VIEW,
+                                  "buffer", buffer,
+                                  "visible", TRUE,
+                                  NULL);
+      else
+        return;
+    }
+  else
     {
-      g_warning ("Attempt to split a view that cannot be split");
-      return;
+      view = ide_layout_stack_get_visible_child (self);
+      if (view == NULL)
+        {
+          g_warning ("No view available to split");
+          return;
+        }
+
+      if (!ide_layout_view_get_can_split (view))
+        {
+          g_warning ("Attempt to split a view that cannot be split");
+          return;
+        }
+
+        split_view = ide_layout_view_create_split_view (view);
     }
 
-  split_view = ide_layout_view_create_split_view (view);
-
   g_assert (IDE_IS_LAYOUT_GRID_COLUMN (column));
 
   gtk_container_child_get (GTK_CONTAINER (column), GTK_WIDGET (self),
@@ -328,7 +349,7 @@ static const GActionEntry actions[] = {
   { "previous-view",     ide_layout_stack_actions_previous_view },
   { "move-right",        ide_layout_stack_actions_move_right },
   { "move-left",         ide_layout_stack_actions_move_left },
-  { "split-view",        ide_layout_stack_actions_split_view },
+  { "split-view",        ide_layout_stack_actions_split_view, "s" },
   { "show-list",         ide_layout_stack_actions_show_list },
 };
 
diff --git a/plugins/command-bar/gb-vim.c b/plugins/command-bar/gb-vim.c
index 0fdbef6..85b0413 100644
--- a/plugins/command-bar/gb-vim.c
+++ b/plugins/command-bar/gb-vim.c
@@ -513,20 +513,31 @@ gb_vim_command_quit (GtkWidget      *active_widget,
   return TRUE;
 }
 
-static gboolean
-gb_vim_command_split (GtkWidget      *active_widget,
-                      const gchar    *command,
-                      const gchar    *options,
-                      GError        **error)
+static void
+gb_vim_command_split_cb (GObject      *object,
+                         GAsyncResult *result,
+                         gpointer      user_data)
 {
-  g_assert (GTK_IS_WIDGET (active_widget));
+  SplitCallbackData *split_callback_data = (SplitCallbackData *)user_data;
+  IdeWorkbench *workbench;
+  GtkWidget *active_widget;
+  const gchar *file_path;
+  GVariant *variant;
+  g_autoptr(GError) error = NULL;
 
-  if (IDE_IS_LAYOUT_VIEW (active_widget))
-    dzl_gtk_widget_action (GTK_WIDGET (active_widget), "layoutstack", "split-view", NULL);
-  else
-    return gb_vim_set_no_view_error (error);
+  workbench = IDE_WORKBENCH (object);
+  if (ide_workbench_open_files_finish (workbench,result, &error))
+    {
+      active_widget = split_callback_data->active_widget;
+      file_path = split_callback_data->file_path;
+      variant = g_variant_new_string (file_path);
 
-  return TRUE;
+      dzl_gtk_widget_action (GTK_WIDGET (active_widget), "layoutstack", "split-view", variant);
+    }
+
+  g_object_unref (split_callback_data->active_widget);
+  g_free (split_callback_data->file_path);
+  g_slice_free (SplitCallbackData, split_callback_data);
 }
 
 static void
@@ -535,15 +546,21 @@ gb_vim_command_vsplit_cb (GObject      *object,
                           gpointer      user_data)
 {
   SplitCallbackData *split_callback_data = (SplitCallbackData *)user_data;
+  IdeWorkbench *workbench;
   GtkWidget *active_widget;
   const gchar *file_path;
   GVariant *variant;
+  g_autoptr(GError) error = NULL;
 
-  active_widget = split_callback_data->active_widget;
-  file_path = split_callback_data->file_path;
-  variant = g_variant_new_string (file_path);
+  workbench = IDE_WORKBENCH (object);
+  if (ide_workbench_open_files_finish (workbench,result, &error))
+    {
+      active_widget = split_callback_data->active_widget;
+      file_path = split_callback_data->file_path;
+      variant = g_variant_new_string (file_path);
 
-  dzl_gtk_widget_action (GTK_WIDGET (active_widget), "layoutstack", "open-in-new-frame", variant);
+      dzl_gtk_widget_action (GTK_WIDGET (active_widget), "layoutstack", "open-in-new-frame", variant);
+    }
 
   g_object_unref (split_callback_data->active_widget);
   g_free (split_callback_data->file_path);
@@ -551,10 +568,10 @@ gb_vim_command_vsplit_cb (GObject      *object,
 }
 
 static gboolean
-gb_vim_command_vsplit (GtkWidget      *active_widget,
-                       const gchar    *command,
-                       const gchar    *options,
-                       GError        **error)
+load_split_async (GtkWidget            *active_widget,
+                  const gchar          *options,
+                  GAsyncReadyCallback   callback,
+                  GError              **error)
 {
   IdeWorkbench *workbench;
   IdeContext *context;
@@ -563,6 +580,58 @@ gb_vim_command_vsplit (GtkWidget      *active_widget,
   GFile *file = NULL;
   gchar *file_path;
   SplitCallbackData *split_callback_data;
+
+  g_assert (GTK_IS_WIDGET (active_widget));
+  g_assert (options != NULL);
+  g_assert (callback != NULL);
+
+  if (!(workbench = ide_widget_get_workbench (active_widget)) ||
+      !(context = ide_workbench_get_context (workbench)) ||
+      !(vcs = ide_context_get_vcs (context)) ||
+      !(workdir = ide_vcs_get_working_directory (vcs)))
+    {
+      g_set_error (error,
+                   GB_VIM_ERROR,
+                   GB_VIM_ERROR_NOT_SOURCE_VIEW,
+                   _("Failed to locate working directory"));
+      return FALSE;
+    }
+
+  if (!g_path_is_absolute (options))
+    {
+      g_autofree gchar *workdir_path = NULL;
+      workdir_path = g_file_get_path (workdir);
+      file_path = g_build_filename (workdir_path, options, NULL);
+    }
+  else
+    file_path = g_strdup (options);
+
+  file = g_file_new_for_path (file_path);
+
+  split_callback_data = g_slice_new (SplitCallbackData);
+  split_callback_data->active_widget = g_object_ref (active_widget);
+  split_callback_data->file_path = file_path;
+
+  ide_workbench_open_files_async (workbench,
+                                  &file,
+                                  1,
+                                  "editor",
+                                  IDE_WORKBENCH_OPEN_FLAGS_BACKGROUND,
+                                  NULL,
+                                  callback,
+                                  split_callback_data);
+
+  g_clear_object (&file);
+
+  return TRUE;
+}
+
+static gboolean
+gb_vim_command_split (GtkWidget    *active_widget,
+                      const gchar  *command,
+                      const gchar  *options,
+                      GError      **error)
+{
   GVariant *variant;
 
   g_assert (GTK_IS_WIDGET (active_widget));
@@ -573,43 +642,36 @@ gb_vim_command_vsplit (GtkWidget      *active_widget,
   if (ide_str_empty0 (options))
     {
       variant = g_variant_new_string ("");
-      dzl_gtk_widget_action (GTK_WIDGET (active_widget), "layoutstack", "open-in-new-frame", variant);
+      dzl_gtk_widget_action (GTK_WIDGET (active_widget), "layoutstack", "split-view", variant);
+
+      return TRUE;
     }
   else
-    {
-      if (!(workbench = ide_widget_get_workbench (active_widget)) ||
-          !(context = ide_workbench_get_context (workbench)) ||
-          !(vcs = ide_context_get_vcs (context)) ||
-          !(workdir = ide_vcs_get_working_directory (vcs)))
-        {
-          g_set_error (error,
-                       GB_VIM_ERROR,
-                       GB_VIM_ERROR_NOT_SOURCE_VIEW,
-                       _("Failed to locate working directory"));
-          return FALSE;
-        }
+    return load_split_async (active_widget, options, gb_vim_command_split_cb, error);
+}
 
-      if (!g_path_is_absolute (options))
-        {
-          g_autofree gchar *workdir_path = NULL;
-          workdir_path = g_file_get_path (workdir);
-          file_path = g_build_filename (workdir_path, options, NULL);
-        }
-      else
-        file_path = g_strdup (options);
+static gboolean
+gb_vim_command_vsplit (GtkWidget    *active_widget,
+                       const gchar  *command,
+                       const gchar  *options,
+                       GError      **error)
+{
+  GVariant *variant;
 
-      file = g_file_new_for_path (file_path);
+  g_assert (GTK_IS_WIDGET (active_widget));
 
-      split_callback_data = g_slice_new (SplitCallbackData);
-      split_callback_data->active_widget = g_object_ref (active_widget);
-      split_callback_data->file_path = file_path;
+  if (!IDE_IS_LAYOUT_VIEW (active_widget))
+    return gb_vim_set_no_view_error (error);
 
-      ide_workbench_open_files_async (workbench, &file, 1, "editor", IDE_WORKBENCH_OPEN_FLAGS_BACKGROUND, 
NULL, gb_vim_command_vsplit_cb, split_callback_data);
+  if (ide_str_empty0 (options))
+    {
+      variant = g_variant_new_string ("");
+      dzl_gtk_widget_action (GTK_WIDGET (active_widget), "layoutstack", "open-in-new-frame", variant);
 
-      g_clear_object (&file);
+      return TRUE;
     }
-
-  return TRUE;
+  else
+    return load_split_async (active_widget, options, gb_vim_command_vsplit_cb, error);
 }
 
 static gboolean
@@ -1552,6 +1614,8 @@ gb_vim_complete (GtkWidget   *active_widget,
           g_str_has_prefix (line, "edit ") ||
           g_str_has_prefix (line, "o ") ||
           g_str_has_prefix (line, "open ") ||
+          g_str_has_prefix (line, "sp ") ||
+          g_str_has_prefix (line, "split ") ||
           g_str_has_prefix (line, "vsp ") ||
           g_str_has_prefix (line, "vsplit ") ||
           g_str_has_prefix (line, "tabe "))


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]