summaryrefslogtreecommitdiff
path: root/src/ui_act.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui_act.c')
-rw-r--r--src/ui_act.c288
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;
+}