From f97f73d03f1ea7b6db6a3ef7d3756680f566f191 Mon Sep 17 00:00:00 2001
From: Lars-Dominik Braun <lars@6xq.net>
Date: Mon, 29 Aug 2011 13:02:01 +0200
Subject: Customizeable list format (songs)

Fixes #151
---
 src/settings.c |  5 +++++
 src/settings.h |  1 +
 src/ui.c       | 31 ++++++++++++++++++++++++++-----
 3 files changed, 32 insertions(+), 5 deletions(-)

(limited to 'src')

diff --git a/src/settings.c b/src/settings.c
index 49d75e6..9867b47 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -91,6 +91,7 @@ void BarSettingsDestroy (BarSettings_t *settings) {
 	free (settings->atIcon);
 	free (settings->npSongFormat);
 	free (settings->npStationFormat);
+	free (settings->listSongFormat);
 	free (settings->fifo);
 	for (size_t i = 0; i < MSG_COUNT; i++) {
 		free (settings->msgFormat[i].prefix);
@@ -127,6 +128,7 @@ void BarSettingsRead (BarSettings_t *settings) {
 	settings->atIcon = strdup (" @ ");
 	settings->npSongFormat = strdup ("\"%t\" by \"%a\" on \"%l\"%r%@%s");
 	settings->npStationFormat = strdup ("Station \"%n\" (%i)");
+	settings->listSongFormat = strdup ("%i) %a - %t%r");
 	settings->fifo = malloc (PATH_MAX * sizeof (*settings->fifo));
 	BarGetXdgConfigDir (PACKAGE "/ctl", settings->fifo, PATH_MAX);
 
@@ -231,6 +233,9 @@ void BarSettingsRead (BarSettings_t *settings) {
 		} else if (streq ("format_nowplaying_station", key)) {
 			free (settings->npStationFormat);
 			settings->npStationFormat = strdup (val);
+		} else if (streq ("format_list_song", key)) {
+			free (settings->listSongFormat);
+			settings->listSongFormat = strdup (val);
 		} else if (streq ("fifo", key)) {
 			free (settings->fifo);
 			settings->fifo = strdup (val);
diff --git a/src/settings.h b/src/settings.h
index ca5db60..6162395 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -94,6 +94,7 @@ typedef struct {
 	char *atIcon;
 	char *npSongFormat;
 	char *npStationFormat;
+	char *listSongFormat;
 	char *fifo;
 	BarMsgFormatStr_t msgFormat[MSG_COUNT];
 } BarSettings_t;
diff --git a/src/ui.c b/src/ui.c
index 68f0cd9..84117bb 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -723,6 +723,20 @@ inline void BarUiPrintSong (const BarSettings_t *settings,
 	BarUiMsg (settings, MSG_PLAYING, outstr);
 }
 
+/*	Incremets two digit ASCII counter
+ */
+static void BarUiIncDigits (char digits[3]) {
+	++digits[1];
+	if (digits[1] == ':') {
+		digits[1] = '0';
+		digits[0] |= 0x30;
+		++digits[0];
+		if (digits[0] == ':') {
+			digits[0] = ' ';
+		}
+	}
+}
+
 /*	Print list of songs
  *	@param pianobar settings
  *	@param linked list of songs
@@ -732,18 +746,25 @@ inline void BarUiPrintSong (const BarSettings_t *settings,
 size_t BarUiListSongs (const BarSettings_t *settings,
 		const PianoSong_t *song, const char *filter) {
 	size_t i = 0;
+	char digits[3] = " 0";
 
 	while (song != NULL) {
 		if (filter == NULL ||
 				(filter != NULL && (BarStrCaseStr (song->artist, filter) != NULL ||
 				BarStrCaseStr (song->title, filter) != NULL))) {
-			BarUiMsg (settings, MSG_LIST, "%2lu) %s - %s %s%s\n", i, song->artist,
-					song->title,
-					(song->rating == PIANO_RATE_LOVE) ? settings->loveIcon : "",
-					(song->rating == PIANO_RATE_BAN) ? settings->banIcon : "");
+			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 : "")};
+
+			BarUiCustomFormat (outstr, sizeof (outstr), settings->listSongFormat,
+					"iatr", vals);
+			BarUiAppendNewline (outstr, sizeof (outstr));
+			BarUiMsg (settings, MSG_LIST, outstr);
 		}
-		song = song->next;
 		i++;
+		BarUiIncDigits (digits);
+		song = song->next;
 	}
 
 	return i;
-- 
cgit v1.2.3