[gnome-builder/wip/gtk4-port: 645/1774] libide/gui: setup preferences window for project options
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/gtk4-port: 645/1774] libide/gui: setup preferences window for project options
- Date: Mon, 11 Jul 2022 22:31:19 +0000 (UTC)
commit c82d1521cab6f7572b609bbff9ca79a2cc9d7673
Author: Christian Hergert <chergert redhat com>
Date: Tue Apr 19 17:41:45 2022 -0700
libide/gui: setup preferences window for project options
The goal here is to allow plugins to have overrides for projects as well
as having the projects configurations. All of that still needs to be
done of course.
src/libide/gui/gtk/menus.ui | 2 +-
src/libide/gui/ide-preferences-builtin.c | 5 ++
src/libide/gui/ide-preferences-window.c | 111 ++++++++++++++++++++-----------
src/libide/gui/ide-workbench.c | 45 +++++++++++++
4 files changed, 123 insertions(+), 40 deletions(-)
---
diff --git a/src/libide/gui/gtk/menus.ui b/src/libide/gui/gtk/menus.ui
index 4a579fd25..a4c7f5466 100644
--- a/src/libide/gui/gtk/menus.ui
+++ b/src/libide/gui/gtk/menus.ui
@@ -57,7 +57,7 @@
</submenu>
<item>
<attribute name="label" translatable="yes">Configure Project…</attribute>
- <attribute name="action">buildui.configure</attribute>
+ <attribute name="action">workbench.configure</attribute>
</item>
</section>
<section id="build-menu-target">
diff --git a/src/libide/gui/ide-preferences-builtin.c b/src/libide/gui/ide-preferences-builtin.c
index ab40d0680..10a0a548f 100644
--- a/src/libide/gui/ide-preferences-builtin.c
+++ b/src/libide/gui/ide-preferences-builtin.c
@@ -664,6 +664,10 @@ static const IdePreferencePageEntry pages[] = {
{ NULL, "plugins", "plugins", "org.gnome.Builder-plugins-symbolic", 700, N_("Plugins") },
};
+static const IdePreferencePageEntry project_pages[] = {
+ { NULL, "code", "languages", "org.gnome.Builder-languages-symbolic", 100, N_("Languages") },
+};
+
static const IdePreferenceGroupEntry groups[] = {
{ "appearance", "style", 0, N_("Appearance") },
{ "appearance", "interface", 1000, N_("Interface") },
@@ -781,5 +785,6 @@ _ide_preferences_builtin_register (IdePreferencesWindow *window)
}
else if (mode == IDE_PREFERENCES_MODE_PROJECT)
{
+ ide_preferences_window_add_pages (window, project_pages, G_N_ELEMENTS (project_pages), NULL);
}
}
diff --git a/src/libide/gui/ide-preferences-window.c b/src/libide/gui/ide-preferences-window.c
index 0b0babe63..c5e17d6df 100644
--- a/src/libide/gui/ide-preferences-window.c
+++ b/src/libide/gui/ide-preferences-window.c
@@ -23,13 +23,15 @@
#include "config.h"
#include <glib/gi18n.h>
-#include <libpeas/peas.h>
+
+#include <libide-plugins.h>
#include "ide-gui-enums.h"
#include "ide-config-view-addin.h"
#include "ide-preferences-addin.h"
#include "ide-preferences-builtin-private.h"
#include "ide-preferences-window.h"
+#include "ide-workbench.h"
struct _IdePreferencesWindow
{
@@ -37,7 +39,7 @@ struct _IdePreferencesWindow
IdePreferencesMode mode;
- PeasExtensionSet *addins;
+ IdeExtensionSetAdapter *addins;
GtkToggleButton *search_button;
GtkButton *back_button;
@@ -281,49 +283,43 @@ search_changed_cb (IdePreferencesWindow *self,
}
static void
-ide_preferences_window_extension_added (PeasExtensionSet *set,
- PeasPluginInfo *plugin_info,
- PeasExtension *exten,
- gpointer user_data)
+ide_preferences_window_extension_added (IdeExtensionSetAdapter *set,
+ PeasPluginInfo *plugin_info,
+ PeasExtension *exten,
+ gpointer user_data)
{
IdePreferencesWindow *self = user_data;
IDE_ENTRY;
- g_assert (PEAS_IS_EXTENSION_SET (set));
+ g_assert (IDE_IS_EXTENSION_SET_ADAPTER (set));
g_assert (plugin_info != NULL);
g_assert (IDE_IS_PREFERENCES_WINDOW (self));
+ g_assert (IDE_IS_PREFERENCES_ADDIN (exten));
- if (IDE_IS_PREFERENCES_ADDIN (exten))
- {
- ide_preferences_addin_load (IDE_PREFERENCES_ADDIN (exten), self);
- IDE_EXIT;
- }
+ ide_preferences_addin_load (IDE_PREFERENCES_ADDIN (exten), self);
- g_assert_not_reached ();
+ IDE_EXIT;
}
static void
-ide_preferences_window_extension_removed (PeasExtensionSet *set,
- PeasPluginInfo *plugin_info,
- PeasExtension *exten,
- gpointer user_data)
+ide_preferences_window_extension_removed (IdeExtensionSetAdapter *set,
+ PeasPluginInfo *plugin_info,
+ PeasExtension *exten,
+ gpointer user_data)
{
IdePreferencesWindow *self = user_data;
IDE_ENTRY;
- g_assert (PEAS_IS_EXTENSION_SET (set));
+ g_assert (IDE_IS_EXTENSION_SET_ADAPTER (set));
g_assert (plugin_info != NULL);
g_assert (IDE_IS_PREFERENCES_WINDOW (self));
+ g_assert (IDE_IS_PREFERENCES_ADDIN (exten));
- if (IDE_IS_PREFERENCES_ADDIN (exten))
- {
- ide_preferences_addin_unload (IDE_PREFERENCES_ADDIN (exten), self);
- IDE_EXIT;
- }
+ ide_preferences_addin_unload (IDE_PREFERENCES_ADDIN (exten), self);
- g_assert_not_reached ();
+ IDE_EXIT;
}
static void
@@ -335,13 +331,26 @@ ide_preferences_window_load_addins (IdePreferencesWindow *self)
_ide_preferences_builtin_register (self);
if (self->mode == IDE_PREFERENCES_MODE_APPLICATION)
- self->addins = peas_extension_set_new (peas_engine_get_default (),
- IDE_TYPE_PREFERENCES_ADDIN,
- NULL);
+ {
+ self->addins = ide_extension_set_adapter_new (NULL,
+ peas_engine_get_default (),
+ IDE_TYPE_PREFERENCES_ADDIN,
+ "Preferences-Kind", "application");
+ }
else if (self->mode == IDE_PREFERENCES_MODE_PROJECT)
- self->addins = peas_extension_set_new (peas_engine_get_default (),
- IDE_TYPE_CONFIG_VIEW_ADDIN,
- NULL);
+ {
+ IdeWorkbench *workbench = IDE_WORKBENCH (gtk_window_get_group (GTK_WINDOW (self)));
+ IdeContext *context = ide_workbench_get_context (workbench);
+
+ self->addins = ide_extension_set_adapter_new (IDE_OBJECT (context),
+ peas_engine_get_default (),
+ IDE_TYPE_PREFERENCES_ADDIN,
+ "Preferences-Kind", "project");
+
+ /* TODO: This also needs configurations, but that could be under a page
+ * if we wanted to.
+ */
+ }
if (self->addins == NULL)
return;
@@ -356,9 +365,9 @@ ide_preferences_window_load_addins (IdePreferencesWindow *self)
G_CALLBACK (ide_preferences_window_extension_removed),
self);
- peas_extension_set_foreach (self->addins,
- ide_preferences_window_extension_added,
- self);
+ ide_extension_set_adapter_foreach (self->addins,
+ ide_preferences_window_extension_added,
+ self);
}
static void
@@ -366,7 +375,7 @@ ide_preferences_window_dispose (GObject *object)
{
IdePreferencesWindow *self = (IdePreferencesWindow *)object;
- g_clear_object (&self->addins);
+ ide_clear_and_destroy_object (&self->addins);
g_clear_pointer (&self->settings, g_hash_table_unref);
g_clear_handle_id (&self->rebuild_source, g_source_remove);
@@ -390,13 +399,16 @@ ide_preferences_window_dispose (GObject *object)
}
static void
-ide_preferences_window_constructed (GObject *object)
+ide_preferences_window_show (GtkWidget *widget)
{
- IdePreferencesWindow *self = (IdePreferencesWindow *)object;
+ IdePreferencesWindow *self = (IdePreferencesWindow *)widget;
- G_OBJECT_CLASS (ide_preferences_window_parent_class)->constructed (object);
+ g_assert (IDE_IS_PREFERENCES_WINDOW (self));
+
+ if (self->addins == NULL)
+ ide_preferences_window_load_addins (self);
- ide_preferences_window_load_addins (self);
+ GTK_WIDGET_CLASS (ide_preferences_window_parent_class)->show (widget);
}
static void
@@ -443,11 +455,12 @@ ide_preferences_window_class_init (IdePreferencesWindowClass *klass)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
- object_class->constructed = ide_preferences_window_constructed;
object_class->dispose = ide_preferences_window_dispose;
object_class->get_property = ide_preferences_window_get_property;
object_class->set_property = ide_preferences_window_set_property;
+ widget_class->show = ide_preferences_window_show;
+
properties [PROP_MODE] =
g_param_spec_enum ("mode",
"Mode",
@@ -642,11 +655,29 @@ group_is_empty (AdwPreferencesGroup *group)
gtk_widget_get_last_child (listbox_box) == listbox;
}
+static char *
+get_project_title (IdePreferencesWindow *self)
+{
+ IdeWorkbench *workbench;
+ IdeContext *context;
+
+ g_assert (IDE_IS_PREFERENCES_WINDOW (self));
+
+ if (self->mode != IDE_PREFERENCES_MODE_PROJECT)
+ return NULL;
+
+ workbench = IDE_WORKBENCH (gtk_window_get_group (GTK_WINDOW (self)));
+ context = ide_workbench_get_context (workbench);
+
+ return ide_context_dup_title (context);
+}
+
static void
ide_preferences_window_page_activated_cb (IdePreferencesWindow *self,
GtkListBoxRow *row,
GtkListBox *list_box)
{
+ g_autofree char *project_title = NULL;
const IdePreferencePageEntry *entry;
const IdePreferencePageEntry *parent;
AdwPreferencesPage *page;
@@ -669,6 +700,8 @@ ide_preferences_window_page_activated_cb (IdePreferencesWindow *self,
if (parent != NULL)
adw_window_title_set_title (self->pages_title, parent->title);
+ else if ((project_title = get_project_title (self)))
+ adw_window_title_set_title (self->pages_title, project_title);
else
adw_window_title_set_title (self->pages_title, _("Preferences"));
diff --git a/src/libide/gui/ide-workbench.c b/src/libide/gui/ide-workbench.c
index be6e1665d..99fbe8251 100644
--- a/src/libide/gui/ide-workbench.c
+++ b/src/libide/gui/ide-workbench.c
@@ -38,6 +38,7 @@
#include "ide-application.h"
#include "ide-gui-global.h"
+#include "ide-preferences-window.h"
#include "ide-primary-workspace.h"
#include "ide-workbench-addin.h"
#include "ide-workbench-private.h"
@@ -126,12 +127,15 @@ static void ide_workbench_action_reload_all (IdeWorkbench *self,
GVariant *param);
static void ide_workbench_action_global_search (IdeWorkbench *self,
GVariant *param);
+static void ide_workbench_action_configure (IdeWorkbench *self,
+ GVariant *param);
IDE_DEFINE_ACTION_GROUP (IdeWorkbench, ide_workbench, {
{ "close", ide_workbench_action_close },
{ "open", ide_workbench_action_open },
{ "reload-files", ide_workbench_action_reload_all },
{ "global-search", ide_workbench_action_global_search },
+ { "configure", ide_workbench_action_configure },
{ "-inspector", ide_workbench_action_inspector },
{ "-object-tree", ide_workbench_action_object_tree },
{ "-dump-tasks", ide_workbench_action_dump_tasks },
@@ -495,6 +499,7 @@ ide_workbench_class_init (IdeWorkbenchClass *klass)
static void
ide_workbench_init (IdeWorkbench *self)
{
+ ide_workbench_set_action_enabled (self, "configure", FALSE);
}
static void
@@ -1000,6 +1005,9 @@ ide_workbench_load_project_completed (IdeWorkbench *self,
build_manager = ide_build_manager_from_context (self->context);
_ide_build_manager_start (build_manager);
+ /* Enable actions that are available to projects */
+ ide_workbench_set_action_enabled (self, "configure", TRUE);
+
ide_task_return_boolean (task, TRUE);
}
@@ -2607,3 +2615,40 @@ ide_workbench_resolve_file_finish (IdeWorkbench *self,
IDE_RETURN (g_steal_pointer (&ret));
}
+
+static void
+ide_workbench_action_configure (IdeWorkbench *self,
+ GVariant *param)
+{
+ GtkWindow *window;
+ GList *windows;
+ gboolean found = FALSE;
+
+ g_assert (IDE_IS_WORKBENCH (self));
+
+ windows = gtk_window_group_list_windows (GTK_WINDOW_GROUP (self));
+
+ for (const GList *iter = windows; iter; iter = iter->next)
+ {
+ window = iter->data;
+
+ if (IDE_IS_PREFERENCES_WINDOW (window) &&
+ ide_preferences_window_get_mode (IDE_PREFERENCES_WINDOW (window)) == IDE_PREFERENCES_MODE_PROJECT)
+ {
+ gtk_window_present (window);
+ found = TRUE;
+ break;
+ }
+ }
+
+ g_list_free (windows);
+
+ if (!found)
+ {
+ window = g_object_new (IDE_TYPE_PREFERENCES_WINDOW,
+ "mode", IDE_PREFERENCES_MODE_PROJECT,
+ NULL);
+ gtk_window_group_add_window (GTK_WINDOW_GROUP (self), window);
+ gtk_window_present (window);
+ }
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]