[gnome-builder/wip/file-loader: 5/5] project-tree: update project tree after adding file or directory
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/file-loader: 5/5] project-tree: update project tree after adding file or directory
- Date: Mon, 13 Apr 2015 08:08:41 +0000 (UTC)
commit f83989710f77117272b63400b683b48875b53630
Author: Christian Hergert <christian hergert me>
Date: Mon Apr 13 01:07:55 2015 -0700
project-tree: update project tree after adding file or directory
src/project-tree/gb-project-tree-actions.c | 119 ++++++++++++++++++++++++++--
1 files changed, 111 insertions(+), 8 deletions(-)
---
diff --git a/src/project-tree/gb-project-tree-actions.c b/src/project-tree/gb-project-tree-actions.c
index 21abcfd..5ccab78 100644
--- a/src/project-tree/gb-project-tree-actions.c
+++ b/src/project-tree/gb-project-tree-actions.c
@@ -257,22 +257,88 @@ gb_project_tree_actions_show_icons (GSimpleAction *action,
g_simple_action_set_state (action, variant);
}
+static IdeProjectFile *
+create_file (IdeContext *context,
+ GFile *file,
+ GFileType file_type)
+{
+ g_autofree gchar *path = NULL;
+ g_autofree gchar *name = NULL;
+ g_autoptr(GFileInfo) file_info = NULL;
+ IdeVcs *vcs;
+ GFile *workdir;
+
+ g_assert (IDE_IS_CONTEXT (context));
+ g_assert (G_IS_FILE (file));
+ g_assert ((file_type == G_FILE_TYPE_DIRECTORY) || (file_type == G_FILE_TYPE_REGULAR));
+
+ vcs = ide_context_get_vcs (context);
+ workdir = ide_vcs_get_working_directory (vcs);
+ path = g_file_get_relative_path (workdir, file);
+ name = g_file_get_basename (file);
+
+ file_info = g_file_info_new ();
+ g_file_info_set_file_type (file_info, file_type);
+ g_file_info_set_name (file_info, name);
+ g_file_info_set_display_name (file_info, name);
+
+ return g_object_new (IDE_TYPE_PROJECT_FILE,
+ "context", context,
+ "file", file,
+ "file-info", file_info,
+ "path", path,
+ "parent", NULL,
+ NULL);
+}
+
static void
gb_project_tree_actions__make_directory_cb (GObject *object,
GAsyncResult *result,
gpointer user_data)
{
GFile *file = (GFile *)object;
- g_autoptr(GbProjectTree) self = user_data;
+ g_autoptr(GbTreeNode) node = user_data;
g_autoptr(GError) error = NULL;
+ g_autoptr(IdeProjectFile) project_file = NULL;
+ GbProjectTree *self;
+ GbWorkbench *workbench;
+ IdeContext *context;
+ IdeProject *project;
+ GbTreeNode *created;
+
+ g_assert (G_IS_FILE (file));
+ g_assert (GB_IS_TREE_NODE (node));
if (!g_file_make_directory_finish (file, result, &error))
{
/* todo: show error messsage */
+ return;
}
- /* todo: add file to project/vcs/etc */
- /* todo: reload portion of tree */
+ self = GB_PROJECT_TREE (gb_tree_node_get_tree (node));
+ if (self == NULL)
+ return;
+
+ workbench = gb_widget_get_workbench (GTK_WIDGET (self));
+ if (workbench == NULL)
+ return;
+
+ context = gb_workbench_get_context (workbench);
+ if (context == NULL)
+ return;
+
+ project = ide_context_get_project (context);
+
+ project_file = create_file (context, file, G_FILE_TYPE_DIRECTORY);
+ ide_project_add_file (project, project_file);
+
+ gb_tree_node_rebuild (node);
+ gb_tree_node_expand (node, FALSE);
+
+ created = gb_tree_find_item (GB_TREE (self), G_OBJECT (project_file));
+
+ if (created != NULL)
+ gb_tree_node_select (created);
}
static void
@@ -281,20 +347,50 @@ gb_project_tree_actions__create_cb (GObject *object,
gpointer user_data)
{
GFile *file = (GFile *)object;
- g_autoptr(GbProjectTree) self = user_data;
+ g_autoptr(IdeProjectFile) project_file = NULL;
+ g_autoptr(GbTreeNode) node = user_data;
g_autoptr(GError) error = NULL;
+ GbProjectTree *self;
GbWorkbench *workbench;
+ IdeContext *context;
+ IdeProject *project;
+ GbTreeNode *created;
+
+ g_assert (G_IS_FILE (file));
+ g_assert (GB_IS_TREE_NODE (node));
if (!g_file_create_finish (file, result, &error))
{
/* todo: show error messsage */
+ return;
}
+ self = GB_PROJECT_TREE (gb_tree_node_get_tree (node));
+ if (self == NULL)
+ return;
+
workbench = gb_widget_get_workbench (GTK_WIDGET (self));
+ if (workbench == NULL)
+ return;
+
+ context = gb_workbench_get_context (workbench);
+ if (context == NULL)
+ return;
+
+ project = ide_context_get_project (context);
+
+ project_file = create_file (context, file, G_FILE_TYPE_REGULAR);
+ ide_project_add_file (project, project_file);
+
gb_workbench_open (workbench, file);
- /* todo: add file to project/vcs/etc */
- /* todo: reload portion of tree */
+ gb_tree_node_rebuild (node);
+ gb_tree_node_expand (node, FALSE);
+
+ created = gb_tree_find_item (GB_TREE (self), G_OBJECT (project_file));
+
+ if (created != NULL)
+ gb_tree_node_select (created);
}
static void
@@ -303,19 +399,26 @@ gb_project_tree_actions__popover_create_file_cb (GbProjectTree *self,
GFileType file_type,
GbNewFilePopover *popover)
{
+ GbTreeNode *selected;
+
g_assert (GB_IS_PROJECT_TREE (self));
g_assert (G_IS_FILE (file));
g_assert ((file_type == G_FILE_TYPE_DIRECTORY) ||
(file_type == G_FILE_TYPE_REGULAR));
g_assert (GB_IS_NEW_FILE_POPOVER (popover));
+ selected = gb_tree_get_selected (GB_TREE (self));
+
+ g_assert (selected != NULL);
+ g_assert (GB_IS_TREE_NODE (selected));
+
if (file_type == G_FILE_TYPE_DIRECTORY)
{
g_file_make_directory_async (file,
G_PRIORITY_DEFAULT,
NULL, /* cancellable */
gb_project_tree_actions__make_directory_cb,
- g_object_ref (self));
+ g_object_ref (selected));
}
else if (file_type == G_FILE_TYPE_REGULAR)
{
@@ -324,7 +427,7 @@ gb_project_tree_actions__popover_create_file_cb (GbProjectTree *self,
G_PRIORITY_DEFAULT,
NULL, /* cancellable */
gb_project_tree_actions__create_cb,
- g_object_ref (self));
+ g_object_ref (selected));
}
else
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]