summaryrefslogtreecommitdiff
path: root/src/nautilus-properties-window.c
diff options
context:
space:
mode:
authorCarlos Soriano <csoriano@redhat.com>2018-05-22 15:10:47 +0200
committerCarlos Soriano <csoriano@gnome.org>2018-06-20 09:59:44 +0200
commit02d041d003ad497a07a964ee2fb5a6378073cb34 (patch)
tree5b320d1dc2e3d5163633148b4fef92d2b95639db /src/nautilus-properties-window.c
parent813a469d445166e4b37e868e0960f30cde540976 (diff)
downloadnautilus-new-properties-extension.tar.gz
general: Make property extensions gtk version independentnew-properties-extension
Nautilus property extensions to add property pages to the property dialog was providing a GtkWidget to be modified by extensions. This makes the extension need to target a specific gtk version, which with the new gtk versioning might be hard to provide, and it's quite a bad practice since it requires everyone to be on top of any gtk update. This is currently holding the work for porting Nautilus to gtk4, since the Totem extension depends on us having the same gtk+ version, which is unlikely. This work makes the extension for providing property extensions not depend on gtk by providing a plain struct to be filled with data that later on Nautilus will layout on the UI. See https://gitlab.gnome.org/GNOME/nautilus/issues/276
Diffstat (limited to 'src/nautilus-properties-window.c')
-rw-r--r--src/nautilus-properties-window.c252
1 files changed, 199 insertions, 53 deletions
diff --git a/src/nautilus-properties-window.c b/src/nautilus-properties-window.c
index 9543d4105..f25a1a63e 100644
--- a/src/nautilus-properties-window.c
+++ b/src/nautilus-properties-window.c
@@ -203,7 +203,8 @@ static void remove_pending (StartupData *data,
gboolean cancel_call_when_ready,
gboolean cancel_timed_wait,
gboolean cancel_destroy_handler);
-static void append_extension_pages (NautilusPropertiesWindow *window);
+static void create_extension_pages_ui (NautilusPropertiesWindow *window);
+static void setup_extension_pages (NautilusPropertiesWindow *window);
static void name_field_focus_changed (GObject *object,
GParamSpec *pspec,
@@ -913,24 +914,21 @@ update_properties_window_title (NautilusPropertiesWindow *window)
}
static void
-clear_extension_pages (NautilusPropertiesWindow *window)
+clear_extension_pages_ui (NautilusPropertiesWindow *window)
{
int i;
int num_pages;
- GtkWidget *page;
+ GtkWidget *page_widget;
- num_pages = gtk_notebook_get_n_pages
- (GTK_NOTEBOOK (window->notebook));
+ num_pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook));
for (i = 0; i < num_pages; i++)
{
- page = gtk_notebook_get_nth_page
- (GTK_NOTEBOOK (window->notebook), i);
+ page_widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), i);
- if (g_object_get_data (G_OBJECT (page), "is-extension-page"))
+ if (g_object_get_data (G_OBJECT (page_widget), "is-extension-page"))
{
- gtk_notebook_remove_page
- (GTK_NOTEBOOK (window->notebook), i);
+ gtk_notebook_remove_page (GTK_NOTEBOOK (window->notebook), i);
num_pages--;
i--;
}
@@ -938,10 +936,66 @@ clear_extension_pages (NautilusPropertiesWindow *window)
}
static void
-refresh_extension_pages (NautilusPropertiesWindow *window)
+clear_extension_pages (NautilusPropertiesWindow *window)
+{
+ GList *model_providers;
+ GList *p;
+
+ model_providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_PROPERTY_PAGE_MODEL_PROVIDER);
+
+ for (p = model_providers; p != NULL; p = p->next)
+ {
+ NautilusPropertyPageModelProvider *model_provider;
+ NautilusPropertyPageModel *page_model = NULL;
+
+ model_provider = NAUTILUS_PROPERTY_PAGE_MODEL_PROVIDER (p->data);
+
+ page_model = nautilus_property_page_model_provider_get_model (model_provider);
+ g_signal_handlers_disconnect_by_data (page_model, window);
+ }
+}
+
+static void
+recreate_extension_pages (NautilusPropertiesWindow *window)
{
clear_extension_pages (window);
- append_extension_pages (window);
+ clear_extension_pages_ui (window);
+ setup_extension_pages (window);
+ create_extension_pages_ui (window);
+}
+
+static void
+refresh_extension_pages (NautilusPropertiesWindow *window)
+{
+ clear_extension_pages_ui (window);
+ create_extension_pages_ui (window);
+}
+
+static void
+setup_extension_pages (NautilusPropertiesWindow *window)
+{
+ GList *model_providers = NULL;
+ GList *p;
+
+ model_providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_PROPERTY_PAGE_MODEL_PROVIDER);
+
+ for (p = model_providers; p != NULL; p = p->next)
+ {
+ NautilusPropertyPageModelProvider *model_provider;
+ NautilusPropertyPageModel *page;
+
+ model_provider = NAUTILUS_PROPERTY_PAGE_MODEL_PROVIDER (p->data);
+
+ page = nautilus_property_page_model_provider_get_model (model_provider);
+
+ g_signal_connect_swapped (page, "notify::sections",
+ G_CALLBACK (refresh_extension_pages), window);
+ g_signal_connect_swapped (page, "notify::items",
+ G_CALLBACK (refresh_extension_pages), window);
+
+ nautilus_property_page_model_provider_set_files (model_provider,
+ window->original_files);
+ }
}
static void
@@ -1183,7 +1237,7 @@ properties_window_update (NautilusPropertiesWindow *window,
{
if (!mime_list_equal (window->mime_list, mime_list))
{
- refresh_extension_pages (window);
+ recreate_extension_pages (window);
}
g_list_free_full (window->mime_list, g_free);
@@ -4769,58 +4823,137 @@ create_permissions_page (NautilusPropertiesWindow *window)
}
}
-static void
-append_extension_pages (NautilusPropertiesWindow *window)
-{
- GList *providers;
- GList *p;
-
- providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER);
-
- for (p = providers; p != NULL; p = p->next)
- {
- NautilusPropertyPageProvider *provider;
- GList *pages;
- GList *l;
+static GtkWidget*
+create_extension_page_ui (NautilusPropertiesWindow *window,
+ NautilusPropertyPageModelProvider *model_provider)
+{
+ NautilusPropertyPageModel *page;
+ GtkWidget *page_container;
+ GList *sections;
+ GList *items;
+ GList *section_iter;
+
+ page = nautilus_property_page_model_provider_get_model (model_provider);
+ page_container = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_widget_set_margin_bottom (page_container, 6);
+ gtk_widget_set_margin_top (page_container, 6);
+ gtk_widget_set_margin_end (page_container, 6);
+ gtk_widget_set_margin_start (page_container, 6);
+
+ sections = nautilus_property_page_model_get_sections (page);
+ items = nautilus_property_page_model_get_items (page);
+ for (section_iter = sections; section_iter != NULL; section_iter = section_iter->next)
+ {
+ NautilusPropertyPageModelSection *section;
+ int section_id;
+ char *section_title;
+ char *section_title_markup;
+ GList *item_iter = NULL;
+ GtkBox *section_container;
+ GtkGrid *items_container;
+ GtkLabel *section_title_label;
+ int grid_row;
+
+ section = (NautilusPropertyPageModelSection *) section_iter->data;
+ section_id = section->id;
+ section_title = section->title;
+
+ section_container = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 6));
+
+ section_title_markup = g_markup_printf_escaped ("<b>%s</b>", section_title);
+ section_title_label = GTK_LABEL (gtk_label_new (NULL));
+ gtk_label_set_markup (section_title_label, section_title_markup);
+ gtk_label_set_xalign (section_title_label, 0);
+ gtk_container_add (GTK_CONTAINER (section_container),
+ GTK_WIDGET (section_title_label));
+
+ items_container = GTK_GRID (gtk_grid_new ());
+ gtk_grid_set_column_spacing (items_container, 20);
+ gtk_container_add (GTK_CONTAINER (section_container),
+ GTK_WIDGET (items_container));
+
+ gtk_container_add (GTK_CONTAINER (page_container),
+ GTK_WIDGET (section_container));
+
+ grid_row = 0;
+ for (item_iter = items; item_iter != NULL; item_iter = item_iter->next)
+ {
+ NautilusPropertyPageModelItem *item;
+ int item_section_id;
+ char *field;
+ char *value;
+ char *markup;
+ g_autofree gchar *field_text = NULL;
+ GtkLabel *value_label;
+ GtkLabel *field_label;
+
+ item = (NautilusPropertyPageModelItem *) item_iter->data;
+ item_section_id = item->section_id;
+ field = item->field;
+ value = item->value;
+
+ if (item_section_id != section_id)
+ {
+ continue;
+ }
- provider = NAUTILUS_PROPERTY_PAGE_PROVIDER (p->data);
+ field_text = g_strconcat (field, ":", NULL);
+ field_label = GTK_LABEL (gtk_label_new (field_text));
+ gtk_label_set_xalign (field_label, 0);
+ markup = g_markup_printf_escaped ("<i>%s</i>", value);
+ value_label = GTK_LABEL (gtk_label_new (NULL));
+ gtk_label_set_markup (value_label, markup);
- pages = nautilus_property_page_provider_get_pages
- (provider, window->original_files);
+ gtk_grid_attach (items_container, GTK_WIDGET (field_label),
+ 0, grid_row, 1, 1);
+ gtk_grid_attach (items_container, GTK_WIDGET (value_label),
+ 1, grid_row, 1, 1);
- for (l = pages; l != NULL; l = l->next)
- {
- NautilusPropertyPage *page;
- GtkWidget *page_widget;
- GtkWidget *label;
+ grid_row++;
+ }
+ }
- page = NAUTILUS_PROPERTY_PAGE (l->data);
+ return page_container;
+}
- g_object_get (G_OBJECT (page),
- "page", &page_widget, "label", &label,
- NULL);
+static void
+create_extension_pages_ui (NautilusPropertiesWindow *window)
+{
+ GList *model_providers = NULL;
+ GList *p;
- gtk_notebook_append_page (window->notebook,
- page_widget, label);
- gtk_container_child_set (GTK_CONTAINER (window->notebook),
- page_widget,
- "tab-expand", TRUE,
- NULL);
+ model_providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_PROPERTY_PAGE_MODEL_PROVIDER);
- g_object_set_data (G_OBJECT (page_widget),
- "is-extension-page",
- page);
+ for (p = model_providers; p != NULL; p = p->next)
+ {
+ NautilusPropertyPageModelProvider *model_provider;
+ NautilusPropertyPageModel *page;
+ GtkWidget *page_container;
+ GtkWidget *title;
- g_object_unref (page_widget);
- g_object_unref (label);
+ model_provider = NAUTILUS_PROPERTY_PAGE_MODEL_PROVIDER (p->data);
- g_object_unref (page);
+ if (!nautilus_property_page_model_provider_supports_files (model_provider))
+ {
+ continue;
}
- g_list_free (pages);
+ page = nautilus_property_page_model_provider_get_model (model_provider);
+ title = gtk_label_new (nautilus_property_page_model_get_title (page));
+ page_container = create_extension_page_ui (window, model_provider);
+ gtk_notebook_append_page (window->notebook, page_container, title);
+ gtk_widget_show_all (page_container);
+ gtk_container_child_set (GTK_CONTAINER (window->notebook),
+ page_container,
+ "tab-expand", TRUE,
+ NULL);
+
+ g_object_set_data (G_OBJECT (page_container),
+ "is-extension-page",
+ page);
}
- nautilus_module_extension_list_free (providers);
+ nautilus_module_extension_list_free (model_providers);
}
static gboolean
@@ -5141,7 +5274,7 @@ create_properties_window (StartupData *startup_data)
}
/* append pages from available views */
- append_extension_pages (window);
+ recreate_extension_pages (window);
/* Update from initial state */
properties_window_update (window, NULL);
@@ -5505,6 +5638,18 @@ real_finalize (GObject *object)
G_OBJECT_CLASS (nautilus_properties_window_parent_class)->finalize (object);
}
+static void
+real_dispose (GObject *object)
+{
+ NautilusPropertiesWindow *window;
+
+ window = NAUTILUS_PROPERTIES_WINDOW (object);
+
+ clear_extension_pages (window);
+
+ G_OBJECT_CLASS (nautilus_properties_window_parent_class)->dispose (object);
+}
+
/* icon selection callback to set the image of the file object to the selected file */
static void
set_icon (const char *icon_uri,
@@ -5736,6 +5881,7 @@ nautilus_properties_window_class_init (NautilusPropertiesWindowClass *class)
GtkBindingSet *binding_set;
G_OBJECT_CLASS (class)->finalize = real_finalize;
+ G_OBJECT_CLASS (class)->dispose = real_dispose;
GTK_WIDGET_CLASS (class)->destroy = real_destroy;
GTK_DIALOG_CLASS (class)->response = real_response;