[gthumb: 2/23] started work on a contact sheet creator
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb: 2/23] started work on a contact sheet creator
- Date: Sun, 26 Dec 2010 19:19:53 +0000 (UTC)
commit eb5add4c12a04df8acdeab14fabd9f05c1dc8041
Author: Paolo Bacchilega <paobac src gnome org>
Date: Wed Dec 8 17:04:19 2010 +0100
started work on a contact sheet creator
configure.ac | 4 +
extensions/Makefile.am | 4 +-
extensions/contact_sheet/Makefile.am | 42 +
extensions/contact_sheet/actions.c | 48 +
extensions/contact_sheet/actions.h | 31 +
extensions/contact_sheet/callbacks.c | 98 ++
extensions/contact_sheet/callbacks.h | 29 +
.../contact_sheet/contact_sheet.extension.in.in | 12 +
extensions/contact_sheet/data/Makefile.am | 18 +
.../data/contact_sheet_themes/Makefile.am | 8 +
.../data/gthumb_contact_sheet.schemas.in | 200 ++++
extensions/contact_sheet/data/ui/Makefile.am | 5 +
.../contact_sheet/data/ui/contact-sheet-creator.ui | 1081 ++++++++++++++++++++
extensions/contact_sheet/dlg-contact-sheet.c | 510 +++++++++
extensions/contact_sheet/dlg-contact-sheet.h | 30 +
.../contact_sheet/gth-contact-sheet-creator.c | 280 +++++
.../contact_sheet/gth-contact-sheet-creator.h | 86 ++
extensions/contact_sheet/main.c | 52 +
extensions/contact_sheet/preferences.h | 47 +
19 files changed, 2584 insertions(+), 1 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index be79633..5c88493 100644
--- a/configure.ac
+++ b/configure.ac
@@ -500,6 +500,10 @@ extensions/change_date/data/ui/Makefile
extensions/comments/Makefile
extensions/comments/data/Makefile
extensions/comments/data/ui/Makefile
+extensions/contact_sheet/Makefile
+extensions/contact_sheet/data/Makefile
+extensions/contact_sheet/data/contact_sheet_themes/Makefile
+extensions/contact_sheet/data/ui/Makefile
extensions/convert_format/Makefile
extensions/convert_format/data/Makefile
extensions/convert_format/data/ui/Makefile
diff --git a/extensions/Makefile.am b/extensions/Makefile.am
index 024bb49..dce6130 100644
--- a/extensions/Makefile.am
+++ b/extensions/Makefile.am
@@ -33,7 +33,9 @@ SUBDIRS = \
webalbums \
flicker \
burn_disc \
- desktop_background
+ desktop_background \
+ contact_sheet \
+ $(NULL)
EXTRA_DIST = example
diff --git a/extensions/contact_sheet/Makefile.am b/extensions/contact_sheet/Makefile.am
new file mode 100644
index 0000000..fadbf4b
--- /dev/null
+++ b/extensions/contact_sheet/Makefile.am
@@ -0,0 +1,42 @@
+SUBDIRS = data
+
+extensiondir = $(pkglibdir)/extensions
+extension_LTLIBRARIES = libcontact_sheet.la
+
+libcontact_sheet_la_SOURCES = \
+ actions.c \
+ actions.h \
+ callbacks.c \
+ callbacks.h \
+ dlg-contact-sheet.c \
+ dlg-contact-sheet.h \
+ gth-contact-sheet-creator.c \
+ gth-contact-sheet-creator.h \
+ main.c \
+ preferences.h
+
+if RUN_IN_PLACE
+contact_sheet_datadir = $(abs_top_srcdir)/extensions/contact_sheet/data
+else
+contact_sheet_datadir = $(pkgdatadir)
+endif
+
+libcontact_sheet_la_CFLAGS = $(GTHUMB_CFLAGS) -I$(top_srcdir) -I$(top_builddir)/gthumb -DCONTACT_SHEET_DATADIR=\"$(contact_sheet_datadir)\"
+libcontact_sheet_la_LDFLAGS = $(EXTENSION_LIBTOOL_FLAGS)
+libcontact_sheet_la_LIBADD = $(GTHUMB_LIBS) ../image_rotation/libimage_rotation.la ../export_tools/libexport_tools.la
+libcontact_sheet_la_DEPENDENCIES = $(top_builddir)/gthumb/gthumb$(EXEEXT)
+
+extensioninidir = $(extensiondir)
+extensionini_DATA = $(extensionini_in_files:.extension.in.in=.extension)
+DISTCLEANFILES = $(extensionini_DATA)
+
+extensionini_in_files = contact_sheet.extension.in.in
+
+ GTHUMB_EXTENSION_IN_RULE@
+ GTHUMB_EXTENSION_RULE@
+
+EXTRA_DIST = $(extensionini_in_files)
+
+CLEANFILES = $(BUILT_SOURCES)
+
+-include $(top_srcdir)/git.mk
diff --git a/extensions/contact_sheet/actions.c b/extensions/contact_sheet/actions.c
new file mode 100644
index 0000000..213c511
--- /dev/null
+++ b/extensions/contact_sheet/actions.c
@@ -0,0 +1,48 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * 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/>.
+ */
+
+
+#include <config.h>
+#include <glib/gi18n.h>
+#include <gthumb.h>
+#include "dlg-contact-sheet.h"
+
+
+void
+gth_browser_activate_action_create_contact_sheet (GtkAction *action,
+ GthBrowser *browser)
+{
+ GList *items;
+ GList *file_data_list;
+ GList *file_list;
+
+ items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
+ file_data_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+ if (file_data_list == NULL)
+ file_data_list = gth_file_store_get_visibles (gth_browser_get_file_store (browser));
+ file_list = gth_file_data_list_to_file_list (file_data_list);
+
+ dlg_contact_sheet (browser, file_list);
+
+ _g_object_list_unref (file_list);
+ _g_object_list_unref (file_data_list);
+ _gtk_tree_path_list_free (items);
+}
diff --git a/extensions/contact_sheet/actions.h b/extensions/contact_sheet/actions.h
new file mode 100644
index 0000000..240731f
--- /dev/null
+++ b/extensions/contact_sheet/actions.h
@@ -0,0 +1,31 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * 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/>.
+ */
+
+#ifndef ACTIONS_H
+#define ACTIONS_H
+
+#include <gtk/gtk.h>
+
+#define DEFINE_ACTION(x) void x (GtkAction *action, gpointer data);
+
+DEFINE_ACTION(gth_browser_activate_action_create_contact_sheet)
+
+#endif /* ACTIONS_H */
diff --git a/extensions/contact_sheet/callbacks.c b/extensions/contact_sheet/callbacks.c
new file mode 100644
index 0000000..28908e2
--- /dev/null
+++ b/extensions/contact_sheet/callbacks.c
@@ -0,0 +1,98 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * 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/>.
+ */
+
+
+#include <config.h>
+#include <glib/gi18n.h>
+#include <glib-object.h>
+#include <gthumb.h>
+#include "actions.h"
+
+
+#define BROWSER_DATA_KEY "contact-sheet-browser-data"
+
+
+static const char *ui_info =
+"<ui>"
+" <menubar name='MenuBar'>"
+" <menu name='File' action='FileMenu'>"
+" <menu name='Export' action='ExportMenu'>"
+" <placeholder name='Web_Services'>"
+" <menuitem action='Tool_CreateContactSheet'/>"
+" </placeholder>"
+" </menu>"
+" </menu>"
+" </menubar>"
+" <popup name='ExportPopup'>"
+" <placeholder name='Misc_Actions'>"
+" <menuitem action='Tool_CreateContactSheet'/>"
+" </placeholder>"
+" </popup>"
+"</ui>";
+
+
+static GtkActionEntry action_entries[] = {
+ { "Tool_CreateContactSheet", "contact-sheet",
+ N_("Contact _Sheet..."), NULL,
+ N_("Create a contact sheet"),
+ G_CALLBACK (gth_browser_activate_action_create_contact_sheet) },
+};
+
+
+typedef struct {
+ GtkActionGroup *action_group;
+} BrowserData;
+
+
+static void
+browser_data_free (BrowserData *data)
+{
+ g_free (data);
+}
+
+
+void
+cs__gth_browser_construct_cb (GthBrowser *browser)
+{
+ BrowserData *data;
+ GError *error = NULL;
+ guint merge_id;
+
+ g_return_if_fail (GTH_IS_BROWSER (browser));
+
+ data = g_new0 (BrowserData, 1);
+
+ data->action_group = gtk_action_group_new ("Web Albums Actions");
+ gtk_action_group_set_translation_domain (data->action_group, NULL);
+ gtk_action_group_add_actions (data->action_group,
+ action_entries,
+ G_N_ELEMENTS (action_entries),
+ browser);
+ gtk_ui_manager_insert_action_group (gth_browser_get_ui_manager (browser), data->action_group, 0);
+
+ merge_id = gtk_ui_manager_add_ui_from_string (gth_browser_get_ui_manager (browser), ui_info, -1, &error);
+ if (merge_id == 0) {
+ g_warning ("building ui failed: %s", error->message);
+ g_clear_error (&error);
+ }
+
+ g_object_set_data_full (G_OBJECT (browser), BROWSER_DATA_KEY, data, (GDestroyNotify) browser_data_free);
+}
diff --git a/extensions/contact_sheet/callbacks.h b/extensions/contact_sheet/callbacks.h
new file mode 100644
index 0000000..d895b06
--- /dev/null
+++ b/extensions/contact_sheet/callbacks.h
@@ -0,0 +1,29 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * 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/>.
+ */
+
+#ifndef CALLBACKS_H
+#define CALLBACKS_H
+
+#include <gthumb.h>
+
+void cs__gth_browser_construct_cb (GthBrowser *browser);
+
+#endif /* CALLBACKS_H */
diff --git a/extensions/contact_sheet/contact_sheet.extension.in.in b/extensions/contact_sheet/contact_sheet.extension.in.in
new file mode 100644
index 0000000..bd30d79
--- /dev/null
+++ b/extensions/contact_sheet/contact_sheet.extension.in.in
@@ -0,0 +1,12 @@
+[Extension]
+_Name=Contact Sheet
+_Description=Create an index image displaying the thumbnails of the selected files.
+_Authors=gthumb development team
+Copyright=Copyright © 2010 The Free Software Foundation, Inc.
+Version=%VERSION%
+Category=Exporter
+
+[Loader]
+Type=module
+File=%LIBRARY%
+Requires=export_tools
diff --git a/extensions/contact_sheet/data/Makefile.am b/extensions/contact_sheet/data/Makefile.am
new file mode 100644
index 0000000..68c070f
--- /dev/null
+++ b/extensions/contact_sheet/data/Makefile.am
@@ -0,0 +1,18 @@
+SUBDIRS = contact_sheet_themes ui
+
+schemadir = @GCONF_SCHEMA_FILE_DIR@
+schema_in_files = gthumb_contact_sheet.schemas.in
+schema_DATA = $(schema_in_files:.schemas.in=.schemas)
+
+ INTLTOOL_SCHEMAS_RULE@
+
+if GCONF_SCHEMAS_INSTALL
+install-data-local:
+ GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(top_builddir)/extensions/contact_sheet/data/$(schema_DATA)
+endif
+
+EXTRA_DIST = $(schema_in_files)
+
+CLEANFILES = $(schema_DATA)
+
+-include $(top_srcdir)/git.mk
diff --git a/extensions/contact_sheet/data/contact_sheet_themes/Makefile.am b/extensions/contact_sheet/data/contact_sheet_themes/Makefile.am
new file mode 100644
index 0000000..343cdb2
--- /dev/null
+++ b/extensions/contact_sheet/data/contact_sheet_themes/Makefile.am
@@ -0,0 +1,8 @@
+themedir = $(pkgdatadir)/contactsheetthemes
+theme_DATA = \
+ default.ini \
+ $(NULL)
+
+EXTRA_DIST = $(theme_DATA)
+
+-include $(top_srcdir)/git.mk
diff --git a/extensions/contact_sheet/data/contact_sheet_themes/default.ini b/extensions/contact_sheet/data/contact_sheet_themes/default.ini
new file mode 100644
index 0000000..e69de29
diff --git a/extensions/contact_sheet/data/gthumb_contact_sheet.schemas.in b/extensions/contact_sheet/data/gthumb_contact_sheet.schemas.in
new file mode 100644
index 0000000..ab6aca7
--- /dev/null
+++ b/extensions/contact_sheet/data/gthumb_contact_sheet.schemas.in
@@ -0,0 +1,200 @@
+<gconfschemafile>
+ <schemalist>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/header</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/header</applyto>
+ <owner>gthumb</owner>
+ <type>string</type>
+ <default></default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/footer</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/footer</applyto>
+ <owner>gthumb</owner>
+ <type>string</type>
+ <default></default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/destination</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/destination</applyto>
+ <owner>gthumb</owner>
+ <type>string</type>
+ <default></default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/template</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/template</applyto>
+ <owner>gthumb</owner>
+ <type>string</type>
+ <default>###</default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/extension</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/extension</applyto>
+ <owner>gthumb</owner>
+ <type>string</type>
+ <default>jpeg</default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/html_image_map</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/html_image_map</applyto>
+ <owner>gthumb</owner>
+ <type>bool</type>
+ <default>false</default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/theme</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/theme</applyto>
+ <owner>gthumb</owner>
+ <type>string</type>
+ <default>default</default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/images_per_page</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/images_per_page</applyto>
+ <owner>gthumb</owner>
+ <type>int</type>
+ <default>25</default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/single_page</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/single_page</applyto>
+ <owner>gthumb</owner>
+ <type>bool</type>
+ <default>false</default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/columns</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/columns</applyto>
+ <owner>gthumb</owner>
+ <type>int</type>
+ <default>5</default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/sort_type</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/sort_type</applyto>
+ <owner>gthumb</owner>
+ <type>string</type>
+ <default>general::unsorted</default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/sort_inverse</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/sort_inverse</applyto>
+ <owner>gthumb</owner>
+ <type>bool</type>
+ <default>false</default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/same_size</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/same_size</applyto>
+ <owner>gthumb</owner>
+ <type>bool</type>
+ <default>true</default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/thumbnail_size</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/thumbnail_size</applyto>
+ <owner>gthumb</owner>
+ <type>int</type>
+ <default>128</default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/gthumb/ext/contact_sheet/thumbnail_caption</key>
+ <applyto>/apps/gthumb/ext/contact_sheet/thumbnail_caption</applyto>
+ <owner>gthumb</owner>
+ <type>string</type>
+ <default></default>
+ <locale name="C">
+ <short></short>
+ <long>
+ </long>
+ </locale>
+ </schema>
+
+ </schemalist>
+</gconfschemafile>
diff --git a/extensions/contact_sheet/data/ui/Makefile.am b/extensions/contact_sheet/data/ui/Makefile.am
new file mode 100644
index 0000000..09ea396
--- /dev/null
+++ b/extensions/contact_sheet/data/ui/Makefile.am
@@ -0,0 +1,5 @@
+uidir = $(pkgdatadir)/ui
+ui_DATA = contact-sheet-creator.ui
+EXTRA_DIST = $(ui_DATA)
+
+-include $(top_srcdir)/git.mk
diff --git a/extensions/contact_sheet/data/ui/contact-sheet-creator.ui b/extensions/contact_sheet/data/ui/contact-sheet-creator.ui
new file mode 100644
index 0000000..10af8b6
--- /dev/null
+++ b/extensions/contact_sheet/data/ui/contact-sheet-creator.ui
@@ -0,0 +1,1081 @@
+<?xml version="1.0"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy project-wide -->
+ <object class="GtkDialog" id="contact_sheet_dialog">
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes">Web Album</property>
+ <property name="type_hint">dialog</property>
+ <property name="has_separator">False</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox3">
+ <property name="visible">True</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkNotebook" id="notebook1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="border_width">6</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkFrame" id="frame7">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment3">
+ <property name="visible">True</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkTable" id="table2">
+ <property name="visible">True</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">6</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkTable" id="page_footer_help_table">
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">%p</property>
+ <attributes>
+ <attribute name="size" value="8000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">%P</property>
+ <attributes>
+ <attribute name="size" value="8000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">The current page number</property>
+ <attributes>
+ <attribute name="size" value="8000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">The total number of pages</property>
+ <attributes>
+ <attribute name="size" value="8000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Special code</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="size" value="8000"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label15">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Description</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="size" value="8000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label16">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes" comments="translate only the text in the curly brackets">%D{ format }</property>
+ <attributes>
+ <attribute name="size" value="8000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label17">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">The current date</property>
+ <attributes>
+ <attribute name="size" value="8000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="footer_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="activates_default">True</property>
+ <property name="secondary_icon_stock">gtk-help</property>
+ <property name="secondary_icon_activatable">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ <property name="secondary_icon_tooltip_text">Help</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label122">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Footer:</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="header_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="activates_default">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label86">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Header:</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label30">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Contact Sheet</property>
+ <property name="use_markup">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkVBox" id="vbox5">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkTable" id="table4">
+ <property name="visible">True</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">6</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label84">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Destination:</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFileChooserButton" id="destination_filechooserbutton">
+ <property name="visible">True</property>
+ <property name="local_only">False</property>
+ <property name="action">select-folder</property>
+ <property name="title" translatable="yes">Choose destination folder</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label54">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">File_name:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">template_entry</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox47">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkEntry" id="template_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="activates_default">True</property>
+ <property name="text" translatable="yes">###</property>
+ <property name="secondary_icon_stock">gtk-help</property>
+ <property name="secondary_icon_activatable">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="filetype_combobox">
+ <property name="visible">True</property>
+ <property name="model">filetype_liststore</property>
+ <property name="active">0</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="template_help_table">
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label32">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">#</property>
+ <attributes>
+ <attribute name="size" value="8000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label34">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">New enumerator digit</property>
+ <attributes>
+ <attribute name="size" value="8000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label36">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Special code</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="size" value="8000"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label37">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Description</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="size" value="8000"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="image_map_checkbutton">
+ <property name="label" translatable="yes">Create _HTML image map</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Saving</property>
+ <property name="use_markup">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame6">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment8">
+ <property name="visible">True</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkIconView" id="theme_iconview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="selection_mode">browse</property>
+ <property name="model">theme_liststore</property>
+ <property name="row_spacing">0</property>
+ <property name="column_spacing">0</property>
+ <property name="margin">0</property>
+ <child>
+ <object class="GtkCellRendererPixbuf" id="cellrenderertext3">
+ <property name="follow_state">True</property>
+ </object>
+ <attributes>
+ <attribute name="pixbuf">2</attribute>
+ </attributes>
+ </child>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext4">
+ <property name="alignment">center</property>
+ <property name="ellipsize">end</property>
+ </object>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkButton" id="add_theme_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Create a new theme</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="stock">gtk-add</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="edit_theme_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Edit the selected theme</property>
+ <child>
+ <object class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="stock">gtk-edit</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="delete_theme_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Delete the selected theme</property>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="stock">gtk-remove</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Theme</property>
+ <property name="use_markup">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">General</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="border_width">6</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkFrame" id="frame3">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkTable" id="table3">
+ <property name="visible">True</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">3</property>
+ <property name="column_spacing">6</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label18">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Columns:</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkSpinButton" id="cols_spinbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="adjustment">cols_adjustment</property>
+ <property name="climb_rate">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkSpinButton" id="images_per_index_spinbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="adjustment">rows_adjustment</property>
+ <property name="climb_rate">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label28">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Images per page:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">images_per_index_spinbutton</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="single_index_checkbutton">
+ <property name="label" translatable="yes">All images on a single page</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="same_size_checkbutton">
+ <property name="label" translatable="yes">_All pages with the same size</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Layout</property>
+ <property name="use_markup">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame4">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment6">
+ <property name="visible">True</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkVBox" id="vbox4">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">6</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label112">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">S_ort:</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox62">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkComboBox" id="sort_combobox">
+ <property name="visible">True</property>
+ <property name="model">sort_liststore</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext2"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="reverse_order_checkbutton">
+ <property name="label" translatable="yes">Re_verse order</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="size_label">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Size:</property>
+ <property name="use_underline">True</property>
+ <property name="justify">center</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkComboBox" id="thumbnail_size_combobox">
+ <property name="visible">True</property>
+ <property name="model">thumbnail_size_liststore</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext5"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox6">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Caption:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="thumbnail_caption_scrolledwindow">
+ <property name="height_request">200</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Thumbnails</property>
+ <property name="use_markup">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Layout</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area3">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="help_button">
+ <property name="label">gtk-help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ <property name="secondary">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="cancel_button">
+ <property name="label">gtk-cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="ok_button">
+ <property name="label">gtk-save</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-11">help_button</action-widget>
+ <action-widget response="-6">cancel_button</action-widget>
+ <action-widget response="-5">ok_button</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkListStore" id="filetype_liststore">
+ <columns>
+ <!-- column-name name -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">jpeg</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">png</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkAdjustment" id="rows_adjustment">
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="cols_adjustment">
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkListStore" id="sort_liststore">
+ <columns>
+ <!-- column-name data -->
+ <column type="gpointer"/>
+ <!-- column-name name -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkListStore" id="theme_liststore">
+ <columns>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ <!-- column-name name -->
+ <column type="gchararray"/>
+ <!-- column-name preview -->
+ <column type="GdkPixbuf"/>
+ </columns>
+ </object>
+ <object class="GtkListStore" id="thumbnail_size_liststore">
+ <columns>
+ <!-- column-name size -->
+ <column type="gint"/>
+ <!-- column-name name -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+</interface>
diff --git a/extensions/contact_sheet/dlg-contact-sheet.c b/extensions/contact_sheet/dlg-contact-sheet.c
new file mode 100644
index 0000000..144930c
--- /dev/null
+++ b/extensions/contact_sheet/dlg-contact-sheet.c
@@ -0,0 +1,510 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * 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/>.
+ */
+
+#include <config.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include "dlg-contact-sheet.h"
+#include "gth-contact-sheet-creator.h"
+#include "preferences.h"
+
+#define GET_WIDGET(name) _gtk_builder_get_widget (data->builder, (name))
+#define STRING_IS_VOID(x) (((x) == NULL) || (*(x) == 0))
+#define DEFAULT_CONTACT_SHEET_THEME "default"
+#define DEFAULT_CONTACT_SHEET_THUMBNAIL_CAPTION ("general::datetime,general::dimensions,gth::file::display-size")
+
+enum {
+ FILETYPE_COLUMN_NAME
+};
+
+enum {
+ THEME_COLUMN_ID,
+ THEME_COLUMN_NAME,
+ THEME_COLUMN_PREVIEW
+};
+
+enum {
+ SORT_TYPE_COLUMN_DATA,
+ SORT_TYPE_COLUMN_NAME
+};
+
+enum {
+ THUMBNAIL_SIZE_TYPE_COLUMN_SIZE,
+ THUMBNAIL_SIZE_TYPE_COLUMN_NAME
+};
+
+typedef struct {
+ GthBrowser *browser;
+ GList *file_list;
+ GtkBuilder *builder;
+ GtkWidget *dialog;
+ GtkWidget *thumbnail_caption_chooser;
+} DialogData;
+
+
+static int thumb_size[] = { 112, 128, 164, 200, 256, 312 };
+static int thumb_sizes = sizeof (thumb_size) / sizeof (int);
+
+
+static int
+get_idx_from_size (int size)
+{
+ int i;
+
+ for (i = 0; i < thumb_sizes; i++)
+ if (size == thumb_size[i])
+ return i;
+ return -1;
+}
+
+
+static void
+destroy_cb (GtkWidget *widget,
+ DialogData *data)
+{
+ gth_browser_set_dialog (data->browser, "contact_sheet", NULL);
+ _g_object_list_unref (data->file_list);
+ g_object_unref (data->builder);
+ g_free (data);
+}
+
+
+static void
+help_clicked_cb (GtkWidget *widget,
+ DialogData *data)
+{
+ show_help_dialog (GTK_WINDOW (data->dialog), "contact-sheet");
+}
+
+
+static void
+ok_clicked_cb (GtkWidget *widget,
+ DialogData *data)
+{
+ const char *header;
+ const char *footer;
+ char *s_value;
+ GFile *destination;
+ const char *template;
+ char *extension;
+ gboolean create_image_map;
+ char *theme_name;
+ int images_per_index;
+ int single_page;
+ int columns;
+ GthFileDataSort *sort_type;
+ gboolean sort_inverse;
+ gboolean same_size;
+ int thumbnail_size;
+ char *thumbnail_caption;
+ GtkTreeIter iter;
+ GthTask *task;
+
+ /* save the options */
+
+ header = gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("header_entry")));
+ eel_gconf_set_string (PREF_CONTACT_SHEET_HEADER, header);
+
+ footer = gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("footer_entry")));
+ eel_gconf_set_string (PREF_CONTACT_SHEET_FOOTER, footer);
+
+ s_value = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (GET_WIDGET ("destination_filechooserbutton")));
+ destination = g_file_new_for_uri (s_value);
+ eel_gconf_set_path (PREF_CONTACT_SHEET_DESTINATION, s_value);
+ g_free (s_value);
+
+ template = gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("template_entry")));
+ eel_gconf_set_string (PREF_CONTACT_SHEET_TEMPLATE, template);
+
+ extension = NULL;
+ if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (GET_WIDGET ("filetype_combobox")), &iter)) {
+ gtk_tree_model_get (GTK_TREE_MODEL (GET_WIDGET ("filetype_combobox")),
+ &iter,
+ FILETYPE_COLUMN_NAME, &extension,
+ -1);
+ eel_gconf_set_string (PREF_CONTACT_SHEET_EXTENSION, extension);
+ }
+
+ create_image_map = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("image_map_checkbutton")));
+ eel_gconf_set_boolean (PREF_CONTACT_SHEET_HTML_IMAGE_MAP, create_image_map);
+
+ theme_name = NULL;
+ {
+ GList *list;
+
+ list = gtk_icon_view_get_selected_items (GTK_ICON_VIEW (GET_WIDGET ("theme_iconview")));
+ if (list != NULL) {
+ GtkTreePath *path;
+ GtkTreeIter iter;
+
+ path = g_list_first (list)->data;
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (GET_WIDGET ("theme_liststore")), &iter, path);
+ gtk_tree_model_get (GTK_TREE_MODEL (GET_WIDGET ("theme_liststore")), &iter,
+ THEME_COLUMN_NAME, &theme_name,
+ -1);
+ }
+
+ g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL);
+ g_list_free (list);
+ }
+ g_return_if_fail (theme_name != NULL);
+ eel_gconf_set_string (PREF_CONTACT_SHEET_THEME, theme_name);
+
+ images_per_index = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("images_per_index_spinbutton")));
+ eel_gconf_set_integer (PREF_CONTACT_SHEET_IMAGES_PER_PAGE, images_per_index);
+
+ single_page = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("single_index_checkbutton")));
+ eel_gconf_set_boolean (PREF_CONTACT_SHEET_SINGLE_PAGE, single_page);
+
+ columns = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("cols_spinbutton")));
+ eel_gconf_set_integer (PREF_CONTACT_SHEET_COLUMNS, columns);
+
+ if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (GET_WIDGET ("sort_combobox")), &iter)) {
+ gtk_tree_model_get (GTK_TREE_MODEL (GET_WIDGET ("sort_liststore")),
+ &iter,
+ SORT_TYPE_COLUMN_DATA, &sort_type,
+ -1);
+ eel_gconf_set_string (PREF_CONTACT_SHEET_SORT_TYPE, sort_type->name);
+ }
+
+ sort_inverse = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("reverse_order_checkbutton")));
+ eel_gconf_set_boolean (PREF_CONTACT_SHEET_SORT_INVERSE, sort_inverse);
+
+ same_size = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("same_size_checkbutton")));
+ eel_gconf_set_boolean (PREF_CONTACT_SHEET_SAME_SIZE, same_size);
+
+ thumbnail_size = thumb_size[gtk_combo_box_get_active (GTK_COMBO_BOX (GET_WIDGET ("thumbnail_size_combobox")))];
+ eel_gconf_set_integer (PREF_CONTACT_SHEET_THUMBNAIL_SIZE, thumbnail_size);
+
+ thumbnail_caption = gth_metadata_chooser_get_selection (GTH_METADATA_CHOOSER (data->thumbnail_caption_chooser));
+ eel_gconf_set_string (PREF_CONTACT_SHEET_THUMBNAIL_CAPTION, thumbnail_caption);
+
+ /* exec the task */
+
+ task = gth_contact_sheet_creator_new (data->browser, data->file_list);
+
+ gth_contact_sheet_creator_set_header (GTH_CONTACT_SHEET_CREATOR (task), header);
+ gth_contact_sheet_creator_set_footer (GTH_CONTACT_SHEET_CREATOR (task), footer);
+ gth_contact_sheet_creator_set_destination (GTH_CONTACT_SHEET_CREATOR (task), destination);
+ gth_contact_sheet_creator_set_filename_template (GTH_CONTACT_SHEET_CREATOR (task), template);
+ gth_contact_sheet_creator_set_filetype (GTH_CONTACT_SHEET_CREATOR (task), extension);
+ gth_contact_sheet_creator_set_write_image_map (GTH_CONTACT_SHEET_CREATOR (task), create_image_map);
+ gth_contact_sheet_creator_set_theme (GTH_CONTACT_SHEET_CREATOR (task), theme_name);
+ gth_contact_sheet_creator_set_images_per_index (GTH_CONTACT_SHEET_CREATOR (task), images_per_index);
+ gth_contact_sheet_creator_set_single_index (GTH_CONTACT_SHEET_CREATOR (task), single_page);
+ gth_contact_sheet_creator_set_columns (GTH_CONTACT_SHEET_CREATOR (task), columns);
+ gth_contact_sheet_creator_set_sort_order (GTH_CONTACT_SHEET_CREATOR (task), sort_type, sort_inverse);
+ gth_contact_sheet_creator_set_same_size (GTH_CONTACT_SHEET_CREATOR (task), same_size);
+ gth_contact_sheet_creator_set_thumb_size (GTH_CONTACT_SHEET_CREATOR (task), FALSE, thumbnail_size, thumbnail_size);
+ gth_contact_sheet_creator_set_thumbnail_caption (GTH_CONTACT_SHEET_CREATOR (task), thumbnail_caption);
+
+ gth_browser_exec_task (data->browser, task, FALSE);
+ gtk_widget_destroy (data->dialog);
+
+ g_free (thumbnail_caption);
+ g_free (theme_name);
+ g_free (extension);
+ g_object_unref (destination);
+}
+
+
+static void
+update_sensitivity (DialogData *data)
+{
+ gtk_widget_set_sensitive (GET_WIDGET ("images_per_index_spinbutton"), ! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("single_index_checkbutton"))));
+}
+
+
+static void
+entry_help_icon_press_cb (GtkEntry *entry,
+ GtkEntryIconPosition icon_pos,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ DialogData *data = user_data;
+ GtkWidget *help_box;
+
+ if (GTK_WIDGET (entry) == GET_WIDGET ("footer_entry"))
+ help_box = GET_WIDGET ("page_footer_help_table");
+ else if (GTK_WIDGET (entry) == GET_WIDGET ("template_entry"))
+ help_box = GET_WIDGET ("template_help_table");
+
+ if (gtk_widget_get_visible (help_box))
+ gtk_widget_hide (help_box);
+ else
+ gtk_widget_show (help_box);
+}
+
+
+static void
+add_themes_from_dir (DialogData *data,
+ GFile *dir)
+{
+ GFileEnumerator *enumerator;
+ GFileInfo *file_info;
+
+ enumerator = g_file_enumerate_children (dir,
+ (G_FILE_ATTRIBUTE_STANDARD_NAME ","
+ G_FILE_ATTRIBUTE_STANDARD_TYPE ","
+ G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME),
+ G_FILE_QUERY_INFO_NONE,
+ NULL,
+ NULL);
+ if (enumerator == NULL)
+ return;
+
+ while ((file_info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL) {
+ GFile *file;
+ char *filename;
+ GdkPixbuf *preview;
+
+ if (g_file_info_get_file_type (file_info) != G_FILE_TYPE_DIRECTORY) {
+ g_object_unref (file_info);
+ continue;
+ }
+
+ file = _g_file_get_child (dir, g_file_info_get_name (file_info), "preview.png", NULL);
+ filename = g_file_get_path (file);
+ preview = gdk_pixbuf_new_from_file_at_size (filename, 128, 128, NULL);
+ if (preview != NULL) {
+ GtkTreeIter iter;
+
+ gtk_list_store_append (GTK_LIST_STORE (GET_WIDGET ("theme_liststore")), &iter);
+ gtk_list_store_set (GTK_LIST_STORE (GET_WIDGET ("theme_liststore")), &iter,
+ THEME_COLUMN_ID, g_file_info_get_name (file_info),
+ THEME_COLUMN_NAME, g_file_info_get_display_name (file_info),
+ THEME_COLUMN_PREVIEW, preview,
+ -1);
+ }
+
+ g_object_unref (preview);
+ g_free (filename);
+ g_object_unref (file);
+ g_object_unref (file_info);
+ }
+
+ g_object_unref (enumerator);
+}
+
+
+static void
+load_themes (DialogData *data)
+{
+ char *style_path;
+ GFile *style_dir;
+ GFile *data_dir;
+ char *default_theme;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ /* local themes */
+
+ style_path = gth_user_dir_get_file (GTH_DIR_DATA, GTHUMB_DIR, "contact_sheet_themes", NULL);
+ style_dir = g_file_new_for_path (style_path);
+ add_themes_from_dir (data, style_dir);
+ g_object_unref (style_dir);
+ g_free (style_path);
+
+ /* system themes */
+
+ data_dir = g_file_new_for_path (CONTACT_SHEET_DATADIR);
+ style_dir = _g_file_get_child (data_dir, "contact_sheet_themes", NULL);
+ add_themes_from_dir (data, style_dir);
+ g_object_unref (style_dir);
+ g_object_unref (data_dir);
+
+ /**/
+
+ /* gtk_widget_set_size_request (GET_WIDGET ("theme_iconview"), (150 * 3), 140); FIXME */
+ gtk_widget_realize (GET_WIDGET ("theme_iconview"));
+
+ default_theme = eel_gconf_get_string (PREF_CONTACT_SHEET_THEME, DEFAULT_CONTACT_SHEET_THEME);
+
+ model = GTK_TREE_MODEL (GET_WIDGET ("theme_liststore"));
+ if (gtk_tree_model_get_iter_first (model, &iter)) {
+ do {
+ char *name;
+
+ gtk_tree_model_get(model, &iter, THEME_COLUMN_ID, &name, -1);
+
+ if (g_strcmp0 (name, default_theme) == 0) {
+ GtkTreePath *path;
+
+ path = gtk_tree_model_get_path (model, &iter);
+ gtk_icon_view_select_path (GTK_ICON_VIEW (GET_WIDGET ("theme_iconview")), path);
+ gtk_icon_view_scroll_to_path (GTK_ICON_VIEW (GET_WIDGET ("theme_iconview")), path, TRUE, 0.5, 0.5);
+
+ gtk_tree_path_free (path);
+ g_free (name);
+ break;
+ }
+
+ g_free (name);
+ }
+ while (gtk_tree_model_iter_next (model, &iter));
+ }
+
+ g_free (default_theme);
+}
+
+
+void
+dlg_contact_sheet (GthBrowser *browser,
+ GList *file_list)
+{
+ DialogData *data;
+ int i;
+ int active_index;
+ char *default_sort_type;
+ GList *sort_types;
+ GList *scan;
+ char *caption;
+ char *s_value;
+
+ if (gth_browser_get_dialog (browser, "contact_sheet") != NULL) {
+ gtk_window_present (GTK_WINDOW (gth_browser_get_dialog (browser, "contact_sheet")));
+ return;
+ }
+
+ data = g_new0 (DialogData, 1);
+ data->browser = browser;
+ data->file_list = _g_object_list_ref (file_list);
+ data->builder = _gtk_builder_new_from_file ("contact-sheet-creator.ui", "contact_sheet");
+
+ data->dialog = _gtk_builder_get_widget (data->builder, "contact_sheet_dialog");
+ gth_browser_set_dialog (browser, "contact_sheet", data->dialog);
+ g_object_set_data (G_OBJECT (data->dialog), "dialog_data", data);
+
+ data->thumbnail_caption_chooser = gth_metadata_chooser_new (GTH_METADATA_ALLOW_IN_FILE_LIST);
+ gtk_widget_show (data->thumbnail_caption_chooser);
+ gtk_container_add (GTK_CONTAINER (GET_WIDGET ("thumbnail_caption_scrolledwindow")), data->thumbnail_caption_chooser);
+
+ /* Set widgets data. */
+
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (GET_WIDGET ("images_per_index_spinbutton")), eel_gconf_get_integer (PREF_CONTACT_SHEET_IMAGES_PER_PAGE, 25));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("single_index_checkbutton")), eel_gconf_get_boolean (PREF_CONTACT_SHEET_SINGLE_PAGE, FALSE));
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (GET_WIDGET ("cols_spinbutton")), eel_gconf_get_integer (PREF_CONTACT_SHEET_COLUMNS, 5));
+
+ default_sort_type = eel_gconf_get_string (PREF_CONTACT_SHEET_SORT_TYPE, "general::unsorted");
+ active_index = 0;
+ sort_types = gth_main_get_all_sort_types ();
+ for (i = 0, scan = sort_types; scan; scan = scan->next, i++) {
+ GthFileDataSort *sort_type = scan->data;
+ GtkTreeIter iter;
+
+ if (g_str_equal (sort_type->name, default_sort_type))
+ active_index = i;
+
+ gtk_list_store_append (GTK_LIST_STORE (GET_WIDGET ("sort_liststore")), &iter);
+ gtk_list_store_set (GTK_LIST_STORE (GET_WIDGET ("sort_liststore")), &iter,
+ SORT_TYPE_COLUMN_DATA, sort_type,
+ SORT_TYPE_COLUMN_NAME, _(sort_type->display_name),
+ -1);
+ }
+ g_list_free (sort_types);
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (GET_WIDGET ("sort_combobox")), active_index);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("reverse_order_checkbutton")), eel_gconf_get_boolean (PREF_CONTACT_SHEET_SORT_INVERSE, FALSE));
+
+ g_free (default_sort_type);
+
+ gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("header_entry")),
+ g_file_info_get_edit_name (gth_browser_get_location_data (browser)->info));
+
+ s_value = eel_gconf_get_string (PREF_CONTACT_SHEET_FOOTER, "");
+ gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("footer_entry")), s_value);
+ g_free (s_value);
+
+ caption = eel_gconf_get_string (PREF_CONTACT_SHEET_THUMBNAIL_CAPTION, DEFAULT_CONTACT_SHEET_THUMBNAIL_CAPTION);
+ gth_metadata_chooser_set_selection (GTH_METADATA_CHOOSER (data->thumbnail_caption_chooser), caption);
+ g_free (caption);
+
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (GET_WIDGET ("theme_liststore")),
+ THEME_COLUMN_NAME,
+ GTK_SORT_ASCENDING);
+
+ for (i = 0; i < thumb_sizes; i++) {
+ char *name;
+ GtkTreeIter iter;
+
+ name = g_strdup_printf ("%d", thumb_size[i]);
+
+ gtk_list_store_append (GTK_LIST_STORE (GET_WIDGET ("thumbnail_size_liststore")), &iter);
+ gtk_list_store_set (GTK_LIST_STORE (GET_WIDGET ("thumbnail_size_liststore")), &iter,
+ THUMBNAIL_SIZE_TYPE_COLUMN_SIZE, thumb_size[i],
+ THUMBNAIL_SIZE_TYPE_COLUMN_NAME, name,
+ -1);
+
+ g_free (name);
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (GET_WIDGET ("thumbnail_size_combobox")), get_idx_from_size (eel_gconf_get_integer (PREF_CONTACT_SHEET_THUMBNAIL_SIZE, 128)));
+
+ load_themes (data);
+ update_sensitivity (data);
+
+ {
+ char *destination;
+
+ destination = eel_gconf_get_path (PREF_CONTACT_SHEET_DESTINATION, NULL);
+ if (destination == NULL)
+ destination = g_strdup (get_home_uri ());
+ gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (GET_WIDGET ("destination_filechooserbutton")), destination);
+
+ g_free (destination);
+ }
+
+ /* Set the signals handlers. */
+
+ g_signal_connect (G_OBJECT (data->dialog),
+ "destroy",
+ G_CALLBACK (destroy_cb),
+ data);
+ g_signal_connect (GET_WIDGET ("ok_button"),
+ "clicked",
+ G_CALLBACK (ok_clicked_cb),
+ data);
+ g_signal_connect (GET_WIDGET ("help_button"),
+ "clicked",
+ G_CALLBACK (help_clicked_cb),
+ data);
+ g_signal_connect_swapped (GET_WIDGET ("cancel_button"),
+ "clicked",
+ G_CALLBACK (gtk_widget_destroy),
+ data->dialog);
+ g_signal_connect (GET_WIDGET ("footer_entry"),
+ "icon-press",
+ G_CALLBACK (entry_help_icon_press_cb),
+ data);
+ g_signal_connect (GET_WIDGET ("template_entry"),
+ "icon-press",
+ G_CALLBACK (entry_help_icon_press_cb),
+ data);
+ g_signal_connect_swapped (GET_WIDGET ("single_index_checkbutton"),
+ "toggled",
+ G_CALLBACK (update_sensitivity),
+ data);
+
+ /* Run dialog. */
+
+ gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (browser));
+ gtk_window_set_modal (GTK_WINDOW (data->dialog), FALSE);
+ gtk_widget_show (data->dialog);
+}
diff --git a/extensions/contact_sheet/dlg-contact-sheet.h b/extensions/contact_sheet/dlg-contact-sheet.h
new file mode 100644
index 0000000..95e71cd
--- /dev/null
+++ b/extensions/contact_sheet/dlg-contact-sheet.h
@@ -0,0 +1,30 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * 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/>.
+ */
+
+#ifndef DLG_CONTACT_SHEET_H
+#define DLG_CONTACT_SHEET_H
+
+#include <gthumb.h>
+
+void dlg_contact_sheet (GthBrowser *browser,
+ GList *file_list); /* GFile list */
+
+#endif /* DLG_CONTACT_SHEET_H */
diff --git a/extensions/contact_sheet/gth-contact-sheet-creator.c b/extensions/contact_sheet/gth-contact-sheet-creator.c
new file mode 100644
index 0000000..f6276a1
--- /dev/null
+++ b/extensions/contact_sheet/gth-contact-sheet-creator.c
@@ -0,0 +1,280 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * 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/>.
+ */
+
+#include <config.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <gthumb.h>
+#include <extensions/image_rotation/rotation-utils.h>
+#include "gth-contact-sheet-creator.h"
+#include "preferences.h"
+
+#define DEFAULT_THUMB_SIZE 128
+
+static GObjectClass *parent_class = NULL;
+
+
+struct _GthContactSheetCreatorPrivate {
+ GthBrowser *browser;
+ GList *gfile_list; /* GFile list */
+
+ /* options */
+
+ char *header;
+ char *footer;
+ GFile *destination; /* Save files in this location. */
+ GthFileDataSort *sort_type;
+ gboolean sort_inverse;
+ int images_per_index;
+ gboolean single_index;
+ int columns_per_page;
+ int rows_per_page;
+ gboolean squared_thumbnails;
+ int thumb_width;
+ int thumb_height;
+ char *thumbnail_caption;
+};
+
+
+static void
+gth_contact_sheet_creator_exec (GthTask *task)
+{
+ /* TODO */
+}
+
+
+static void
+gth_contact_sheet_creator_cancelled (GthTask *task)
+{
+ /* TODO */
+}
+
+
+static void
+gth_contact_sheet_creator_finalize (GObject *object)
+{
+ GthContactSheetCreator *self;
+
+ g_return_if_fail (GTH_IS_CONTACT_SHEET_CREATOR (object));
+
+ self = GTH_CONTACT_SHEET_CREATOR (object);
+ g_free (self->priv->header);
+ g_free (self->priv->footer);
+ g_free (self->priv->thumbnail_caption);
+ _g_object_list_unref (self->priv->gfile_list);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+
+static void
+gth_contact_sheet_creator_class_init (GthContactSheetCreatorClass *klass)
+{
+ GObjectClass *object_class;
+ GthTaskClass *task_class;
+
+ parent_class = g_type_class_peek_parent (klass);
+ g_type_class_add_private (klass, sizeof (GthContactSheetCreatorPrivate));
+
+ object_class = G_OBJECT_CLASS (klass);
+ object_class->finalize = gth_contact_sheet_creator_finalize;
+
+ task_class = GTH_TASK_CLASS (klass);
+ task_class->exec = gth_contact_sheet_creator_exec;
+ task_class->cancelled = gth_contact_sheet_creator_cancelled;
+}
+
+
+static void
+gth_contact_sheet_creator_init (GthContactSheetCreator *self)
+{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_CONTACT_SHEET_CREATOR, GthContactSheetCreatorPrivate);
+ self->priv->header = NULL;
+ self->priv->footer = NULL;
+ self->priv->sort_type = NULL;
+ self->priv->sort_inverse = FALSE;
+ self->priv->images_per_index = 0;
+ self->priv->columns_per_page = 0;
+ self->priv->rows_per_page = 0;
+ self->priv->single_index = FALSE;
+ self->priv->thumb_width = DEFAULT_THUMB_SIZE;
+ self->priv->thumb_height = DEFAULT_THUMB_SIZE;
+ self->priv->thumbnail_caption = NULL;
+}
+
+
+GType
+gth_contact_sheet_creator_get_type (void)
+{
+ static GType type = 0;
+
+ if (! type) {
+ GTypeInfo type_info = {
+ sizeof (GthContactSheetCreatorClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gth_contact_sheet_creator_class_init,
+ NULL,
+ NULL,
+ sizeof (GthContactSheetCreator),
+ 0,
+ (GInstanceInitFunc) gth_contact_sheet_creator_init
+ };
+
+ type = g_type_register_static (GTH_TYPE_TASK,
+ "GthContactSheetCreator",
+ &type_info,
+ 0);
+ }
+
+ return type;
+}
+
+
+GthTask *
+gth_contact_sheet_creator_new (GthBrowser *browser,
+ GList *file_list)
+{
+ GthContactSheetCreator *self;
+
+ g_return_val_if_fail (browser != NULL, NULL);
+
+ self = (GthContactSheetCreator *) g_object_new (GTH_TYPE_CONTACT_SHEET_CREATOR, NULL);
+ self->priv->browser = browser;
+ self->priv->gfile_list = _g_object_list_ref (file_list);
+
+ return (GthTask *) self;
+}
+
+
+void
+gth_contact_sheet_creator_set_header (GthContactSheetCreator *self,
+ const char *value)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_footer (GthContactSheetCreator *self,
+ const char *value)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_destination (GthContactSheetCreator *self,
+ GFile *destination)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_filename_template (GthContactSheetCreator *self,
+ const char *filename_template)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_filetype (GthContactSheetCreator *self,
+ const char *filetype)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_write_image_map (GthContactSheetCreator *self,
+ gboolean value)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_theme (GthContactSheetCreator *self,
+ const char *theme_name)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_images_per_index (GthContactSheetCreator *self,
+ int value)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_single_index (GthContactSheetCreator *self,
+ gboolean value)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_columns (GthContactSheetCreator *self,
+ int columns)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_sort_order (GthContactSheetCreator *self,
+ GthFileDataSort *sort_type,
+ gboolean sort_inverse)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_same_size (GthContactSheetCreator *self,
+ gboolean value)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_thumb_size (GthContactSheetCreator *self,
+ gboolean squared,
+ int width,
+ int height)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_thumbnail_caption (GthContactSheetCreator *self,
+ const char *caption)
+{
+
+}
diff --git a/extensions/contact_sheet/gth-contact-sheet-creator.h b/extensions/contact_sheet/gth-contact-sheet-creator.h
new file mode 100644
index 0000000..ceaddaf
--- /dev/null
+++ b/extensions/contact_sheet/gth-contact-sheet-creator.h
@@ -0,0 +1,86 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * 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/>.
+ */
+
+#ifndef GTH_CONTACT_SHEET_CREATOR_H
+#define GTH_CONTACT_SHEET_CREATOR_H
+
+#include <glib.h>
+#include <gio/gio.h>
+#include <gtk/gtk.h>
+#include <gthumb.h>
+
+#define GTH_TYPE_CONTACT_SHEET_CREATOR (gth_contact_sheet_creator_get_type ())
+#define GTH_CONTACT_SHEET_CREATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTH_TYPE_CONTACT_SHEET_CREATOR, GthContactSheetCreator))
+#define GTH_CONTACT_SHEET_CREATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTH_TYPE_CONTACT_SHEET_CREATOR, GthContactSheetCreatorClass))
+#define GTH_IS_CONTACT_SHEET_CREATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTH_TYPE_CONTACT_SHEET_CREATOR))
+#define GTH_IS_CONTACT_SHEET_CREATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTH_TYPE_CONTACT_SHEET_CREATOR))
+#define GTH_CONTACT_SHEET_CREATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTH_TYPE_CONTACT_SHEET_CREATOR, GthContactSheetCreatorClass))
+
+typedef struct _GthContactSheetCreator GthContactSheetCreator;
+typedef struct _GthContactSheetCreatorClass GthContactSheetCreatorClass;
+typedef struct _GthContactSheetCreatorPrivate GthContactSheetCreatorPrivate;
+
+struct _GthContactSheetCreator {
+ GthTask __parent;
+ GthContactSheetCreatorPrivate *priv;
+
+};
+
+struct _GthContactSheetCreatorClass {
+ GthTaskClass __parent;
+};
+
+GType gth_contact_sheet_creator_get_type (void);
+GthTask * gth_contact_sheet_creator_new (GthBrowser *browser,
+ GList *file_list); /* GFile list */
+void gth_contact_sheet_creator_set_header (GthContactSheetCreator *self,
+ const char *value);
+void gth_contact_sheet_creator_set_footer (GthContactSheetCreator *self,
+ const char *value);
+void gth_contact_sheet_creator_set_destination (GthContactSheetCreator *self,
+ GFile *destination);
+void gth_contact_sheet_creator_set_filename_template (GthContactSheetCreator *self,
+ const char *filename_template);
+void gth_contact_sheet_creator_set_filetype (GthContactSheetCreator *self,
+ const char *filetype);
+void gth_contact_sheet_creator_set_write_image_map (GthContactSheetCreator *self,
+ gboolean value);
+void gth_contact_sheet_creator_set_theme (GthContactSheetCreator *self,
+ const char *theme_name);
+void gth_contact_sheet_creator_set_images_per_index (GthContactSheetCreator *self,
+ int value);
+void gth_contact_sheet_creator_set_single_index (GthContactSheetCreator *self,
+ gboolean value);
+void gth_contact_sheet_creator_set_columns (GthContactSheetCreator *self,
+ int columns);
+void gth_contact_sheet_creator_set_sort_order (GthContactSheetCreator *self,
+ GthFileDataSort *sort_type,
+ gboolean sort_inverse);
+void gth_contact_sheet_creator_set_same_size (GthContactSheetCreator *self,
+ gboolean value);
+void gth_contact_sheet_creator_set_thumb_size (GthContactSheetCreator *self,
+ gboolean squared,
+ int width,
+ int height);
+void gth_contact_sheet_creator_set_thumbnail_caption (GthContactSheetCreator *self,
+ const char *caption);
+
+#endif /* GTH_CONTACT_SHEET_CREATOR_H */
diff --git a/extensions/contact_sheet/main.c b/extensions/contact_sheet/main.c
new file mode 100644
index 0000000..285ad0f
--- /dev/null
+++ b/extensions/contact_sheet/main.c
@@ -0,0 +1,52 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * 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/>.
+ */
+
+
+#include <config.h>
+#include <gtk/gtk.h>
+#include <gthumb.h>
+#include "callbacks.h"
+
+
+G_MODULE_EXPORT void
+gthumb_extension_activate (void)
+{
+ gth_hook_add_callback ("gth-browser-construct", 10, G_CALLBACK (cs__gth_browser_construct_cb), NULL);
+}
+
+
+G_MODULE_EXPORT void
+gthumb_extension_deactivate (void)
+{
+}
+
+
+G_MODULE_EXPORT gboolean
+gthumb_extension_is_configurable (void)
+{
+ return FALSE;
+}
+
+
+G_MODULE_EXPORT void
+gthumb_extension_configure (GtkWindow *parent)
+{
+}
diff --git a/extensions/contact_sheet/preferences.h b/extensions/contact_sheet/preferences.h
new file mode 100644
index 0000000..99bcade
--- /dev/null
+++ b/extensions/contact_sheet/preferences.h
@@ -0,0 +1,47 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * 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/>.
+ */
+
+#ifndef PREFERENCES_H
+#define PREFERENCES_H
+
+#include <gthumb.h>
+
+G_BEGIN_DECLS
+
+#define PREF_CONTACT_SHEET_HEADER "/apps/gthumb/ext/contact_sheet/header"
+#define PREF_CONTACT_SHEET_FOOTER "/apps/gthumb/ext/contact_sheet/footer"
+#define PREF_CONTACT_SHEET_DESTINATION "/apps/gthumb/ext/contact_sheet/destination"
+#define PREF_CONTACT_SHEET_TEMPLATE "/apps/gthumb/ext/contact_sheet/template"
+#define PREF_CONTACT_SHEET_EXTENSION "/apps/gthumb/ext/contact_sheet/extension"
+#define PREF_CONTACT_SHEET_HTML_IMAGE_MAP "/apps/gthumb/ext/contact_sheet/html_image_map"
+#define PREF_CONTACT_SHEET_THEME "/apps/gthumb/ext/contact_sheet/theme"
+#define PREF_CONTACT_SHEET_IMAGES_PER_PAGE "/apps/gthumb/ext/contact_sheet/images_per_page"
+#define PREF_CONTACT_SHEET_SINGLE_PAGE "/apps/gthumb/ext/contact_sheet/single_page"
+#define PREF_CONTACT_SHEET_COLUMNS "/apps/gthumb/ext/contact_sheet/columns"
+#define PREF_CONTACT_SHEET_SORT_TYPE "/apps/gthumb/ext/contact_sheet/sort_type"
+#define PREF_CONTACT_SHEET_SORT_INVERSE "/apps/gthumb/ext/contact_sheet/sort_inverse"
+#define PREF_CONTACT_SHEET_SAME_SIZE "/apps/gthumb/ext/contact_sheet/same_size"
+#define PREF_CONTACT_SHEET_THUMBNAIL_SIZE "/apps/gthumb/ext/contact_sheet/thumbnail_size"
+#define PREF_CONTACT_SHEET_THUMBNAIL_CAPTION "/apps/gthumb/ext/contact_sheet/thumbnail_caption"
+
+G_END_DECLS
+
+#endif /* PREFERENCES_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]