[gthumb] add to catalog: create the catalog if the file does not exist



commit e75201a6734bf36fb7e6f25cbe4ec845c8e94172
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Tue Dec 17 17:42:00 2019 +0100

    add to catalog: create the catalog if the file does not exist
    
    If the catalog file does not exist, use the file extension to
    choose whether to create a GthCatalog or a GthSearch.

 extensions/catalogs/callbacks.c                | 12 ++++++++++++
 extensions/catalogs/callbacks.h                |  1 +
 extensions/catalogs/dlg-add-to-catalog.c       | 11 ++++-------
 extensions/catalogs/dlg-catalog-properties.c   |  7 +++++--
 extensions/catalogs/gth-catalog.c              | 26 ++++++++++++++++++++++----
 extensions/catalogs/gth-catalog.h              |  1 +
 extensions/catalogs/gth-file-source-catalogs.c |  4 ++--
 extensions/catalogs/main.c                     | 10 ++++++++++
 extensions/search/callbacks.c                  | 10 ++++++++++
 extensions/search/callbacks.h                  |  1 +
 extensions/search/main.c                       |  1 +
 11 files changed, 69 insertions(+), 15 deletions(-)
---
diff --git a/extensions/catalogs/callbacks.c b/extensions/catalogs/callbacks.c
index 4991a944..b543c4a9 100644
--- a/extensions/catalogs/callbacks.c
+++ b/extensions/catalogs/callbacks.c
@@ -248,6 +248,16 @@ catalogs__gth_catalog_load_from_data_cb (const void *buffer)
 }
 
 
+GthCatalog *
+catalogs__gth_catalog_new_for_uri_cb (const char *uri)
+{
+       if (g_str_has_suffix (uri, ".catalog") || g_str_has_suffix (uri, ".gqv"))
+               return gth_catalog_new ();
+       else
+               return NULL;
+}
+
+
 void
 catalogs__gth_browser_folder_tree_popup_before_cb (GthBrowser    *browser,
                                                   GthFileSource *file_source,
@@ -462,6 +472,8 @@ process_rename_data_list (gpointer user_data)
                GError     *error = NULL;
 
                catalog = gth_catalog_load_from_file (rename_data->location);
+               if (catalog == NULL)
+                       continue;
 
                for (scan_files = rename_data->files, scan_new_files = rename_data->new_files;
                     scan_files && scan_new_files;
diff --git a/extensions/catalogs/callbacks.h b/extensions/catalogs/callbacks.h
index 3f1f7eb9..126b7f23 100644
--- a/extensions/catalogs/callbacks.h
+++ b/extensions/catalogs/callbacks.h
@@ -34,6 +34,7 @@ void catalogs__gth_browser_folder_tree_popup_before_cb    (GthBrowser    *browse
                                                           GthFileData   *folder);
 GFile *      catalogs__command_line_files_cb              (GList         *files);
 GthCatalog * catalogs__gth_catalog_load_from_data_cb      (const void    *buffer);
+GthCatalog * catalogs__gth_catalog_new_for_uri_cb         (const char    *uri);
 void         catalogs__gth_browser_load_location_after_cb (GthBrowser    *browser,
                                                           GthFileData   *location);
 void         catalogs__gth_browser_update_extra_widget_cb (GthBrowser    *browser);
diff --git a/extensions/catalogs/dlg-add-to-catalog.c b/extensions/catalogs/dlg-add-to-catalog.c
index 742a221a..76fd4a0a 100644
--- a/extensions/catalogs/dlg-add-to-catalog.c
+++ b/extensions/catalogs/dlg-add-to-catalog.c
@@ -184,14 +184,11 @@ catalog_ready_cb (GObject  *catalog,
        gsize    length;
        GFile   *gio_file;
 
-       if (error != NULL) {
-               _gtk_error_dialog_from_gerror_show (GTK_WINDOW (add_data->parent_window), _("Could not add 
the files to the catalog"), error);
-               add_data_unref (add_data);
-               return;
-       }
-
        _g_object_unref (add_data->catalog);
-       add_data->catalog = (GthCatalog *) catalog;
+       if (catalog != NULL)
+               add_data->catalog = (GthCatalog *) catalog;
+       else
+               add_data->catalog = gth_catalog_new_for_file (add_data->catalog_file);
 
        for (scan = add_data->files; scan; scan = scan->next)
                gth_catalog_insert_file (add_data->catalog, (GFile *) scan->data, -1);
diff --git a/extensions/catalogs/dlg-catalog-properties.c b/extensions/catalogs/dlg-catalog-properties.c
index 28ba05a1..b2f20f68 100644
--- a/extensions/catalogs/dlg-catalog-properties.c
+++ b/extensions/catalogs/dlg-catalog-properties.c
@@ -150,7 +150,7 @@ catalog_ready_cb (GObject  *object,
 {
        DialogData *data = user_data;
 
-       if (error != NULL) {
+       if ((error != NULL) || (object == NULL)) {
                _gtk_error_dialog_from_gerror_show (GTK_WINDOW(data->browser), _("Could not load the 
catalog"), error);
                gtk_widget_destroy (data->dialog);
                return;
@@ -238,5 +238,8 @@ dlg_catalog_properties (GthBrowser  *browser,
        /* run dialog. */
 
        gtk_widget_grab_focus (GET_WIDGET ("name_entry"));
-       gth_catalog_load_from_file_async (file_data->file, NULL, catalog_ready_cb, data);
+       gth_catalog_load_from_file_async (file_data->file,
+                                         NULL,
+                                         catalog_ready_cb,
+                                         data);
 }
diff --git a/extensions/catalogs/gth-catalog.c b/extensions/catalogs/gth-catalog.c
index d4befe1b..9d9d940a 100644
--- a/extensions/catalogs/gth-catalog.c
+++ b/extensions/catalogs/gth-catalog.c
@@ -262,6 +262,24 @@ gth_catalog_new (void)
 }
 
 
+GthCatalog *
+gth_catalog_new_for_file (GFile *file)
+{
+       char       *uri;
+       GthCatalog *catalog;
+
+       if (file == NULL)
+               return NULL;
+
+       uri = g_file_get_uri (file);
+       catalog = gth_hook_invoke_get ("gth-catalog-new-for-uri", uri);
+
+       g_free (uri);
+
+       return catalog;
+}
+
+
 GthCatalog *
 gth_catalog_new_from_data (const void  *buffer,
                           gsize        count,
@@ -271,10 +289,10 @@ gth_catalog_new_from_data (const void  *buffer,
        GthCatalog *catalog = NULL;
 
        text_buffer = (char *) buffer;
-       if ((text_buffer == NULL)
-               || (*text_buffer == 0)
-               || (strncmp (text_buffer, "<?xml ", 6) == 0))
-       {
+       if ((text_buffer == NULL) || (*text_buffer == 0))
+               return NULL;
+
+       if (strncmp (text_buffer, "<?xml ", 6) == 0) {
                catalog = gth_hook_invoke_get ("gth-catalog-load-from-data", (gpointer) buffer);
                if (catalog != NULL)
                        read_catalog_data_from_xml (catalog, text_buffer, count, error);
diff --git a/extensions/catalogs/gth-catalog.h b/extensions/catalogs/gth-catalog.h
index 4a2b556d..058fa9b6 100644
--- a/extensions/catalogs/gth-catalog.h
+++ b/extensions/catalogs/gth-catalog.h
@@ -73,6 +73,7 @@ typedef void (*CatalogReadyCallback) (GthCatalog *catalog,
 
 GType         gth_catalog_get_type        (void) G_GNUC_CONST;
 GthCatalog *  gth_catalog_new             (void);
+GthCatalog *  gth_catalog_new_for_file    (GFile                *file);
 GthCatalog *  gth_catalog_new_from_data   (const void           *buffer,
                                           gsize                 count,
                                           GError              **error);
diff --git a/extensions/catalogs/gth-file-source-catalogs.c b/extensions/catalogs/gth-file-source-catalogs.c
index 170cae6d..9107eebd 100644
--- a/extensions/catalogs/gth-file-source-catalogs.c
+++ b/extensions/catalogs/gth-file-source-catalogs.c
@@ -820,7 +820,7 @@ catalog_ready_cb (GObject  *catalog,
        gsize       size;
        GFile      *gio_file;
 
-       if (error != NULL) {
+       if ((error != NULL) || (catalog == NULL)) {
                cod->ready_callback (G_OBJECT (cod->file_source), error, cod->user_data);
                copy_op_data_free (cod);
                return;
@@ -1235,7 +1235,7 @@ reorder_catalog_ready_cb (GObject  *object,
        gsize        size;
        GFile       *gio_file;
 
-       if (error != NULL) {
+       if ((error != NULL) || (object == NULL)) {
                reorder_data->callback (G_OBJECT (reorder_data->file_source), error, reorder_data->data);
                reorder_data_free (reorder_data);
                return;
diff --git a/extensions/catalogs/main.c b/extensions/catalogs/main.c
index 1174121c..49a86d22 100644
--- a/extensions/catalogs/main.c
+++ b/extensions/catalogs/main.c
@@ -39,6 +39,15 @@ gthumb_extension_activate (void)
         **/
        gth_hook_register ("gth-catalog-load-from-data", 1);
 
+       /**
+        * Called to create the right catalog class for the given uri.
+        *
+        * @uri (const char *): the file uri.
+        * @return (GthCatalog *): return a pointer to the object that can
+        * handle the catalog uri, or NULL if the data type doesn't match.
+        **/
+       gth_hook_register ("gth-catalog-new-for-uri", 1);
+
        /**
         * Called to update the catalog data from a given file data.
         *
@@ -109,6 +118,7 @@ gthumb_extension_activate (void)
 
        gth_hook_add_callback ("command-line-files", 10, G_CALLBACK (catalogs__command_line_files_cb), NULL);
        gth_hook_add_callback ("gth-catalog-load-from-data", 10, G_CALLBACK 
(catalogs__gth_catalog_load_from_data_cb), NULL);
+       gth_hook_add_callback ("gth-catalog-new-for-uri", 10, G_CALLBACK 
(catalogs__gth_catalog_new_for_uri_cb), NULL);
 
        gth_main_register_file_source (GTH_TYPE_FILE_SOURCE_CATALOGS);
        gth_hook_add_callback ("initialize", 10, G_CALLBACK (catalogs__initialize_cb), NULL);
diff --git a/extensions/search/callbacks.c b/extensions/search/callbacks.c
index 6dc1c78a..612d0115 100644
--- a/extensions/search/callbacks.c
+++ b/extensions/search/callbacks.c
@@ -135,6 +135,16 @@ search__gth_catalog_load_from_data_cb (const void *buffer)
 }
 
 
+GthCatalog *
+search__gth_catalog_new_for_uri_cb (const char *uri)
+{
+       if (g_str_has_suffix (uri, ".search"))
+               return (GthCatalog *) gth_search_new ();
+       else
+               return NULL;
+}
+
+
 void
 search__dlg_catalog_properties (GtkBuilder  *builder,
                                GthFileData *file_data,
diff --git a/extensions/search/callbacks.h b/extensions/search/callbacks.h
index c0f4947a..1ee9103b 100644
--- a/extensions/search/callbacks.h
+++ b/extensions/search/callbacks.h
@@ -30,6 +30,7 @@ void         search__gth_browser_construct_cb            (GthBrowser         *br
 void         search__gth_browser_update_sensitivity_cb   (GthBrowser         *browser);
 void         search__gth_browser_update_extra_widget_cb  (GthBrowser         *browser);
 GthCatalog * search__gth_catalog_load_from_data_cb       (const void         *buffer);
+GthCatalog * search__gth_catalog_new_for_uri_cb          (const char         *uri);
 void         search__dlg_catalog_properties              (GtkBuilder         *builder,
                                                          GthFileData        *file_data,
                                                          GthCatalog         *catalog);
diff --git a/extensions/search/main.c b/extensions/search/main.c
index 7308713f..1d11a498 100644
--- a/extensions/search/main.c
+++ b/extensions/search/main.c
@@ -30,6 +30,7 @@ G_MODULE_EXPORT void
 gthumb_extension_activate (void)
 {
        gth_hook_add_callback ("gth-catalog-load-from-data", 10, G_CALLBACK 
(search__gth_catalog_load_from_data_cb), NULL);
+       gth_hook_add_callback ("gth-catalog-new-for-uri", 10, G_CALLBACK 
(search__gth_catalog_new_for_uri_cb), NULL);
        gth_hook_add_callback ("gth-browser-construct", 10, G_CALLBACK (search__gth_browser_construct_cb), 
NULL);
        gth_hook_add_callback ("gth-browser-update-extra-widget", 20, G_CALLBACK 
(search__gth_browser_update_extra_widget_cb), NULL);
        gth_hook_add_callback ("dlg-catalog-properties", 10, G_CALLBACK (search__dlg_catalog_properties), 
NULL);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]