void edit_metadata__gth_browser_construct_cb (GthBrowser *browser) { BrowserData *data; GError *error = NULL; g_return_if_fail (GTH_IS_BROWSER (browser)); data = g_new0 (BrowserData, 1); data->browser = browser; data->actions = gtk_action_group_new ("Edit Metadata Actions"); gtk_action_group_set_translation_domain (data->actions, NULL); _gtk_action_group_add_actions_with_flags (data->actions, edit_metadata_action_entries, G_N_ELEMENTS (edit_metadata_action_entries), browser); gtk_ui_manager_insert_action_group (gth_browser_get_ui_manager (browser), data->actions, 0); if (! gtk_ui_manager_add_ui_from_string (gth_browser_get_ui_manager (browser), fixed_ui_info, -1, &error)) { g_message ("building menus failed: %s", error->message); g_error_free (error); } if (gth_main_extension_is_active ("list_tools") && ! gtk_ui_manager_add_ui_from_string (gth_browser_get_ui_manager (browser), fixed_ui_file_tools_info, -1, &error)) { g_message ("building menus failed: %s", error->message); g_error_free (error); } g_object_set_data_full (G_OBJECT (browser), BROWSER_DATA_KEY, data, (GDestroyNotify) browser_data_free); }
G_MODULE_EXPORT void gthumb_extension_activate (void) { gth_main_register_metadata_category (comments_metadata_category); gth_main_register_metadata_info_v (comments_metadata_info); gth_main_register_metadata_provider (GTH_TYPE_METADATA_PROVIDER_COMMENT); gth_main_register_object (GTH_TYPE_TEST, "comment::note", GTH_TYPE_TEST_SIMPLE, "attributes", "comment::note", "display-name", _("Description"), "data-type", GTH_TEST_DATA_TYPE_STRING, "get-data-func", get_comment_for_test, NULL); gth_main_register_object (GTH_TYPE_TEST, "comment::place", GTH_TYPE_TEST_SIMPLE, "attributes", "comment::place", "display-name", _("Place"), "data-type", GTH_TEST_DATA_TYPE_STRING, "get-data-func", get_place_for_test, NULL); gth_main_register_object (GTH_TYPE_TEST, "comment::category", GTH_TYPE_TEST_CATEGORY, "attributes", "comment::categories", "display-name", _("Tag"), NULL); gth_hook_add_callback ("add-sidecars", 10, G_CALLBACK (comments__add_sidecars_cb), NULL); gth_hook_add_callback ("read-metadata-ready", 10, G_CALLBACK (comments__read_metadata_ready_cb), NULL); if (gth_main_extension_is_active ("edit_metadata")) gth_hook_add_callback ("delete-metadata", 10, G_CALLBACK (comments__delete_metadata_cb), NULL); gth_hook_add_callback ("gth-browser-construct", 10, G_CALLBACK (comments__gth_browser_construct_cb), NULL); }
static void comments__read_metadata_ready_cb (GList *file_list, const char *attributes) { GSettings *settings; gboolean store_metadata_in_files; GList *scan; gboolean synchronize; settings = g_settings_new (GTHUMB_GENERAL_SCHEMA); store_metadata_in_files = g_settings_get_boolean (settings, PREF_GENERAL_STORE_METADATA_IN_FILES); g_object_unref (settings); if (! store_metadata_in_files) { /* if PREF_GENERAL_STORE_METADATA_IN_FILES is false, avoid to * synchronize the .comment metadata because the embedded * metadata is likely to be out-of-date. * Give priority to the .comment metadata which, if present, * is the most up-to-date. */ gboolean can_read_embedded_attributes; can_read_embedded_attributes = gth_main_extension_is_active ("exiv2_tools"); for (scan = file_list; scan; scan = scan->next) { GthFileData *file_data = scan->data; /* If PREF_GENERAL_STORE_METADATA_IN_FILES is false and * there is no comment file then we are reading * the image metadata for the first time, in this * case update the .comment metadata with the * embedded metadata. */ if (g_file_info_get_attribute_boolean (file_data->info, "comment::no-comment-file")) { if (can_read_embedded_attributes) { exiv2_update_general_attributes (file_data->info); gth_comment_update_from_general_attributes (file_data); } } else gth_comment_update_general_attributes ((GthFileData *) scan->data); } } else { /* if PREF_GENERAL_STORE_METADATA_IN_FILES is true, update the .comment * metadata with the embedded metadata. */ settings = g_settings_new (GTHUMB_COMMENTS_SCHEMA); synchronize = g_settings_get_boolean (settings, PREF_COMMENTS_SYNCHRONIZE); g_object_unref (settings); if (! synchronize) return; for (scan = file_list; scan; scan = scan->next) gth_comment_update_from_general_attributes ((GthFileData *) scan->data); } }
void gth_browser_activate_action_tool_desktop_background (GtkAction *action, GthBrowser *browser) { WallpaperData *wdata; gboolean saving_wallpaper = FALSE; GList *items; GList *file_list; GthFileData *file_data; const char *mime_type; wdata = wallpaper_data_new (browser); items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser))); file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items); file_data = (file_list != NULL) ? file_list->data : NULL; mime_type = (file_data != NULL) ? gth_file_data_get_mime_type (file_data) : NULL; if (gth_main_extension_is_active ("image_viewer") && (gth_browser_get_file_modified (browser) || ! _gdk_pixbuf_mime_type_is_readable (mime_type))) { GtkWidget *viewer_page; viewer_page = gth_browser_get_viewer_page (browser); if (viewer_page != NULL) { GthImage *image; GthTask *task; image = gth_image_new_for_surface (gth_image_viewer_page_get_image (GTH_IMAGE_VIEWER_PAGE (viewer_page))); file_data = gth_file_data_new (wdata->new_style.file, NULL); task = gth_save_image_task_new (image, "image/jpeg", file_data, GTH_OVERWRITE_RESPONSE_YES); g_signal_connect (task, "completed", G_CALLBACK (save_wallpaper_task_completed_cb), wdata); gth_browser_exec_task (GTH_BROWSER (browser), task, FALSE); saving_wallpaper = TRUE; _g_object_unref (task); g_object_unref (image); } } if (saving_wallpaper) return; if (file_data == NULL) return; if (g_file_is_native (file_data->file)) { _g_object_unref (wdata->new_style.file); wdata->new_style.file = g_file_dup (file_data->file); wallpaper_data_set (wdata); } else g_file_copy_async (file_data->file, wdata->new_style.file, G_FILE_COPY_OVERWRITE, G_PRIORITY_DEFAULT, NULL, NULL, NULL, copy_wallpaper_ready_cb, wdata); _g_object_list_unref (file_list); _gtk_tree_path_list_free (items); }
void ss__dlg_preferences_construct_cb (GtkWidget *dialog, GthBrowser *browser, GtkBuilder *dialog_builder) { BrowserData *data; GtkWidget *notebook; char *current_transition; gboolean image_viewer_page_found; notebook = _gtk_builder_get_widget (dialog_builder, "notebook"); data = g_new0 (BrowserData, 1); data->settings = g_settings_new (GTHUMB_SLIDESHOW_SCHEMA); current_transition = g_settings_get_string (data->settings, PREF_SLIDESHOW_TRANSITION); data->preferences_page = gth_slideshow_preferences_new (current_transition, g_settings_get_boolean (data->settings, PREF_SLIDESHOW_AUTOMATIC), (int) (1000.0 * g_settings_get_double (data->settings, PREF_SLIDESHOW_CHANGE_DELAY)), g_settings_get_boolean (data->settings, PREF_SLIDESHOW_WRAP_AROUND), g_settings_get_boolean (data->settings, PREF_SLIDESHOW_RANDOM_ORDER)); gtk_widget_show (data->preferences_page); g_free (current_transition); #ifndef HAVE_CLUTTER gtk_widget_hide (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (data->preferences_page), "transition_box")); #endif /* ! HAVE_CLUTTER */ g_signal_connect (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (data->preferences_page), "transition_combobox"), "changed", G_CALLBACK (transition_combobox_changed_cb), data); g_signal_connect (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (data->preferences_page), "automatic_checkbutton"), "toggled", G_CALLBACK (automatic_checkbutton_toggled_cb), data); g_signal_connect (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (data->preferences_page), "wrap_around_checkbutton"), "toggled", G_CALLBACK (wrap_around_checkbutton_toggled_cb), data); g_signal_connect (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (data->preferences_page), "random_order_checkbutton"), "toggled", G_CALLBACK (random_order_checkbutton_toggled_cb), data); g_signal_connect (gth_slideshow_preferences_get_widget (GTH_SLIDESHOW_PREFERENCES (data->preferences_page), "change_delay_spinbutton"), "value-changed", G_CALLBACK (change_delay_spinbutton_value_changed_cb), data); image_viewer_page_found = FALSE; if (gth_main_extension_is_active ("image_viewer")) { GList *children; GList *scan; children = gtk_container_get_children (GTK_CONTAINER (gtk_builder_get_object (dialog_builder, "notebook"))); for (scan = children; scan; scan = scan->next) { GtkWidget *page = scan->data; if (g_strcmp0 (g_object_get_data (G_OBJECT (page), "extension-name"), "image_viewer") == 0) { image_viewer_page_found = TRUE; gtk_widget_set_vexpand (data->preferences_page, FALSE); gtk_box_pack_start (GTK_BOX (page), data->preferences_page, FALSE, FALSE, 0); } } } if (! image_viewer_page_found) { /* add the preferences in an ad-hoc page */ GtkWidget *label; label = gtk_label_new (_("Slideshow")); gtk_widget_show (label); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), data->preferences_page, label); } g_object_set_data_full (G_OBJECT (dialog), BROWSER_DATA_KEY, data, (GDestroyNotify) browser_data_free); }