static void gb_project_tree_actions_refresh (GSimpleAction *action, GVariant *variant, gpointer user_data) { GbProjectTree *self = user_data; IdeTreeNode *selected; GObject *item = NULL; g_assert (GB_IS_PROJECT_TREE (self)); if ((selected = ide_tree_get_selected (IDE_TREE (self)))) { item = ide_tree_node_get_item (selected); if (item != NULL) g_object_ref (item); } ide_tree_rebuild (IDE_TREE (self)); if (item != NULL) { selected = ide_tree_find_item (IDE_TREE (self), item); if (selected != NULL) { ide_tree_node_expand (selected, TRUE); ide_tree_node_select (selected); ide_tree_scroll_to_node (IDE_TREE (self), selected); } g_object_unref (item); } }
static void gb_project_tree_init (GbProjectTree *self) { GtkStyleContext *style_context; IdeTreeBuilder *builder; GMenu *menu; style_context = gtk_widget_get_style_context (GTK_WIDGET (self)); gtk_style_context_add_class (style_context, "project-tree"); self->settings = g_settings_new ("org.gnome.builder.project-tree"); g_settings_bind (self->settings, "show-icons", self, "show-icons", G_SETTINGS_BIND_DEFAULT); g_settings_bind (self->settings, "show-ignored-files", self, "show-ignored-files", G_SETTINGS_BIND_DEFAULT); builder = gb_project_tree_builder_new (); ide_tree_add_builder (IDE_TREE (self), builder); g_signal_connect (self, "notify::selection", G_CALLBACK (gb_project_tree_notify_selection), NULL); gb_project_tree_actions_init (self); menu = ide_application_get_menu_by_id (IDE_APPLICATION_DEFAULT, "gb-project-tree-popup-menu"); ide_tree_set_context_menu (IDE_TREE (self), G_MENU_MODEL (menu)); }
static void gb_project_tree_vcs_changed (GbProjectTree *self, IdeVcs *vcs) { g_autoptr(GFile) file = NULL; IdeTreeNode *node; GObject *item; g_assert (GB_IS_PROJECT_TREE (self)); g_assert (IDE_IS_VCS (vcs)); if (NULL != (node = ide_tree_get_selected (IDE_TREE (self))) && NULL != (item = ide_tree_node_get_item (node)) && GB_IS_PROJECT_FILE (item)) { if (NULL != (file = gb_project_file_get_file (GB_PROJECT_FILE (item)))) g_object_ref (file); } ide_tree_rebuild (IDE_TREE (self)); if (file != NULL) gb_project_tree_reveal (self, file); }
static void gb_project_tree_project_file_trashed (GbProjectTree *self, GFile *file, IdeProject *project) { IdeTreeNode *node; IDE_ENTRY; g_assert (GB_IS_PROJECT_TREE (self)); g_assert (G_IS_FILE (file)); g_assert (IDE_IS_PROJECT (project)); node = ide_tree_find_custom (IDE_TREE (self), compare_to_file, file); if (node != NULL) { IdeTreeNode *parent = ide_tree_node_get_parent (node); ide_tree_node_invalidate (parent); ide_tree_node_expand (parent, TRUE); ide_tree_node_select (parent); } IDE_EXIT; }
void gb_project_tree_set_context (GbProjectTree *self, IdeContext *context) { GtkTreeModel *model; GtkTreeIter iter; IdeTreeNode *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 = ide_tree_node_new (); ide_tree_node_set_item (root, G_OBJECT (context)); ide_tree_set_root (IDE_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(IdeTreeNode) node = NULL; gtk_tree_model_get (model, &iter, 0, &node, -1); if (node != NULL) ide_tree_node_expand (node, FALSE); } }
static void gb_project_tree_actions_open_with_editor (GSimpleAction *action, GVariant *variant, gpointer user_data) { IdeWorkbench *workbench; GbProjectTree *self = user_data; GFileInfo *file_info; GFile *file; IdeTreeNode *selected; GObject *item; g_assert (GB_IS_PROJECT_TREE (self)); if (!(selected = ide_tree_get_selected (IDE_TREE (self))) || !(item = ide_tree_node_get_item (selected)) || !GB_IS_PROJECT_FILE (item) || !(file_info = gb_project_file_get_file_info (GB_PROJECT_FILE (item))) || (g_file_info_get_file_type (file_info) == G_FILE_TYPE_DIRECTORY) || !(file = gb_project_file_get_file (GB_PROJECT_FILE (item))) || !(workbench = ide_widget_get_workbench (GTK_WIDGET (self)))) return; ide_workbench_open_files_async (workbench, &file, 1, "editor", NULL, NULL, NULL); }
void gb_project_tree_reveal (GbProjectTree *self, GFile *file) { g_autofree gchar *relpath = NULL; g_auto(GStrv) parts = NULL; IdeContext *context; IdeTreeNode *node; IdeVcs *vcs; GFile *workdir; guint i; g_return_if_fail (GB_IS_PROJECT_TREE (self)); g_return_if_fail (G_IS_FILE (file)); context = gb_project_tree_get_context (self); g_assert (IDE_IS_CONTEXT (context)); if (context == NULL) return; vcs = ide_context_get_vcs (context); workdir = ide_vcs_get_working_directory (vcs); relpath = g_file_get_relative_path (workdir, file); if (relpath == NULL) return; node = ide_tree_find_child_node (IDE_TREE (self), NULL, find_files_node, NULL); if (node == NULL) return; parts = g_strsplit (relpath, G_DIR_SEPARATOR_S, 0); for (i = 0; parts [i]; i++) { node = ide_tree_find_child_node (IDE_TREE (self), node, find_child_node, parts [i]); if (node == NULL) return; } ide_tree_expand_to_node (IDE_TREE (self), node); ide_tree_scroll_to_node (IDE_TREE (self), node); ide_tree_node_select (node); }
void gb_project_tree_set_context (GbProjectTree *self, IdeContext *context) { GtkTreeModel *model; GtkTreeIter iter; IdeTreeNode *root; IdeProject *project; IdeVcs *vcs; g_return_if_fail (GB_IS_PROJECT_TREE (self)); g_return_if_fail (IDE_IS_CONTEXT (context)); vcs = ide_context_get_vcs (context); g_signal_connect_object (vcs, "changed", G_CALLBACK (gb_project_tree_vcs_changed), self, G_CONNECT_SWAPPED); project = ide_context_get_project (context); g_signal_connect_object (project, "file-renamed", G_CALLBACK (gb_project_tree_project_file_renamed), self, G_CONNECT_SWAPPED); g_signal_connect_object (project, "file-trashed", G_CALLBACK (gb_project_tree_project_file_trashed), self, G_CONNECT_SWAPPED); model = gtk_tree_view_get_model (GTK_TREE_VIEW (self)); root = ide_tree_node_new (); ide_tree_node_set_item (root, G_OBJECT (context)); ide_tree_set_root (IDE_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(IdeTreeNode) node = NULL; gtk_tree_model_get (model, &iter, 0, &node, -1); if (node != NULL) ide_tree_node_expand (node, FALSE); } }
IdeContext * gb_project_tree_get_context (GbProjectTree *self) { IdeTreeNode *root; GObject *item; g_return_val_if_fail (GB_IS_PROJECT_TREE (self), NULL); if ((root = ide_tree_get_root (IDE_TREE (self))) && (item = ide_tree_node_get_item (root)) && IDE_IS_CONTEXT (item)) return IDE_CONTEXT (item); return NULL; }
void gb_project_tree_set_show_ignored_files (GbProjectTree *self, gboolean show_ignored_files) { g_return_if_fail (GB_IS_PROJECT_TREE (self)); show_ignored_files = !!show_ignored_files; if (show_ignored_files != self->show_ignored_files) { self->show_ignored_files = show_ignored_files; g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_SHOW_IGNORED_FILES]); ide_tree_rebuild (IDE_TREE (self)); } }
static void gb_project_tree_project_file_renamed (GbProjectTree *self, GFile *src_file, GFile *dst_file, IdeProject *project) { IDE_ENTRY; g_assert (GB_IS_PROJECT_TREE (self)); g_assert (G_IS_FILE (src_file)); g_assert (G_IS_FILE (dst_file)); g_assert (IDE_IS_PROJECT (project)); ide_tree_rebuild (IDE_TREE (self)); gb_project_tree_reveal (self, dst_file); IDE_EXIT; }
static void gb_project_tree_actions_open_containing_folder (GSimpleAction *action, GVariant *variant, gpointer user_data) { GbProjectTree *self = user_data; IdeTreeNode *selected; GObject *item; GFile *file; g_assert (GB_IS_PROJECT_TREE (self)); if (!(selected = ide_tree_get_selected (IDE_TREE (self))) || !(item = ide_tree_node_get_item (selected)) || !GB_IS_PROJECT_FILE (item)) return; file = gb_project_file_get_file (GB_PROJECT_FILE (item)); ide_file_manager_show (file, NULL); }
static void gb_project_tree_actions_open_with (GSimpleAction *action, GVariant *variant, gpointer user_data) { g_autoptr(GDesktopAppInfo) app_info = NULL; g_autoptr(GdkAppLaunchContext) launch_context = NULL; GbProjectTree *self = user_data; IdeTreeNode *selected; IdeWorkbench *workbench; GdkDisplay *display; GFileInfo *file_info; GFile *file; const gchar *app_id; GObject *item; GList *files; g_assert (GB_IS_PROJECT_TREE (self)); g_assert (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING)); if (!(workbench = ide_widget_get_workbench (GTK_WIDGET (self))) || !(selected = ide_tree_get_selected (IDE_TREE (self))) || !(item = ide_tree_node_get_item (selected)) || !GB_IS_PROJECT_FILE (item) || !(app_id = g_variant_get_string (variant, NULL)) || !(file_info = gb_project_file_get_file_info (GB_PROJECT_FILE (item))) || !(file = gb_project_file_get_file (GB_PROJECT_FILE (item))) || !(app_info = g_desktop_app_info_new (app_id))) return; display = gtk_widget_get_display (GTK_WIDGET (self)); launch_context = gdk_display_get_app_launch_context (display); files = g_list_append (NULL, file); g_app_info_launch (G_APP_INFO (app_info), files, G_APP_LAUNCH_CONTEXT (launch_context), NULL); g_list_free (files); }