f-spot r3659 - in trunk/extensions: . CDExport DevelopInUFraw FacebookExport FlickrExport GalleryExport MetaPixel PicasaWebExport PictureTile RawPlusJpeg SmugMugExport SyncCatalog ZipExport



Author: sdelcroix
Date: Mon Feb 11 09:01:43 2008
New Revision: 3659
URL: http://svn.gnome.org/viewvc/f-spot?rev=3659&view=rev

Log:
2008-02-11  Stephane Delcroix  <sdelcroix novell com>

	* PictureTile:
	* MetaPixel: 2 new extensions from maxxer.


Added:
   trunk/extensions/MetaPixel/
   trunk/extensions/MetaPixel/Makefile
   trunk/extensions/MetaPixel/MetaPixel.addin.xml
   trunk/extensions/MetaPixel/MetaPixel.cs
   trunk/extensions/MetaPixel/MetaPixel.glade
   trunk/extensions/PictureTile/
   trunk/extensions/PictureTile/Makefile
   trunk/extensions/PictureTile/PictureTile.addin.xml
   trunk/extensions/PictureTile/PictureTile.cs
   trunk/extensions/PictureTile/PictureTile.glade
Modified:
   trunk/extensions/CDExport/CDExport.addin.xml
   trunk/extensions/ChangeLog
   trunk/extensions/DevelopInUFraw/DevelopInUFRaw.addin.xml
   trunk/extensions/FacebookExport/FacebookExport.addin.xml
   trunk/extensions/FacebookExport/FacebookExport.cs
   trunk/extensions/FlickrExport/FlickrExport.addin.xml
   trunk/extensions/GalleryExport/GalleryExport.addin.xml
   trunk/extensions/PicasaWebExport/PicasaWebExport.addin.xml
   trunk/extensions/RawPlusJpeg/RawPlusJpeg.addin.xml
   trunk/extensions/SmugMugExport/SmugMugExport.addin.xml
   trunk/extensions/SyncCatalog/SyncCatalog.addin.xml
   trunk/extensions/SyncCatalog/SyncCatalog.cs
   trunk/extensions/ZipExport/ZipExport.addin.xml
   trunk/extensions/ZipExport/ZipExport.cs

Modified: trunk/extensions/CDExport/CDExport.addin.xml
==============================================================================
--- trunk/extensions/CDExport/CDExport.addin.xml	(original)
+++ trunk/extensions/CDExport/CDExport.addin.xml	Mon Feb 11 09:01:43 2008
@@ -1,5 +1,5 @@
 <Addin namespace="FSpot"
-	version="1.0"
+	version="1.1"
 	name="CD Export"
 	description="This extension allows you to burn your photos to CD."
 	author="F-Spot team"
@@ -8,7 +8,7 @@
 	category="Export">
 
 	<Dependencies>
-		<Addin id="Core" version="0.4.0.0"/>
+		<Addin id="Core" version="0.4.2.0"/>
 	</Dependencies>
 
 	<Extension path = "/FSpot/Menus/Exports">

Modified: trunk/extensions/DevelopInUFraw/DevelopInUFRaw.addin.xml
==============================================================================
--- trunk/extensions/DevelopInUFraw/DevelopInUFRaw.addin.xml	(original)
+++ trunk/extensions/DevelopInUFraw/DevelopInUFRaw.addin.xml	Mon Feb 11 09:01:43 2008
@@ -1,12 +1,12 @@
 <Addin namespace="FSpot"
 	id="DevelopInUFraw"
-	version="0.99"
+	version="1.0"
 	description="Develop the image in UFRaw, saves the result as a new version\n\nNote: Require ufraw 0.13 or CVS version newer than 2007-09-06 !!!"
 	author="Stephane Delcroix"
 	url="http://f-spot.org/Extensions";
 	category="Tools">
 	<Dependencies>
-		<Addin id="Core" version="0.4.0.3347"/>
+		<Addin id="Core" version="0.4.2.0"/>
 	</Dependencies>
 	<Extension path = "/FSpot/Menus/PhotoPopup">
 		<Command id = "DevelopInUFRaw" _label = "Develop in UFRaw" command_type = "DevelopInUFRawExtension.DevelopInUFRaw" insertbefore="OpenWith"/>

Modified: trunk/extensions/FacebookExport/FacebookExport.addin.xml
==============================================================================
--- trunk/extensions/FacebookExport/FacebookExport.addin.xml	(original)
+++ trunk/extensions/FacebookExport/FacebookExport.addin.xml	Mon Feb 11 09:01:43 2008
@@ -1,13 +1,13 @@
 <Addin 	namespace="FSpot"
 	id="FacebookExport"
-	version="0.95"
+	version="0.96"
 	name="FacebookExport"
 	description="Export pictures to facebook"
 	author="George Talusan"
 	url="http://f-spot.org/Extensions";
 	category="Export">
 	<Dependencies>
-		<Addin id="Core" version="0.4.0.3457"/>
+		<Addin id="Core" version="0.4.2.0"/>
 	</Dependencies>
 	<Runtime>
 		<Import file="Mono.Facebook.dll" />

Modified: trunk/extensions/FacebookExport/FacebookExport.cs
==============================================================================
--- trunk/extensions/FacebookExport/FacebookExport.cs	(original)
+++ trunk/extensions/FacebookExport/FacebookExport.cs	Mon Feb 11 09:01:43 2008
@@ -21,6 +21,8 @@
 using Gtk;
 
 using FSpot;
+using FSpot.Utils;
+using FSpot.UI.Dialog;
 using FSpot.Extensions;
 using FSpot.Filters;
 

Modified: trunk/extensions/FlickrExport/FlickrExport.addin.xml
==============================================================================
--- trunk/extensions/FlickrExport/FlickrExport.addin.xml	(original)
+++ trunk/extensions/FlickrExport/FlickrExport.addin.xml	Mon Feb 11 09:01:43 2008
@@ -1,5 +1,5 @@
 <Addin namespace="FSpot"
-	version="1.0"
+	version="1.1"
 	name="Flickr Export"
 	description="This extension allows you to export your photos to Flickr and 23hq."
 	author="F-Spot team"
@@ -8,7 +8,7 @@
 	category="Export">
 
 	<Dependencies>
-		<Addin id="Core" version="0.4.0.0"/>
+		<Addin id="Core" version="0.4.2.0"/>
 	</Dependencies>
 
 	<Extension path = "/FSpot/Menus/Exports">

Modified: trunk/extensions/GalleryExport/GalleryExport.addin.xml
==============================================================================
--- trunk/extensions/GalleryExport/GalleryExport.addin.xml	(original)
+++ trunk/extensions/GalleryExport/GalleryExport.addin.xml	Mon Feb 11 09:01:43 2008
@@ -1,5 +1,5 @@
 <Addin namespace="FSpot"
-	version="1.0.1"
+	version="1.1"
 	name="Gallery Export"
 	description="This extension allows you to export your photos to PHP Gallery (http://gallery.menalto.com)."
 	author="F-Spot team"
@@ -8,7 +8,7 @@
 	category="Export">
 
 	<Dependencies>
-		<Addin id="Core" version="0.4.0.0"/>
+		<Addin id="Core" version="0.4.2.0"/>
 	</Dependencies>
 
 	<Extension path = "/FSpot/Menus/Exports">

Added: trunk/extensions/MetaPixel/Makefile
==============================================================================
--- (empty file)
+++ trunk/extensions/MetaPixel/Makefile	Mon Feb 11 09:01:43 2008
@@ -0,0 +1,32 @@
+all: MetaPixel.dll
+
+PACKAGES = \
+	-pkg:f-spot \
+	-pkg:gnome-vfs-sharp-2.0 \
+	-pkg:gtk-sharp-2.0 \
+	-pkg:glade-sharp-2.0
+
+ASSEMBLIES = \
+	-r:Mono.Posix
+
+RESOURCES = \
+	-resource:MetaPixel.glade \
+	-resource:MetaPixel.addin.xml 
+
+SOURCES = \
+	MetaPixel.cs
+
+install: all
+	cp *.dll ~/.gnome2/f-spot/addins/
+
+mpack: MetaPixel.dll
+	mautil p MetaPixel.dll
+
+%.dll: %.cs %.glade
+	gmcs -target:library $(SOURCES) $(PACKAGES) $(ASSEMBLIES) $(RESOURCES)
+
+clean:
+	rm -f *.dll *~ *.bak .mpack *.gladep
+
+PHONY:
+	install clean all mpack

Added: trunk/extensions/MetaPixel/MetaPixel.addin.xml
==============================================================================
--- (empty file)
+++ trunk/extensions/MetaPixel/MetaPixel.addin.xml	Mon Feb 11 09:01:43 2008
@@ -0,0 +1,16 @@
+<Addin namespace="FSpot"
+	id="MetaPixelExtension"
+	version="0.5"
+	description="Create photomosaics using MetaPixel (http://www.complang.tuwien.ac.at/schani/metapixel/)"
+	author="Lorenzo Milesi"
+	url="http://f-spot.org/Extensions";
+	category="Tools">
+	<Dependencies>
+		<Addin id="Core" version="0.4.2.0"/>
+	</Dependencies>
+	<Extension path = "/FSpot/Menus/Tools">
+		<Command id = "MetaPixel" _label = "Create p_hotomosaic" command_type = "MetaPixelExtension.MetaPixel" />
+	</Extension>
+</Addin>
+
+

Added: trunk/extensions/MetaPixel/MetaPixel.cs
==============================================================================
--- (empty file)
+++ trunk/extensions/MetaPixel/MetaPixel.cs	Mon Feb 11 09:01:43 2008
@@ -0,0 +1,302 @@
+/*
+ * MetaPixel.cs 
+ * Create photomosaics from F-Spot using MetaPixel 
+ * http://www.complang.tuwien.ac.at/schani/metapixel/
+ *
+ * Author(s)
+ * 	Lorenzo Milesi <maxxer yetopen it>
+ *
+ * Many lines of this file are inspired or taken from other ext like DevelopInUFraw or SyncCatalog.
+ * So thanks to Stephane and Miguel for their help. ;)
+ *
+ * This is free software. See COPYING for details
+ * 
+ * (c) YetOpen S.r.l.
+ */
+
+using System;
+using System.IO;
+using System.Collections;
+using Gtk;
+
+using FSpot;
+using FSpot.Extensions;
+using FSpot.Widgets;
+using FSpot.Filters;
+using FSpot.UI.Dialog;
+using Mono.Unix;
+
+namespace MetaPixelExtension {
+	public class MetaPixel: ICommand
+	{
+		[Glade.Widget] Gtk.Dialog metapixel_dialog;
+		[Glade.Widget] Gtk.HBox tagentry_box;
+		[Glade.Widget] Gtk.SpinButton icon_x_size;
+		[Glade.Widget] Gtk.SpinButton icon_y_size;
+		[Glade.Widget] Gtk.RadioButton tags_radio;
+		[Glade.Widget] Gtk.RadioButton current_radio;
+		FSpot.Widgets.TagEntry miniatures_tags;
+		string minidir_tmp;
+
+		public void Run (object o, EventArgs e) {
+			Console.WriteLine ("Executing MetaPixel extension");
+			if (MainWindow.Toplevel.SelectedPhotos ().Length == 0) {
+				InfoDialog (Catalog.GetString ("No selection available"),
+                        		    Catalog.GetString ("This tool requires an active selection. Please select one or more pictures and try again"), 
+					    Gtk.MessageType.Error);
+				return;
+			} else {
+				//Check for MetaPixel executable
+				string output = "";
+				try {
+					System.Diagnostics.Process mp_check = new System.Diagnostics.Process ();
+					mp_check.StartInfo.RedirectStandardOutput = true;
+					mp_check.StartInfo.UseShellExecute = false;
+					mp_check.StartInfo.FileName = "metapixel";
+					mp_check.StartInfo.Arguments = "--version";
+					mp_check.Start ();
+					mp_check.WaitForExit ();
+					StreamReader sroutput = mp_check.StandardOutput;
+					output = sroutput.ReadLine ();
+				} catch (System.Exception) {
+				}
+				if (!System.Text.RegularExpressions.Regex.IsMatch (output, "^metapixel")) {
+					InfoDialog (Catalog.GetString ("Metapixel not available"),
+						    Catalog.GetString ("The metapixel executable was not found in path. Please check that you have it installed and that you have permissions to execute it"),
+						    Gtk.MessageType.Error);
+					return;
+				}
+
+				ShowDialog ();
+			}
+		}
+
+		public void ShowDialog () {
+			Glade.XML xml = new Glade.XML (null, "MetaPixel.glade", "metapixel_dialog", "f-spot");
+			xml.Autoconnect (this);
+			metapixel_dialog.Modal = false;
+			metapixel_dialog.TransientFor = null;
+
+			miniatures_tags = new FSpot.Widgets.TagEntry (MainWindow.Toplevel.Database.Tags, false);
+                	miniatures_tags.UpdateFromTagNames (new string []{});
+			tagentry_box.Add (miniatures_tags);
+
+			metapixel_dialog.Response += on_dialog_response;
+			current_radio.Active = true;
+			tags_radio.Toggled += HandleTagsRadioToggled;
+			HandleTagsRadioToggled (null, null);
+			metapixel_dialog.ShowAll ();
+		}
+
+		void on_dialog_response (object obj, ResponseArgs args) {
+			if (args.ResponseId == ResponseType.Ok) {
+				create_mosaics ();
+			}
+			metapixel_dialog.Destroy ();
+		}
+
+		void create_mosaics () {
+			//Prepare the query
+			Db db = MainWindow.Toplevel.Database;
+			FSpot.PhotoQuery mini_query = new FSpot.PhotoQuery (db.Photos);
+			Photo [] photos;
+			
+			if (tags_radio.Active) {
+				//Build tag array
+				ArrayList taglist = new ArrayList ();
+				foreach (string tag_name in miniatures_tags.GetTypedTagNames ()) {
+					Tag t = db.Tags.GetTagByName (tag_name); 
+					if (t != null) 
+						taglist.Add(t);
+				}
+				mini_query.Terms = FSpot.OrTerm.FromTags ((Tag []) taglist.ToArray (typeof (Tag)));
+				photos = mini_query.Photos;
+			} else {
+				photos = MainWindow.Toplevel.ActivePhotos ();
+			}
+
+			if (photos.Length == 0) {
+				//There is no photo for the selected tags! :(
+				InfoDialog (Catalog.GetString ("No photos for the selection"),
+					    Catalog.GetString ("The tags selected provided no pictures. Please select different tags"),
+					    Gtk.MessageType.Error);
+				return;
+			}
+			
+			//Create minis
+			ProgressDialog progress_dialog = null;
+			progress_dialog = new ProgressDialog (Catalog.GetString ("Creating miniatures"),
+							      ProgressDialog.CancelButtonType.Stop,
+							      photos.Length, metapixel_dialog);
+
+			minidir_tmp = System.IO.Path.GetTempFileName ();
+			System.IO.File.Delete (minidir_tmp);
+			System.IO.Directory.CreateDirectory (minidir_tmp);
+			minidir_tmp += "/";
+			
+			//Call MetaPixel to create the minis
+			foreach (Photo p in photos) {
+				if (progress_dialog.Update (String.Format (Catalog.GetString ("Preparing photo \"{0}\""), p.Name))) {
+					progress_dialog.Destroy ();
+					DeleteTmp ();
+					return;
+				}
+				//FIXME should switch to retry/skip
+				if (!(new Gnome.Vfs.Uri (p.DefaultVersionUri.ToString ())).Exists)
+					continue;
+				//FIXME Check if the picture's format is supproted (jpg, gif)
+
+				FilterSet filters = new FilterSet ();
+				filters.Add (new JpegFilter ());
+				filters.Add (new OrientationFilter ());
+				FilterRequest freq = new FilterRequest (p.DefaultVersionUri);
+				filters.Convert (freq);
+
+				//We use photo id for minis, instead of photo names, to avoid duplicates
+				string minifile = minidir_tmp + p.Id.ToString() + System.IO.Path.GetExtension (p.DefaultVersionUri.ToString ());
+				string prepare_command = String.Format ("--prepare -w {0} -h {1} {2} {3} {4}tables.mxt",
+									icon_x_size.Text, //Minis width
+									icon_y_size.Text, //Minis height
+									CheapEscape(freq.Current.LocalPath), //Source image
+									CheapEscape(minifile),  //Dest image
+									minidir_tmp);  //Table file
+				Console.WriteLine ("Executing: metapixel {0}", prepare_command);
+				
+				System.Diagnostics.Process mp_prep = System.Diagnostics.Process.Start ("metapixel", prepare_command);
+				mp_prep.WaitForExit ();
+				if (!(new Gnome.Vfs.Uri (minifile)).Exists) {
+					Console.WriteLine ("No mini? No party! {0}", minifile);
+					continue;
+				}
+
+			} //Finished preparing!
+			if (progress_dialog != null)
+				progress_dialog.Destroy ();
+		
+			progress_dialog = null;
+			progress_dialog = new ProgressDialog (Catalog.GetString ("Creating photomosaics"),
+							      ProgressDialog.CancelButtonType.Stop,
+							      MainWindow.Toplevel.SelectedPhotos ().Length, metapixel_dialog);
+
+			//Now create the mosaics!
+			uint error_count = 0;
+			foreach (Photo p in MainWindow.Toplevel.SelectedPhotos ()) {
+				if (progress_dialog.Update (String.Format (Catalog.GetString ("Processing \"{0}\""), p.Name))) {
+					progress_dialog.Destroy ();
+					DeleteTmp ();
+					return;
+				}
+				//FIXME should switch to retry/skip
+				if (!(new Gnome.Vfs.Uri (p.DefaultVersionUri.ToString ())).Exists)
+					continue;
+
+				//FIXME Check if the picture's format is supproted (jpg, gif)
+
+				FilterSet filters = new FilterSet ();
+				filters.Add (new JpegFilter ());
+				filters.Add (new OrientationFilter ());
+				FilterRequest freq = new FilterRequest (p.DefaultVersionUri);
+				filters.Convert (freq);
+
+				string name = GetVersionName (p);
+				System.Uri mosaic = GetUriForVersionName (p, name);
+								
+				string mosaic_command = String.Format ("--metapixel -l {0} {1} {2}", 
+									minidir_tmp, 
+									CheapEscape(freq.Current.LocalPath),
+									CheapEscape(mosaic.LocalPath));
+				Console.WriteLine ("Executing: metapixel {0}", mosaic_command);
+				System.Diagnostics.Process mp_exe = System.Diagnostics.Process.Start ("metapixel", mosaic_command);
+				mp_exe.WaitForExit ();
+				if (!(new Gnome.Vfs.Uri (mosaic.ToString ())).Exists) {
+					Console.WriteLine ("Error in processing image");
+					error_count ++;
+					continue;
+				}
+				
+				p.DefaultVersionId = p.AddVersion (mosaic, name, true);
+				Core.Database.Photos.Commit (p);
+
+			} //Finished creating mosaics
+			if (progress_dialog != null)
+				progress_dialog.Destroy ();
+
+
+			string final_message = "Your mosaics have been generated as new versions of the pictures you selected";
+			if (error_count > 0)
+				final_message += String.Format (".\n{0} images out of {1} had errors", 
+							error_count, MainWindow.Toplevel.SelectedPhotos ().Length);
+			InfoDialog (Catalog.GetString("PhotoMosaics generated!"), 
+				    Catalog.GetString(final_message),
+				    Gtk.MessageType.Info);
+			DeleteTmp ();
+			
+		}
+
+		private void HandleTagsRadioToggled (object o, EventArgs e) {
+			miniatures_tags.Sensitive = tags_radio.Active;
+		}
+			
+                private static string GetVersionName (Photo p)
+                {
+                        return GetVersionName (p, 1);
+                }
+
+                private static string GetVersionName (Photo p, int i)
+                {
+                        string name = Catalog.GetPluralString ("PhotoMosaic", "PhotoMosaic ({0})", i);
+                        name = String.Format (name, i);
+                        if (p.VersionNameExists (name))
+                                return GetVersionName (p, i + 1);
+                        return name;
+                }
+
+                private System.Uri GetUriForVersionName (Photo p, string version_name)
+                {
+                        string name_without_ext = System.IO.Path.GetFileNameWithoutExtension (p.Name);
+                        return new System.Uri (System.IO.Path.Combine (DirectoryPath (p),  name_without_ext
+                                               + " (" + version_name + ")" + ".jpg"));
+                }
+
+                private static string CheapEscape (string input)
+                {
+                        string escaped = input;
+                        escaped = escaped.Replace (" ", "\\ ");
+                        escaped = escaped.Replace ("(", "\\(");
+                        escaped = escaped.Replace (")", "\\)");
+                        return escaped;
+                }
+
+                private static string DirectoryPath (Photo p)
+                {
+                        System.Uri uri = p.VersionUri (Photo.OriginalVersionId);
+                        return uri.Scheme + "://" + uri.Host + System.IO.Path.GetDirectoryName (uri.AbsolutePath);
+                }
+
+		private void DeleteTmp ()
+		{
+			//Clean temp workdir
+			DirectoryInfo dir = new DirectoryInfo(minidir_tmp);
+			FileInfo[] tmpfiles = dir.GetFiles();
+			foreach (FileInfo f in tmpfiles) {
+				if (System.IO.File.Exists(minidir_tmp + f.Name)) {
+					System.IO.File.Delete (minidir_tmp + f.Name);
+				}
+			}
+			if (System.IO.Directory.Exists(minidir_tmp)) {
+				System.IO.Directory.Delete(minidir_tmp);
+			}
+		}
+
+		private void InfoDialog (string title, string msg, Gtk.MessageType type) {
+			HigMessageDialog md = new HigMessageDialog (MainWindow.Toplevel.Window, DialogFlags.DestroyWithParent,
+						  type, ButtonsType.Ok, title, msg);
+
+			md.Run ();
+			md.Destroy ();
+
+		}
+
+	}
+}
+

Added: trunk/extensions/MetaPixel/MetaPixel.glade
==============================================================================
--- (empty file)
+++ trunk/extensions/MetaPixel/MetaPixel.glade	Mon Feb 11 09:01:43 2008
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--Generated with glade3 3.4.0 on Wed Feb  6 15:20:36 2008 -->
+<glade-interface>
+  <widget class="GtkDialog" id="metapixel_dialog">
+    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">MetaPixel photomosaics</property>
+    <property name="resizable">False</property>
+    <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <widget class="GtkVBox" id="dialog-vbox1">
+        <property name="visible">True</property>
+        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+        <property name="spacing">2</property>
+        <child>
+          <widget class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <widget class="GtkFrame" id="frame1">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label_xalign">0</property>
+                <property name="shadow_type">GTK_SHADOW_NONE</property>
+                <child>
+                  <widget class="GtkAlignment" id="alignment1">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="left_padding">12</property>
+                    <child>
+                      <widget class="GtkVBox" id="vbox2">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <child>
+                          <widget class="GtkRadioButton" id="current_radio">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="tooltip" translatable="yes">Miniatures can be generated from the current main view</property>
+                            <property name="label" translatable="yes">_Current query</property>
+                            <property name="use_underline">True</property>
+                            <property name="response_id">0</property>
+                            <property name="active">True</property>
+                            <property name="draw_indicator">True</property>
+                            <property name="group">tags_radio</property>
+                          </widget>
+                        </child>
+                        <child>
+                          <widget class="GtkHBox" id="tagentry_box">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="tooltip" translatable="yes">Generate the miniatures from a selection of tags. No tags mean ALL pictures</property>
+                            <child>
+                              <widget class="GtkRadioButton" id="tags_radio">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="label" translatable="yes">_Tags</property>
+                                <property name="use_underline">True</property>
+                                <property name="response_id">0</property>
+                                <property name="active">True</property>
+                                <property name="draw_indicator">True</property>
+                              </widget>
+                              <packing>
+                                <property name="expand">False</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                          </widget>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label1">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">&lt;b&gt;Generate miniatures from&lt;/b&gt;</property>
+                    <property name="use_markup">True</property>
+                  </widget>
+                  <packing>
+                    <property name="type">label_item</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="hbox2">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="tooltip" translatable="yes">Size of the miniatures composing the mosaic</property>
+                <child>
+                  <widget class="GtkLabel" id="label2">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Miniatures _size</property>
+                    <property name="use_underline">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <widget class="GtkSpinButton" id="icon_x_size">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="adjustment">10 0 500 1 10 10</property>
+                    <property name="numeric">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label4">
+                    <property name="width_request">0</property>
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">x</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkSpinButton" id="icon_y_size">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="adjustment">10 0 500 1 10 10</property>
+                    <property name="numeric">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">4</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+          </widget>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <widget class="GtkHButtonBox" id="dialog-action_area1">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <child>
+              <widget class="GtkButton" id="button1">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">gtk-cancel</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">0</property>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkButton" id="create_button">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">_Create</property>
+                <property name="use_underline">True</property>
+                <property name="response_id">-5</property>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+</glade-interface>

Modified: trunk/extensions/PicasaWebExport/PicasaWebExport.addin.xml
==============================================================================
--- trunk/extensions/PicasaWebExport/PicasaWebExport.addin.xml	(original)
+++ trunk/extensions/PicasaWebExport/PicasaWebExport.addin.xml	Mon Feb 11 09:01:43 2008
@@ -1,5 +1,5 @@
 <Addin namespace="FSpot"
-	version="1.0"
+	version="1.1"
 	name="PicasaWeb Export"
 	description="This extension allows you to export your photos to PicasaWeb."
 	author="F-Spot team"
@@ -8,7 +8,7 @@
 	category="Export">
 
 	<Dependencies>
-		<Addin id="Core" version="0.4.0.0"/>
+		<Addin id="Core" version="0.4.2.0"/>
 	</Dependencies>
 
 	<Extension path = "/FSpot/Menus/Exports">

Added: trunk/extensions/PictureTile/Makefile
==============================================================================
--- (empty file)
+++ trunk/extensions/PictureTile/Makefile	Mon Feb 11 09:01:43 2008
@@ -0,0 +1,32 @@
+all: PictureTile.dll
+
+PACKAGES = \
+	-pkg:f-spot \
+	-pkg:gnome-vfs-sharp-2.0 \
+	-pkg:gtk-sharp-2.0 \
+	-pkg:glade-sharp-2.0
+
+ASSEMBLIES = \
+	-r:Mono.Posix
+
+RESOURCES = \
+	-resource:PictureTile.glade \
+	-resource:PictureTile.addin.xml 
+
+SOURCES = \
+	PictureTile.cs
+
+install: all
+	cp *.dll ~/.gnome2/f-spot/addins/
+
+mpack: PictureTile.dll
+	mautil p PictureTile.dll
+
+%.dll: %.cs %.glade
+	gmcs -target:library $(SOURCES) $(PACKAGES) $(ASSEMBLIES) $(RESOURCES)
+
+clean:
+	rm -f *.dll *~ *.bak .mpack *.gladep
+
+PHONY:
+	install clean all mpack

Added: trunk/extensions/PictureTile/PictureTile.addin.xml
==============================================================================
--- (empty file)
+++ trunk/extensions/PictureTile/PictureTile.addin.xml	Mon Feb 11 09:01:43 2008
@@ -0,0 +1,16 @@
+<Addin namespace="FSpot"
+	id="PictureTileExtension"
+	version="0.2"
+	description="Create photo wall using PictureTile by Jamie Zawinski (http://www.jwz.org/picturetile/)"
+	author="Lorenzo Milesi"
+	url="http://f-spot.org/Extensions";
+	category="Tools">
+	<Dependencies>
+		<Addin id="Core" version="0.4.2.0"/>
+	</Dependencies>
+	<Extension path = "/FSpot/Menus/Tools">
+		<Command id = "PictureTile" _label = "Create photo_wall" command_type = "PictureTileExtension.PictureTile" />
+	</Extension>
+</Addin>
+
+

Added: trunk/extensions/PictureTile/PictureTile.cs
==============================================================================
--- (empty file)
+++ trunk/extensions/PictureTile/PictureTile.cs	Mon Feb 11 09:01:43 2008
@@ -0,0 +1,253 @@
+/*
+ * PictureTile.cs 
+ * Create photowalls from F-Spot using PictureTile by Jamie Zawinski 
+ * http://www.jwz.org/picturetile/
+ *
+ * Author(s)
+ * 	Lorenzo Milesi <maxxer yetopen it>
+ *
+ * This is free software. See COPYING for details
+ * 
+ * (c) YetOpen S.r.l. - Lecco
+ */
+
+using System;
+using System.IO;
+using System.Collections;
+using System.Globalization;
+using Gtk;
+
+using FSpot;
+using FSpot.Extensions;
+using FSpot.Widgets;
+using FSpot.Filters;
+using FSpot.UI.Dialog;
+using Mono.Unix;
+
+namespace PictureTileExtension {
+	public class PictureTile: ICommand
+	{
+		[Glade.Widget] Gtk.Dialog picturetile_dialog;
+		[Glade.Widget] Gtk.SpinButton x_max_size;
+		[Glade.Widget] Gtk.SpinButton y_max_size;
+		[Glade.Widget] Gtk.SpinButton space_between_images;
+		[Glade.Widget] Gtk.SpinButton outside_border;
+		[Glade.Widget] Gtk.ComboBox background_color;
+		[Glade.Widget] Gtk.SpinButton image_scale;
+		[Glade.Widget] Gtk.CheckButton uniform_images;
+		[Glade.Widget] Gtk.RadioButton jpeg_radio;
+		[Glade.Widget] Gtk.RadioButton tiff_radio;
+		[Glade.Widget] Gtk.SpinButton pages;
+		[Glade.Widget] Gtk.SpinButton jpeg_quality;
+		string dir_tmp;
+		string destfile_tmp;
+		string [] colors = {"white", "black"};
+		Tag [] photo_tags;
+
+		public void Run (object o, EventArgs e) {
+			Console.WriteLine ("Executing PictureTile extension");
+			if (MainWindow.Toplevel.SelectedPhotos ().Length == 0) {
+				InfoDialog (Catalog.GetString ("No selection available"),
+                        		    Catalog.GetString ("This tool requires an active selection. Please select one or more pictures and try again"), 
+					    Gtk.MessageType.Error);
+				return;
+			} else {
+				//Check for PictureTile executable
+				string output = "";
+				try {
+					System.Diagnostics.Process mp_check = new System.Diagnostics.Process ();
+					mp_check.StartInfo.RedirectStandardOutput = true;
+					mp_check.StartInfo.RedirectStandardError = true;
+					mp_check.StartInfo.UseShellExecute = false;
+					mp_check.StartInfo.FileName = "picturetile.pl";
+					mp_check.Start ();
+					mp_check.WaitForExit ();
+					StreamReader sroutput = mp_check.StandardError;
+					output = sroutput.ReadLine ();
+				} catch (System.Exception) {
+				}
+				if (!System.Text.RegularExpressions.Regex.IsMatch (output, "^picturetile")) {
+					InfoDialog (Catalog.GetString ("PictureTile not available"),
+						    Catalog.GetString ("The picturetile.pl executable was not found in path. Please check that you have it installed and that you have permissions to execute it"),
+						    Gtk.MessageType.Error);
+					return;
+				}
+
+				ShowDialog ();
+			}
+		}
+
+		public void ShowDialog () {
+			Glade.XML xml = new Glade.XML (null, "PictureTile.glade", "picturetile_dialog", "f-spot");
+			xml.Autoconnect (this);
+			picturetile_dialog.Modal = true;
+			picturetile_dialog.TransientFor = null;
+
+			picturetile_dialog.Response += OnDialogReponse;
+			jpeg_radio.Active = true;
+			jpeg_radio.Toggled += HandleFormatRadioToggled;
+			HandleFormatRadioToggled (null, null);
+			PopulateCombo ();
+			picturetile_dialog.ShowAll ();
+		}
+
+		void OnDialogReponse (object obj, ResponseArgs args) {
+			if (args.ResponseId == ResponseType.Ok) {
+				CreatePhotoWall ();
+			}
+			picturetile_dialog.Destroy ();
+		}
+
+		void CreatePhotoWall () {
+			dir_tmp = System.IO.Path.GetTempFileName ();
+			System.IO.File.Delete (dir_tmp);
+			System.IO.Directory.CreateDirectory (dir_tmp);
+			dir_tmp += "/";
+
+			//Prepare the pictures
+			ProgressDialog progress_dialog = null;
+			progress_dialog = new ProgressDialog (Catalog.GetString ("Preparing selected pictures"),
+							      ProgressDialog.CancelButtonType.Stop,
+							      MainWindow.Toplevel.SelectedPhotos ().Length, picturetile_dialog);
+
+			FilterSet filters = new FilterSet ();
+			filters.Add (new JpegFilter ());
+			filters.Add (new OrientationFilter ());
+			uint counter = 0;
+			ArrayList all_tags = new ArrayList ();
+			foreach (Photo p in MainWindow.Toplevel.SelectedPhotos ()) {
+				if (progress_dialog.Update (String.Format (Catalog.GetString ("Processing \"{0}\""), p.Name))) {
+					progress_dialog.Destroy ();
+					DeleteTmp ();
+					return;
+				}
+
+				//Store photo tags, to attach them later on import
+				foreach (Tag tag in p.Tags) {
+					if (! all_tags.Contains (tag))
+						all_tags.Add (tag);
+				}
+
+				//FIXME should switch to retry/skip
+				if (!(new Gnome.Vfs.Uri (p.DefaultVersionUri.ToString ())).Exists)
+					continue;
+
+				using (FilterRequest freq = new FilterRequest (p.DefaultVersionUri)) {
+					filters.Convert (freq);
+					File.Copy (freq.Current.LocalPath, String.Format ("{0}{1}.jpg", dir_tmp, counter ++));
+				}
+			}
+			if (progress_dialog != null)
+				progress_dialog.Destroy ();
+
+			photo_tags = (Tag []) all_tags.ToArray (typeof (Tag));
+
+			string uniform = "";
+			if (uniform_images.Active)
+				uniform = "--uniform";
+			string output_format = "jpeg";
+			if (tiff_radio.Active)
+				output_format = "tiff";
+			string scale = String.Format (CultureInfo.InvariantCulture, "{0,4}", (double) image_scale.Value / (double) 100);
+
+			destfile_tmp = String.Format ("{0}.{1}", System.IO.Path.GetTempFileName (), output_format);
+								
+			//Execute picturetile
+			string picturetile_command = String.Format ("--size {0}x{1} " +
+									"--directory {2} " +
+									"--scale {3} " +
+									"--margin {4} " +
+									"--border {5} " +
+									"--background {6} " +
+									"--pages {7} " +
+									"{8} " +
+									"{9}", 
+								x_max_size.Text, 
+								y_max_size.Text, 
+								dir_tmp, 
+								scale, 
+								space_between_images.Text, 
+								outside_border.Text, 
+								colors [background_color.Active], 
+								pages.Text, 
+								uniform, 
+								destfile_tmp);
+			Console.WriteLine ("Executing: picturetile.pl {0}", picturetile_command);
+			System.Diagnostics.Process pt_exe = System.Diagnostics.Process.Start ("picturetile.pl", picturetile_command);
+			pt_exe.WaitForExit ();
+			
+			// Handle multiple files generation (pages). 
+			// If the user wants 2 pages (images), and the output filename is out.jpg, picturetile will create 
+			// /tmp/out1.jpg and /tmp/out2.jpg.
+			System.IO.DirectoryInfo di = new System.IO.DirectoryInfo (System.IO.Path.GetDirectoryName (destfile_tmp));
+			string filemask = System.IO.Path.GetFileNameWithoutExtension (destfile_tmp) + "*" + System.IO.Path.GetExtension (destfile_tmp);
+			FileInfo [] fi = di.GetFiles (filemask);
+
+			// Move generated files to f-spot photodir
+			string [] photo_import_list = new string [fi.Length];
+			counter = 0;
+			foreach (FileInfo f in fi) {
+				string orig = System.IO.Path.Combine (f.DirectoryName, f.Name);
+				photo_import_list [counter ++] = MoveFile (orig);
+			}
+
+			//Add the pic(s) to F-Spot!
+			Db db = MainWindow.Toplevel.Database;
+			ImportCommand command = new ImportCommand (null);
+			if (command.ImportFromPaths (db.Photos, photo_import_list, photo_tags) > 0) {
+				InfoDialog (Catalog.GetString ("PhotoWall generated!"), 
+					    Catalog.GetString ("Your photo wall have been generated and imported in F-Spot. Select the last roll to see it"),
+					    Gtk.MessageType.Info);
+			} else {
+				InfoDialog (Catalog.GetString ("Error importing photowall"), 
+					    Catalog.GetString ("An error occoured while importing the newly generated photowall to F-Spot"),
+					    Gtk.MessageType.Error);
+			}
+			DeleteTmp ();
+			
+		}
+
+		private void HandleFormatRadioToggled (object o, EventArgs e) {
+			jpeg_quality.Sensitive = jpeg_radio.Active;
+		}
+			
+		private void DeleteTmp ()
+		{
+			//Clean temp workdir
+			DirectoryInfo dir = new DirectoryInfo(dir_tmp);
+			FileInfo[] tmpfiles = dir.GetFiles();
+			foreach (FileInfo f in tmpfiles) {
+				if (System.IO.File.Exists(dir_tmp + f.Name)) {
+					System.IO.File.Delete (dir_tmp + f.Name);
+				}
+			}
+			if (System.IO.Directory.Exists(dir_tmp)) {
+				System.IO.Directory.Delete(dir_tmp);
+			}
+		}
+
+		private void PopulateCombo () {
+			foreach (string c in colors) {
+				background_color.AppendText (c);
+			}
+			background_color.Active = 0;
+		}
+
+		private string MoveFile (string orig) {
+			string dest = FileImportBackend.ChooseLocation (orig);
+			System.IO.File.Move (orig, dest);
+			return dest;
+		}
+
+		private void InfoDialog (string title, string msg, Gtk.MessageType type) {
+			HigMessageDialog md = new HigMessageDialog (MainWindow.Toplevel.Window, DialogFlags.DestroyWithParent,
+						  type, ButtonsType.Ok, title, msg);
+
+			md.Run ();
+			md.Destroy ();
+
+		}
+
+	}
+}
+

Added: trunk/extensions/PictureTile/PictureTile.glade
==============================================================================
--- (empty file)
+++ trunk/extensions/PictureTile/PictureTile.glade	Mon Feb 11 09:01:43 2008
@@ -0,0 +1,436 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--Generated with glade3 3.4.0 on Fri Feb  8 15:22:10 2008 -->
+<glade-interface>
+  <widget class="GtkDialog" id="picturetile_dialog">
+    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">PictureTile for F-Spot</property>
+    <property name="modal">True</property>
+    <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <widget class="GtkVBox" id="dialog-vbox1">
+        <property name="visible">True</property>
+        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+        <property name="spacing">2</property>
+        <child>
+          <widget class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="spacing">4</property>
+            <child>
+              <widget class="GtkLabel" id="label13">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="ypad">5</property>
+                <property name="label" translatable="yes">Photo wall generator</property>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="hbox1">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkLabel" id="label1">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="xpad">5</property>
+                    <property name="label" translatable="yes">Destination picture max _size</property>
+                    <property name="use_underline">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkSpinButton" id="x_max_size">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="adjustment">10000 10 99999 10 100 10</property>
+                  </widget>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label2">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="xpad">2</property>
+                    <property name="label" translatable="yes">x</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkSpinButton" id="y_max_size">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="adjustment">12000 10 99999 10 100 10</property>
+                  </widget>
+                  <packing>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="hbox2">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkLabel" id="label3">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Spa_cing between images</property>
+                    <property name="use_underline">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkSpinButton" id="space_between_images">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="tooltip" translatable="yes">Can be negative. It will overlap images</property>
+                    <property name="adjustment">8 -100 1000 1 10 10</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="pack_type">GTK_PACK_END</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="hbox5">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkLabel" id="label6">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Outside _border</property>
+                    <property name="use_underline">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkSpinButton" id="outside_border">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="adjustment">8 0 1000 1 10 10</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="pack_type">GTK_PACK_END</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="hbox6">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkLabel" id="label7">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Background _color</property>
+                    <property name="use_underline">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkComboBox" id="background_color">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="items" translatable="yes"></property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="pack_type">GTK_PACK_END</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">4</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="hbox7">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkLabel" id="label8">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">_Scale images</property>
+                    <property name="use_underline">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkSpinButton" id="image_scale">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="adjustment">80 1 100 1 10 10</property>
+                    <property name="digits">1</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="pack_type">GTK_PACK_END</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label9">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">%</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="pack_type">GTK_PACK_END</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">5</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkCheckButton" id="uniform_images">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="tooltip" translatable="yes">Check this if your images are all of the same size and you will have a more regular grid</property>
+                <property name="label" translatable="yes">_Uniform images</property>
+                <property name="use_underline">True</property>
+                <property name="response_id">0</property>
+                <property name="draw_indicator">True</property>
+              </widget>
+              <packing>
+                <property name="position">6</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="hbox10">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkLabel" id="label12">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Output type</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkRadioButton" id="jpeg_radio">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">_Jpeg</property>
+                    <property name="use_underline">True</property>
+                    <property name="response_id">0</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                    <property name="group">tiff_radio</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="pack_type">GTK_PACK_END</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkRadioButton" id="tiff_radio">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">_Tiff</property>
+                    <property name="use_underline">True</property>
+                    <property name="response_id">0</property>
+                    <property name="draw_indicator">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="pack_type">GTK_PACK_END</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">7</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="hbox9">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkLabel" id="label11">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Jpeg _quality</property>
+                    <property name="use_underline">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkSpinButton" id="jpeg_quality">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="adjustment">85 5 100 5 10 10</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="pack_type">GTK_PACK_END</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">8</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="hbox8">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkLabel" id="label10">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">_Pages</property>
+                    <property name="use_underline">True</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkSpinButton" id="pages">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="tooltip" translatable="yes">Choose how many destination images you want to generate</property>
+                    <property name="adjustment">1 1 100 1 10 10</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="pack_type">GTK_PACK_END</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">9</property>
+              </packing>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="label4">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">This operation is going to TAKE VERY LONG TIME!</property>
+              </widget>
+              <packing>
+                <property name="position">11</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="label5">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">For more information please visit PictureTile website
+http://www.jwz.org/picturetile/</property>
+                <property name="justify">GTK_JUSTIFY_CENTER</property>
+              </widget>
+              <packing>
+                <property name="position">12</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <widget class="GtkHButtonBox" id="dialog-action_area1">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <child>
+              <widget class="GtkButton" id="button1">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">gtk-cancel</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">0</property>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkButton" id="generate_button">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">_Create</property>
+                <property name="use_underline">True</property>
+                <property name="response_id">-5</property>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+</glade-interface>

Modified: trunk/extensions/RawPlusJpeg/RawPlusJpeg.addin.xml
==============================================================================
--- trunk/extensions/RawPlusJpeg/RawPlusJpeg.addin.xml	(original)
+++ trunk/extensions/RawPlusJpeg/RawPlusJpeg.addin.xml	Mon Feb 11 09:01:43 2008
@@ -1,12 +1,12 @@
 <Addin namespace="FSpot"
 	id="RawPlusJpeg"
-	version="1.05"
+	version="1.6"
 	description="Merge RAW+Jpeg as multiple versions of the same photo"
 	author="Stephane Delcroix"
 	url="http://f-spot.org/Extensions";
 	category="Tools">
 	<Dependencies>
-		<Addin id="Core" version="0.4.0.3437"/>
+		<Addin id="Core" version="0.4.2.0"/>
 	</Dependencies>
 	<Extension path = "/FSpot/Menus/Tools">
 		<Command id = "MergeRawJpeg" _label = "Merge Raw" command_type = "RawPlusJpegExtension.RawPlusJpeg" />

Modified: trunk/extensions/SmugMugExport/SmugMugExport.addin.xml
==============================================================================
--- trunk/extensions/SmugMugExport/SmugMugExport.addin.xml	(original)
+++ trunk/extensions/SmugMugExport/SmugMugExport.addin.xml	Mon Feb 11 09:01:43 2008
@@ -1,5 +1,5 @@
 <Addin namespace="FSpot"
-	version="1.0"
+	version="1.1"
 	name="SmugMug Export"
 	description="This extension allows you to export your photos to SmugMug."
 	author="F-Spot team"
@@ -8,7 +8,7 @@
 	category="Export">
 
 	<Dependencies>
-		<Addin id="Core" version="0.4.0.0"/>
+		<Addin id="Core" version="0.4.2.0"/>
 	</Dependencies>
 
 	<Extension path = "/FSpot/Menus/Exports">

Modified: trunk/extensions/SyncCatalog/SyncCatalog.addin.xml
==============================================================================
--- trunk/extensions/SyncCatalog/SyncCatalog.addin.xml	(original)
+++ trunk/extensions/SyncCatalog/SyncCatalog.addin.xml	Mon Feb 11 09:01:43 2008
@@ -1,12 +1,12 @@
 <Addin namespace="FSpot"
 	id="SyncMetaData"
-	version="0.12"
+	version="0.13"
 	description="Sync MetaData information of all catalog with Photos"
 	author="Miguel Aguero"
 	url="http://f-spot.org/Extensions";
 	category="Tools">
 	<Dependencies>
-		<Addin id="Core" version="0.4.0.3366"/>
+		<Addin id="Core" version="0.4.2.0"/>
 	</Dependencies>
 	<Extension path = "/FSpot/Menus/Tools">
 		<Command id = "SyncMetaData" _label = "Sync Catalog with Photos" command_type = "SyncCatalogExtension.SyncCatalog" />

Modified: trunk/extensions/SyncCatalog/SyncCatalog.cs
==============================================================================
--- trunk/extensions/SyncCatalog/SyncCatalog.cs	(original)
+++ trunk/extensions/SyncCatalog/SyncCatalog.cs	Mon Feb 11 09:01:43 2008
@@ -13,6 +13,7 @@
 using Gtk;
 
 using FSpot;
+using FSpot.UI.Dialog;
 using FSpot.Extensions;
 using FSpot.Jobs;
 

Modified: trunk/extensions/ZipExport/ZipExport.addin.xml
==============================================================================
--- trunk/extensions/ZipExport/ZipExport.addin.xml	(original)
+++ trunk/extensions/ZipExport/ZipExport.addin.xml	Mon Feb 11 09:01:43 2008
@@ -1,13 +1,13 @@
 <Addin namespace="FSpot"
 	id="ZipExport"
-	version="0.2"
+	version="0.3"
 	name="Zip export"
 	description="Simple export to Zip file"
 	author="Lorenzo Milesi"
 	url="http://f-spot.org/Extensions";
 	category="Export">
 	<Dependencies>
-		<Addin id="Core" version="0.4.0.0"/>
+		<Addin id="Core" version="0.4.2.0"/>
 	</Dependencies>
 	<Extension path = "/FSpot/Menus/Exports">
 		<ExportMenuItem id="ZipExport" _label = "Compressed fil_e..." class = "ZipExport.Zip" />

Modified: trunk/extensions/ZipExport/ZipExport.cs
==============================================================================
--- trunk/extensions/ZipExport/ZipExport.cs	(original)
+++ trunk/extensions/ZipExport/ZipExport.cs	Mon Feb 11 09:01:43 2008
@@ -13,6 +13,7 @@
 
 
 using FSpot;
+using FSpot.UI.Dialog;
 using FSpot.Extensions;
 using FSpot.Filters;
 using System;



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