/* Print list of songs * @param pianobar settings * @param linked list of songs * @param artist/song filter string * @return # of songs */ size_t BarUiListSongs (const BarSettings_t *settings, const PianoSong_t *song, const char *filter) { size_t i = 0; char digits[4]; while (song != NULL) { if (filter == NULL || (filter != NULL && (BarStrCaseStr (song->artist, filter) != NULL || BarStrCaseStr (song->title, filter) != NULL))) { char outstr[512]; const char *vals[] = {digits, song->artist, song->title, (song->rating == PIANO_RATE_LOVE) ? settings->loveIcon : ((song->rating == PIANO_RATE_BAN) ? settings->banIcon : "")}; snprintf (digits, sizeof (digits) / sizeof (*digits), "%2zu", i); BarUiCustomFormat (outstr, sizeof (outstr), settings->listSongFormat, "iatr", vals); BarUiAppendNewline (outstr, sizeof (outstr)); BarUiMsg (settings, MSG_LIST, "%s", outstr); } i++; song = song->next; } return i; }
/* let user pick one artist * @param app handle * @param artists (linked list) * @return pointer to selected artist or NULL on abort */ PianoArtist_t *BarUiSelectArtist (BarApp_t *app, PianoArtist_t *startArtist) { PianoArtist_t *tmpArtist = NULL; char buf[100]; unsigned long i; memset (buf, 0, sizeof (buf)); do { /* print all artists */ i = 0; tmpArtist = startArtist; PianoListForeachP (tmpArtist) { if (BarStrCaseStr (tmpArtist->name, buf) != NULL) { BarUiMsg (&app->settings, MSG_LIST, "%2lu) %s\n", i, tmpArtist->name); } i++; } BarUiMsg (&app->settings, MSG_QUESTION, "Select artist: "); if (BarReadlineStr (buf, sizeof (buf), &app->input, BAR_RL_DEFAULT) == 0) { return NULL; } if (isnumeric (buf)) { i = strtoul (buf, NULL, 0); tmpArtist = PianoListGetP (startArtist, i); } } while (tmpArtist == NULL); return tmpArtist; }
/* 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, PianoStation_t *stations, const char *prompt, BarUiSelectStationCallback_t callback) { PianoStation_t **sortedStations = NULL, *retStation = NULL; size_t stationCount, i; char buf[100]; if (stations == NULL) { BarUiMsg (&app->settings, MSG_ERR, "No station available.\n"); return NULL; } memset (buf, 0, sizeof (buf)); /* sort and print stations */ sortedStations = BarSortedStations (stations, &stationCount, app->settings.sortOrder); 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' : ' ', currStation->isQuickMix ? 'Q' : ' ', !currStation->isCreator ? 'S' : ' ', currStation->name); } } BarUiMsg (&app->settings, MSG_QUESTION, prompt); if (BarReadlineStr (buf, sizeof (buf), &app->input, BAR_RL_DEFAULT) == 0) { free (sortedStations); return NULL; } if (isnumeric (buf)) { unsigned long selected = strtoul (buf, NULL, 0); if (selected < stationCount) { 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); return retStation; }
/* let user pick one station * @param app handle * @param stations that should be listed * @param prompt string * @param called if input was not a number * @param auto-select if only one station remains after filtering * @return pointer to selected station or NULL */ PianoStation_t *BarUiSelectStation (BarApp_t *app, PianoStation_t *stations, const char *prompt, BarUiSelectStationCallback_t callback, bool autoselect) { PianoStation_t **sortedStations = NULL, *retStation = NULL; size_t stationCount, i, lastDisplayed, displayCount; char buf[100]; if (stations == NULL) { BarUiMsg (&app->settings, MSG_ERR, "No station available.\n"); return NULL; } memset (buf, 0, sizeof (buf)); /* sort and print stations */ sortedStations = BarSortedStations (stations, &stationCount, app->settings.sortOrder); do { displayCount = 0; 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, "%2zi) %c%c%c %s\n", i, currStation->useQuickMix ? 'q' : ' ', currStation->isQuickMix ? 'Q' : ' ', !currStation->isCreator ? 'S' : ' ', currStation->name); ++displayCount; lastDisplayed = i; } } BarUiMsg (&app->settings, MSG_QUESTION, "%s", prompt); if (autoselect && displayCount == 1 && stationCount != 1) { /* auto-select last remaining station */ BarUiMsg (&app->settings, MSG_NONE, "%zi\n", lastDisplayed); retStation = sortedStations[lastDisplayed]; } else { if (BarReadlineStr (buf, sizeof (buf), app->rl, BAR_RL_DEFAULT) == 0) { break; } if (isnumeric (buf)) { unsigned long selected = strtoul (buf, NULL, 0); if (selected < stationCount) { 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); return retStation; }