summaryrefslogtreecommitdiff
path: root/plugins/gtkui
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2011-03-09 11:38:38 +0100
committerGravatar waker <wakeroid@gmail.com>2011-03-09 11:38:38 +0100
commit2d0b00f6bbd326790c053961ccec07106cb172c7 (patch)
treea4ffb39b2a5d1c9a80aa2ba79f885d0d20667df8 /plugins/gtkui
parentfb269bc2b4cbbe6b457b46588d39ace1c021e3f1 (diff)
moved most of track properties from playItem struct to metadata
implemented track properties with multiple selection
Diffstat (limited to 'plugins/gtkui')
-rw-r--r--plugins/gtkui/gtkui.c2
-rw-r--r--plugins/gtkui/mainplaylist.c6
-rw-r--r--plugins/gtkui/plcommon.c11
-rw-r--r--plugins/gtkui/trkproperties.c142
4 files changed, 76 insertions, 85 deletions
diff --git a/plugins/gtkui/gtkui.c b/plugins/gtkui/gtkui.c
index 539b6eb7..b25317d7 100644
--- a/plugins/gtkui/gtkui.c
+++ b/plugins/gtkui/gtkui.c
@@ -1081,7 +1081,7 @@ gtkui_add_file_info_cb (DB_playItem_t *it, void *data) {
if (progress_is_aborted ()) {
return -1;
}
- g_idle_add (gtkui_set_progress_text_idle, it->fname);
+ g_idle_add (gtkui_set_progress_text_idle, (gpointer)deadbeef->pl_find_meta (it, ":URI"));
return 0;
}
diff --git a/plugins/gtkui/mainplaylist.c b/plugins/gtkui/mainplaylist.c
index fc86a058..9342f257 100644
--- a/plugins/gtkui/mainplaylist.c
+++ b/plugins/gtkui/mainplaylist.c
@@ -127,9 +127,9 @@ gboolean
playlist_tooltip_handler (GtkWidget *widget, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer unused)
{
GtkWidget *pl = lookup_widget (mainwin, "playlist");
- DB_playItem_t *item = (DB_playItem_t *)ddb_listview_get_iter_from_coord (DDB_LISTVIEW (pl), 0, y);
- if (item && item->fname) {
- gtk_tooltip_set_text (tooltip, item->fname);
+ DB_playItem_t *it = (DB_playItem_t *)ddb_listview_get_iter_from_coord (DDB_LISTVIEW (pl), 0, y);
+ if (it) {
+ gtk_tooltip_set_text (tooltip, deadbeef->pl_find_meta (it, ":URI"));
return TRUE;
}
return FALSE;
diff --git a/plugins/gtkui/plcommon.c b/plugins/gtkui/plcommon.c
index 53965295..bffaa6c9 100644
--- a/plugins/gtkui/plcommon.c
+++ b/plugins/gtkui/plcommon.c
@@ -120,7 +120,7 @@ void draw_column_data (DdbListview *listview, GdkDrawable *drawable, DdbListview
if (!album || !*album) {
album = deadbeef->pl_find_meta (group_it, "title");
}
- GdkPixbuf *pixbuf = get_cover_art (((DB_playItem_t *)group_it)->fname, artist, album, art_width);
+ GdkPixbuf *pixbuf = get_cover_art (deadbeef->pl_find_meta (((DB_playItem_t *)group_it), ":URI"), artist, album, art_width);
if (pixbuf) {
int pw = gdk_pixbuf_get_width (pixbuf);
int ph = gdk_pixbuf_get_height (pixbuf);
@@ -238,14 +238,15 @@ main_reload_metadata_activate
DdbListview *ps = DDB_LISTVIEW (g_object_get_data (G_OBJECT (menuitem), "ps"));
DB_playItem_t *it = deadbeef->pl_get_first (PL_MAIN);
while (it) {
- if (deadbeef->pl_is_selected (it) && deadbeef->is_local_file (it->fname) && it->decoder_id) {
+ const char *decoder_id = deadbeef->pl_find_meta (it, ":DECODER");
+ if (deadbeef->pl_is_selected (it) && deadbeef->is_local_file (deadbeef->pl_find_meta (it, ":URI")) && decoder_id) {
uint32_t f = deadbeef->pl_get_item_flags (it);
if (!(f & DDB_IS_SUBTRACK)) {
f &= ~DDB_TAG_MASK;
deadbeef->pl_set_item_flags (it, f);
DB_decoder_t **decoders = deadbeef->plug_get_decoder_list ();
for (int i = 0; decoders[i]; i++) {
- if (!strcmp (decoders[i]->plugin.id, it->decoder_id)) {
+ if (!strcmp (decoders[i]->plugin.id, decoder_id)) {
if (decoders[i]->read_metadata) {
decoders[i]->read_metadata (it);
}
@@ -337,8 +338,8 @@ on_remove_from_disk_activate (GtkMenuItem *menuitem,
DB_playItem_t *it = deadbeef->pl_get_first (PL_MAIN);
while (it) {
- if (deadbeef->pl_is_selected (it) && deadbeef->is_local_file (it->fname)) {
- unlink (it->fname);
+ if (deadbeef->pl_is_selected (it) && deadbeef->is_local_file (deadbeef->pl_find_meta (it, ":URI"))) {
+ unlink (deadbeef->pl_find_meta (it, ":URI"));
}
DB_playItem_t *next = deadbeef->pl_get_next (it, PL_MAIN);
deadbeef->pl_item_unref (it);
diff --git a/plugins/gtkui/trkproperties.c b/plugins/gtkui/trkproperties.c
index 49be5b81..889e4984 100644
--- a/plugins/gtkui/trkproperties.c
+++ b/plugins/gtkui/trkproperties.c
@@ -49,7 +49,7 @@ static DB_playItem_t **tracks;
static int numtracks;
static int
-build_key_list (const char ***pkeys) {
+build_key_list (const char ***pkeys, int props) {
int sz = 20;
const char **keys = malloc (sizeof (const char *) * sz);
if (!keys) {
@@ -63,7 +63,7 @@ build_key_list (const char ***pkeys) {
for (int i = 0; i < numtracks; i++) {
DB_metaInfo_t *meta = deadbeef->pl_get_metadata (tracks[i]);
while (meta) {
- if (meta->key[0] != ':') {
+ if ((props && meta->key[0] == ':') || (!props && meta->key[0] != ':')) {
int k = 0;
for (; k < n; k++) {
if (meta->key == keys[k]) {
@@ -91,7 +91,17 @@ build_key_list (const char ***pkeys) {
}
static int
-get_field_value (char *out, int size, const char *key) {
+equals_ptr (const char *a, const char *b) {
+ return a == b;
+}
+
+static int
+equals_value (const char *a, const char *b) {
+ return !strcmp (a, b);
+}
+
+static int
+get_field_value (char *out, int size, const char *key, const char *(*getter)(DB_playItem_t *it, const char *key), int (*equals)(const char *a, const char *b)) {
int multiple = 0;
*out = 0;
if (numtracks == 0) {
@@ -101,14 +111,14 @@ get_field_value (char *out, int size, const char *key) {
const char **prev = malloc (sizeof (const char *) * numtracks);
memset (prev, 0, sizeof (const char *) * numtracks);
for (int i = 0; i < numtracks; i++) {
- const char *val = deadbeef->pl_find_meta (tracks[i], key);
+ const char *val = getter (tracks[i], key);
if (val && val[0] == 0) {
val = NULL;
}
if (i > 0) {
int n = 0;
for (; n < i; n++) {
- if (prev[n] == val) {
+ if (equals (prev[n], val)) {
break;
}
}
@@ -134,7 +144,8 @@ get_field_value (char *out, int size, const char *key) {
}
}
if (size <= 1) {
- strcpy (out-2, "…");
+ gchar *prev = g_utf8_prev_char (out-4);
+ strcpy (prev, "...");
}
free (prev);
return multiple;
@@ -229,23 +240,38 @@ static const char *types[] = {
NULL
};
+static const char *hc_props[] = {
+ ":URI", "Location",
+ ":TRACKNUM", "Subtrack Index",
+ ":DURATION", "Duration",
+ ":TAGS", "Tag Type(s)",
+ ":HAS_EMBEDDED_CUESHEET", "Embedded Cuesheet",
+ ":DECODER", "Codec",
+ NULL
+};
+
static inline float
amp_to_db (float amp) {
return 20*log10 (amp);
}
void
-add_field (GtkListStore *store, const char *key, const char *title) {
+add_field (GtkListStore *store, const char *key, const char *title, int is_prop) {
// get value to edit
const char mult[] = _("[Multiple values] ");
char val[1000];
size_t ml = strlen (mult);
memcpy (val, mult, ml+1);
- int n = get_field_value (val + ml, sizeof (val) - ml, key);
+ int n = get_field_value (val + ml, sizeof (val) - ml, key, deadbeef->pl_find_meta, equals_ptr);
GtkTreeIter iter;
gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, 0, title, 1, n ? val : val + ml, 2, key, 3, n ? 1 : 0, -1);
+ if (!is_prop) {
+ gtk_list_store_set (store, &iter, 0, title, 1, n ? val : val + ml, 2, key, 3, n ? 1 : 0, -1);
+ }
+ else {
+ gtk_list_store_set (store, &iter, 0, title, 1, n ? val : val + ml, -1);
+ }
}
void
@@ -257,17 +283,14 @@ trkproperties_fill_metadata (void) {
gtk_list_store_clear (store);
deadbeef->pl_lock ();
- struct timeval tm1;
- gettimeofday (&tm1, NULL);
-
const char **keys = NULL;
- int nkeys = build_key_list (&keys);
+ int nkeys = build_key_list (&keys, 0);
int k;
// add "standard" fields
for (int i = 0; types[i]; i += 2) {
- add_field (store, types[i], _(types[i+1]));
+ add_field (store, types[i], _(types[i+1]), 0);
}
// add all other fields
@@ -286,70 +309,35 @@ trkproperties_fill_metadata (void) {
if (!types[i]) {
snprintf (title, sizeof (title), "<%s>", keys[k]);
}
- add_field (store, keys[k], title);
+ add_field (store, keys[k], title, 0);
}
if (keys) {
free (keys);
}
- // unknown fields and properties
- 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;
+ // hardcoded properties
+ for (int i = 0; hc_props[i]; i += 2) {
+ add_field (propstore, hc_props[i], _(hc_props[i+1]), 1);
+ }
+ // properties
+ keys = NULL;
+ nkeys = build_key_list (&keys, 1);
+ for (int k = 0; k < nkeys; k++) {
+ int i;
+ for (i = 0; hc_props[i]; i += 2) {
+ if (!strcmp (keys[k], hc_props[i])) {
+ break;
}
- 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);
+ if (hc_props[i]) {
+ continue;
+ }
+ char title[1000];
+ snprintf (title, sizeof (title), "<%s>", keys[k]+1);
+ add_field (propstore, keys[k], title, 1);
+ }
+ if (keys) {
+ free (keys);
}
deadbeef->pl_unlock ();
@@ -402,13 +390,14 @@ show_track_properties_dlg (DB_playItem_t *it) {
int is_subtrack = deadbeef->pl_get_item_flags (it) & DDB_IS_SUBTRACK;
- if (!is_subtrack && deadbeef->is_local_file (it->fname)) {
+ if (!is_subtrack && deadbeef->is_local_file (deadbeef->pl_find_meta (it, ":URI"))) {
// get decoder plugin by id
DB_decoder_t *dec = NULL;
- if (it->decoder_id) {
+ const char *decoder_id = deadbeef->pl_find_meta (it, ":DECODER");
+ if (decoder_id) {
DB_decoder_t **decoders = deadbeef->plug_get_decoder_list ();
for (int i = 0; decoders[i]; i++) {
- if (!strcmp (decoders[i]->plugin.id, it->decoder_id)) {
+ if (!strcmp (decoders[i]->plugin.id, decoder_id)) {
dec = decoders[i];
break;
}
@@ -512,12 +501,13 @@ on_write_tags_clicked (GtkButton *button,
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) {
+ const char *decoder_id = deadbeef->pl_find_meta (track, ":DECODER");
+ if (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)) {
+ if (!strcmp (decoders[i]->plugin.id, decoder_id)) {
dec = decoders[i];
if (dec->write_metadata) {
dec->write_metadata (track);