summaryrefslogtreecommitdiff
path: root/src/ui.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui.c')
-rw-r--r--src/ui.c41
1 files changed, 26 insertions, 15 deletions
diff --git a/src/ui.c b/src/ui.c
index acba151..104ee04 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -330,14 +330,17 @@ static PianoStation_t **BarSortedStations (PianoStation_t *unsortedStations,
/* 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) {
+ const char *prompt, BarUiSelectStationCallback_t callback,
+ bool autoselect) {
PianoStation_t **sortedStations = NULL, *retStation = NULL;
- size_t stationCount, i;
+ size_t stationCount, i, lastDisplayed, displayCount;
char buf[100];
if (stations == NULL) {
@@ -352,6 +355,7 @@ PianoStation_t *BarUiSelectStation (BarApp_t *app, PianoStation_t *stations,
app->settings.sortOrder);
do {
+ displayCount = 0;
for (i = 0; i < stationCount; i++) {
const PianoStation_t *currStation = sortedStations[i];
/* filter stations */
@@ -361,26 +365,33 @@ PianoStation_t *BarUiSelectStation (BarApp_t *app, PianoStation_t *stations,
currStation->isQuickMix ? 'Q' : ' ',
!currStation->isCreator ? 'S' : ' ',
currStation->name);
+ ++displayCount;
+ lastDisplayed = i;
}
}
BarUiMsg (&app->settings, MSG_QUESTION, prompt);
- if (BarReadlineStr (buf, sizeof (buf), &app->input,
- BAR_RL_DEFAULT) == 0) {
- free (sortedStations);
- return NULL;
- }
+ if (autoselect && displayCount == 1 && stationCount != 1) {
+ /* auto-select last remaining station */
+ BarUiMsg (&app->settings, MSG_NONE, "%i\n", lastDisplayed);
+ retStation = sortedStations[lastDisplayed];
+ } else {
+ if (BarReadlineStr (buf, sizeof (buf), &app->input,
+ BAR_RL_DEFAULT) == 0) {
+ break;
+ }
- if (isnumeric (buf)) {
- unsigned long selected = strtoul (buf, NULL, 0);
- if (selected < stationCount) {
- retStation = sortedStations[selected];
+ 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);
+ /* hand over buffer to external function if it was not a station number */
+ if (retStation == NULL && callback != NULL) {
+ callback (app, buf);
+ }
}
} while (retStation == NULL);