summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/gtkui/ddbcellrenderertextmultiline.c47
-rw-r--r--plugins/gtkui/ddbcellrenderertextmultiline.vala14
-rw-r--r--plugins/gtkui/trkproperties.c197
3 files changed, 144 insertions, 114 deletions
diff --git a/plugins/gtkui/ddbcellrenderertextmultiline.c b/plugins/gtkui/ddbcellrenderertextmultiline.c
index b47ef95c..a6e95853 100644
--- a/plugins/gtkui/ddbcellrenderertextmultiline.c
+++ b/plugins/gtkui/ddbcellrenderertextmultiline.c
@@ -52,6 +52,7 @@ typedef struct _DdbCellRendererTextMultiline DdbCellRendererTextMultiline;
typedef struct _DdbCellRendererTextMultilineClass DdbCellRendererTextMultilineClass;
typedef struct _DdbCellRendererTextMultilinePrivate DdbCellRendererTextMultilinePrivate;
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
+#define _gtk_tree_path_free0(var) ((var == NULL) ? NULL : (var = (gtk_tree_path_free (var), NULL)))
struct _DdbCellEditableTextView {
GtkTextView parent_instance;
@@ -236,12 +237,20 @@ static GtkCellEditable* ddb_cell_renderer_text_multiline_real_start_editing (Gtk
DdbCellRendererTextMultiline * self;
GtkCellEditable* result = NULL;
gboolean _tmp0_;
- DdbCellEditableTextView* _tmp1_;
- char* _tmp2_;
- GtkTextBuffer* buf;
- char* _tmp3_ = NULL;
+ GtkTreePath* p;
+ GtkTreeView* tv;
+ GtkListStore* store;
+ GtkTreeIter iter = {0};
+ GValue v = {0};
+ GValue _tmp1_ = {0};
+ GValue _tmp2_;
+ gint mult;
+ DdbCellEditableTextView* _tmp3_;
char* _tmp4_;
- gboolean _tmp5_;
+ GtkTextBuffer* buf;
+ char* _tmp5_ = NULL;
+ char* _tmp6_;
+ gboolean _tmp7_;
self = (DdbCellRendererTextMultiline*) base;
g_return_val_if_fail (event != NULL, NULL);
g_return_val_if_fail (widget != NULL, NULL);
@@ -250,14 +259,24 @@ static GtkCellEditable* ddb_cell_renderer_text_multiline_real_start_editing (Gtk
result = GTK_CELL_EDITABLE (NULL);
return result;
}
- self->priv->entry = (_tmp1_ = g_object_ref_sink (ddb_cell_editable_text_view_new ()), _g_object_unref0 (self->priv->entry), _tmp1_);
- self->priv->entry->tree_path = (_tmp2_ = g_strdup (path), _g_free0 (self->priv->entry->tree_path), _tmp2_);
+ p = gtk_tree_path_new_from_string (path);
+ tv = _g_object_ref0 (GTK_TREE_VIEW (widget));
+ store = _g_object_ref0 (GTK_LIST_STORE (gtk_tree_view_get_model (tv)));
+ gtk_tree_model_get_iter ((GtkTreeModel*) store, &iter, p);
+ gtk_tree_model_get_value ((GtkTreeModel*) store, &iter, 3, &_tmp1_);
+ v = (_tmp2_ = _tmp1_, G_IS_VALUE (&v) ? (g_value_unset (&v), NULL) : NULL, _tmp2_);
+ mult = g_value_get_int (&v);
+ self->priv->entry = (_tmp3_ = g_object_ref_sink (ddb_cell_editable_text_view_new ()), _g_object_unref0 (self->priv->entry), _tmp3_);
+ if (mult != 0) {
+ g_object_set ((GtkCellRendererText*) self, "text", "", NULL);
+ }
+ self->priv->entry->tree_path = (_tmp4_ = g_strdup (path), _g_free0 (self->priv->entry->tree_path), _tmp4_);
buf = gtk_text_buffer_new (NULL);
- if ((_tmp5_ = (_tmp4_ = (g_object_get ((GtkCellRendererText*) self, "text", &_tmp3_, NULL), _tmp3_)) != NULL, _g_free0 (_tmp4_), _tmp5_)) {
- char* _tmp6_ = NULL;
- char* _tmp7_;
- gtk_text_buffer_set_text (buf, _tmp7_ = (g_object_get ((GtkCellRendererText*) self, "text", &_tmp6_, NULL), _tmp6_), -1);
- _g_free0 (_tmp7_);
+ if ((_tmp7_ = (_tmp6_ = (g_object_get ((GtkCellRendererText*) self, "text", &_tmp5_, NULL), _tmp5_)) != NULL, _g_free0 (_tmp6_), _tmp7_)) {
+ char* _tmp8_ = NULL;
+ char* _tmp9_;
+ gtk_text_buffer_set_text (buf, _tmp9_ = (g_object_get ((GtkCellRendererText*) self, "text", &_tmp8_, NULL), _tmp8_), -1);
+ _g_free0 (_tmp9_);
}
gtk_text_view_set_buffer ((GtkTextView*) self->priv->entry, buf);
g_signal_connect (self->priv->entry, "editing-done", (GCallback) ddb_cell_renderer_text_multiline_gtk_cell_renderer_text_editing_done, self);
@@ -266,6 +285,10 @@ static GtkCellEditable* ddb_cell_renderer_text_multiline_real_start_editing (Gtk
gtk_widget_show ((GtkWidget*) self->priv->entry);
result = GTK_CELL_EDITABLE (self->priv->entry);
_g_object_unref0 (buf);
+ G_IS_VALUE (&v) ? (g_value_unset (&v), NULL) : NULL;
+ _g_object_unref0 (store);
+ _g_object_unref0 (tv);
+ _gtk_tree_path_free0 (p);
return result;
}
diff --git a/plugins/gtkui/ddbcellrenderertextmultiline.vala b/plugins/gtkui/ddbcellrenderertextmultiline.vala
index 75e7bdc9..4587cff9 100644
--- a/plugins/gtkui/ddbcellrenderertextmultiline.vala
+++ b/plugins/gtkui/ddbcellrenderertextmultiline.vala
@@ -79,7 +79,21 @@ namespace Ddb {
if (!editable) {
return (Gtk.CellEditable)null;
}
+
+ Gtk.TreePath p = new Gtk.TreePath.from_string (path);
+ Gtk.TreeView tv = (Gtk.TreeView)widget;
+ Gtk.ListStore store = (Gtk.ListStore)tv.get_model();
+ Gtk.TreeIter iter;
+ store.get_iter (out iter, p);
+ GLib.Value v;
+ store.get_value (iter, 3, out v);
+ int mult = v.get_int ();
+
entry = new CellEditableTextView ();
+ if (mult != 0) {
+ text = "";
+ }
+
entry.tree_path = path;
Gtk.TextBuffer buf = new Gtk.TextBuffer (null);
if (text != null) {
diff --git a/plugins/gtkui/trkproperties.c b/plugins/gtkui/trkproperties.c
index a7149293..49be5b81 100644
--- a/plugins/gtkui/trkproperties.c
+++ b/plugins/gtkui/trkproperties.c
@@ -41,7 +41,6 @@
#define min(x,y) ((x)<(y)?(x):(y))
static GtkWidget *trackproperties;
-static DB_playItem_t *track;
static GtkCellRenderer *rend_text2;
static GtkListStore *store;
static GtkListStore *propstore;
@@ -161,10 +160,6 @@ on_trackproperties_delete_event (GtkWidget *widget,
gtk_widget_destroy (widget);
rend_text2 = NULL;
trackproperties = NULL;
- if (track) {
- deadbeef->pl_item_unref (track);
- track = NULL;
- }
if (tracks) {
for (int i = 0; i < numtracks; i++) {
deadbeef->pl_item_unref (tracks[i]);
@@ -213,7 +208,7 @@ on_metadata_edited (GtkCellRendererText *renderer, gchar *path, gchar *new_text,
gtk_tree_model_get_value (GTK_TREE_MODEL (store), &iter, 1, &value);
const char *svalue = g_value_get_string (&value);
if (strcmp (svalue, new_text)) {
- gtk_list_store_set (store, &iter, 1, new_text, -1);
+ gtk_list_store_set (store, &iter, 1, new_text, 3, 0, -1);
trkproperties_modified = 1;
}
}
@@ -250,7 +245,7 @@ add_field (GtkListStore *store, const char *key, const char *title) {
GtkTreeIter iter;
gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, 0, title, 1, n ? val : val + ml, 2, key, -1);
+ gtk_list_store_set (store, &iter, 0, title, 1, n ? val : val + ml, 2, key, 3, n ? 1 : 0, -1);
}
void
@@ -293,65 +288,70 @@ trkproperties_fill_metadata (void) {
}
add_field (store, keys[k], title);
}
- free (keys);
+ if (keys) {
+ free (keys);
+ }
// unknown fields and properties
- DB_metaInfo_t *meta = deadbeef->pl_get_metadata (track);
- while (meta) {
- if (meta->key[0] == ':') {
- int l = strlen (meta->key)-1;
- char title[l+3];
- snprintf (title, sizeof (title), "<%s>", meta->key+1);
- const char *value = meta->value;
-
- GtkTreeIter iter;
- gtk_list_store_append (propstore, &iter);
- gtk_list_store_set (propstore, &iter, 0, title, 1, value, -1);
+ if (numtracks == 1) {
+ DB_playItem_t *track = tracks[0];
+
+ DB_metaInfo_t *meta = deadbeef->pl_get_metadata (track);
+ while (meta) {
+ if (meta->key[0] == ':') {
+ int l = strlen (meta->key)-1;
+ char title[l+3];
+ snprintf (title, sizeof (title), "<%s>", meta->key+1);
+ const char *value = meta->value;
+
+ GtkTreeIter iter;
+ gtk_list_store_append (propstore, &iter);
+ gtk_list_store_set (propstore, &iter, 0, title, 1, value, -1);
+ meta = meta->next;
+ continue;
+ }
meta = meta->next;
- continue;
}
- meta = meta->next;
+ // properties
+ char temp[200];
+ GtkTreeIter iter;
+ gtk_list_store_clear (propstore);
+ gtk_list_store_append (propstore, &iter);
+ gtk_list_store_set (propstore, &iter, 0, _("Location"), 1, track->fname, -1);
+ gtk_list_store_append (propstore, &iter);
+ snprintf (temp, sizeof (temp), "%d", track->tracknum);
+ gtk_list_store_set (propstore, &iter, 0, _("Subtrack Index"), 1, temp, -1);
+ gtk_list_store_append (propstore, &iter);
+ deadbeef->pl_format_time (deadbeef->pl_get_item_duration (track), temp, sizeof (temp));
+ gtk_list_store_set (propstore, &iter, 0, _("Duration"), 1, temp, -1);
+ gtk_list_store_append (propstore, &iter);
+ deadbeef->pl_format_title (track, -1, temp, sizeof (temp), -1, "%T");
+ gtk_list_store_set (propstore, &iter, 0, _("Tag Type(s)"), 1, temp, -1);
+ gtk_list_store_append (propstore, &iter);
+ gtk_list_store_set (propstore, &iter, 0, _("Embedded Cuesheet"), 1, (deadbeef->pl_get_item_flags (track) & DDB_HAS_EMBEDDED_CUESHEET) ? _("Yes") : _("No"), -1);
+ gtk_list_store_append (propstore, &iter);
+ gtk_list_store_set (propstore, &iter, 0, _("Codec"), 1, track->decoder_id, -1);
+
+ gtk_list_store_append (propstore, &iter);
+ snprintf (temp, sizeof (temp), "%0.2f dB", track->replaygain_album_gain);
+ gtk_list_store_set (propstore, &iter, 0, "ReplayGain Album Gain", 1, temp, -1);
+ gtk_list_store_append (propstore, &iter);
+ snprintf (temp, sizeof (temp), "%0.6f", track->replaygain_album_peak);
+ gtk_list_store_set (propstore, &iter, 0, "ReplayGain Album Peak", 1, temp, -1);
+
+ gtk_list_store_append (propstore, &iter);
+ snprintf (temp, sizeof (temp), "%0.2f dB", track->replaygain_track_gain);
+ gtk_list_store_set (propstore, &iter, 0, "ReplayGain Track Gain", 1, temp, -1);
+ gtk_list_store_append (propstore, &iter);
+ snprintf (temp, sizeof (temp), "%0.6f", track->replaygain_track_peak);
+ gtk_list_store_set (propstore, &iter, 0, "ReplayGain Track Peak", 1, temp, -1);
+
+ struct timeval tm2;
+ gettimeofday (&tm2, NULL);
+ int ms = (tm2.tv_sec*1000+tm2.tv_usec/1000) - (tm1.tv_sec*1000+tm1.tv_usec/1000);
}
- // properties
- char temp[200];
- GtkTreeIter iter;
- gtk_list_store_clear (propstore);
- gtk_list_store_append (propstore, &iter);
- gtk_list_store_set (propstore, &iter, 0, _("Location"), 1, track->fname, -1);
- gtk_list_store_append (propstore, &iter);
- snprintf (temp, sizeof (temp), "%d", track->tracknum);
- gtk_list_store_set (propstore, &iter, 0, _("Subtrack Index"), 1, temp, -1);
- gtk_list_store_append (propstore, &iter);
- deadbeef->pl_format_time (deadbeef->pl_get_item_duration (track), temp, sizeof (temp));
- gtk_list_store_set (propstore, &iter, 0, _("Duration"), 1, temp, -1);
- gtk_list_store_append (propstore, &iter);
- deadbeef->pl_format_title (track, -1, temp, sizeof (temp), -1, "%T");
- gtk_list_store_set (propstore, &iter, 0, _("Tag Type(s)"), 1, temp, -1);
- gtk_list_store_append (propstore, &iter);
- gtk_list_store_set (propstore, &iter, 0, _("Embedded Cuesheet"), 1, (deadbeef->pl_get_item_flags (track) & DDB_HAS_EMBEDDED_CUESHEET) ? _("Yes") : _("No"), -1);
- gtk_list_store_append (propstore, &iter);
- gtk_list_store_set (propstore, &iter, 0, _("Codec"), 1, track->decoder_id, -1);
-
- gtk_list_store_append (propstore, &iter);
- snprintf (temp, sizeof (temp), "%0.2f dB", track->replaygain_album_gain);
- gtk_list_store_set (propstore, &iter, 0, "ReplayGain Album Gain", 1, temp, -1);
- gtk_list_store_append (propstore, &iter);
- snprintf (temp, sizeof (temp), "%0.6f", track->replaygain_album_peak);
- gtk_list_store_set (propstore, &iter, 0, "ReplayGain Album Peak", 1, temp, -1);
-
- gtk_list_store_append (propstore, &iter);
- snprintf (temp, sizeof (temp), "%0.2f dB", track->replaygain_track_gain);
- gtk_list_store_set (propstore, &iter, 0, "ReplayGain Track Gain", 1, temp, -1);
- gtk_list_store_append (propstore, &iter);
- snprintf (temp, sizeof (temp), "%0.6f", track->replaygain_track_peak);
- gtk_list_store_set (propstore, &iter, 0, "ReplayGain Track Peak", 1, temp, -1);
-
- struct timeval tm2;
- gettimeofday (&tm2, NULL);
- int ms = (tm2.tv_sec*1000+tm2.tv_usec/1000) - (tm1.tv_sec*1000+tm1.tv_usec/1000);
-
deadbeef->pl_unlock ();
}
@@ -398,16 +398,6 @@ show_track_properties_dlg (DB_playItem_t *it) {
deadbeef->pl_unlock ();
deadbeef->plt_unlock ();
- if (track) {
- deadbeef->pl_item_unref (track);
- track = NULL;
- }
- if (it) {
- deadbeef->pl_item_ref (it);
- }
- track = it;
-
-
int allow_editing = 0;
int is_subtrack = deadbeef->pl_get_item_flags (it) & DDB_IS_SUBTRACK;
@@ -438,10 +428,10 @@ show_track_properties_dlg (DB_playItem_t *it) {
// metadata tree
tree = GTK_TREE_VIEW (lookup_widget (trackproperties, "metalist"));
- store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+ store = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT);
gtk_tree_view_set_model (tree, GTK_TREE_MODEL (store));
GtkCellRenderer *rend_text = gtk_cell_renderer_text_new ();
- rend_text2 = GTK_CELL_RENDERER (ddb_cell_renderer_text_multiline_new ());//gtk_cell_renderer_text_new ();
+ rend_text2 = GTK_CELL_RENDERER (ddb_cell_renderer_text_multiline_new ());
if (allow_editing) {
g_signal_connect ((gpointer)rend_text2, "edited",
G_CALLBACK (on_metadata_edited),
@@ -473,12 +463,7 @@ show_track_properties_dlg (DB_playItem_t *it) {
gtk_list_store_clear (propstore);
}
-// if (allow_editing) {
- g_object_set (G_OBJECT (rend_text2), "editable", TRUE, NULL);
-// }
-// else {
-// g_object_set (G_OBJECT (rend_text2), "editable", FALSE, NULL);
-// }
+ g_object_set (G_OBJECT (rend_text2), "editable", TRUE, NULL);
GtkWidget *widget = trackproperties;
GtkWidget *w;
@@ -499,13 +484,20 @@ show_track_properties_dlg (DB_playItem_t *it) {
static gboolean
set_metadata_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) {
- GValue key = {0,}, value = {0,};
- gtk_tree_model_get_value (model, iter, 2, &key);
- gtk_tree_model_get_value (model, iter, 1, &value);
- const char *skey = g_value_get_string (&key);
- const char *svalue = g_value_get_string (&value);
+ GValue mult = {0,};
+ gtk_tree_model_get_value (model, iter, 3, &mult);
+ int smult = g_value_get_int (&mult);
+ if (!smult) {
+ GValue key = {0,}, value = {0,};
+ gtk_tree_model_get_value (model, iter, 2, &key);
+ gtk_tree_model_get_value (model, iter, 1, &value);
+ const char *skey = g_value_get_string (&key);
+ const char *svalue = g_value_get_string (&value);
- deadbeef->pl_replace_meta (DB_PLAYITEM (data), skey, svalue);
+ for (int i = 0; i < numtracks; i++) {
+ deadbeef->pl_replace_meta (tracks[i], skey, svalue);
+ }
+ }
return FALSE;
}
@@ -514,27 +506,29 @@ void
on_write_tags_clicked (GtkButton *button,
gpointer user_data)
{
- if (!track || !track->decoder_id) {
- return;
- }
- // find decoder
- DB_decoder_t *dec = NULL;
- DB_decoder_t **decoders = deadbeef->plug_get_decoder_list ();
- for (int i = 0; decoders[i]; i++) {
- if (!strcmp (decoders[i]->plugin.id, track->decoder_id)) {
- dec = decoders[i];
- if (dec->write_metadata) {
- // put all metainfo into track
- GtkTreeView *tree = GTK_TREE_VIEW (lookup_widget (trackproperties, "metalist"));
- GtkTreeModel *model = GTK_TREE_MODEL (gtk_tree_view_get_model (tree));
- gtk_tree_model_foreach (model, set_metadata_cb, track);
- dec->write_metadata (track);
- main_refresh ();
- search_refresh ();
+ // put all metainfo into track
+ GtkTreeView *tree = GTK_TREE_VIEW (lookup_widget (trackproperties, "metalist"));
+ GtkTreeModel *model = GTK_TREE_MODEL (gtk_tree_view_get_model (tree));
+ gtk_tree_model_foreach (model, set_metadata_cb, NULL);
+ for (int t = 0; t < numtracks; t++) {
+ DB_playItem_t *track = tracks[t];
+ if (track && track->decoder_id) {
+ // find decoder
+ DB_decoder_t *dec = NULL;
+ DB_decoder_t **decoders = deadbeef->plug_get_decoder_list ();
+ for (int i = 0; decoders[i]; i++) {
+ if (!strcmp (decoders[i]->plugin.id, track->decoder_id)) {
+ dec = decoders[i];
+ if (dec->write_metadata) {
+ dec->write_metadata (track);
+ }
+ break;
+ }
}
- break;
}
}
+ main_refresh ();
+ search_refresh ();
trkproperties_modified = 0;
}
@@ -580,7 +574,6 @@ on_remove_field_activate (GtkMenuItem *menuitem,
}
GtkWidget *dlg = gtk_message_dialog_new (GTK_WINDOW (mainwin), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO, _("Really remove selected field?"));
-// gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dlg), _("Files will be lost. Proceed?\n(This dialog can be turned off in GTKUI plugin settings)"));
gtk_window_set_title (GTK_WINDOW (dlg), _("Warning"));
int response = gtk_dialog_run (GTK_DIALOG (dlg));