summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2007-10-29 12:02:55 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2007-10-29 12:02:55 +0000
commit4d18aa35462c1a1c01aa0c382cf60e3d01a392f6 (patch)
tree8d40d44f152d2337d64f354fa37cd4df22113207 /apps
parentbae8f4c3167a0b44ff6516d421e95baaf8937066 (diff)
downloadrockbox-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.h8
-rw-r--r--apps/tagnavi.config6
-rw-r--r--apps/tagtree.c54
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;
}
}
}