brasero r782 - in trunk: . po src



Author: philippr
Date: Tue Apr 29 18:58:17 2008
New Revision: 782
URL: http://svn.gnome.org/viewvc/brasero?rev=782&view=rev

Log:
	Fix for #529780 â Can\'t edit multiple CD-Text entries at once.
	Also added code for file renaming (to be extented to data project)

	* src/Makefile.am:
	* src/brasero-audio-disc.c (brasero_audio_disc_selection_function),
	(brasero_audio_disc_rename_songs),
	(brasero_audio_disc_edit_song_properties):
	* src/brasero-multi-song-props.c
	(brasero_multi_song_props_set_rename_callback),
	(brasero_multi_song_props_get_properties),
	(brasero_multi_song_props_gap_output_cb),
	(brasero_multi_song_props_gap_input_cb),
	(brasero_multi_song_props_entry_focus_out),
	(brasero_multi_song_props_entry_focus_in),
	(brasero_multi_song_props_init),
	(brasero_multi_song_props_finalize),
	(brasero_multi_song_props_class_init),
	(brasero_multi_song_props_new):
	* src/brasero-multi-song-props.h:
	* src/brasero-rename.c (brasero_rename_insert_string),
	(brasero_rename_delete_string), (brasero_rename_substitute_string),
	(brasero_rename_number_string), (brasero_rename_do),
	(brasero_rename_type_changed), (brasero_rename_init),
	(brasero_rename_finalize), (brasero_rename_class_init),
	(brasero_rename_new):
	* src/brasero-rename.h:
	* src/brasero-song-properties.c (brasero_song_props_init):

Added:
   trunk/src/brasero-multi-song-props.c   (contents, props changed)
   trunk/src/brasero-multi-song-props.h   (contents, props changed)
   trunk/src/brasero-rename.c   (contents, props changed)
   trunk/src/brasero-rename.h
Modified:
   trunk/ChangeLog
   trunk/po/ChangeLog
   trunk/po/POTFILES.in
   trunk/src/Makefile.am
   trunk/src/brasero-audio-disc.c
   trunk/src/brasero-song-properties.c

Modified: trunk/po/POTFILES.in
==============================================================================
--- trunk/po/POTFILES.in	(original)
+++ trunk/po/POTFILES.in	Tue Apr 29 18:58:17 2008
@@ -98,3 +98,5 @@
 src/brasero-jacket-background.c
 src/brasero-jacket-view.c
 src/brasero-jacket-edit.c
+src/brasero-multi-song-props.c
+src/brasero-rename.c

Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am	(original)
+++ trunk/src/Makefile.am	Tue Apr 29 18:58:17 2008
@@ -251,7 +251,11 @@
 	brasero-jacket-font.c         \
 	brasero-jacket-font.h         \
 	brasero-jacket-view.c         \
-	brasero-jacket-view.h
+	brasero-jacket-view.h         \
+	brasero-multi-song-props.h         \
+	brasero-multi-song-props.c         \
+	brasero-rename.h         \
+	brasero-rename.c
 
 if BUILD_INOTIFY
 brasero_SOURCES += brasero-file-monitor.c brasero-file-monitor.h

Modified: trunk/src/brasero-audio-disc.c
==============================================================================
--- trunk/src/brasero-audio-disc.c	(original)
+++ trunk/src/brasero-audio-disc.c	Tue Apr 29 18:58:17 2008
@@ -64,6 +64,7 @@
 #include "brasero-audio-disc.h"
 #include "brasero-metadata.h"
 #include "brasero-utils.h"
+#include "brasero-multi-song-props.h"
 #include "brasero-song-properties.h"
 #include "brasero-io.h"
 #include "brasero-split-dialog.h"
@@ -555,16 +556,11 @@
 	gtk_tree_model_get (model, &iter,
 			    SONG_COL, &is_song,
 			    -1);
-	if (!is_song) {
-		if (is_selected)
-			return TRUE;
-
-		return FALSE;
-	}
 
-	gtk_list_store_set (GTK_LIST_STORE (model), &iter,
-			    EDITABLE_COL, (is_selected == FALSE),
-			    -1);
+	if (is_song)
+		gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+				    EDITABLE_COL, (is_selected == FALSE),
+				    -1);
 	return TRUE;
 }
 
@@ -2920,57 +2916,86 @@
 	g_slist_free (uris);
 }
 
+static gboolean
+brasero_audio_disc_rename_songs (GtkTreeModel *model,
+				 GtkTreeIter *iter,
+				 const gchar *old_name,
+				 const gchar *new_name)
+{
+	gtk_list_store_set (GTK_LIST_STORE (model), iter,
+			    NAME_COL, new_name,
+			    -1);
+	return TRUE;
+}
+
 static void
 brasero_audio_disc_edit_song_properties (BraseroAudioDisc *disc,
 					 GList *list)
 {
-	gint isrc;
-	gint64 gap;
 	GList *item;
-	gchar *title;
-	gchar *artist;
+	gint song_num;
 	gint track_num;
-	gchar *composer;
 	GtkWidget *props;
-	gboolean success;
-	GtkTreeIter iter;
 	GtkWidget *toplevel;
 	GtkTreeModel *model;
 	GtkTreePath *treepath;
 	GtkResponseType result;
 
+	if (!g_list_length (list))
+		return;
+
 	model = gtk_tree_view_get_model (GTK_TREE_VIEW (disc->priv->tree));
-	props = brasero_song_props_new ();
 
 	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (disc));
-	gtk_window_set_transient_for (GTK_WINDOW (props),
-				      GTK_WINDOW (toplevel));
-	gtk_window_set_modal (GTK_WINDOW (props), TRUE);
-	gtk_window_set_position (GTK_WINDOW (props),
-				 GTK_WIN_POS_CENTER_ON_PARENT);
 
+	/* count the number of selected songs */
+	song_num = 0;
 	for (item = list; item; item = item->next) {
-		GtkTreeIter gap_iter;
-		gchar *track_num_str;
-		gchar *length_str;
+		GtkTreePath *tmp;
+		GtkTreeIter iter;
 		gboolean is_song;
-		gint64 length;
-		
-		gint64 start;
+
+		tmp = item->data;
+		gtk_tree_model_get_iter (model, &iter, tmp);
+		gtk_tree_model_get (model, &iter, 
+				    SONG_COL, &is_song,
+				    -1);
+
+		if (is_song)
+			song_num ++;
+	}
+
+	if (!song_num)
+		return;
+
+	if (song_num == 1) {
+		gint isrc;
 		gint64 end;
-		gchar *markup;
+		gint64 gap;
+		gint64 start;
+		gint64 length;
+		gboolean is_song;
+		gboolean success;
+		gchar *title;
+		gchar *artist;
+		gchar *composer;
+		gchar *track_num_str;
+		GtkTreeIter iter;
+		GtkTreeIter gap_iter;
 
-		treepath = item->data;
+		props = brasero_song_props_new ();
+
+		treepath = list->data;
 		success = gtk_tree_model_get_iter (model, &iter, treepath);
 
 		if (!success)
-			continue;
+			goto end;
 
 		gtk_tree_model_get (model, &iter,
 				    SONG_COL, &is_song,
 				    -1);
 		if (!is_song)
-			continue;
+			goto end;
 
 		gtk_tree_model_get (model, &iter,
 				    NAME_COL, &title,
@@ -2990,8 +3015,6 @@
 		else
 			gap = 0;
 
-		gtk_widget_show_all (GTK_WIDGET (props));
-
 		if (track_num_str) {
 			track_num = (gint) g_strtod (track_num_str + 6 /* (ignore markup) */, NULL);
 			g_free (track_num_str);
@@ -3009,22 +3032,43 @@
 						   start,
 						   end,
 						   gap);
-
 		if (artist)
 			g_free (artist);
 		if (title)
 			g_free (title);
 		if (composer)
 			g_free (composer);
+	}
+	else {
+		treepath = NULL;
+		props = brasero_multi_song_props_new ();
+	}
 
-		result = gtk_dialog_run (GTK_DIALOG (props));
-		gtk_widget_hide (GTK_WIDGET (props));
+	gtk_window_set_transient_for (GTK_WINDOW (props),
+				      GTK_WINDOW (toplevel));
+	gtk_window_set_modal (GTK_WINDOW (props), TRUE);
+	gtk_window_set_position (GTK_WINDOW (props),
+				 GTK_WIN_POS_CENTER_ON_PARENT);
 
-		if (result != GTK_RESPONSE_ACCEPT)
-			break;
+	gtk_widget_show (GTK_WIDGET (props));
+	result = gtk_dialog_run (GTK_DIALOG (props));
+	gtk_widget_hide (GTK_WIDGET (props));
+	if (result != GTK_RESPONSE_ACCEPT)
+		goto end;
 
-		disc->priv->sectors -= BRASERO_DURATION_TO_SECTORS (BRASERO_AUDIO_TRACK_LENGTH (start, end));
+	if (treepath) {
+		gint isrc;
+		gint64 end;
+		gint64 gap;
+		gint64 start;
+		gchar *title;
+		gchar *markup;
+		gchar *artist;
+		gchar *composer;
+		gchar *length_str;
+		GtkTreeIter iter;
 
+		disc->priv->sectors -= BRASERO_DURATION_TO_SECTORS (BRASERO_AUDIO_TRACK_LENGTH (start, end));
 		brasero_song_props_get_properties (BRASERO_SONG_PROPS (props),
 						   &artist,
 						   &title,
@@ -3039,6 +3083,8 @@
 
 		markup = g_markup_escape_text (title, -1);
 		length_str = brasero_utils_get_time_string (BRASERO_AUDIO_TRACK_LENGTH (start, end), TRUE, FALSE);
+
+		gtk_tree_model_get_iter (model, &iter, treepath);
 		gtk_list_store_set (GTK_LIST_STORE (model), &iter,
 				    NAME_COL, markup,
 				    ARTIST_COL, artist,
@@ -3057,10 +3103,73 @@
 		if (gap)
 			brasero_audio_disc_add_gap (disc, &iter, gap);
 
-		g_free (artist);
 		g_free (title);
+		g_free (artist);
 		g_free (composer);
 	}
+	else  {
+		gint isrc;
+		gint64 gap;
+		GList *copy;
+		gchar *artist = NULL;
+		gchar *composer = NULL;
+
+		brasero_multi_song_props_set_rename_callback (BRASERO_MULTI_SONG_PROPS (props),
+							      gtk_tree_view_get_selection (GTK_TREE_VIEW (disc->priv->tree)),
+							      NAME_COL,
+							      brasero_audio_disc_rename_songs);
+
+		brasero_multi_song_props_get_properties (BRASERO_MULTI_SONG_PROPS (props),
+							 &artist,
+							 &composer,
+							 &isrc,
+							 &gap);
+
+		/* start by the end in case we add silences since then the next
+		 * treepaths will be wrong */
+		copy = g_list_copy (list);
+		copy = g_list_reverse (copy);
+		for (item = copy; item; item = item->next) {
+			GtkTreePath *treepath;
+			GtkTreeIter iter;
+			gboolean is_song;
+
+			treepath = item->data;
+			if (!gtk_tree_model_get_iter (model, &iter, treepath))
+				continue;
+
+			gtk_tree_model_get (model, &iter,
+					    SONG_COL, &is_song,
+					    -1);
+
+			if (!is_song)
+				continue;
+
+			if (artist)
+				gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+						    ARTIST_COL, artist,
+						    -1);
+
+			if (composer)
+				gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+						    COMPOSER_COL, composer,
+						    -1);
+
+			if (isrc > 0)
+				gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+						    ISRC_COL, isrc,
+						    -1);
+
+			if (gap > -1)
+				brasero_audio_disc_add_gap (disc, &iter, gap);
+		}
+
+		g_list_free (copy);
+		g_free (artist);
+		g_free (composer);
+	}
+
+end:
 
 	gtk_widget_destroy (props);
 }

Added: trunk/src/brasero-multi-song-props.c
==============================================================================
--- (empty file)
+++ trunk/src/brasero-multi-song-props.c	Tue Apr 29 18:58:17 2008
@@ -0,0 +1,342 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * trunk
+ * Copyright (C) Philippe Rouquier 2008 <bonfire-app wanadoo fr>
+ * 
+ * trunk is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * trunk is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <string.h>
+
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+
+#include <gtk/gtk.h>
+
+#include <gst/gst.h>
+
+#include "brasero-multi-song-props.h"
+#include "brasero-rename.h"
+#include "brasero-utils.h"
+
+typedef struct _BraseroMultiSongPropsPrivate BraseroMultiSongPropsPrivate;
+struct _BraseroMultiSongPropsPrivate
+{
+	GtkWidget *title;
+	GtkWidget *artist;
+	GtkWidget *composer;
+	GtkWidget *isrc;
+	GtkWidget *label;
+	GtkWidget *gap;
+};
+
+
+#define BRASERO_MULTI_SONG_PROPS_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_MULTI_SONG_PROPS, BraseroMultiSongPropsPrivate))
+
+
+G_DEFINE_TYPE (BraseroMultiSongProps, brasero_multi_song_props, GTK_TYPE_DIALOG);
+
+void
+brasero_multi_song_props_set_rename_callback (BraseroMultiSongProps *self,
+					      GtkTreeSelection *selection,
+					      gint column_num,
+					      BraseroRenameCallback callback)
+{
+	BraseroMultiSongPropsPrivate *priv;
+
+	priv = BRASERO_MULTI_SONG_PROPS_PRIVATE (self);
+
+	brasero_rename_do (BRASERO_RENAME (priv->title),
+			   selection,
+			   column_num,
+			   callback);
+}
+
+void
+brasero_multi_song_props_get_properties (BraseroMultiSongProps *self,
+					 gchar **artist,
+					 gchar **composer,
+					 gint *isrc,
+					 gint64 *gap)
+{
+	const gchar *text;
+	BraseroMultiSongPropsPrivate *priv;
+
+	priv = BRASERO_MULTI_SONG_PROPS_PRIVATE (self);
+	if (artist) {
+		text = gtk_entry_get_text (GTK_ENTRY (priv->artist));
+		if (text && strcmp (text, _("<keep current values>")))
+			*artist = g_strdup (text);
+		else
+			*artist = NULL;
+	}
+
+	if (composer) {
+		text = gtk_entry_get_text (GTK_ENTRY (priv->composer));
+		if (text && strcmp (text, _("<keep current values>")))
+			*composer = g_strdup (text);
+		else
+			*composer = NULL;
+	}
+
+	if (isrc) {
+		text = gtk_entry_get_text (GTK_ENTRY (priv->isrc));
+		if (text && strcmp (text, _("<keep current values>")))
+			*isrc = (gint) g_strtod (text, NULL);
+		else
+			*isrc = -1;
+	}
+
+	if (gap)
+		*gap = gtk_spin_button_get_value (GTK_SPIN_BUTTON (priv->gap)) * GST_SECOND;
+}
+
+static gboolean
+brasero_multi_song_props_gap_output_cb (GtkSpinButton *spin,
+					BraseroMultiSongProps *self)
+{
+	if (gtk_spin_button_get_value (spin) > 0.0)
+		return FALSE;
+
+	if (gtk_spin_button_get_value (spin) == -1.0)
+		gtk_entry_set_text (GTK_ENTRY (spin), _("<keep current values>"));
+
+	if (gtk_spin_button_get_value (spin) == 0.0)
+		gtk_entry_set_text (GTK_ENTRY (spin), _("Remove silences"));
+
+	return TRUE;
+}
+
+static guint
+brasero_multi_song_props_gap_input_cb (GtkSpinButton *spin,
+				       gdouble *val,
+				       BraseroMultiSongProps *self)
+{
+	const gchar *text;
+
+	text = gtk_entry_get_text (GTK_ENTRY (spin));
+	if (text && !strcmp (text, _("<keep current values>"))) {
+		*val = -1.0;
+		return TRUE;
+	}
+	else if (text && !strcmp (text, _("Remove silences"))) {
+		*val = 0.0;
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+static gboolean
+brasero_multi_song_props_entry_focus_out (GtkEntry *entry,
+					  GdkEventFocus *event,
+					  gpointer NULL_data)
+{
+	const gchar *text;
+
+	text = gtk_entry_get_text (entry);
+	if (!text || text [0] == '\0')
+		gtk_entry_set_text (entry, _("<keep current values>"));
+
+	return FALSE;
+}
+
+static gboolean
+brasero_multi_song_props_entry_focus_in (GtkEntry *entry,
+					 GdkEventFocus *event,
+					 gpointer NULL_data)
+{
+	const gchar *text;
+
+	text = gtk_entry_get_text (entry);
+	if (text && !strcmp (text, _("<keep current values>")))
+		gtk_entry_set_text (entry, "");
+
+	return FALSE;
+}
+
+static void
+brasero_multi_song_props_init (BraseroMultiSongProps *object)
+{
+	GtkWidget *box;
+	GtkWidget *label;
+	GtkWidget *table;
+	GtkWidget *frame;
+	BraseroMultiSongPropsPrivate *priv;
+
+	priv = BRASERO_MULTI_SONG_PROPS_PRIVATE (object);
+
+	gtk_dialog_set_has_separator (GTK_DIALOG (object), FALSE);
+	gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (object)->vbox), 0);
+	gtk_window_set_default_size (GTK_WINDOW (object), 400, 200);
+
+	table = gtk_table_new (4, 2, FALSE);
+	gtk_widget_show (table);
+	gtk_table_set_row_spacings (GTK_TABLE (table), 4);
+	gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+
+	frame = brasero_utils_pack_properties (_("<b><big>Song information for all tracks</big></b>"), table, NULL);
+	gtk_widget_show (frame);
+	gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
+	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (object)->vbox),
+						frame,
+						FALSE,
+						FALSE,
+						0);
+
+	priv->label = gtk_frame_get_label_widget (GTK_FRAME (frame));
+	gtk_widget_show (priv->label);
+	gtk_label_set_single_line_mode (GTK_LABEL (priv->label), FALSE);
+	gtk_label_set_use_markup (GTK_LABEL (priv->label), TRUE);
+	gtk_label_set_line_wrap (GTK_LABEL (priv->label), TRUE);
+
+	label = gtk_label_new (_("Title:"));
+	gtk_widget_show (label);
+	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+	gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
+
+	priv->title = brasero_rename_new ();
+	gtk_widget_show (priv->title);
+	gtk_table_attach_defaults (GTK_TABLE (table), priv->title, 1, 2, 0, 1);
+	gtk_widget_set_tooltip_text (priv->title,
+				     _("This information will be written to the disc using CD-TEXT technology. It can be read and displayed by some audio CD players."));
+
+	label = gtk_label_new (_("Artist:"));
+	gtk_widget_show (label);
+	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+	gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
+
+	priv->artist = gtk_entry_new ();
+	gtk_widget_show (priv->artist);
+	gtk_entry_set_text (GTK_ENTRY (priv->artist), _("<keep current values>"));
+	gtk_table_attach_defaults (GTK_TABLE (table), priv->artist, 1, 2, 1, 2);
+	gtk_widget_set_tooltip_text (priv->artist,
+				     _("This information will be written to the disc using CD-TEXT technology. It can be read and displayed by some audio CD players."));
+	g_signal_connect (priv->artist,
+			  "focus-in-event",
+			  G_CALLBACK (brasero_multi_song_props_entry_focus_in),
+			  NULL);
+
+	g_signal_connect (priv->artist,
+			  "focus-out-event",
+			  G_CALLBACK (brasero_multi_song_props_entry_focus_out),
+			  NULL);
+
+	label = gtk_label_new (_("Composer:\t"));
+	gtk_widget_show (label);
+	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+	gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0);
+
+	priv->composer = gtk_entry_new ();
+	gtk_widget_show (priv->composer);
+	gtk_entry_set_text (GTK_ENTRY (priv->composer), _("<keep current values>"));
+	gtk_table_attach_defaults (GTK_TABLE (table), priv->composer, 1, 2, 2, 3);
+	gtk_widget_set_tooltip_text (priv->composer,
+				     _("This information will be written to the disc using CD-TEXT technology. It can be read and displayed by some audio CD players."));
+	g_signal_connect (priv->composer,
+			  "focus-in-event",
+			  G_CALLBACK (brasero_multi_song_props_entry_focus_in),
+			  NULL);
+
+	g_signal_connect (priv->composer,
+			  "focus-out-event",
+			  G_CALLBACK (brasero_multi_song_props_entry_focus_out),
+			  NULL);
+
+	label = gtk_label_new ("ISRC:");
+	gtk_widget_show (label);
+	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+	gtk_table_attach (GTK_TABLE (table), label, 0, 1, 3, 4, GTK_FILL, GTK_FILL, 0, 0);
+
+	priv->isrc = gtk_entry_new ();
+	gtk_widget_show (priv->isrc);
+	gtk_entry_set_text (GTK_ENTRY (priv->isrc), _("<keep current values>"));
+	gtk_table_attach_defaults (GTK_TABLE (table), priv->isrc, 1, 2, 3, 4);
+
+	g_signal_connect (priv->isrc,
+			  "focus-in-event",
+			  G_CALLBACK (brasero_multi_song_props_entry_focus_in),
+			  NULL);
+
+	g_signal_connect (priv->isrc,
+			  "focus-out-event",
+			  G_CALLBACK (brasero_multi_song_props_entry_focus_out),
+			  NULL);
+
+	/* second part of the dialog */
+	box = gtk_hbox_new (FALSE, 6);
+	gtk_widget_show (box);
+
+	frame = brasero_utils_pack_properties (_("<big><b>Options</b></big>"), box, NULL);
+	gtk_widget_show (frame);
+	gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
+	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (object)->vbox), frame, FALSE, FALSE, 0);
+
+	label = gtk_label_new (_("Pause length:\t"));
+	gtk_widget_show (label);
+	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+
+	priv->gap = gtk_spin_button_new_with_range (-1.0, 100.0, 1.0);
+	gtk_widget_show (priv->gap);
+	gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (priv->gap), FALSE);
+
+	gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
+	gtk_box_pack_start (GTK_BOX (box), priv->gap, TRUE, TRUE, 0);
+	gtk_widget_set_tooltip_text (priv->gap,
+				     _("Gives the length of the pause that should follow the track"));
+
+	g_signal_connect (priv->gap,
+			  "output",
+			  G_CALLBACK (brasero_multi_song_props_gap_output_cb),
+			  object);
+	g_signal_connect (priv->gap,
+			  "input",
+			  G_CALLBACK (brasero_multi_song_props_gap_input_cb),
+			  object);
+
+	/* buttons */
+	gtk_dialog_add_buttons (GTK_DIALOG (object),
+				GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+				GTK_STOCK_APPLY, GTK_RESPONSE_ACCEPT,
+				NULL);
+
+	gtk_window_set_title (GTK_WINDOW (object), _("Song information"));
+}
+
+static void
+brasero_multi_song_props_finalize (GObject *object)
+{
+	G_OBJECT_CLASS (brasero_multi_song_props_parent_class)->finalize (object);
+}
+
+static void
+brasero_multi_song_props_class_init (BraseroMultiSongPropsClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	g_type_class_add_private (klass, sizeof (BraseroMultiSongPropsPrivate));
+
+	object_class->finalize = brasero_multi_song_props_finalize;
+}
+
+GtkWidget *
+brasero_multi_song_props_new (void)
+{
+	return g_object_new (BRASERO_TYPE_MULTI_SONG_PROPS, NULL);
+}

Added: trunk/src/brasero-multi-song-props.h
==============================================================================
--- (empty file)
+++ trunk/src/brasero-multi-song-props.h	Tue Apr 29 18:58:17 2008
@@ -0,0 +1,72 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-oTK_TYPE_DIALOGffset: 8; tab-width: 8 -*- */
+/*
+ * brasero
+ * Copyright (C) Philippe Rouquier 2008 <bonfire-app wanadoo fr>
+ * 
+ * brasero is free software: you can redistribute it and/or modify itTK_TYPE_DIALOG
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * brasero is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _BRASERO_MULTI_SONG_PROPS_H_
+#define _BRASERO_MULTI_SONG_PROPS_H_
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <gtk/gtk.h>
+#include <gtk/gtkdialog.h>
+
+#include "brasero-rename.h"
+
+G_BEGIN_DECLS
+
+#define BRASERO_TYPE_MULTI_SONG_PROPS             (brasero_multi_song_props_get_type ())
+#define BRASERO_MULTI_SONG_PROPS(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), BRASERO_TYPE_MULTI_SONG_PROPS, BraseroMultiSongProps))
+#define BRASERO_MULTI_SONG_PROPS_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), BRASERO_TYPE_MULTI_SONG_PROPS, BraseroMultiSongPropsClass))
+#define BRASERO_IS_MULTI_SONG_PROPS(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BRASERO_TYPE_MULTI_SONG_PROPS))
+#define BRASERO_IS_MULTI_SONG_PROPS_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), BRASERO_TYPE_MULTI_SONG_PROPS))
+#define BRASERO_MULTI_SONG_PROPS_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), BRASERO_TYPE_MULTI_SONG_PROPS, BraseroMultiSongPropsClass))
+
+typedef struct _BraseroMultiSongPropsClass BraseroMultiSongPropsClass;
+typedef struct _BraseroMultiSongProps BraseroMultiSongProps;
+
+struct _BraseroMultiSongPropsClass
+{
+	GtkDialogClass parent_class;
+};
+
+struct _BraseroMultiSongProps
+{
+	GtkDialog parent_instance;
+};
+
+GType brasero_multi_song_props_get_type (void) G_GNUC_CONST;
+
+GtkWidget *
+brasero_multi_song_props_new (void);
+
+void
+brasero_multi_song_props_set_rename_callback (BraseroMultiSongProps *self,
+					      GtkTreeSelection *selection,
+					      gint column_num,
+					      BraseroRenameCallback callback);
+void
+brasero_multi_song_props_get_properties (BraseroMultiSongProps *props,
+					 gchar **artist,
+					 gchar **composer,
+					 gint *isrc,
+					 gint64 *gap);
+
+G_END_DECLS
+
+#endif /* _BRASERO_MULTI_SONG_PROPS_H_ */

Added: trunk/src/brasero-rename.c
==============================================================================
--- (empty file)
+++ trunk/src/brasero-rename.c	Tue Apr 29 18:58:17 2008
@@ -0,0 +1,359 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * brasero
+ * Copyright (C) Philippe Rouquier 2008 <bonfire-app wanadoo fr>
+ * 
+ * brasero is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * brasero is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <string.h>
+
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+
+#include <gtk/gtk.h>
+
+#include "brasero-rename.h"
+
+typedef struct _BraseroRenamePrivate BraseroRenamePrivate;
+struct _BraseroRenamePrivate
+{
+	GtkWidget *notebook;
+	GtkWidget *combo;
+
+	GtkWidget *insert_entry;
+	GtkWidget *insert_combo;
+
+	GtkWidget *delete_entry;
+
+	GtkWidget *substitute_entry;
+	GtkWidget *joker_entry;
+
+	GtkWidget *number_left_entry;
+	GtkWidget *number_right_entry;
+	guint number;
+};
+
+#define BRASERO_RENAME_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_RENAME, BraseroRenamePrivate))
+
+
+
+G_DEFINE_TYPE (BraseroRename, brasero_rename, GTK_TYPE_VBOX);
+
+
+static gchar *
+brasero_rename_insert_string (BraseroRename *self,
+			      const gchar *name)
+{
+	BraseroRenamePrivate *priv;
+	gboolean is_at_end;
+	const gchar *text;
+
+	priv = BRASERO_RENAME_PRIVATE (self);
+
+	text = gtk_entry_get_text (GTK_ENTRY (priv->insert_entry));
+	is_at_end = gtk_combo_box_get_active (GTK_COMBO_BOX (priv->insert_combo));
+
+	if (is_at_end)
+		return g_strconcat (name, text, NULL);
+
+	return g_strconcat (text, name, NULL);
+}
+
+static gchar *
+brasero_rename_delete_string (BraseroRename *self,
+			      const gchar *name)
+{
+	BraseroRenamePrivate *priv;
+	const gchar *text;
+	gchar *occurence;
+
+	priv = BRASERO_RENAME_PRIVATE (self);
+
+	text = gtk_entry_get_text (GTK_ENTRY (priv->delete_entry));
+	occurence = g_strstr_len (name, -1, text);
+
+	if (!occurence)
+		return NULL;
+
+	return g_strdup_printf ("%.*s%s", occurence - name, name, occurence + strlen (text));
+}
+
+static gchar *
+brasero_rename_substitute_string (BraseroRename *self,
+			 	  const gchar *name)
+{
+	BraseroRenamePrivate *priv;
+	const gchar *joker;
+	const gchar *text;
+	gchar *occurence;
+
+	priv = BRASERO_RENAME_PRIVATE (self);
+
+	text = gtk_entry_get_text (GTK_ENTRY (priv->substitute_entry));
+	occurence = g_strstr_len (name, -1, text);
+
+	if (!occurence)
+		return NULL;
+
+	joker = gtk_entry_get_text (GTK_ENTRY (priv->joker_entry));
+	return g_strdup_printf ("%.*s%s%s", occurence - name, name, joker, occurence + strlen (text));
+}
+
+static gchar *
+brasero_rename_number_string (BraseroRename *self,
+			      const gchar *name)
+{
+	BraseroRenamePrivate *priv;
+	const gchar *right;
+	const gchar *left;
+
+	priv = BRASERO_RENAME_PRIVATE (self);
+
+	left = gtk_entry_get_text (GTK_ENTRY (priv->number_left_entry));
+	right = gtk_entry_get_text (GTK_ENTRY (priv->number_right_entry));
+	return g_strdup_printf ("%s%i%s", left, priv->number ++, right);
+}
+
+gboolean
+brasero_rename_do (BraseroRename *self,
+		   GtkTreeSelection *selection,
+		   guint column_num,
+		   BraseroRenameCallback callback)
+{
+	BraseroRenamePrivate *priv;
+	GtkTreeModel *model;
+	GList *selected;
+	GList *item;
+	guint mode;
+
+	priv = BRASERO_RENAME_PRIVATE (self);
+	mode = gtk_combo_box_get_active (GTK_COMBO_BOX (priv->combo));
+	if (!mode)
+		return TRUE;
+
+	selected = gtk_tree_selection_get_selected_rows (selection, &model);
+	for (item = selected; item; item = item->next) {
+		GtkTreePath *treepath;
+		GtkTreeIter iter;
+		gboolean result;
+		gchar *new_name;
+		gchar *name;
+
+		treepath = item->data;
+		gtk_tree_model_get_iter (model, &iter, treepath);
+
+		gtk_tree_model_get (model, &iter,
+				    column_num, &name,
+				    -1);
+
+redo:
+		switch (mode) {
+		case 1:
+			new_name = brasero_rename_insert_string (self, name);
+			break;
+		case 2:
+			new_name = brasero_rename_delete_string (self, name);
+			break;
+		case 3:
+			new_name = brasero_rename_substitute_string (self, name);
+			break;
+		case 4:
+			new_name = brasero_rename_number_string (self, name);
+			break;
+		default:
+			break;
+		}
+
+		if (!new_name) {
+			g_free (name);
+			continue;
+		}
+
+		result = callback (model, &iter, name, new_name);
+
+		if (!result) {
+			if (mode == 3)
+				goto redo;
+
+			g_free (name);
+			break;
+		}
+		g_free (name);
+	}
+	g_list_foreach (selected, (GFunc) gtk_tree_path_free, NULL);
+	g_list_free (selected);
+	return TRUE;
+}
+
+static void
+brasero_rename_type_changed (GtkComboBox *combo,
+			     BraseroRename *self)
+{
+	BraseroRenamePrivate *priv;
+
+	priv = BRASERO_RENAME_PRIVATE (self);
+	if (!gtk_combo_box_get_active (combo)) {
+		gtk_widget_hide (priv->notebook);
+		return;
+	}
+
+	gtk_widget_show (priv->notebook);
+	gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook),
+				       gtk_combo_box_get_active (combo) - 1);
+}
+
+static void
+brasero_rename_init (BraseroRename *object)
+{
+	BraseroRenamePrivate *priv;
+	GtkWidget *combo;
+	GtkWidget *entry;
+	GtkWidget *label;
+	GtkWidget *hbox;
+
+	priv = BRASERO_RENAME_PRIVATE (object);
+
+	priv->notebook = gtk_notebook_new ();
+	gtk_widget_show (priv->notebook);
+	gtk_box_pack_end (GTK_BOX (object), priv->notebook, FALSE, FALSE, 0);
+	gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->notebook), FALSE);
+	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->notebook), FALSE);
+
+	priv->combo = gtk_combo_box_new_text ();
+	gtk_widget_show (priv->combo);
+	gtk_box_pack_start (GTK_BOX (object), priv->combo, FALSE, FALSE, 0);
+
+	gtk_combo_box_append_text (GTK_COMBO_BOX (priv->combo), _("<keep current values>"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (priv->combo), _("Insert a string"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (priv->combo), _("Delete a string"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (priv->combo), _("Substitute a string"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (priv->combo), _("Number files according to a pattern"));
+
+	g_signal_connect (priv->combo,
+			  "changed",
+			  G_CALLBACK (brasero_rename_type_changed),
+			  object);
+
+	gtk_combo_box_set_active (GTK_COMBO_BOX (priv->combo), 0);
+
+	/* Insert */
+	hbox = gtk_hbox_new (FALSE, 6);
+	gtk_widget_show (hbox);
+	gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), hbox, NULL);
+
+	label = gtk_label_new (_("Insert"));
+	gtk_widget_show (label);
+	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+	entry = gtk_entry_new ();
+	gtk_widget_show (entry);
+	gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+	priv->insert_entry = entry;
+
+	combo = gtk_combo_box_new_text ();
+	gtk_widget_show (combo);
+	gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("at the begining"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (combo), _("at the end"));
+	gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
+	gtk_box_pack_start (GTK_BOX (hbox), combo, FALSE, FALSE, 0);
+	priv->insert_combo = combo;
+
+	/* Delete */
+	hbox = gtk_hbox_new (FALSE, 6);
+	gtk_widget_show (hbox);
+	gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), hbox, NULL);
+
+	label = gtk_label_new (_("Delete every occurence of"));
+	gtk_widget_show (label);
+	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+	entry = gtk_entry_new ();
+	gtk_widget_show (entry);
+	gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+	priv->delete_entry = entry;
+
+	/* Substitution */
+	hbox = gtk_hbox_new (FALSE, 6);
+	gtk_widget_show (hbox);
+	gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), hbox, NULL);
+
+	label = gtk_label_new (_("Substitute"));
+	gtk_widget_show (label);
+	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+	entry = gtk_entry_new ();
+	gtk_widget_show (entry);
+	gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+	priv->substitute_entry = entry;
+
+	label = gtk_label_new (_("by"));
+	gtk_widget_show (label);
+	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+	entry = gtk_entry_new ();
+	gtk_widget_show (entry);
+	gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+	priv->joker_entry = entry;
+
+	/* Pattern */
+	hbox = gtk_hbox_new (FALSE, 6);
+	gtk_widget_show (hbox);
+	gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), hbox, NULL);
+
+	label = gtk_label_new (_("Rename to"));
+	gtk_widget_show (label);
+	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+	entry = gtk_entry_new ();
+	gtk_widget_show (entry);
+	gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+	priv->number_left_entry = entry;
+
+	label = gtk_label_new (_("{number}"));
+	gtk_widget_show (label);
+	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+	entry = gtk_entry_new ();
+	gtk_widget_show (entry);
+	gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+	priv->number_right_entry = entry;
+}
+
+static void
+brasero_rename_finalize (GObject *object)
+{
+	G_OBJECT_CLASS (brasero_rename_parent_class)->finalize (object);
+}
+
+static void
+brasero_rename_class_init (BraseroRenameClass *klass)
+{
+	GObjectClass* object_class = G_OBJECT_CLASS (klass);
+
+	g_type_class_add_private (klass, sizeof (BraseroRenamePrivate));
+
+	object_class->finalize = brasero_rename_finalize;
+}
+
+GtkWidget *
+brasero_rename_new (void)
+{
+	return g_object_new (BRASERO_TYPE_RENAME, NULL);
+}

Added: trunk/src/brasero-rename.h
==============================================================================
--- (empty file)
+++ trunk/src/brasero-rename.h	Tue Apr 29 18:58:17 2008
@@ -0,0 +1,67 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * brasero
+ * Copyright (C) Philippe Rouquier 2008 <bonfire-app wanadoo fr>
+ * 
+ * brasero is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * brasero is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _BRASERO_RENAME_H_
+#define _BRASERO_RENAME_H_
+
+#include <glib-object.h>
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+typedef gboolean (*BraseroRenameCallback)	(GtkTreeModel *model,
+						 GtkTreeIter *iter,
+						 const gchar *old_name,
+						 const gchar *new_name);
+
+#define BRASERO_TYPE_RENAME             (brasero_rename_get_type ())
+#define BRASERO_RENAME(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), BRASERO_TYPE_RENAME, BraseroRename))
+#define BRASERO_RENAME_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), BRASERO_TYPE_RENAME, BraseroRenameClass))
+#define BRASERO_IS_RENAME(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BRASERO_TYPE_RENAME))
+#define BRASERO_IS_RENAME_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), BRASERO_TYPE_RENAME))
+#define BRASERO_RENAME_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), BRASERO_TYPE_RENAME, BraseroRenameClass))
+
+typedef struct _BraseroRenameClass BraseroRenameClass;
+typedef struct _BraseroRename BraseroRename;
+
+struct _BraseroRenameClass
+{
+	GtkVBoxClass parent_class;
+};
+
+struct _BraseroRename
+{
+	GtkVBox parent_instance;
+};
+
+GType brasero_rename_get_type (void) G_GNUC_CONST;
+
+GtkWidget *
+brasero_rename_new (void);
+
+gboolean
+brasero_rename_do (BraseroRename *self,
+		   GtkTreeSelection *selection,
+		   guint column_num,
+		   BraseroRenameCallback callback);
+
+G_END_DECLS
+
+#endif /* _BRASERO_RENAME_H_ */

Modified: trunk/src/brasero-song-properties.c
==============================================================================
--- trunk/src/brasero-song-properties.c	(original)
+++ trunk/src/brasero-song-properties.c	Tue Apr 29 18:58:17 2008
@@ -181,6 +181,8 @@
 	gtk_table_attach (GTK_TABLE (table), label, 0, 1, 3, 4, GTK_FILL, GTK_FILL, 0, 0);
 	gtk_table_attach_defaults (GTK_TABLE (table), obj->priv->isrc, 1, 2, 3, 4);
 
+	gtk_widget_show_all (frame);
+
 	/* second part of the dialog */
 	table = gtk_table_new (2, 4, FALSE);
 	gtk_table_set_row_spacings (GTK_TABLE (table), 6);
@@ -221,6 +223,8 @@
 	gtk_misc_set_alignment (GTK_MISC (obj->priv->length), 0.0, 0.5);
 	gtk_table_attach (GTK_TABLE (table), obj->priv->length, 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0);
 
+	gtk_widget_show_all (frame);
+
 	/* monitor since there must be 4 sec at least for a track */
 	g_signal_connect (obj->priv->end,
 			  "value-changed",



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