diff options
-rw-r--r-- | contrib/pianobar.1 | 3 | ||||
-rw-r--r-- | src/main.c | 2 | ||||
-rw-r--r-- | src/ui.c | 10 | ||||
-rw-r--r-- | src/ui.h | 4 | ||||
-rw-r--r-- | src/ui_act.c | 44 |
5 files changed, 56 insertions, 7 deletions
diff --git a/contrib/pianobar.1 b/contrib/pianobar.1 index d036c1e..55300f8 100644 --- a/contrib/pianobar.1 +++ b/contrib/pianobar.1 @@ -133,7 +133,8 @@ Show next songs in playlist. .TP .B act_stationselectquickmix = x -Select quickmix stations. +Select quickmix stations. You can toggle the selection with 't', select all +with 'a' or select none with 'n'. .TP .B act_voldown = ( @@ -136,7 +136,7 @@ static void BarMainGetInitialStation (BarApp_t *app) { } /* no autostart? ask the user */ if (app->curStation == NULL) { - app->curStation = BarUiSelectStation (app, "Select station: "); + app->curStation = BarUiSelectStation (app, "Select station: ", NULL); } if (app->curStation != NULL) { BarUiPrintStation (&app->settings, app->curStation); @@ -330,9 +330,11 @@ static PianoStation_t **BarSortedStations (PianoStation_t *unsortedStations, /* let user pick one station * @param app handle * @param prompt string + * @param called if input was not a number * @return pointer to selected station or NULL */ -PianoStation_t *BarUiSelectStation (BarApp_t *app, const char *prompt) { +PianoStation_t *BarUiSelectStation (BarApp_t *app, const char *prompt, + BarUiSelectStationCallback_t callback) { PianoStation_t **sortedStations = NULL, *retStation = NULL; size_t stationCount, i; char buf[100]; @@ -351,6 +353,7 @@ PianoStation_t *BarUiSelectStation (BarApp_t *app, const char *prompt) { do { for (i = 0; i < stationCount; i++) { const PianoStation_t *currStation = sortedStations[i]; + /* filter stations */ if (BarStrCaseStr (currStation->name, buf) != NULL) { BarUiMsg (&app->settings, MSG_LIST, "%2i) %c%c%c %s\n", i, currStation->useQuickMix ? 'q' : ' ', @@ -373,6 +376,11 @@ PianoStation_t *BarUiSelectStation (BarApp_t *app, const char *prompt) { retStation = sortedStations[selected]; } } + + /* hand over buffer to external function if it was not a station number */ + if (retStation == NULL && callback != NULL) { + callback (app, buf); + } } while (retStation == NULL); free (sortedStations); @@ -33,8 +33,10 @@ THE SOFTWARE. #include "ui_readline.h" #include "ui_types.h" +typedef void (*BarUiSelectStationCallback_t) (BarApp_t *app, char *buf); + void BarUiMsg (const BarSettings_t *, const BarUiMsg_t, const char *, ...); -PianoStation_t *BarUiSelectStation (BarApp_t *, const char *); +PianoStation_t *BarUiSelectStation (BarApp_t *, const char *, BarUiSelectStationCallback_t); PianoSong_t *BarUiSelectSong (const BarSettings_t *, PianoSong_t *, BarReadlineFds_t *); PianoArtist_t *BarUiSelectArtist (BarApp_t *, PianoArtist_t *); diff --git a/src/ui_act.c b/src/ui_act.c index 22ca2da..08cd6e2 100644 --- a/src/ui_act.c +++ b/src/ui_act.c @@ -317,7 +317,7 @@ BarUiActCallback(BarUiActMoveSong) { reqData.step = 0; - reqData.to = BarUiSelectStation (app, "Move song to station: "); + reqData.to = BarUiSelectStation (app, "Move song to station: ", NULL); if (reqData.to != NULL) { /* find original station (just is case we're playing a quickmix * station) */ @@ -379,7 +379,8 @@ BarUiActCallback(BarUiActRenameStation) { /* play another station */ BarUiActCallback(BarUiActSelectStation) { - PianoStation_t *newStation = BarUiSelectStation (app, "Select station: "); + PianoStation_t *newStation = BarUiSelectStation (app, "Select station: ", + NULL); if (newStation != NULL) { app->curStation = newStation; BarUiPrintStation (&app->settings, app->curStation); @@ -421,6 +422,42 @@ BarUiActCallback(BarUiActPrintUpcoming) { } } +/* selectStation callback used by BarUiActSelectQuickMix; toggle, select + * all/none + */ +static void BarUiActQuickmixCallback (BarApp_t *app, char *buf) { + PianoStation_t *curStation = app->ph.stations; + + switch (*buf) { + case 't': + /* toggle */ + while (curStation != NULL) { + curStation->useQuickMix = !curStation->useQuickMix; + curStation = curStation->next; + } + *buf = '\0'; + break; + + case 'a': + /* enable all */ + while (curStation != NULL) { + curStation->useQuickMix = true; + curStation = curStation->next; + } + *buf = '\0'; + break; + + case 'n': + /* enable none */ + while (curStation != NULL) { + curStation->useQuickMix = false; + curStation = curStation->next; + } + *buf = '\0'; + break; + } +} + /* if current station is a quickmix: select stations that are played in * quickmix */ @@ -433,7 +470,8 @@ BarUiActCallback(BarUiActSelectQuickMix) { if (selStation->isQuickMix) { PianoStation_t *toggleStation; while ((toggleStation = BarUiSelectStation (app, - "Toggle quickmix for station: ")) != NULL) { + "Toggle quickmix for station: ", + BarUiActQuickmixCallback)) != NULL) { toggleStation->useQuickMix = !toggleStation->useQuickMix; } BarUiMsg (&app->settings, MSG_INFO, "Setting quickmix stations... "); |