Exemplo n.º 1
0
static void
catalog_saved_cb (void     **buffer,
		  gsize      count,
		  GError    *error,
		  gpointer   user_data)
{
	DialogData *data = user_data;

	if (error == NULL) {
		if (! g_file_equal (data->original_file, data->file_data->file)) {
			GFile *gio_file;

			gio_file = gth_catalog_file_to_gio_file (data->original_file);
			g_file_delete (gio_file, NULL, NULL);
			g_object_unref (gio_file);

			gth_monitor_file_renamed (gth_main_get_default_monitor (),
						  data->original_file,
						  data->file_data->file);
		}

		gth_catalog_update_metadata (data->catalog, data->file_data);
		gth_monitor_metadata_changed (gth_main_get_default_monitor (), data->file_data);

		gth_hook_invoke ("dlg-catalog-properties-saved", data->browser, data->file_data, data->catalog);
	}
	else
		_gtk_error_dialog_from_gerror_show (GTK_WINDOW (data->browser), _("Could not save the catalog"), error);

	gtk_widget_destroy (data->dialog);
}
Exemplo n.º 2
0
void
gth_browser_activate_file_list_rename (GSimpleAction *action,
				       GVariant      *parameter,
				       gpointer       user_data)
{
	GthBrowser *browser = GTH_BROWSER (user_data);
	gth_hook_invoke ("gth-browser-file-list-rename", browser);
}
Exemplo n.º 3
0
static void
import_photos_from_location (GFile *location)
{
	GtkWidget *window;

	window = gth_browser_new (NULL, NULL);
	gth_browser_set_close_with_task (GTH_BROWSER (window), TRUE);
	gth_hook_invoke ("import-photos", window, location, NULL);
}
Exemplo n.º 4
0
static GthImageSaveData *
_gth_image_save_to_buffer_common (GthImage      *image,
				  const char    *mime_type,
				  GthFileData   *file_data,
				  GCancellable  *cancellable,
				  GError       **p_error)
{
	GthImageSaver    *saver;
	char             *buffer;
	gsize             buffer_size;
	GError           *error = NULL;
	GthImageSaveData *save_data = NULL;

	saver = gth_main_get_image_saver (mime_type);
	if (saver == NULL) {
		if (p_error != NULL)
			*p_error = g_error_new (GTH_ERROR, GTH_ERROR_GENERIC, _("Could not find a suitable module to save the image as \"%s\""), mime_type);
		return NULL;
	}

	if (gth_image_saver_save_image (saver,
					image,
					&buffer,
					&buffer_size,
					mime_type,
					cancellable,
					&error))
	{
		save_data = g_new0 (GthImageSaveData, 1);
		save_data->file_data = _g_object_ref (file_data);
		save_data->image = gth_image_copy (image);
		save_data->mime_type = mime_type;
		save_data->buffer = buffer;
		save_data->buffer_size = buffer_size;
		save_data->files = NULL;
		save_data->error = NULL;
		save_data->cancellable = _g_object_ref (cancellable);

		if (save_data->file_data != NULL)
			gth_hook_invoke ("save-image", save_data);

		if ((save_data->error != NULL) && (p_error != NULL))
			*p_error = g_error_copy (*save_data->error);
	}
	else {
		if (p_error != NULL)
			*p_error = error;
		else
			_g_error_free (error);
	}

	g_object_unref (saver);

	return save_data;
}
Exemplo n.º 5
0
static void
save_button_clicked_cb (GtkButton  *button,
			DialogData *data)
{
	GthDateTime *date_time;
	GFile       *gio_file;
	char        *buffer;
	gsize        size;

	if (strcmp (gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("name_entry"))), "") != 0) {
		GFile *parent;
		char  *uri;
		char  *clean_name;
		char  *display_name;
		GFile *new_file;

		parent = g_file_get_parent (data->original_file);
		uri = g_file_get_uri (data->original_file);
		clean_name = _g_filename_clear_for_file (gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("name_entry"))));
		display_name = g_strconcat (clean_name, _g_uri_get_file_extension (uri), NULL);
		new_file = g_file_get_child_for_display_name (parent, display_name, NULL);
		if ((new_file != NULL) && ! g_file_equal (new_file, data->original_file))
			gth_file_data_set_file (data->file_data, new_file);

		_g_object_unref (new_file);
		g_free (display_name);
		g_free (clean_name);
		g_free (uri);
		g_object_unref (parent);
	}

	gth_catalog_set_name (data->catalog, gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("name_entry"))));

	date_time = gth_datetime_new ();
	gth_time_selector_get_value (GTH_TIME_SELECTOR (data->time_selector), date_time);
	gth_catalog_set_date (data->catalog, date_time);
	gth_datetime_free (date_time);

	/* invoke the hook to save derived catalogs such as searches */

	gth_hook_invoke ("dlg-catalog-properties-save", data->builder, data->file_data, data->catalog);

	gio_file = gth_catalog_file_to_gio_file (data->file_data->file);
	buffer = gth_catalog_to_data (data->catalog, &size);
	_g_file_write_async (gio_file,
			     buffer,
			     size,
			     TRUE,
			     G_PRIORITY_DEFAULT,
			     NULL,
			     catalog_saved_cb,
			     data);

	g_object_unref (gio_file);
}
Exemplo n.º 6
0
static void
gth_application_startup (GApplication *application)
{
	G_APPLICATION_CLASS (gth_application_parent_class)->startup (application);

	g_object_set (gtk_settings_get_default (), "gtk-application-prefer-dark-theme", TRUE, NULL);

	_gth_application_initialize_app_actions (application);
	gth_pref_initialize ();
	migrate_data ();
	gth_main_initialize ();
	gth_main_register_default_hooks ();
	gth_main_register_file_source (GTH_TYPE_FILE_SOURCE_VFS);
	gth_main_register_default_sort_types ();
	gth_main_register_default_tests ();
	gth_main_register_default_types ();
	gth_main_register_default_metadata ();
	gth_main_activate_extensions ();
	gth_hook_invoke ("initialize", NULL);
}
Exemplo n.º 7
0
static void
catalog_ready_cb (GObject  *object,
		  GError   *error,
		  gpointer  user_data)
{
	DialogData *data = user_data;

	if (error != NULL) {
		_gtk_error_dialog_from_gerror_show (GTK_WINDOW(data->browser), _("Could not load the catalog"), error);
		gtk_widget_destroy (data->dialog);
		return;
	}

	data->catalog = g_object_ref (object);

	if (gth_catalog_get_name (data->catalog) != NULL) {
		gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("name_entry")), gth_catalog_get_name (data->catalog));
	}
	else if (! gth_datetime_valid_date (gth_catalog_get_date (data->catalog))) {
		char *basename;
		char *name;
		char *utf8_name;

		basename = g_file_get_basename (data->file_data->file);
		name = _g_uri_remove_extension (basename);
		utf8_name = g_filename_to_utf8 (name, -1, NULL, NULL, NULL);
		gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("name_entry")), utf8_name);

		g_free (utf8_name);
		g_free (name);
		g_free (basename);
	}

	gth_time_selector_set_value (GTH_TIME_SELECTOR (data->time_selector), gth_catalog_get_date (data->catalog));
	gth_hook_invoke ("dlg-catalog-properties", data->builder, data->file_data, data->catalog);
	gtk_widget_show (data->dialog);

	g_object_unref (object);
}
Exemplo n.º 8
0
gboolean
jpegtran (void           *in_buffer,
          gsize           in_buffer_size,
          void          **out_buffer,
          gsize          *out_buffer_size,
          GthTransform    transformation,
          JpegMcuAction   mcu_action,
          GError        **error)
{
    struct jpeg_decompress_struct  srcinfo;
    struct jpeg_compress_struct    dstinfo;
    struct error_handler_data      jsrcerr, jdsterr;
    gboolean                       success;

    *out_buffer = NULL;
    *out_buffer_size = 0;

    /* Initialize the JPEG decompression object with default error
     * handling. */
    srcinfo.err = jpeg_std_error (&(jsrcerr.pub));
    jsrcerr.pub.error_exit = fatal_error_handler;
    jsrcerr.pub.output_message = output_message_handler;
    jsrcerr.error = error;

    jpeg_create_decompress (&srcinfo);

    /* Initialize the JPEG compression object with default error
     * handling. */
    dstinfo.err = jpeg_std_error (&(jdsterr.pub));
    jdsterr.pub.error_exit = fatal_error_handler;
    jdsterr.pub.output_message = output_message_handler;
    jdsterr.error = error;

    jpeg_create_compress (&dstinfo);

    dstinfo.err->trace_level = 0;
    dstinfo.arith_code = FALSE;
    dstinfo.optimize_coding = FALSE;

    jsrcerr.pub.trace_level = jdsterr.pub.trace_level;
    srcinfo.mem->max_memory_to_use = dstinfo.mem->max_memory_to_use;

    /* Decompression error handler */
    if (sigsetjmp (jsrcerr.setjmp_buffer, 1)) {
        jpeg_destroy_compress (&dstinfo);
        jpeg_destroy_decompress (&srcinfo);
        return FALSE;
    }

    /* Compression error handler */
    if (sigsetjmp (jdsterr.setjmp_buffer, 1)) {
        jpeg_destroy_compress (&dstinfo);
        jpeg_destroy_decompress (&srcinfo);
        return FALSE;
    }

    /* Specify data source for decompression */
    _jpeg_memory_src (&srcinfo, in_buffer, in_buffer_size);

    /* Specify data destination for compression */
    _jpeg_memory_dest (&dstinfo, out_buffer, out_buffer_size);

    /* Apply transformation */
    success = jpegtran_internal (&srcinfo, &dstinfo, transformation, JCOPYOPT_ALL, mcu_action, error);

    /* Release memory */
    jpeg_destroy_compress (&dstinfo);
    jpeg_destroy_decompress (&srcinfo);

    if (success) {
        gth_hook_invoke ("jpegtran-after", out_buffer, out_buffer_size, &transformation);
    }
    else {
        g_free (*out_buffer);
        *out_buffer_size = 0;
    }

    return success;
}
Exemplo n.º 9
0
void
dlg_preferences (GthBrowser *browser)
{
	DialogData       *data;
	GtkWidget        *notebook;
	GList            *children;
	GList            *scan;
	int               page_num;
	GtkWidget        *list_box;
	GtkTreeSelection *selection;

	if (gth_browser_get_dialog (browser, "preferences") != NULL) {
		gtk_window_present (GTK_WINDOW (gth_browser_get_dialog (browser, "preferences")));
		return;
	}

	data = g_new0 (DialogData, 1);
	data->browser = browser;
	data->builder = _gtk_builder_new_from_file ("preferences.ui", NULL);
	data->dialog = GET_WIDGET ("preferences_dialog");

	gtk_container_set_border_width (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (data->dialog))), 0);
	gth_browser_set_dialog (browser, "preferences", data->dialog);
	gth_hook_invoke ("dlg-preferences-construct", data->dialog, data->browser, data->builder);

	/* widgets */

	list_box = GET_WIDGET ("tabs_listbox");
	notebook = GET_WIDGET ("notebook");
	children = gtk_container_get_children (GTK_CONTAINER (notebook));
	page_num = 0;
	for (scan = children; scan; scan = scan->next) {
		GtkWidget   *child = scan->data;
		const char  *name;
		GtkWidget   *row;
		GtkWidget   *box;
		GtkWidget   *label;

		name = gtk_notebook_get_tab_label_text (GTK_NOTEBOOK (notebook), child);
		if (name == NULL)
			continue;

		if (scan != children)
			_gtk_list_box_add_separator (GTK_LIST_BOX (list_box));

		row = gtk_list_box_row_new ();
		g_object_set_data (G_OBJECT (row), "gth.page_num", GINT_TO_POINTER (page_num));
		gtk_widget_show (row);
		gtk_container_add (GTK_CONTAINER (list_box), row);

		box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
		gtk_container_set_border_width (GTK_CONTAINER (box), 10);
		gtk_widget_show (box);
		gtk_container_add (GTK_CONTAINER (row), box);

		label = gtk_label_new (name);
		gtk_label_set_ellipsize (GTK_LABEL(label), PANGO_ELLIPSIZE_END);
		gtk_widget_show (label);
		gtk_container_add (GTK_CONTAINER (box), label);

		page_num += 1;
	}

	/* Set the signals handlers. */

	g_signal_connect (data->dialog,
			  "destroy",
			  G_CALLBACK (destroy_cb),
			  data);
	g_signal_connect (list_box,
			  "row-activated",
			  G_CALLBACK (list_box_row_activated_cb),
			  data);

	/* run dialog. */

	gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (browser));
	gtk_widget_show (data->dialog);
}
Exemplo n.º 10
0
static void
apply_changes (DialogData *data)
{
	gth_hook_invoke ("dlg-preferences-apply", data->dialog, data->browser, data->builder);
}