summaryrefslogtreecommitdiff
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
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
-rw-r--r--extensions/image-properties/meson.build8
-rw-r--r--extensions/image-properties/nautilus-image-properties-module.c6
-rw-r--r--extensions/image-properties/nautilus-image-properties-page-model-provider.c250
-rw-r--r--extensions/image-properties/nautilus-image-properties-page-model-provider.h (renamed from extensions/image-properties/nautilus-image-properties-page-provider.h)10
-rw-r--r--extensions/image-properties/nautilus-image-properties-page-model.c (renamed from extensions/image-properties/nautilus-image-properties-page.c)170
-rw-r--r--extensions/image-properties/nautilus-image-properties-page-model.h (renamed from extensions/image-properties/nautilus-image-properties-page.h)16
-rw-r--r--extensions/image-properties/nautilus-image-properties-page-provider.c136
-rw-r--r--libnautilus-extension/meson.build14
-rw-r--r--libnautilus-extension/nautilus-extension.h6
-rw-r--r--libnautilus-extension/nautilus-property-page-model-provider.c118
-rw-r--r--libnautilus-extension/nautilus-property-page-model-provider.h (renamed from libnautilus-extension/nautilus-property-page-provider.h)49
-rw-r--r--libnautilus-extension/nautilus-property-page-model.c346
-rw-r--r--libnautilus-extension/nautilus-property-page-model.h80
-rw-r--r--libnautilus-extension/nautilus-property-page-provider.c70
-rw-r--r--libnautilus-extension/nautilus-property-page.c246
-rw-r--r--libnautilus-extension/nautilus-property-page.h53
-rw-r--r--meson.build2
-rw-r--r--src/nautilus-properties-window.c252
18 files changed, 1136 insertions, 696 deletions
diff --git a/extensions/image-properties/meson.build b/extensions/image-properties/meson.build
index b292a1905..76a76213b 100644
--- a/extensions/image-properties/meson.build
+++ b/extensions/image-properties/meson.build
@@ -1,10 +1,10 @@
shared_module (
'nautilus-image-properties', [
'nautilus-image-properties-module.c',
- 'nautilus-image-properties-page.c',
- 'nautilus-image-properties-page.h',
- 'nautilus-image-properties-page-provider.c',
- 'nautilus-image-properties-page-provider.h'
+ 'nautilus-image-properties-page-model.c',
+ 'nautilus-image-properties-page-model.h',
+ 'nautilus-image-properties-page-model-provider.c',
+ 'nautilus-image-properties-page-model-provider.h'
],
dependencies: [
gexiv,
diff --git a/extensions/image-properties/nautilus-image-properties-module.c b/extensions/image-properties/nautilus-image-properties-module.c
index 0ce02e973..3e4619b92 100644
--- a/extensions/image-properties/nautilus-image-properties-module.c
+++ b/extensions/image-properties/nautilus-image-properties-module.c
@@ -18,7 +18,7 @@
#include <config.h>
-#include "nautilus-image-properties-page-provider.h"
+#include "nautilus-image-properties-page-model-provider.h"
#include <glib/gi18n-lib.h>
@@ -30,7 +30,7 @@ nautilus_module_initialize (GTypeModule *module)
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
- nautilus_image_properties_page_provider_load (module);
+ nautilus_image_properties_page_model_provider_load (module);
}
void
@@ -47,7 +47,7 @@ nautilus_module_list_types (const GType **types,
g_assert (types != NULL);
g_assert (num_types != NULL);
- type_list[0] = NAUTILUS_TYPE_IMAGE_PROPERTIES_PAGE_PROVIDER;
+ type_list[0] = NAUTILUS_TYPE_IMAGE_PROPERTIES_PAGE_MODEL_PROVIDER;
*types = type_list;
*num_types = G_N_ELEMENTS (type_list);
diff --git a/extensions/image-properties/nautilus-image-properties-page-model-provider.c b/extensions/image-properties/nautilus-image-properties-page-model-provider.c
new file mode 100644
index 000000000..cf55f1094
--- /dev/null
+++ b/extensions/image-properties/nautilus-image-properties-page-model-provider.c
@@ -0,0 +1,250 @@
+/* Copyright (C) 2004 Red Hat, Inc
+ * Copyright (c) 2007 Novell, Inc.
+ * Copyright (c) 2017 Thomas Bechtold <thomasbechtold@jpberlin.de>
+ * Copyright (c) 2018 Ernestas Kulik <ernestask@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Alexander Larsson <alexl@redhat.com>
+ * XMP support by Hubert Figuiere <hfiguiere@novell.com>
+ */
+
+#include "nautilus-image-properties-page-model-provider.h"
+#include "nautilus-image-properties-page-model.h"
+#include <glib/gi18n.h>
+#include <nautilus-extension.h>
+
+#define NAUTILUS_IMAGE_PROPERTIES_PAGE_MODEL_NAME "NautilusImagePropertiesPageModel::property_page"
+
+struct _NautilusImagePropertiesPageModelProvider
+{
+ GObject parent_instance;
+
+ NautilusPropertyPageModel *page_model;
+ GList *files;
+};
+
+enum
+{
+ PROP_0,
+ PROP_PAGE_MODEL,
+ PROP_FILES,
+ N_PROPERTIES
+};
+
+static void property_page_provider_iface_init (NautilusPropertyPageModelProviderInterface *iface);
+
+G_DEFINE_DYNAMIC_TYPE_EXTENDED (NautilusImagePropertiesPageModelProvider,
+ nautilus_image_properties_page_model_provider,
+ G_TYPE_OBJECT,
+ 0,
+ G_IMPLEMENT_INTERFACE_DYNAMIC (NAUTILUS_TYPE_PROPERTY_PAGE_MODEL_PROVIDER,
+ property_page_provider_iface_init))
+
+static gboolean
+is_mime_type_supported (const char *mime_type)
+{
+ g_autoptr (GSList) formats = NULL;
+
+ if (mime_type == NULL)
+ {
+ return FALSE;
+ }
+
+ formats = gdk_pixbuf_get_formats ();
+
+ for (GSList *l = formats; l != NULL; l = l->next)
+ {
+ g_auto (GStrv) mime_types = NULL;
+
+ mime_types = gdk_pixbuf_format_get_mime_types (l->data);
+ if (mime_types == NULL)
+ {
+ continue;
+ }
+
+ if (g_strv_contains ((const char *const *) mime_types, mime_type))
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static NautilusPropertyPageModel*
+get_model (NautilusPropertyPageModelProvider *provider)
+{
+ NautilusImagePropertiesPageModelProvider *self;
+
+ self = NAUTILUS_IMAGE_PROPERTIES_PAGE_MODEL_PROVIDER (provider);
+
+ return self->page_model;
+}
+
+static void
+set_files (NautilusPropertyPageModelProvider *provider,
+ GList *files)
+{
+ NautilusImagePropertiesPageModelProvider *self;
+ NautilusFileInfo *file_info;
+ g_autofree char *mime_type = NULL;
+
+ self = NAUTILUS_IMAGE_PROPERTIES_PAGE_MODEL_PROVIDER (provider);
+
+ if (self->files != NULL)
+ {
+ g_list_free_full (self->files, g_object_unref);
+ self->files = NULL;
+ }
+
+ self->files = g_list_copy_deep (files,
+ (GCopyFunc) g_object_ref, NULL);
+
+ if (self->files == NULL || self->files->next != NULL)
+ {
+ return;
+ }
+
+ file_info = NAUTILUS_FILE_INFO (self->files->data);
+ mime_type = nautilus_file_info_get_mime_type (file_info);
+ if (!is_mime_type_supported (mime_type))
+ {
+ return;
+ }
+
+ nautilus_image_properties_page_model_load_from_file_info (NAUTILUS_IMAGE_PROPERTIES_PAGE_MODEL (self->page_model),
+ file_info);
+}
+
+static gboolean
+supports_files (NautilusPropertyPageModelProvider *provider)
+{
+ g_autofree char *mime_type = NULL;
+ NautilusFileInfo *file_info;
+ NautilusImagePropertiesPageModelProvider *self;
+
+ self = NAUTILUS_IMAGE_PROPERTIES_PAGE_MODEL_PROVIDER (provider);
+ if (self->files == NULL || self->files->next != NULL)
+ {
+ return FALSE;
+ }
+
+ file_info = NAUTILUS_FILE_INFO (self->files->data);
+ mime_type = nautilus_file_info_get_mime_type (file_info);
+ if (!is_mime_type_supported (mime_type))
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+nautilus_image_properties_page_model_provider_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ NautilusImagePropertiesPageModelProvider *self = NAUTILUS_IMAGE_PROPERTIES_PAGE_MODEL_PROVIDER (object);
+ switch (prop_id)
+ {
+ case PROP_PAGE_MODEL:
+ {
+ g_value_set_object (value, self->page_model);
+ }
+ break;
+
+ case PROP_FILES:
+ {
+ g_value_set_pointer (value, self->files);
+ }
+ break;
+
+ default:
+ {
+ g_assert_not_reached ();
+ }
+ }
+}
+
+static void
+nautilus_image_properties_page_model_provider_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ NautilusImagePropertiesPageModelProvider *self = NAUTILUS_IMAGE_PROPERTIES_PAGE_MODEL_PROVIDER (object);
+ switch (prop_id)
+ {
+ case PROP_PAGE_MODEL:
+ {
+ g_clear_object (&self->page_model);
+ self->page_model = NAUTILUS_PROPERTY_PAGE_MODEL (g_value_get_object (value));
+ }
+ break;
+
+ case PROP_FILES:
+ {
+ set_files (NAUTILUS_PROPERTY_PAGE_MODEL_PROVIDER (self),
+ g_value_get_pointer (value));
+ }
+ break;
+
+ default:
+ {
+ g_assert_not_reached ();
+ }
+ }
+}
+
+static void
+property_page_provider_iface_init (NautilusPropertyPageModelProviderInterface *iface)
+{
+ iface->get_model = get_model;
+ iface->set_files = set_files;
+ iface->supports_files = supports_files;
+
+}
+
+static void
+nautilus_image_properties_page_model_provider_init (NautilusImagePropertiesPageModelProvider *self)
+{
+ self->page_model = NAUTILUS_PROPERTY_PAGE_MODEL (nautilus_image_properties_page_model_new ());
+}
+
+static void
+nautilus_image_properties_page_model_provider_class_init (NautilusImagePropertiesPageModelProviderClass *klass)
+{
+ GObjectClass *oclass;
+
+ oclass = G_OBJECT_CLASS (klass);
+ oclass->get_property = nautilus_image_properties_page_model_provider_get_property;
+ oclass->set_property = nautilus_image_properties_page_model_provider_set_property;
+
+ g_object_class_override_property (oclass, PROP_PAGE_MODEL, "page-model");
+ g_object_class_override_property (oclass, PROP_FILES, "files");
+}
+
+static void
+nautilus_image_properties_page_model_provider_class_finalize (NautilusImagePropertiesPageModelProviderClass *klass)
+{
+ (void) klass;
+}
+
+void
+nautilus_image_properties_page_model_provider_load (GTypeModule *module)
+{
+ nautilus_image_properties_page_model_provider_register_type (module);
+}
diff --git a/extensions/image-properties/nautilus-image-properties-page-provider.h b/extensions/image-properties/nautilus-image-properties-page-model-provider.h
index 59fd6f905..f25449209 100644
--- a/extensions/image-properties/nautilus-image-properties-page-provider.h
+++ b/extensions/image-properties/nautilus-image-properties-page-model-provider.h
@@ -20,11 +20,11 @@
#include <glib-object.h>
-#define NAUTILUS_TYPE_IMAGE_PROPERTIES_PAGE_PROVIDER (nautilus_image_properties_page_provider_get_type ())
+#define NAUTILUS_TYPE_IMAGE_PROPERTIES_PAGE_MODEL_PROVIDER (nautilus_image_properties_page_model_provider_get_type ())
-G_DECLARE_FINAL_TYPE (NautilusImagesPropertiesPageProvider,
- nautilus_image_properties_page_provider,
- NAUTILUS, IMAGE_PROPERTIES_PAGE_PROVIDER,
+G_DECLARE_FINAL_TYPE (NautilusImagePropertiesPageModelProvider,
+ nautilus_image_properties_page_model_provider,
+ NAUTILUS, IMAGE_PROPERTIES_PAGE_MODEL_PROVIDER,
GObject)
-void nautilus_image_properties_page_provider_load (GTypeModule *module); \ No newline at end of file
+void nautilus_image_properties_page_model_provider_load (GTypeModule *module);
diff --git a/extensions/image-properties/nautilus-image-properties-page.c b/extensions/image-properties/nautilus-image-properties-page-model.c
index bca0b56e8..437f8abda 100644
--- a/extensions/image-properties/nautilus-image-properties-page.c
+++ b/extensions/image-properties/nautilus-image-properties-page-model.c
@@ -19,16 +19,17 @@
* XMP support by Hubert Figuiere <hfiguiere@novell.com>
*/
-#include "nautilus-image-properties-page.h"
+#include "nautilus-image-properties-page-model.h"
#include <gexiv2/gexiv2.h>
#include <glib/gi18n.h>
#define LOAD_BUFFER_SIZE 8192
+#define SECTION_ID 0
-struct _NautilusImagesPropertiesPage
+struct _NautilusImagePropertiesPageModel
{
- GtkGrid parent;
+ NautilusPropertyPageModel parent;
GCancellable *cancellable;
GtkWidget *grid;
@@ -41,30 +42,56 @@ struct _NautilusImagesPropertiesPage
GExiv2Metadata *md;
gboolean md_ready;
+
+ GList *sections;
+ GList *items;
};
-G_DEFINE_TYPE (NautilusImagesPropertiesPage,
- nautilus_image_properties_page,
- GTK_TYPE_GRID);
+G_DEFINE_TYPE (NautilusImagePropertiesPageModel,
+ nautilus_image_properties_page_model,
+ NAUTILUS_TYPE_PROPERTY_PAGE_MODEL);
+
+
+static void
+free_section (gpointer data)
+{
+ NautilusPropertyPageModelSection *section = (NautilusPropertyPageModelSection *) data;
+
+ g_free(section->title);
+}
+
+static void
+free_item (gpointer data)
+{
+ NautilusPropertyPageModelItem *section = (NautilusPropertyPageModelItem *) data;
+
+ g_free(section->field);
+ g_free(section->value);
+}
static void
finalize (GObject *object)
{
- NautilusImagesPropertiesPage *page;
+ NautilusImagePropertiesPageModel *self;
- page = NAUTILUS_IMAGE_PROPERTIES_PAGE (object);
+ self = NAUTILUS_IMAGE_PROPERTIES_PAGE_MODEL (object);
- if (page->cancellable != NULL)
+ if (self->cancellable != NULL)
{
- g_cancellable_cancel (page->cancellable);
- g_clear_object (&page->cancellable);
+ g_cancellable_cancel (self->cancellable);
+ g_clear_object (&self->cancellable);
}
- G_OBJECT_CLASS (nautilus_image_properties_page_parent_class)->finalize (object);
+ g_list_free_full (self->items, free_item);
+ g_list_free_full (self->sections, free_section);
+ self->items = NULL;
+ self->sections = NULL;
+
+ G_OBJECT_CLASS (nautilus_image_properties_page_model_parent_class)->finalize (object);
}
static void
-nautilus_image_properties_page_class_init (NautilusImagesPropertiesPageClass *klass)
+nautilus_image_properties_page_model_class_init (NautilusImagePropertiesPageModelClass *klass)
{
GObjectClass *object_class;
@@ -74,66 +101,35 @@ nautilus_image_properties_page_class_init (NautilusImagesPropertiesPageClass *kl
}
static void
-append_item (NautilusImagesPropertiesPage *page,
- const char *name,
- const char *value)
+append_item (NautilusImagePropertiesPageModel *self,
+ const char *name,
+ const char *value)
{
- GtkWidget *name_label;
- PangoAttrList *attrs;
-
- name_label = gtk_label_new (name);
- attrs = pango_attr_list_new ();
-
- pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD));
- gtk_label_set_attributes (GTK_LABEL (name_label), attrs);
- pango_attr_list_unref (attrs);
- gtk_container_add (GTK_CONTAINER (page->grid), name_label);
- gtk_widget_set_halign (name_label, GTK_ALIGN_START);
- gtk_widget_show (name_label);
+ NautilusPropertyPageModelItem *item;
if (value != NULL)
{
- GtkWidget *value_label;
-
- value_label = gtk_label_new (value);
-
- gtk_label_set_line_wrap (GTK_LABEL (value_label), TRUE);
- gtk_grid_attach_next_to (GTK_GRID (page->grid), value_label,
- name_label, GTK_POS_RIGHT,
- 1, 1);
- gtk_widget_set_halign (value_label, GTK_ALIGN_START);
- gtk_widget_set_hexpand (value_label, TRUE);
- gtk_widget_show (value_label);
+ item = g_new (NautilusPropertyPageModelItem, 1);
+ item->section_id = SECTION_ID;
+ item->field = g_strdup (name);
+ item->value = g_strdup (value);
+ self->items = g_list_append (self->items, item);
}
}
static void
-nautilus_image_properties_page_init (NautilusImagesPropertiesPage *self)
+nautilus_image_properties_page_model_init (NautilusImagePropertiesPageModel *self)
{
- GtkWidget *scrolled_window;
-
- scrolled_window = gtk_scrolled_window_new (NULL, NULL);
-
- gtk_widget_set_vexpand (GTK_WIDGET (scrolled_window), TRUE);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
- GTK_POLICY_NEVER,
- GTK_POLICY_AUTOMATIC);
-
- gtk_container_add (GTK_CONTAINER (self), scrolled_window);
+ NautilusPropertyPageModelSection *section;
- self->grid = gtk_grid_new ();
-
- gtk_orientable_set_orientation (GTK_ORIENTABLE (self->grid), GTK_ORIENTATION_VERTICAL);
- gtk_grid_set_row_spacing (GTK_GRID (self->grid), 6);
- gtk_grid_set_column_spacing (GTK_GRID (self->grid), 18);
- append_item (self, _("Loading…"), NULL);
- gtk_container_add (GTK_CONTAINER (scrolled_window), self->grid);
-
- gtk_widget_show_all (GTK_WIDGET (self));
+ section = g_new (NautilusPropertyPageModelSection, 1);
+ section->id = SECTION_ID;
+ section->title = g_strdup (_("Basic information"));
+ self->sections = g_list_append (NULL, section);
}
static void
-append_basic_info (NautilusImagesPropertiesPage *page)
+append_basic_info (NautilusImagePropertiesPageModel *page)
{
GdkPixbufFormat *format;
g_autofree char *name = NULL;
@@ -165,9 +161,9 @@ append_basic_info (NautilusImagesPropertiesPage *page)
}
static void
-append_gexiv2_tag (NautilusImagesPropertiesPage *page,
- const char **tag_names,
- const char *description)
+append_gexiv2_tag (NautilusImagePropertiesPageModel *page,
+ const char **tag_names,
+ const char *description)
{
g_assert (tag_names != NULL);
@@ -195,7 +191,7 @@ append_gexiv2_tag (NautilusImagesPropertiesPage *page,
}
static void
-append_gexiv2_info (NautilusImagesPropertiesPage *page)
+append_gexiv2_info (NautilusImagePropertiesPageModel *page)
{
double longitude;
double latitude;
@@ -255,13 +251,8 @@ append_gexiv2_info (NautilusImagesPropertiesPage *page)
}
static void
-load_finished (NautilusImagesPropertiesPage *page)
+load_finished (NautilusImagePropertiesPageModel *page)
{
- GtkWidget *label;
-
- label = gtk_grid_get_child_at (GTK_GRID (page->grid), 0, 0);
- gtk_container_remove (GTK_CONTAINER (page->grid), label);
-
if (page->loader != NULL)
{
gdk_pixbuf_loader_close (page->loader, NULL);
@@ -284,6 +275,11 @@ load_finished (NautilusImagesPropertiesPage *page)
}
page->md_ready = FALSE;
g_clear_object (&page->md);
+
+ nautilus_property_page_model_set_sections (NAUTILUS_PROPERTY_PAGE_MODEL (page),
+ page->sections);
+ nautilus_property_page_model_set_items (NAUTILUS_PROPERTY_PAGE_MODEL (page),
+ page->items);
}
static void
@@ -291,7 +287,7 @@ file_close_callback (GObject *object,
GAsyncResult *res,
gpointer data)
{
- NautilusImagesPropertiesPage *page;
+ NautilusImagePropertiesPageModel *page;
GInputStream *stream;
page = data;
@@ -307,7 +303,7 @@ file_read_callback (GObject *object,
GAsyncResult *res,
gpointer data)
{
- NautilusImagesPropertiesPage *page;
+ NautilusImagePropertiesPageModel *page;
GInputStream *stream;
g_autoptr (GError) error = NULL;
gssize count_read;
@@ -380,7 +376,7 @@ size_prepared_callback (GdkPixbufLoader *loader,
int height,
gpointer callback_data)
{
- NautilusImagesPropertiesPage *page;
+ NautilusImagePropertiesPageModel *page;
page = callback_data;
@@ -392,7 +388,7 @@ size_prepared_callback (GdkPixbufLoader *loader,
typedef struct
{
- NautilusImagesPropertiesPage *page;
+ NautilusImagePropertiesPageModel *page;
NautilusFileInfo *file_info;
} FileOpenData;
@@ -402,7 +398,7 @@ file_open_callback (GObject *object,
gpointer user_data)
{
g_autofree FileOpenData *data = NULL;
- NautilusImagesPropertiesPage *page;
+ NautilusImagePropertiesPageModel *page;
GFile *file;
g_autofree char *uri = NULL;
g_autoptr (GError) error = NULL;
@@ -449,19 +445,26 @@ file_open_callback (GObject *object,
}
void
-nautilus_image_properties_page_load_from_file_info (NautilusImagesPropertiesPage *self,
- NautilusFileInfo *file_info)
+nautilus_image_properties_page_model_load_from_file_info (NautilusImagePropertiesPageModel *self,
+ NautilusFileInfo *file_info)
{
g_autofree char *uri = NULL;
g_autoptr (GFile) file = NULL;
g_autofree char *path = NULL;
FileOpenData *data;
- g_return_if_fail (NAUTILUS_IS_IMAGE_PROPERTIES_PAGE (self));
+ g_return_if_fail (NAUTILUS_IS_IMAGE_PROPERTIES_PAGE_MODEL (self));
g_return_if_fail (file_info != NULL);
self->cancellable = g_cancellable_new ();
+ g_print ("### removing old info\n");
+ /* Remove old information, if any */
+ g_list_free_full (self->items, free_item);
+ self->items = NULL;
+ nautilus_property_page_model_set_items (NAUTILUS_PROPERTY_PAGE_MODEL (self),
+ NULL);
+
uri = nautilus_file_info_get_uri (file_info);
file = g_file_new_for_uri (uri);
path = g_file_get_path (file);
@@ -503,13 +506,10 @@ nautilus_image_properties_page_load_from_file_info (NautilusImagesPropertiesPage
data);
}
-NautilusImagesPropertiesPage *
-nautilus_image_properties_page_new (void)
+NautilusImagePropertiesPageModel *
+nautilus_image_properties_page_model_new (void)
{
- return g_object_new (NAUTILUS_TYPE_IMAGE_PROPERTIES_PAGE,
- "margin-bottom", 6,
- "margin-end", 12,
- "margin-start", 12,
- "margin-top", 6,
+ return g_object_new (NAUTILUS_TYPE_IMAGE_PROPERTIES_PAGE_MODEL,
+ "title", _("Image"),
NULL);
}
diff --git a/extensions/image-properties/nautilus-image-properties-page.h b/extensions/image-properties/nautilus-image-properties-page-model.h
index 5a2c3580a..469aaa6ba 100644
--- a/extensions/image-properties/nautilus-image-properties-page.h
+++ b/extensions/image-properties/nautilus-image-properties-page-model.h
@@ -22,14 +22,14 @@
#include <nautilus-extension.h>
-#define NAUTILUS_TYPE_IMAGE_PROPERTIES_PAGE (nautilus_image_properties_page_get_type ())
+#define NAUTILUS_TYPE_IMAGE_PROPERTIES_PAGE_MODEL (nautilus_image_properties_page_model_get_type ())
-G_DECLARE_FINAL_TYPE (NautilusImagesPropertiesPage,
- nautilus_image_properties_page,
- NAUTILUS, IMAGE_PROPERTIES_PAGE,
- GtkGrid)
+G_DECLARE_FINAL_TYPE (NautilusImagePropertiesPageModel,
+ nautilus_image_properties_page_model,
+ NAUTILUS, IMAGE_PROPERTIES_PAGE_MODEL,
+ NautilusPropertyPageModel)
-void nautilus_image_properties_page_load_from_file_info (NautilusImagesPropertiesPage *page,
- NautilusFileInfo *file_info);
+void nautilus_image_properties_page_model_load_from_file_info (NautilusImagePropertiesPageModel *page,
+ NautilusFileInfo *file_info);
-NautilusImagesPropertiesPage *nautilus_image_properties_page_new (void); \ No newline at end of file
+NautilusImagePropertiesPageModel *nautilus_image_properties_page_model_new (void);
diff --git a/extensions/image-properties/nautilus-image-properties-page-provider.c b/extensions/image-properties/nautilus-image-properties-page-provider.c
deleted file mode 100644
index 99e495bb7..000000000
--- a/extensions/image-properties/nautilus-image-properties-page-provider.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/* Copyright (C) 2004 Red Hat, Inc
- * Copyright (c) 2007 Novell, Inc.
- * Copyright (c) 2017 Thomas Bechtold <thomasbechtold@jpberlin.de>
- * Copyright (c) 2018 Ernestas Kulik <ernestask@gnome.org>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Alexander Larsson <alexl@redhat.com>
- * XMP support by Hubert Figuiere <hfiguiere@novell.com>
- */
-
-#include "nautilus-image-properties-page-provider.h"
-
-#include "nautilus-image-properties-page.h"
-
-#include <glib/gi18n.h>
-
-#include <nautilus-extension.h>
-
-#define NAUTILUS_IMAGE_PROPERTIES_PAGE_NAME "NautilusImagePropertiesPage::property_page"
-
-struct _NautilusImagesPropertiesPageProvider
-{
- GObject parent_instance;
-};
-
-static void property_page_provider_iface_init (NautilusPropertyPageProviderInterface *iface);
-
-G_DEFINE_DYNAMIC_TYPE_EXTENDED (NautilusImagesPropertiesPageProvider,
- nautilus_image_properties_page_provider,
- G_TYPE_OBJECT,
- 0,
- G_IMPLEMENT_INTERFACE_DYNAMIC (NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER,
- property_page_provider_iface_init))
-
-static gboolean
-is_mime_type_supported (const char *mime_type)
-{
- g_autoptr (GSList) formats = NULL;
-
- if (mime_type == NULL)
- {
- return FALSE;
- }
-
- formats = gdk_pixbuf_get_formats ();
-
- for (GSList *l = formats; l != NULL; l = l->next)
- {
- g_auto (GStrv) mime_types = NULL;
-
- mime_types = gdk_pixbuf_format_get_mime_types (l->data);
- if (mime_types == NULL)
- {
- continue;
- }
-
- if (g_strv_contains ((const char *const *) mime_types, mime_type))
- {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static GList *
-get_pages (NautilusPropertyPageProvider *provider,
- GList *files)
-{
- NautilusFileInfo *file_info;
- g_autofree char *mime_type = NULL;
- NautilusImagesPropertiesPage *image_properties_page;
- NautilusPropertyPage *property_page;
-
- if (files == NULL || files->next != NULL)
- {
- return NULL;
- }
-
- file_info = NAUTILUS_FILE_INFO (files->data);
- mime_type = nautilus_file_info_get_mime_type (file_info);
- if (!is_mime_type_supported (mime_type))
- {
- return NULL;
- }
- image_properties_page = nautilus_image_properties_page_new ();
- property_page = nautilus_property_page_new (NAUTILUS_IMAGE_PROPERTIES_PAGE_NAME,
- gtk_label_new (_("Image")),
- GTK_WIDGET (image_properties_page));
-
- nautilus_image_properties_page_load_from_file_info (image_properties_page, file_info);
-
- return g_list_prepend (NULL, property_page);
-}
-
-static void
-property_page_provider_iface_init (NautilusPropertyPageProviderInterface *iface)
-{
- iface->get_pages = get_pages;
-}
-
-static void
-nautilus_image_properties_page_provider_init (NautilusImagesPropertiesPageProvider *self)
-{
- (void) self;
-}
-
-static void
-nautilus_image_properties_page_provider_class_init (NautilusImagesPropertiesPageProviderClass *klass)
-{
- (void) klass;
-}
-
-static void
-nautilus_image_properties_page_provider_class_finalize (NautilusImagesPropertiesPageProviderClass *klass)
-{
- (void) klass;
-}
-
-void
-nautilus_image_properties_page_provider_load (GTypeModule *module)
-{
- nautilus_image_properties_page_provider_register_type (module);
-}
diff --git a/libnautilus-extension/meson.build b/libnautilus-extension/meson.build
index d62b05c62..648054c29 100644
--- a/libnautilus-extension/meson.build
+++ b/libnautilus-extension/meson.build
@@ -1,4 +1,4 @@
-nautilus_extension_version = '1.5.0'
+nautilus_extension_version = '2.0.0'
libnautilus_extension_deprecated_headers = [
'nautilus-extension-types.h',
@@ -12,8 +12,8 @@ libnautilus_extension_headers = [
'nautilus-info-provider.h',
'nautilus-location-widget-provider.h',
'nautilus-menu-provider.h',
- 'nautilus-property-page-provider.h',
- 'nautilus-property-page.h',
+ 'nautilus-property-page-model-provider.h',
+ 'nautilus-property-page-model.h',
'nautilus-menu.h'
]
@@ -48,8 +48,8 @@ libnautilus_extension_sources = [
'nautilus-location-widget-provider.c',
'nautilus-menu-item.c',
'nautilus-menu-provider.c',
- 'nautilus-property-page-provider.c',
- 'nautilus-property-page.c',
+ 'nautilus-property-page-model-provider.c',
+ 'nautilus-property-page-model.c',
'nautilus-menu.c'
]
@@ -79,7 +79,7 @@ gnome.generate_gir(
'-DNAUTILUS_COMPILATION'
],
sources: libnautilus_extension_sources,
- nsversion: '3.0',
+ nsversion: '4.0',
namespace: 'Nautilus',
includes: [
'Gtk-3.0',
@@ -114,7 +114,7 @@ pkgconfig.generate(
],
variables: [
'exec_prefix=${prefix}',
- 'extensiondir=${libdir}/nautilus/extensions-3.0'
+ 'extensiondir=${libdir}/nautilus/extensions-4.0'
],
version: meson.project_version()
)
diff --git a/libnautilus-extension/nautilus-extension.h b/libnautilus-extension/nautilus-extension.h
index 7723f453a..061959297 100644
--- a/libnautilus-extension/nautilus-extension.h
+++ b/libnautilus-extension/nautilus-extension.h
@@ -26,8 +26,8 @@
#include <libnautilus-extension/nautilus-location-widget-provider.h>
#include <libnautilus-extension/nautilus-menu.h>
#include <libnautilus-extension/nautilus-menu-provider.h>
-#include <libnautilus-extension/nautilus-property-page.h>
-#include <libnautilus-extension/nautilus-property-page-provider.h>
+#include <libnautilus-extension/nautilus-property-page-model.h>
+#include <libnautilus-extension/nautilus-property-page-model-provider.h>
/**
* SECTION:nautilus-extension
@@ -39,4 +39,4 @@ void nautilus_module_shutdown (void);
void nautilus_module_list_types (const GType **types,
int *num_types);
-#endif \ No newline at end of file
+#endif
diff --git a/libnautilus-extension/nautilus-property-page-model-provider.c b/libnautilus-extension/nautilus-property-page-model-provider.c
new file mode 100644
index 000000000..12b0fe711
--- /dev/null
+++ b/libnautilus-extension/nautilus-property-page-model-provider.c
@@ -0,0 +1,118 @@
+/*
+ * nautilus-property-page-model-provider.c - Interface for Nautilus extensions
+ * * that provide property pages for
+ * * files.
+ *
+ * Copyright (C) 2003 Novell, Inc.
+ * Copyright (C) 2018 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Dave Camp <dave@ximian.com>
+ * Carlos Soriano <csoriano@redhat.com>
+ *
+ */
+#include "config.h"
+
+#include "nautilus-property-page-model-provider.h"
+#include "nautilus-property-page-model.h"
+
+G_DEFINE_INTERFACE (NautilusPropertyPageModelProvider, nautilus_property_page_model_provider,
+ G_TYPE_OBJECT)
+
+/**
+ * SECTION:nautilus-property-page-model-provider-interface
+ * @title: NautilusPropertyPageModelProvider
+ * @short_description: Interface to provide a property page
+ *
+ * #NautilusPropertyPageModelProvider allows extension to provide an additional
+ * page for the file properties dialog.
+ */
+
+static void
+nautilus_property_page_model_provider_default_init (NautilusPropertyPageModelProviderInterface *klass)
+{
+ /**
+ * NautilusView::page-model:
+ *
+ * The page model associated with the provider.
+ */
+ g_object_interface_install_property (klass,
+ g_param_spec_object ("page-model",
+ "Page model",
+ "The page model associated with the provider",
+ NAUTILUS_TYPE_PROPERTY_PAGE_MODEL,
+ G_PARAM_READWRITE));
+ g_object_interface_install_property (klass,
+ g_param_spec_pointer ("files",
+ "Files",
+ "Files to get info from",
+ G_PARAM_READWRITE));
+}
+
+/**
+ * nautilus_property_page_model_provider_get_model:
+ * @provider: a #NautilusPropertyPageModelProvider
+ * @files: (element-type NautilusFileInfo): a #GList of #NautilusFileInfo
+ *
+ * This function is called by Nautilus when it wants property page
+ * items from the extension.
+ *
+ * This function is called in the main thread before a property page
+ * is shown, so it should return quickly.
+ *
+ * Returns: (element-type NautilusPropertyItem) (transfer full): A #GList of allocated #NautilusPropertyItem.
+ */
+NautilusPropertyPageModel *
+nautilus_property_page_model_provider_get_model (NautilusPropertyPageModelProvider *self)
+{
+ NautilusPropertyPageModelProviderInterface *iface;
+
+ g_return_val_if_fail (NAUTILUS_IS_PROPERTY_PAGE_MODEL_PROVIDER (self), NULL);
+
+ iface = NAUTILUS_PROPERTY_PAGE_MODEL_PROVIDER_GET_IFACE (self);
+
+ g_return_val_if_fail (iface->get_model != NULL, NULL);
+
+ return iface->get_model (self);
+}
+
+void
+nautilus_property_page_model_provider_set_files (NautilusPropertyPageModelProvider *self,
+ GList *files)
+{
+ NautilusPropertyPageModelProviderInterface *iface;
+
+ g_return_if_fail (NAUTILUS_IS_PROPERTY_PAGE_MODEL_PROVIDER (self));
+
+ iface = NAUTILUS_PROPERTY_PAGE_MODEL_PROVIDER_GET_IFACE (self);
+
+ g_return_if_fail (iface->set_files != NULL);
+
+ iface->set_files (self, files);
+}
+
+gboolean
+nautilus_property_page_model_provider_supports_files (NautilusPropertyPageModelProvider *self)
+{
+ NautilusPropertyPageModelProviderInterface *iface;
+
+ g_return_val_if_fail (NAUTILUS_IS_PROPERTY_PAGE_MODEL_PROVIDER (self), FALSE);
+
+ iface = NAUTILUS_PROPERTY_PAGE_MODEL_PROVIDER_GET_IFACE (self);
+
+ g_return_val_if_fail (iface->supports_files != NULL, FALSE);
+
+ return iface->supports_files (self);
+}
diff --git a/libnautilus-extension/nautilus-property-page-provider.h b/libnautilus-extension/nautilus-property-page-model-provider.h
index e3c9416f8..750a4ca45 100644
--- a/libnautilus-extension/nautilus-property-page-provider.h
+++ b/libnautilus-extension/nautilus-property-page-model-provider.h
@@ -3,6 +3,7 @@
* that provide property pages.
*
* Copyright (C) 2003 Novell, Inc.
+ * Copyright (C) 2018 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -16,14 +17,15 @@
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
- *
+ *
* Author: Dave Camp <dave@ximian.com>
+ * Carlos Soriano <csoriano@redhat.com>
*
*/
-/* This interface is implemented by Nautilus extensions that want to
- * add property page to property dialogs. Extensions are called when
- * Nautilus needs property pages for a selection. They are passed a
+/* This interface is implemented by Nautilus extensions that want to
+ * add property page to property dialogs. Extensions are called when
+ * Nautilus needs property pages for a selection. They are passed a
* list of NautilusFileInfo objects for which information should
* be displayed */
@@ -35,40 +37,43 @@
#include <glib-object.h>
/* These should be removed at some point. */
+#include "nautilus-property-page-model.h"
#include "nautilus-extension-types.h"
#include "nautilus-file-info.h"
-#include "nautilus-property-page.h"
G_BEGIN_DECLS
-#define NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER (nautilus_property_page_provider_get_type ())
+#define NAUTILUS_TYPE_PROPERTY_PAGE_MODEL_PROVIDER (nautilus_property_page_model_provider_get_type ())
-G_DECLARE_INTERFACE (NautilusPropertyPageProvider, nautilus_property_page_provider,
- NAUTILUS, PROPERTY_PAGE_PROVIDER,
+G_DECLARE_INTERFACE (NautilusPropertyPageModelProvider, nautilus_property_page_model_provider,
+ NAUTILUS, PROPERTY_PAGE_MODEL_PROVIDER,
GObject)
-/* For compatibility reasons, remove this once you start introducing breaking changes. */
-typedef NautilusPropertyPageProviderInterface NautilusPropertyPageProviderIface;
-
/**
- * NautilusPropertyPageProviderInterface:
+ * NautilusPropertyPageModelProvider:
* @g_iface: The parent interface.
- * @get_pages: Returns a #GList of #NautilusPropertyPage.
- * See nautilus_property_page_provider_get_pages() for details.
+ * @get_model: Returns #NautilusPropertyPageModel.
+ * See nautilus_property_page_provider_get_model() for details.
*
- * Interface for extensions to provide additional property pages.
+ * Interface for extensions to provide additional a property page.
*/
-struct _NautilusPropertyPageProviderInterface
+struct _NautilusPropertyPageModelProviderInterface
{
- GTypeInterface g_iface;
+ GTypeInterface parent;
- GList *(*get_pages) (NautilusPropertyPageProvider *provider,
- GList *files);
+ NautilusPropertyPageModel *(*get_model) (NautilusPropertyPageModelProvider *provider);
+
+ void (*set_files) (NautilusPropertyPageModelProvider *provider,
+ GList *files);
+ gboolean (*supports_files) (NautilusPropertyPageModelProvider *provider);
};
/* Interface Functions */
-GList *nautilus_property_page_provider_get_pages (NautilusPropertyPageProvider *provider,
- GList *files);
+NautilusPropertyPageModel *nautilus_property_page_model_provider_get_model (NautilusPropertyPageModelProvider *provider);
+
+void nautilus_property_page_model_provider_set_files (NautilusPropertyPageModelProvider *provider,
+ GList *files);
+gboolean nautilus_property_page_model_provider_supports_files (NautilusPropertyPageModelProvider *provider);
-G_END_DECLS \ No newline at end of file
+G_END_DECLS
diff --git a/libnautilus-extension/nautilus-property-page-model.c b/libnautilus-extension/nautilus-property-page-model.c
new file mode 100644
index 000000000..62742ceb2
--- /dev/null
+++ b/libnautilus-extension/nautilus-property-page-model.c
@@ -0,0 +1,346 @@
+/*
+ * nautilus-property-page.h - Property pages exported by
+ * NautilusPropertyProvider objects.
+ *
+ * Copyright (C) 2003 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Dave Camp <dave@ximian.com>
+ *
+ */
+
+#include <config.h>
+#include "nautilus-property-page-model.h"
+
+#include <glib-object.h>
+
+enum
+{
+ PROP_0,
+ PROP_TITLE,
+ PROP_SECTIONS,
+ PROP_ITEMS,
+ LAST_PROP
+};
+
+typedef struct
+{
+ char *title;
+ GList *sections;
+ GList *items;
+} NautilusPropertyPageModelPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (NautilusPropertyPageModel, nautilus_property_page_model, G_TYPE_OBJECT)
+
+/**
+ * SECTION:nautilus-property-page
+ * @title: NautilusPropertyPageModel
+ * @short_description: Property page descriptor object
+ *
+ * #NautilusPropertyPageModel is an object that describes a page in the file
+ * properties dialog. Extensions can provide #NautilusPropertyPageModel objects
+ * by registering a #NautilusPropertyPageModelProvider and returning them from
+ * nautilus_property_page_model_provider_get_pages(), which will be called by the
+ * main application when creating file properties dialogs.
+ */
+
+/**
+ * nautilus_property_page_model_new:
+ * @name: the identifier for the property page
+ * @label: the user-visible label of the property page
+ * @page: the property page to display
+ *
+ * Creates a new #NautilusPropertyPageModel from page_widget.
+ *
+ * Returns: a newly created #NautilusPropertyPageModel
+ */
+NautilusPropertyPageModel *
+nautilus_property_page_model_new (const char *title,
+ GList *sections,
+ GList *items)
+{
+ NautilusPropertyPageModel *page;
+
+ g_return_val_if_fail (title != NULL, NULL);
+ g_return_val_if_fail (sections != NULL, NULL);
+ g_return_val_if_fail (items != NULL, NULL);
+
+ page = g_object_new (NAUTILUS_TYPE_PROPERTY_PAGE_MODEL,
+ "title", title,
+ "sections", sections,
+ "items", items,
+ NULL);
+
+ return page;
+}
+
+char *
+nautilus_property_page_model_get_title (NautilusPropertyPageModel *self)
+{
+ NautilusPropertyPageModelPrivate *priv;
+
+ g_return_val_if_fail (NAUTILUS_IS_PROPERTY_PAGE_MODEL (self), NULL);
+
+ priv = nautilus_property_page_model_get_instance_private (self);
+
+ return priv->title;
+}
+
+static void
+free_section (gpointer data)
+{
+ NautilusPropertyPageModelSection *section = (NautilusPropertyPageModelSection *) data;
+
+ g_free(section->title);
+}
+
+static NautilusPropertyPageModelSection*
+copy_section (gconstpointer src,
+ gpointer data)
+{
+ NautilusPropertyPageModelSection *section = (NautilusPropertyPageModelSection *) src;
+ NautilusPropertyPageModelSection *copy = g_new (NautilusPropertyPageModelSection, 1);
+
+ copy->title = g_strdup (section->title);
+ copy->id = section->id;
+
+ return copy;
+}
+
+static void
+free_item (gpointer data)
+{
+ NautilusPropertyPageModelItem *section = (NautilusPropertyPageModelItem *) data;
+
+ g_free(section->field);
+ g_free(section->value);
+}
+
+static NautilusPropertyPageModelItem*
+copy_item (gconstpointer src,
+ gpointer data)
+{
+ NautilusPropertyPageModelItem *item = (NautilusPropertyPageModelItem *) src;
+ NautilusPropertyPageModelItem *copy = g_new (NautilusPropertyPageModelItem, 1);
+
+ copy->field = g_strdup (item->field);
+ copy->value = g_strdup (item->value);
+ copy->section_id = item->section_id;
+
+ return copy;
+}
+
+
+static void
+nautilus_property_page_model_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ NautilusPropertyPageModel *self;
+ NautilusPropertyPageModelPrivate *priv;
+
+ g_return_if_fail (NAUTILUS_IS_PROPERTY_PAGE_MODEL (object));
+
+ self = NAUTILUS_PROPERTY_PAGE_MODEL (object);
+ priv = nautilus_property_page_model_get_instance_private (self);
+
+ switch (param_id)
+ {
+ case PROP_TITLE:
+ {
+ g_value_set_string (value, priv->title);
+ }
+ break;
+
+ case PROP_SECTIONS:
+ {
+ g_value_set_pointer (value, priv->sections);
+ }
+ break;
+
+ case PROP_ITEMS:
+ {
+ g_value_set_pointer (value, priv->items);
+ }
+ break;
+
+ default:
+ {
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ }
+ break;
+ }
+}
+
+static void
+nautilus_property_page_model_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ NautilusPropertyPageModel *self;
+ NautilusPropertyPageModelPrivate *priv;
+
+ g_return_if_fail (NAUTILUS_IS_PROPERTY_PAGE_MODEL (object));
+
+ self = NAUTILUS_PROPERTY_PAGE_MODEL (object);
+ priv = nautilus_property_page_model_get_instance_private (self);
+
+ switch (param_id)
+ {
+ case PROP_TITLE:
+ {
+ g_free (priv->title);
+ priv->title = g_strdup (g_value_get_string (value));
+ }
+ break;
+
+ case PROP_SECTIONS:
+ {
+ if (priv->sections)
+ {
+ g_list_free_full (priv->sections, free_section);
+ }
+
+ priv->sections = g_list_copy_deep (g_value_get_pointer (value),
+ (GCopyFunc) copy_section, NULL);
+
+ g_object_notify (G_OBJECT (self), "sections");
+ }
+ break;
+
+ case PROP_ITEMS:
+ {
+ if (priv->items)
+ {
+ g_list_free_full (priv->items, free_item);
+ }
+
+ priv->items = g_list_copy_deep (g_value_get_pointer (value),
+ (GCopyFunc) copy_item, NULL);
+ }
+ break;
+
+ default:
+ {
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ }
+ break;
+ }
+}
+
+static void
+nautilus_property_page_model_finalize (GObject *object)
+{
+ NautilusPropertyPageModel *self;
+ NautilusPropertyPageModelPrivate *priv;
+
+ self = NAUTILUS_PROPERTY_PAGE_MODEL (object);
+ priv = nautilus_property_page_model_get_instance_private (self);
+
+ if (priv->title != NULL)
+ {
+ g_free (priv->title);
+ priv->title = NULL;
+ }
+ if (priv->sections != NULL)
+ {
+ g_list_free_full (priv->sections, free_section);
+ priv->sections = NULL;
+ }
+ if (priv->items != NULL)
+ {
+ g_list_free_full (priv->items, free_item);
+ priv->items = NULL;
+ }
+
+ G_OBJECT_CLASS (nautilus_property_page_model_parent_class)->finalize (object);
+}
+
+static void
+nautilus_property_page_model_init (NautilusPropertyPageModel *page)
+{
+}
+
+static void
+nautilus_property_page_model_class_init (NautilusPropertyPageModelClass *class)
+{
+ G_OBJECT_CLASS (class)->finalize = nautilus_property_page_model_finalize;
+ G_OBJECT_CLASS (class)->get_property = nautilus_property_page_model_get_property;
+ G_OBJECT_CLASS (class)->set_property = nautilus_property_page_model_set_property;
+
+ g_object_class_install_property (G_OBJECT_CLASS (class),
+ PROP_TITLE,
+ g_param_spec_string ("title",
+ "Title",
+ "Title of the page",
+ NULL,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | G_PARAM_READABLE));
+ g_object_class_install_property (G_OBJECT_CLASS (class),
+ PROP_SECTIONS,
+ g_param_spec_pointer ("sections",
+ "Sections",
+ "Sections of the page",
+ G_PARAM_READWRITE));
+ g_object_class_install_property (G_OBJECT_CLASS (class),
+ PROP_ITEMS,
+ g_param_spec_pointer ("items",
+ "Items",
+ "Items for the property page",
+ G_PARAM_READWRITE));
+}
+
+GList*
+nautilus_property_page_model_get_sections (NautilusPropertyPageModel *self)
+{
+ NautilusPropertyPageModelPrivate *priv;
+
+ priv = nautilus_property_page_model_get_instance_private (self);
+
+ return priv->sections;
+}
+
+GList*
+nautilus_property_page_model_get_items (NautilusPropertyPageModel *self)
+{
+ NautilusPropertyPageModelPrivate *priv;
+
+ priv = nautilus_property_page_model_get_instance_private (self);
+
+ return priv->items;
+}
+
+void
+nautilus_property_page_model_set_sections (NautilusPropertyPageModel *self,
+ GList *sections)
+{
+ g_object_set (self, "sections", sections, NULL);
+}
+
+void
+nautilus_property_page_model_set_items (NautilusPropertyPageModel *self,
+ GList *items)
+{
+ g_object_set (self, "items", items, NULL);
+}
+
+void
+nautilus_property_page_model_set_title (NautilusPropertyPageModel *self,
+ const char *title)
+
+{
+ g_object_set (self, "title", title, NULL);
+}
diff --git a/libnautilus-extension/nautilus-property-page-model.h b/libnautilus-extension/nautilus-property-page-model.h
new file mode 100644
index 000000000..37f38f080
--- /dev/null
+++ b/libnautilus-extension/nautilus-property-page-model.h
@@ -0,0 +1,80 @@
+/*
+ * nautilus-property-page-model.h - Property pages exported by
+ * NautilusPropertyProvider objects.
+ *
+ * Copyright (C) 2003 Novell, Inc.
+ * Copyright (C) 2018 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Dave Camp <dave@ximian.com>
+ *
+ */
+
+#pragma once
+
+#if !defined (NAUTILUS_EXTENSION_H) && !defined (NAUTILUS_COMPILATION)
+#warning "Only <nautilus-extension.h> should be included directly."
+#endif
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define NAUTILUS_TYPE_PROPERTY_PAGE_MODEL (nautilus_property_page_model_get_type ())
+
+G_DECLARE_DERIVABLE_TYPE (NautilusPropertyPageModel, nautilus_property_page_model,
+ NAUTILUS, PROPERTY_PAGE_MODEL,
+ GObject)
+
+struct _NautilusPropertyPageModelClass
+{
+ GObjectClass parent_class;
+};
+
+typedef struct
+{
+ int id;
+ char* title;
+} NautilusPropertyPageModelSection;
+
+typedef struct
+{
+ int section_id;
+ char* field;
+ char* value;
+} NautilusPropertyPageModelItem;
+
+NautilusPropertyPageModel *nautilus_property_page_model_new (const char *title,
+ GList *sections,
+ GList *items);
+char * nautilus_property_page_model_get_title (NautilusPropertyPageModel *self);
+void nautilus_property_page_model_set_title (NautilusPropertyPageModel *self,
+ const char *title);
+GList *nautilus_property_page_model_get_sections (NautilusPropertyPageModel *self);
+void
+nautilus_property_page_model_set_sections (NautilusPropertyPageModel *self,
+ GList *sections);
+GList *nautilus_property_page_model_get_items (NautilusPropertyPageModel *self);
+void
+nautilus_property_page_model_set_items (NautilusPropertyPageModel *self,
+ GList *items);
+
+/* NautilusPropertyPageModel has the following properties:
+ * label (string) - the user-visible label of the property page
+ * sections (GList of NautilusPropertyPageModelSection) - the sections
+ * items (GList of NautilusPropertyPageModelItem) - the items
+ */
+
+G_END_DECLS
diff --git a/libnautilus-extension/nautilus-property-page-provider.c b/libnautilus-extension/nautilus-property-page-provider.c
deleted file mode 100644
index 26ec03cf5..000000000
--- a/libnautilus-extension/nautilus-property-page-provider.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * nautilus-property-page-provider.c - Interface for Nautilus extensions
- * that provide property pages for
- * files.
- *
- * Copyright (C) 2003 Novell, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Dave Camp <dave@ximian.com>
- *
- */
-
-#include "nautilus-property-page-provider.h"
-
-G_DEFINE_INTERFACE (NautilusPropertyPageProvider, nautilus_property_page_provider,
- G_TYPE_OBJECT)
-
-/**
- * SECTION:nautilus-property-page-provider
- * @title: NautilusPropertyPageProvider
- * @short_description: Interface to provide additional property pages
- *
- * #NautilusPropertyPageProvider allows extension to provide additional pages
- * for the file properties dialog.
- */
-
-static void
-nautilus_property_page_provider_default_init (NautilusPropertyPageProviderInterface *klass)
-{
-}
-
-/**
- * nautilus_property_page_provider_get_pages:
- * @provider: a #NautilusPropertyPageProvider
- * @files: (element-type NautilusFileInfo): a #GList of #NautilusFileInfo
- *
- * This function is called by Nautilus when it wants property page
- * items from the extension.
- *
- * This function is called in the main thread before a property page
- * is shown, so it should return quickly.
- *
- * Returns: (element-type NautilusPropertyPage) (transfer full): A #GList of allocated #NautilusPropertyPage items.
- */
-GList *
-nautilus_property_page_provider_get_pages (NautilusPropertyPageProvider *self,
- GList *files)
-{
- NautilusPropertyPageProviderInterface *iface;
-
- g_return_val_if_fail (NAUTILUS_IS_PROPERTY_PAGE_PROVIDER (self), NULL);
-
- iface = NAUTILUS_PROPERTY_PAGE_PROVIDER_GET_IFACE (self);
-
- g_return_val_if_fail (iface->get_pages != NULL, NULL);
-
- return iface->get_pages (self, files);
-}
diff --git a/libnautilus-extension/nautilus-property-page.c b/libnautilus-extension/nautilus-property-page.c
deleted file mode 100644
index ca81fc121..000000000
--- a/libnautilus-extension/nautilus-property-page.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * nautilus-property-page.h - Property pages exported by
- * NautilusPropertyProvider objects.
- *
- * Copyright (C) 2003 Novell, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Dave Camp <dave@ximian.com>
- *
- */
-
-#include <config.h>
-#include "nautilus-property-page.h"
-
-#include <glib/gi18n-lib.h>
-
-enum
-{
- PROP_0,
- PROP_NAME,
- PROP_LABEL,
- PROP_PAGE,
- LAST_PROP
-};
-
-struct _NautilusPropertyPage
-{
- GObject parent_instance;
-
- char *name;
- GtkWidget *label;
- GtkWidget *page;
-};
-
-G_DEFINE_TYPE (NautilusPropertyPage, nautilus_property_page, G_TYPE_OBJECT)
-
-/**
- * SECTION:nautilus-property-page
- * @title: NautilusPropertyPage
- * @short_description: Property page descriptor object
- *
- * #NautilusPropertyPage is an object that describes a page in the file
- * properties dialog. Extensions can provide #NautilusPropertyPage objects
- * by registering a #NautilusPropertyPageProvider and returning them from
- * nautilus_property_page_provider_get_pages(), which will be called by the
- * main application when creating file properties dialogs.
- */
-
-/**
- * nautilus_property_page_new:
- * @name: the identifier for the property page
- * @label: the user-visible label of the property page
- * @page: the property page to display
- *
- * Creates a new #NautilusPropertyPage from page_widget.
- *
- * Returns: a newly created #NautilusPropertyPage
- */
-NautilusPropertyPage *
-nautilus_property_page_new (const char *name,
- GtkWidget *label,
- GtkWidget *page_widget)
-{
- NautilusPropertyPage *page;
-
- g_return_val_if_fail (name != NULL, NULL);
- g_return_val_if_fail (GTK_IS_WIDGET (label), NULL);
- g_return_val_if_fail (GTK_IS_WIDGET (page_widget), NULL);
-
- page = g_object_new (NAUTILUS_TYPE_PROPERTY_PAGE,
- "name", name,
- "label", label,
- "page", page_widget,
- NULL);
-
- return page;
-}
-
-static void
-nautilus_property_page_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
-{
- NautilusPropertyPage *page;
-
- page = NAUTILUS_PROPERTY_PAGE (object);
-
- switch (param_id)
- {
- case PROP_NAME:
- {
- g_value_set_string (value, page->name);
- }
- break;
-
- case PROP_LABEL:
- {
- g_value_set_object (value, page->label);
- }
- break;
-
- case PROP_PAGE:
- {
- g_value_set_object (value, page->page);
- }
- break;
-
- default:
- {
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- }
- break;
- }
-}
-
-static void
-nautilus_property_page_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- NautilusPropertyPage *page;
-
- page = NAUTILUS_PROPERTY_PAGE (object);
-
- switch (param_id)
- {
- case PROP_NAME:
- {
- g_free (page->name);
- page->name = g_strdup (g_value_get_string (value));
- g_object_notify (object, "name");
- }
- break;
-
- case PROP_LABEL:
- {
- if (page->label)
- {
- g_object_unref (page->label);
- }
-
- page->label = g_object_ref (g_value_get_object (value));
- g_object_notify (object, "label");
- }
- break;
-
- case PROP_PAGE:
- {
- if (page->page)
- {
- g_object_unref (page->page);
- }
-
- page->page = g_object_ref (g_value_get_object (value));
- g_object_notify (object, "page");
- }
- break;
-
- default:
- {
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- }
- break;
- }
-}
-
-static void
-nautilus_property_page_dispose (GObject *object)
-{
- NautilusPropertyPage *page;
-
- page = NAUTILUS_PROPERTY_PAGE (object);
-
- if (page->label)
- {
- g_object_unref (page->label);
- page->label = NULL;
- }
- if (page->page)
- {
- g_object_unref (page->page);
- page->page = NULL;
- }
-}
-
-static void
-nautilus_property_page_finalize (GObject *object)
-{
- NautilusPropertyPage *page;
-
- page = NAUTILUS_PROPERTY_PAGE (object);
-
- g_free (page->name);
-
- G_OBJECT_CLASS (nautilus_property_page_parent_class)->finalize (object);
-}
-
-static void
-nautilus_property_page_init (NautilusPropertyPage *page)
-{
-}
-
-static void
-nautilus_property_page_class_init (NautilusPropertyPageClass *class)
-{
- G_OBJECT_CLASS (class)->finalize = nautilus_property_page_finalize;
- G_OBJECT_CLASS (class)->dispose = nautilus_property_page_dispose;
- G_OBJECT_CLASS (class)->get_property = nautilus_property_page_get_property;
- G_OBJECT_CLASS (class)->set_property = nautilus_property_page_set_property;
-
- g_object_class_install_property (G_OBJECT_CLASS (class),
- PROP_NAME,
- g_param_spec_string ("name",
- "Name",
- "Name of the page",
- NULL,
- G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | G_PARAM_READABLE));
- g_object_class_install_property (G_OBJECT_CLASS (class),
- PROP_LABEL,
- g_param_spec_object ("label",
- "Label",
- "Label widget to display in the notebook tab",
- GTK_TYPE_WIDGET,
- G_PARAM_READWRITE));
- g_object_class_install_property (G_OBJECT_CLASS (class),
- PROP_PAGE,
- g_param_spec_object ("page",
- "Page",
- "Widget for the property page",
- GTK_TYPE_WIDGET,
- G_PARAM_READWRITE));
-}
diff --git a/libnautilus-extension/nautilus-property-page.h b/libnautilus-extension/nautilus-property-page.h
deleted file mode 100644
index 70e31925a..000000000
--- a/libnautilus-extension/nautilus-property-page.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * nautilus-property-page.h - Property pages exported by
- * NautilusPropertyProvider objects.
- *
- * Copyright (C) 2003 Novell, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Dave Camp <dave@ximian.com>
- *
- */
-
-#pragma once
-
-#if !defined (NAUTILUS_EXTENSION_H) && !defined (NAUTILUS_COMPILATION)
-#warning "Only <nautilus-extension.h> should be included directly."
-#endif
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-/* This should be removed at some point. */
-#include "nautilus-extension-types.h"
-
-G_BEGIN_DECLS
-
-#define NAUTILUS_TYPE_PROPERTY_PAGE (nautilus_property_page_get_type ())
-
-G_DECLARE_FINAL_TYPE (NautilusPropertyPage, nautilus_property_page,
- NAUTILUS, PROPERTY_PAGE,
- GObject)
-
-NautilusPropertyPage *nautilus_property_page_new (const char *name,
- GtkWidget *label,
- GtkWidget *page);
-
-/* NautilusPropertyPage has the following properties:
- * name (string) - the identifier for the property page
- * label (widget) - the user-visible label of the property page
- * page (widget) - the property page to display
- */
-
-G_END_DECLS \ No newline at end of file
diff --git a/meson.build b/meson.build
index 4e9be097b..9659b0fba 100644
--- a/meson.build
+++ b/meson.build
@@ -10,7 +10,7 @@ datadir = get_option('datadir')
desktopdir = join_paths(datadir, 'applications')
includedir = get_option('includedir')
libdir = get_option('libdir')
-extensiondir = join_paths(libdir, 'nautilus', 'extensions-3.0')
+extensiondir = join_paths(libdir, 'nautilus', 'extensions-4.0')
prefix = get_option('prefix')
servicedir = join_paths(datadir, 'dbus-1', 'services')
#
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;