diff options
| author | Jonathan Gordon <rockbox@jdgordon.info> | 2007-10-29 12:02:55 +0000 |
|---|---|---|
| committer | Jonathan Gordon <rockbox@jdgordon.info> | 2007-10-29 12:02:55 +0000 |
| commit | 4d18aa35462c1a1c01aa0c382cf60e3d01a392f6 (patch) | |
| tree | 8d40d44f152d2337d64f354fa37cd4df22113207 /apps | |
| parent | bae8f4c3167a0b44ff6516d421e95baaf8937066 (diff) | |
| download | rockbox-4d18aa35462c1a1c01aa0c382cf60e3d01a392f6.zip rockbox-4d18aa35462c1a1c01aa0c382cf60e3d01a392f6.tar.gz rockbox-4d18aa35462c1a1c01aa0c382cf60e3d01a392f6.tar.bz2 rockbox-4d18aa35462c1a1c01aa0c382cf60e3d01a392f6.tar.xz | |
Accept FS#8008 - allows the current artist or album to be used in databse searches (use the #artist# or #album# keywords in tagnavi.config)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15354 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
| -rw-r--r-- | apps/tagcache.h | 8 | ||||
| -rw-r--r-- | apps/tagnavi.config | 6 | ||||
| -rw-r--r-- | apps/tagtree.c | 54 |
3 files changed, 55 insertions, 13 deletions
diff --git a/apps/tagcache.h b/apps/tagcache.h index 6b2df6b..16dac0b 100644 --- a/apps/tagcache.h +++ b/apps/tagcache.h @@ -109,12 +109,18 @@ struct tagcache_stat { // const char *uimessage; /* Pending error message. Implement soon. */ }; +enum source_type {source_constant, source_input, + source_current_artist, source_current_album}; + +#define SOURCE_CURRENT_ARTIST "#artist#" +#define SOURCE_CURRENT_ALBUM "#album#" + struct tagcache_search_clause { int tag; int type; bool numeric; - bool input; + int source; long numeric_data; char *str; }; diff --git a/apps/tagnavi.config b/apps/tagnavi.config index 7377363..30fd371 100644 --- a/apps/tagnavi.config +++ b/apps/tagnavi.config @@ -139,6 +139,11 @@ "User Rating" -> title = "fmt_rating" ? rating > "" "Comment" -> album ? comment ~ "" -> title = "fmt_title" +# Define the "same as current" sub menu +%menu_start "same" "Same as current" +"Artist" -> album ? artist = "#artist#" -> title = "fmt_title" +"Album" -> title = "fmt_title" ? album = "#album#" + # Define the runtime sub menu %menu_start "runtime" "Play history" "Most played (Plays|Score)" -> title = "fmt_mostplayed" ? playcount > "0" @@ -166,6 +171,7 @@ "Recently Added" -> album ? entryage < "4" & commitid > "0" -> title = "fmt_title" "A to Z..." ==> "a2z" "History..." ==> "runtime" +"Same as current..." ==> "same" "Search..." ==> "search" "Custom view..." ==> "custom" diff --git a/apps/tagtree.c b/apps/tagtree.c index f9ae0be..fd52471 100644 --- a/apps/tagtree.c +++ b/apps/tagtree.c @@ -50,7 +50,8 @@ static int tagtree_play_folder(struct tree_context* c); -static char searchstring[128]; +#define SEARCHSTR_SIZE 128 +static char searchstring[SEARCHSTR_SIZE]; enum variables { var_sorttype = 100, @@ -293,9 +294,13 @@ static bool read_clause(struct tagcache_search_clause *clause) logf("got clause: %d/%d [%s]", clause->tag, clause->type, clause->str); if (*(clause->str) == '\0') - clause->input = true; + clause->source = source_input; + else if (!strcasecmp(clause->str, SOURCE_CURRENT_ALBUM)) + clause->source = source_current_album; + else if (!strcasecmp(clause->str, SOURCE_CURRENT_ARTIST)) + clause->source = source_current_artist; else - clause->input = false; + clause->source = source_constant; if (tagcache_is_numeric_tag(clause->tag)) { @@ -1345,8 +1350,10 @@ int tagtree_enter(struct tree_context* c) { int rc = 0; struct tagentry *dptr; + struct mp3entry *id3; int newextra; int seek; + int source; dptr = tagtree_get_entry(c, c->selected_item); @@ -1388,20 +1395,43 @@ int tagtree_enter(struct tree_context* c) { for (j = 0; j < csi->clause_count[i]; j++) { - if (!csi->clause[i][j]->input) + *searchstring='\0'; + source = csi->clause[i][j]->source; + + if (source == source_constant) continue; - rc = kbd_input(searchstring, sizeof(searchstring)); - if (rc == -1 || !searchstring[0]) + id3 = audio_current_track(); + + if ((source == source_current_artist) && + (id3) && (id3->artist)) { - tagtree_exit(c); - return 0; - } - + strncpy(searchstring, id3->artist, SEARCHSTR_SIZE); + searchstring[SEARCHSTR_SIZE-1] = '\0'; + } + + if ((source == source_current_album) && + (id3) && (id3->album)) + { + strncpy(searchstring, id3->album, SEARCHSTR_SIZE); + searchstring[SEARCHSTR_SIZE-1] = '\0'; + } + + if((source == source_input) || (*searchstring=='\0')) + { + rc = kbd_input(searchstring, SEARCHSTR_SIZE); + if (rc == -1 || !searchstring[0]) + { + tagtree_exit(c); + return 0; + } + } + if (csi->clause[i][j]->numeric) csi->clause[i][j]->numeric_data = atoi(searchstring); - else - csi->clause[i][j]->str = searchstring; + + /* existing bug: only one dynamic string per clause! */ + csi->clause[i][j]->str = searchstring; } } } |