brasero r782 - in trunk: . po src
- From: philippr svn gnome org
- To: svn-commits-list gnome org
- Subject: brasero r782 - in trunk: . po src
- Date: Tue, 29 Apr 2008 19:58:18 +0100 (BST)
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]