[gnome-builder] greeter: use greeter.open for open action
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] greeter: use greeter.open for open action
- Date: Thu, 14 Jul 2022 00:23:19 +0000 (UTC)
commit 7a07d7bb748f99597db00e756906382a3174cd22
Author: Christian Hergert <chergert redhat com>
Date: Wed Jul 13 17:23:13 2022 -0700
greeter: use greeter.open for open action
This also ensures that we are marking it disabled when the project load is
started. That makes the transition a bit less jarring. Also, now we can
drop the -actions.c file since everything is self contained.
src/libide/greeter/ide-greeter-buttons-section.c | 2 +-
src/libide/greeter/ide-greeter-private.h | 31 ---
src/libide/greeter/ide-greeter-workspace-actions.c | 254 ---------------------
src/libide/greeter/ide-greeter-workspace.c | 226 +++++++++++++++++-
src/libide/greeter/meson.build | 2 -
5 files changed, 224 insertions(+), 291 deletions(-)
---
diff --git a/src/libide/greeter/ide-greeter-buttons-section.c
b/src/libide/greeter/ide-greeter-buttons-section.c
index 0f36f3bdb..63c38727c 100644
--- a/src/libide/greeter/ide-greeter-buttons-section.c
+++ b/src/libide/greeter/ide-greeter-buttons-section.c
@@ -77,7 +77,7 @@ ide_greeter_buttons_section_init (IdeGreeterButtonsSection *self)
g_object_new (GTK_TYPE_BUTTON,
"label", _("Select a _Folder…"),
"visible", TRUE,
- "action-name", "win.open",
+ "action-name", "greeter.open",
"use-underline", TRUE,
NULL));
}
diff --git a/src/libide/greeter/ide-greeter-workspace.c b/src/libide/greeter/ide-greeter-workspace.c
index e08404e0c..440d38103 100644
--- a/src/libide/greeter/ide-greeter-workspace.c
+++ b/src/libide/greeter/ide-greeter-workspace.c
@@ -26,7 +26,6 @@
#include <libpeas/peas.h>
#include "ide-greeter-buttons-section.h"
-#include "ide-greeter-private.h"
#include "ide-greeter-resources.h"
#include "ide-greeter-row.h"
#include "ide-greeter-workspace.h"
@@ -596,6 +595,228 @@ ide_greeter_workspace_page_action (GtkWidget *widget,
IDE_EXIT;
}
+static void
+ide_greeter_workspace_dialog_response (IdeGreeterWorkspace *self,
+ gint response_id,
+ GtkFileChooserDialog *dialog)
+{
+ IDE_ENTRY;
+
+ g_assert (IDE_IS_GREETER_WORKSPACE (self));
+ g_assert (GTK_IS_FILE_CHOOSER_DIALOG (dialog));
+
+ if (response_id == GTK_RESPONSE_OK)
+ {
+ g_autoptr(IdeProjectInfo) project_info = NULL;
+ g_autoptr(GFile) project_file = NULL;
+ GtkFileFilter *filter;
+
+ project_file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
+
+ project_info = ide_project_info_new ();
+ ide_project_info_set_file (project_info, project_file);
+
+ if ((filter = gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog))))
+ {
+ const gchar *module_name = g_object_get_data (G_OBJECT (filter), "MODULE_NAME");
+
+ if (module_name != NULL)
+ ide_project_info_set_build_system_hint (project_info, module_name);
+
+ /* If this is a directory selection, then make sure we set the
+ * directory on the project-info too. That way we don't rely on
+ * it being set elsewhere (which could be a translated symlink path).
+ */
+ if (g_object_get_data (G_OBJECT (filter), "IS_DIRECTORY"))
+ ide_project_info_set_directory (project_info, project_file);
+ }
+
+ ide_greeter_workspace_open_project (self, project_info);
+ }
+
+ gtk_window_destroy (GTK_WINDOW (dialog));
+
+ IDE_EXIT;
+}
+
+static void
+ide_greeter_workspace_dialog_notify_filter (IdeGreeterWorkspace *self,
+ GParamSpec *pspec,
+ GtkFileChooserDialog *dialog)
+{
+ GtkFileFilter *filter;
+ GtkFileChooserAction action;
+ const gchar *title;
+
+ IDE_ENTRY;
+
+ g_assert (IDE_IS_GREETER_WORKSPACE (self));
+ g_assert (pspec != NULL);
+ g_assert (GTK_IS_FILE_CHOOSER_DIALOG (dialog));
+
+ filter = gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog));
+
+ if (filter && g_object_get_data (G_OBJECT (filter), "IS_DIRECTORY"))
+ {
+ action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
+ title = _("Select Project Folder");
+ }
+ else
+ {
+ action = GTK_FILE_CHOOSER_ACTION_OPEN;
+ title = _("Select Project File");
+ }
+
+ gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), action);
+ gtk_window_set_title (GTK_WINDOW (dialog), title);
+
+ IDE_EXIT;
+}
+
+static void
+ide_greeter_workspace_open_action (GtkWidget *widget,
+ const char *action_name,
+ GVariant *param)
+{
+ IdeGreeterWorkspace *self = (IdeGreeterWorkspace *)widget;
+ g_autoptr(GFile) projects_dir = NULL;
+ GtkFileChooserDialog *dialog;
+ GtkFileFilter *all_filter;
+ const GList *list;
+ gint64 last_priority = G_MAXINT64;
+
+ IDE_ENTRY;
+
+ g_assert (IDE_IS_GREETER_WORKSPACE (self));
+ g_assert (param == NULL);
+
+ list = peas_engine_get_plugin_list (peas_engine_get_default ());
+
+ dialog = g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG,
+ "action", GTK_FILE_CHOOSER_ACTION_OPEN,
+ "transient-for", self,
+ "modal", TRUE,
+ "title", _("Select Project Folder"),
+ "visible", TRUE,
+ NULL);
+ gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("_Open"), GTK_RESPONSE_OK,
+ NULL);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+
+ g_signal_connect_object (dialog,
+ "notify::filter",
+ G_CALLBACK (ide_greeter_workspace_dialog_notify_filter),
+ self,
+ G_CONNECT_SWAPPED);
+
+ all_filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (all_filter, _("All Project Types"));
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), all_filter);
+
+ /* For testing with no plugins */
+ if (list == NULL)
+ gtk_file_filter_add_pattern (all_filter, "*");
+
+ for (; list != NULL; list = list->next)
+ {
+ PeasPluginInfo *plugin_info = list->data;
+ const gchar *module_name = peas_plugin_info_get_module_name (plugin_info);
+ GtkFileFilter *filter;
+ const gchar *pattern;
+ const gchar *content_type;
+ const gchar *name;
+ const gchar *priority;
+ gchar **patterns;
+ gchar **content_types;
+ gint i;
+
+ if (!peas_plugin_info_is_loaded (plugin_info))
+ continue;
+
+ name = peas_plugin_info_get_external_data (plugin_info, "X-Project-File-Filter-Name");
+ if (name == NULL)
+ continue;
+
+ pattern = peas_plugin_info_get_external_data (plugin_info, "X-Project-File-Filter-Pattern");
+ content_type = peas_plugin_info_get_external_data (plugin_info, "X-Project-File-Filter-Content-Type");
+ priority = peas_plugin_info_get_external_data (plugin_info, "X-Project-File-Filter-Priority");
+
+ if (pattern == NULL && content_type == NULL)
+ continue;
+
+ patterns = g_strsplit (pattern ?: "", ",", 0);
+ content_types = g_strsplit (content_type ?: "", ",", 0);
+
+ filter = gtk_file_filter_new ();
+
+ gtk_file_filter_set_name (filter, name);
+
+ if (!ide_str_equal0 (module_name, "greeter"))
+ g_object_set_data_full (G_OBJECT (filter), "MODULE_NAME", g_strdup (module_name), g_free);
+
+ for (i = 0; patterns [i] != NULL; i++)
+ {
+ if (*patterns [i])
+ {
+ gtk_file_filter_add_pattern (filter, patterns [i]);
+ gtk_file_filter_add_pattern (all_filter, patterns [i]);
+ }
+ }
+
+ for (i = 0; content_types [i] != NULL; i++)
+ {
+ if (*content_types [i])
+ {
+ gtk_file_filter_add_mime_type (filter, content_types [i]);
+ gtk_file_filter_add_mime_type (all_filter, content_types [i]);
+
+ /* Helper so we can change the file chooser action to OPEN_DIRECTORY,
+ * otherwise the user won't be able to choose a directory, it will
+ * instead dive into the directory.
+ */
+ if (g_strcmp0 (content_types [i], "inode/directory") == 0)
+ g_object_set_data (G_OBJECT (filter), "IS_DIRECTORY", GINT_TO_POINTER (1));
+ }
+ }
+
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+
+ /* Look at the priority to set the default file filter. */
+ if (priority != NULL)
+ {
+ gint64 pval = g_ascii_strtoll (priority, NULL, 10);
+
+ if (pval < last_priority)
+ {
+ gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter);
+ last_priority = pval;
+ }
+ }
+
+ g_strfreev (patterns);
+ g_strfreev (content_types);
+ }
+
+ g_signal_connect_object (dialog,
+ "response",
+ G_CALLBACK (ide_greeter_workspace_dialog_response),
+ self,
+ G_CONNECT_SWAPPED);
+
+ /* If unset, set the default filter */
+ if (last_priority == G_MAXINT64)
+ gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), all_filter);
+
+ projects_dir = g_file_new_for_path (ide_get_projects_dir ());
+ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), projects_dir, NULL);
+
+ gtk_window_present (GTK_WINDOW (dialog));
+
+ IDE_EXIT;
+}
+
static void
ide_greeter_workspace_dispose (GObject *object)
{
@@ -706,6 +927,7 @@ ide_greeter_workspace_class_init (IdeGreeterWorkspaceClass *klass)
gtk_widget_class_bind_template_child (widget_class, IdeGreeterWorkspace, title);
gtk_widget_class_bind_template_callback (widget_class, stack_notify_visible_child_cb);
+ gtk_widget_class_install_action (widget_class, "greeter.open", NULL, ide_greeter_workspace_open_action);
gtk_widget_class_install_action (widget_class, "greeter.page", "s", ide_greeter_workspace_page_action);
gtk_widget_class_add_binding_action (widget_class, GDK_KEY_Left, GDK_ALT_MASK, "win.page", "s",
"overview");
@@ -762,8 +984,6 @@ ide_greeter_workspace_init (IdeGreeterWorkspace *self)
G_CONNECT_SWAPPED);
stack_notify_visible_child_cb (self, NULL, self->pages);
-
- _ide_greeter_workspace_init_actions (self);
}
IdeGreeterWorkspace *
diff --git a/src/libide/greeter/meson.build b/src/libide/greeter/meson.build
index c2be40390..278cd025d 100644
--- a/src/libide/greeter/meson.build
+++ b/src/libide/greeter/meson.build
@@ -16,7 +16,6 @@ libide_greeter_public_headers = [
libide_greeter_private_headers = [
'ide-greeter-buttons-section.h',
- 'ide-greeter-private.h',
]
install_headers(libide_greeter_public_headers, subdir: libide_greeter_header_subdir)
@@ -32,7 +31,6 @@ libide_greeter_public_sources = [
]
libide_greeter_private_sources = [
- 'ide-greeter-workspace-actions.c',
'ide-greeter-buttons-section.c',
]
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]