diff options
Diffstat (limited to 'src/ui_act.c')
-rw-r--r-- | src/ui_act.c | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/src/ui_act.c b/src/ui_act.c new file mode 100644 index 0000000..57ac9af --- /dev/null +++ b/src/ui_act.c @@ -0,0 +1,288 @@ +/* +Copyright (c) 2008 Lars-Dominik Braun + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +/* functions responding to user's keystrokes */ + +#include <string.h> +/* needed by readline */ +#include <stdio.h> +#include <readline/readline.h> + +#include "ui.h" +#include "ui_act.h" + +void BarUiActHelp (BAR_KS_ARGS) { + BarKeyShortcut_t *curShortcut = settings->keys; + + printf ("\r"); + while (curShortcut != NULL) { + if (curShortcut->description != NULL) { + printf ("%c\t%s\n", curShortcut->key, curShortcut->description); + } + curShortcut = curShortcut->next; + } +} + +void BarUiActAddMusic (BAR_KS_ARGS) { + char *musicId; + if (*curStation == NULL) { + BarUiMsg ("No station selected.\n"); + return; + } + musicId = BarUiSelectMusicId (ph); + if (musicId == NULL) { + if (!BarTransformIfShared (ph, *curStation)) { + return; + } + BarUiMsg ("Adding music to station... "); + BarUiPrintPianoStatus (PianoStationAddMusic (ph, + *curStation, musicId)); + free (musicId); + } +} + +void BarUiActBanSong (BAR_KS_ARGS) { + if (*curStation == NULL || *curSong == NULL) { + BarUiMsg ("No song playing.\n"); + return; + } + if (!BarTransformIfShared (ph, *curStation)) { + return; + } + BarUiMsg ("Banning song... "); + if (BarUiPrintPianoStatus (PianoRateTrack (ph, *curSong, + PIANO_RATE_BAN)) == PIANO_RET_OK) { + player->doQuit = 1; + } +} + +void BarUiActCreateStation (BAR_KS_ARGS) { + char *musicId; + musicId = BarUiSelectMusicId (ph); + if (musicId != NULL) { + BarUiMsg ("Creating station... "); + BarUiPrintPianoStatus (PianoCreateStation (ph, "mi", musicId)); + free (musicId); + } +} + +void BarUiActDeleteStation (BAR_KS_ARGS) { + char yesNoBuf; + + if (*curStation == NULL) { + BarUiMsg ("No station selected.\n"); + return; + } + printf ("Really delete \"%s\"? [yn]\n", (*curStation)->name); + read (fileno (stdin), &yesNoBuf, sizeof (yesNoBuf)); + if (yesNoBuf == 'y') { + BarUiMsg ("Deleting station... "); + if (BarUiPrintPianoStatus (PianoDeleteStation (ph, + *curStation)) == PIANO_RET_OK) { + player->doQuit = 1; + PianoDestroyPlaylist (ph); + *curSong = NULL; + *curStation = NULL; + } + } +} + +void BarUiActExplain (BAR_KS_ARGS) { + char *explanation; + + if (*curSong == NULL) { + BarUiMsg ("No song playing.\n"); + return; + } + BarUiMsg ("Receiving explanation... "); + if (BarUiPrintPianoStatus (PianoExplain (ph, *curSong, + &explanation)) == PIANO_RET_OK) { + printf ("%s\n", explanation); + free (explanation); + } +} + +void BarUiActStationFromGenre (BAR_KS_ARGS) { + /* use genre station */ + BarStationFromGenre (ph); +} + +void BarUiActSongInfo (BAR_KS_ARGS) { + if (*curStation == NULL || *curSong == NULL) { + BarUiMsg ("No song playing.\n"); + return; + } + /* print debug-alike infos */ + printf ("Song infos:\n" + "album:\t%s\n" + "artist:\t%s\n" + "audioUrl:\t%s\n" + "fileGain:\t%f\n" + "focusTraitId:\t%s\n" + "identity:\t%s\n" + "matchingSeed:\t%s\n" + "musicId:\t%s\n" + "rating:\t%i\n" + "stationId:\t%s\n" + "title:\t%s\n" + "userSeed:\t%s\n", + (*curSong)->album, (*curSong)->artist, (*curSong)->audioUrl, + (*curSong)->fileGain, (*curSong)->focusTraitId, + (*curSong)->identity, (*curSong)->matchingSeed, + (*curSong)->musicId, (*curSong)->rating, + (*curSong)->stationId, (*curSong)->title, + (*curSong)->userSeed); +} + +void BarUiActLoveSong (BAR_KS_ARGS) { + if (*curStation == NULL || *curSong == NULL) { + BarUiMsg ("No song playing.\n"); + return; + } + if ((*curSong)->rating == PIANO_RATE_LOVE) { + BarUiMsg ("Already loved. No need to do this twice.\n"); + return; + } + if (!BarTransformIfShared (ph, *curStation)) { + return; + } + BarUiMsg ("Loving song... "); + BarUiPrintPianoStatus (PianoRateTrack (ph, *curSong, PIANO_RATE_LOVE)); +} + +void BarUiActSkipSong (BAR_KS_ARGS) { + player->doQuit = 1; +} + +void BarUiActMoveSong (BAR_KS_ARGS) { + PianoStation_t *moveStation; + + if (*curStation == NULL || *curSong == NULL) { + BarUiMsg ("No song playing.\n"); + return; + } + moveStation = BarUiSelectStation (ph, "Move song to station: "); + if (moveStation != NULL) { + if (!BarTransformIfShared (ph, *curStation) || + !BarTransformIfShared (ph, moveStation)) { + return; + } + printf ("Moving song to \"%s\"... ", moveStation->name); + fflush (stdout); + if (BarUiPrintPianoStatus (PianoMoveSong (ph, *curStation, + moveStation, *curSong)) == PIANO_RET_OK) { + player->doQuit = 1; + } + } +} + +void BarUiActPause (BAR_KS_ARGS) { + player->doPause = !player->doPause; +} + +void BarUiActRenameStation (BAR_KS_ARGS) { + char *lineBuf; + + if (*curStation == NULL) { + BarUiMsg ("No station selected.\n"); + return; + } + lineBuf = readline ("New name?\n"); + if (lineBuf != NULL && strlen (lineBuf) > 0) { + if (!BarTransformIfShared (ph, *curStation)) { + return; + } + BarUiMsg ("Renaming station... "); + BarUiPrintPianoStatus (PianoRenameStation (ph, *curStation, lineBuf)); + } + if (lineBuf != NULL) { + free (lineBuf); + } +} + +void BarUiActSelectStation (BAR_KS_ARGS) { + player->doQuit = 1; + PianoDestroyPlaylist (ph); + *curSong = NULL; + *curStation = BarUiSelectStation (ph, "Select station: "); + if (*curStation != NULL) { + printf ("Changed station to %s\n", (*curStation)->name); + } +} + +void BarUiActTempBanSong (BAR_KS_ARGS) { + if (*curStation == NULL || *curSong == NULL) { + BarUiMsg ("No song playing.\n"); + return; + } + if (!BarTransformIfShared (ph, *curStation)) { + return; + } + BarUiMsg ("Putting song on shelf... "); + if (BarUiPrintPianoStatus (PianoSongTired (ph, *curSong)) == + PIANO_RET_OK) { + player->doQuit = 1; + } +} + +void BarUiActPrintUpcoming (BAR_KS_ARGS) { + if (*curStation == NULL || *curSong == NULL) { + BarUiMsg ("No song playing.\n"); + return; + } + PianoSong_t *nextSong = (*curSong)->next; + if (nextSong != NULL) { + int i = 0; + BarUiMsg ("Next songs:\n"); + while (nextSong != NULL) { + printf ("%2i) \"%s\" by \"%s\"\n", i, nextSong->title, + nextSong->artist); + nextSong = nextSong->next; + i++; + } + } else { + BarUiMsg ("No songs in queue.\n"); + } +} + +void BarUiActSelectQuickMix (BAR_KS_ARGS) { + if (*curStation == NULL) { + BarUiMsg ("No station selected.\n"); + return; + } + if ((*curStation)->isQuickMix) { + PianoStation_t *selStation; + while ((selStation = BarUiSelectStation (ph, + "Toggle quickmix for station: ")) != NULL) { + selStation->useQuickMix = !selStation->useQuickMix; + } + BarUiMsg ("Setting quickmix stations... "); + BarUiPrintPianoStatus (PianoSetQuickmix (ph)); + } else { + BarUiMsg ("Not a QuickMix station.\n"); + } +} + +void BarUiActQuit (BAR_KS_ARGS) { + *doQuit = 1; + player->doQuit = 1; +} |