f-spot r3659 - in trunk/extensions: . CDExport DevelopInUFraw FacebookExport FlickrExport GalleryExport MetaPixel PicasaWebExport PictureTile RawPlusJpeg SmugMugExport SyncCatalog ZipExport
- From: sdelcroix svn gnome org
- To: svn-commits-list gnome org
- Subject: f-spot r3659 - in trunk/extensions: . CDExport DevelopInUFraw FacebookExport FlickrExport GalleryExport MetaPixel PicasaWebExport PictureTile RawPlusJpeg SmugMugExport SyncCatalog ZipExport
- Date: Mon, 11 Feb 2008 09:01:44 +0000 (GMT)
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"><b>Generate miniatures from</b></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]