static void gb_project_tree_actions_refresh (GSimpleAction *action, GVariant *variant, gpointer user_data) { GbProjectTree *self = user_data; GbTreeNode *selected; GObject *item = NULL; g_assert (GB_IS_PROJECT_TREE (self)); if ((selected = gb_tree_get_selected (GB_TREE (self)))) { item = gb_tree_node_get_item (selected); if (item != NULL) g_object_ref (item); } gb_tree_rebuild (GB_TREE (self)); if (item != NULL) { selected = gb_tree_find_item (GB_TREE (self), item); if (selected != NULL) { gb_tree_node_expand (selected, TRUE); gb_tree_node_select (selected); gb_tree_scroll_to_node (GB_TREE (self), selected); } g_object_unref (item); } }
static void gb_project_tree_actions__trash_file_cb (GObject *object, GAsyncResult *result, gpointer user_data) { IdeProject *project = (IdeProject *)object; g_autoptr(GbProjectTree) self = user_data; g_autoptr(GError) error = NULL; GbTreeNode *node; GObject *item = NULL; g_assert (IDE_IS_PROJECT (project)); g_assert (GB_IS_PROJECT_TREE (self)); if (!ide_project_trash_file_finish (project, result, &error)) { /* todo: warning dialog */ g_warning ("%s", error->message); return; } /* todo: this should be done with tree observer */ if ((node = gb_tree_get_selected (GB_TREE (self)))) { if ((node = gb_tree_node_get_parent (node))) item = gb_tree_node_get_item (node); } gb_tree_rebuild (GB_TREE (self)); if ((node = gb_tree_find_item (GB_TREE (self), item))) gb_tree_node_expand (node, TRUE); }
void gb_project_tree_set_context (GbProjectTree *self, IdeContext *context) { GtkTreeModel *model; GtkTreeIter iter; GbTreeNode *root; g_return_if_fail (GB_IS_PROJECT_TREE (self)); g_return_if_fail (!context || IDE_IS_CONTEXT (context)); model = gtk_tree_view_get_model (GTK_TREE_VIEW (self)); root = gb_tree_node_new (); gb_tree_node_set_item (root, G_OBJECT (context)); gb_tree_set_root (GB_TREE (self), root); /* * If we only have one toplevel item (underneath root), expand it. */ if ((gtk_tree_model_iter_n_children (model, NULL) == 1) && gtk_tree_model_get_iter_first (model, &iter)) { g_autoptr(GbTreeNode) node = NULL; gtk_tree_model_get (model, &iter, 0, &node, -1); if (node != NULL) gb_tree_node_expand (node, FALSE); } }
static void gb_project_tree_actions__create_cb (GObject *object, GAsyncResult *result, gpointer user_data) { GFile *file = (GFile *)object; 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); 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 gb_project_tree_actions__project_rename_file_cb (GObject *object, GAsyncResult *result, gpointer user_data) { IdeProject *project = (IdeProject *)object; g_autoptr(GbRenameFilePopover) popover = user_data; g_autoptr(GError) error = NULL; GbTreeNode *node; GFile *file; GbTree *tree; gboolean expanded = FALSE; g_assert (IDE_IS_PROJECT (project)); g_assert (GB_IS_RENAME_FILE_POPOVER (popover)); if (!ide_project_rename_file_finish (project, result, &error)) { /* todo: display error */ g_warning ("%s", error->message); return; } file = g_object_get_data (G_OBJECT (popover), "G_FILE"); tree = GB_TREE (gtk_popover_get_relative_to (GTK_POPOVER (popover))); g_assert (G_IS_FILE (file)); g_assert (GB_IS_TREE (tree)); if ((node = gb_tree_get_selected (tree))) expanded = gb_tree_node_get_expanded (node); gb_tree_rebuild (tree); node = gb_tree_find_custom (tree, (GEqualFunc)project_item_equal_func, file); if (node != NULL) { gb_tree_node_expand (node, TRUE); if (!expanded) gb_tree_node_collapse (node); gb_tree_node_select (node); gb_tree_scroll_to_node (tree, node); } gtk_widget_hide (GTK_WIDGET (popover)); gtk_widget_destroy (GTK_WIDGET (popover)); }
void gb_project_tree_set_context (GbProjectTree *self, IdeContext *context) { GbTreeNode *root; IdeProject *project = NULL; GtkTreeModel *model; g_return_if_fail (GB_IS_PROJECT_TREE (self)); g_return_if_fail (!context || IDE_IS_CONTEXT (context)); if (context != NULL) project = ide_context_get_project (context); root = gb_tree_get_root (GB_TREE (self)); gb_tree_node_set_item (root, G_OBJECT (project)); gb_tree_rebuild (GB_TREE (self)); /* * If we only have one item at the root of the tree, expand it. */ if ((model = gtk_tree_view_get_model (GTK_TREE_VIEW (self)))) { GtkTreeIter iter; if ((gtk_tree_model_iter_n_children (model, NULL) == 1) && gtk_tree_model_get_iter_first (model, &iter)) { g_autoptr(GbTreeNode) node = NULL; gtk_tree_model_get (model, &iter, 0, &node, -1); if (node != NULL) gb_tree_node_expand (node, FALSE); } } }
static void gb_project_tree_actions_new (GbProjectTree *self, GFileType file_type) { GbTreeNode *selected; GObject *item; GtkPopover *popover; IdeProjectFile *project_file; GFile *file = NULL; gboolean is_dir; g_assert (GB_IS_PROJECT_TREE (self)); g_assert ((file_type == G_FILE_TYPE_DIRECTORY) || (file_type == G_FILE_TYPE_REGULAR)); again: if (!(selected = gb_tree_get_selected (GB_TREE (self))) || !(item = gb_tree_node_get_item (selected)) || !(IDE_IS_PROJECT_FILES (item) || IDE_IS_PROJECT_FILE (item))) return; if (IDE_IS_PROJECT_FILE (item)) { if (!(project_file = IDE_PROJECT_FILE (item)) || !(file = ide_project_file_get_file (project_file))) return; is_dir = project_file_is_directory (item); } else if (IDE_IS_PROJECT_FILES (item)) { IdeContext *context; IdeVcs *vcs; context = ide_object_get_context (IDE_OBJECT (item)); vcs = ide_context_get_vcs (context); file = ide_vcs_get_working_directory (vcs); is_dir = TRUE; } g_assert (G_IS_FILE (file)); /* * If this item is an IdeProjectFile and not a directory, then we really * want to create a sibling. */ if (!is_dir) { GtkTreePath *path; selected = gb_tree_node_get_parent (selected); gb_tree_node_select (selected); path = gb_tree_node_get_path (selected); gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (self), path, NULL, FALSE, 0, 0); gtk_tree_path_free (path); goto again; } if ((self->expanded_in_new = !gb_tree_node_get_expanded (selected))) gb_tree_node_expand (selected, FALSE); popover = g_object_new (GB_TYPE_NEW_FILE_POPOVER, "directory", file, "file-type", file_type, "position", GTK_POS_RIGHT, NULL); g_signal_connect_object (popover, "create-file", G_CALLBACK (gb_project_tree_actions__popover_create_file_cb), self, G_CONNECT_SWAPPED); g_signal_connect_object (popover, "closed", G_CALLBACK (gb_project_tree_actions__popover_closed_cb), self, G_CONNECT_SWAPPED); gb_tree_node_show_popover (selected, popover); }