ref: e4a9c43404e2b63158cb59cef0d153dc320da5b0
parent: ebbddfea84efee38eb49ebc8165bc20c13f5950e
author: Sigrid Haflínudóttir <ftrvxmtrx@gmail.com>
date: Tue Jun 2 15:08:31 EDT 2020
add -c option to specify columns to show
--- a/README.md
+++ b/README.md
@@ -32,6 +32,21 @@
% audio/mkplist /n/music | audio/zuke
```
+## Columns to display
+
+Zuke has an optional argument `-c` that specifies which columns to
+display, the default is `-c AatD`.
+
+```
+A artist
+a album
+t title
+D duration
+d date
+T track number
+p file path
+```
+
## Hot keys
```
--- a/zuke.c
+++ b/zuke.c
@@ -55,8 +55,9 @@
static Channel *ev;
static Mousectl *mctl;
static Keyboardctl *kctl;
-static int colwidth[3];
-static int mincolwidth[3];
+static int colwidth[7];
+static int mincolwidth[7];
+static char *cols = "AatD";
static int *shuffle;
static char *covers[] = {"folder", "cover", "Cover", "scans/CD", "Scans/Front", "Covers/Front"};
@@ -90,26 +91,58 @@
return fmtstrcpy(f, tmp);
}
+static char *
+getcol(Meta *m, int c)
+{
+ static char tmp[32];
+
+ switch(c){
+ case Palbum: return m->album;
+ case Partist: return m->artist[0];
+ case Pdate: return m->date;
+ case Pduration: snprint(tmp, sizeof(tmp), "%8P", m->duration/1000); return tmp;
+ case Ptitle: return m->title;
+ case Ptrack: snprint(tmp, sizeof(tmp), "%4s", m->track); return m->track ? tmp : nil;
+ case Ppath: return m->path;
+ default: sysfatal("invalid column '%c'", c);
+ }
+
+ return nil;
+}
+
static void
adjustcolumns(void)
{
- int i, x, total;
+ int i, n, x, total, width;
if(mincolwidth[0] == 0){
- mincolwidth[0] = mincolwidth[1] = mincolwidth[2] = 1;
- for(i = 0; i < plnum; i++){
- if((x = stringwidth(f, pl[i].artist[0])) > mincolwidth[0])
- mincolwidth[0] = x;
- if((x = stringwidth(f, pl[i].album)) > mincolwidth[1])
- mincolwidth[1] = x;
- if((x = stringwidth(f, pl[i].title)) > mincolwidth[2])
- mincolwidth[2] = x;
+ for(i = 0; cols[i] != 0; i++)
+ mincolwidth[i] = 1;
+ for(n = 0; n < plnum; n++){
+ for(i = 0; cols[i] != 0; i++){
+ if((x = stringwidth(f, getcol(&pl[n], cols[i]))) > mincolwidth[i])
+ mincolwidth[i] = x;
+ }
}
}
- total = mincolwidth[0] + mincolwidth[1] + mincolwidth[2];
- for(i = 0; i < nelem(mincolwidth); i++)
- colwidth[i] = (Dx(screen->r) - 8) * mincolwidth[i] / total;
+ total = 0;
+ n = 0;
+ width = Dx(screen->r);
+ for(i = 0; cols[i] != 0; i++){
+ if(cols[i] == Pduration || cols[i] == Pdate || cols[i] == Ptrack)
+ width -= mincolwidth[i] + 8;
+ else{
+ total += mincolwidth[i];
+ n++;
+ }
+ }
+ for(i = 0; cols[i] != 0; i++){
+ if(cols[i] == Pduration || cols[i] == Pdate || cols[i] == Ptrack)
+ colwidth[i] = mincolwidth[i];
+ else
+ colwidth[i] = (width - Scrollwidth - n*8) * mincolwidth[i] / total;
+ }
}
static Meta *
@@ -124,7 +157,7 @@
Image *col;
Point p, sp;
Rectangle sel, r;
- int i, left, scrollcenter;
+ int i, j, left, scrollcenter;
char tmp[32];
lockdisplay(display);
@@ -154,16 +187,16 @@
left += Scrollwidth + 4;
}
- p.x = sp.x = left + colwidth[0] + 4;
+ p.x = sp.x = left;
p.y = 0;
sp.y = screen->r.max.y;
- line(screen, p, sp, Endsquare, Endsquare, 0, colors[Dfmed].im, ZP);
+ for(i = 0; cols[i+1] != 0; i++){
+ p.x += colwidth[i] + 4;
+ sp.x = p.x;
+ line(screen, p, sp, Endsquare, Endsquare, 0, colors[Dfmed].im, ZP);
+ p.x += 4;
+ }
- p.x = sp.x = left + colwidth[0] + 8 + colwidth[1] + 4;
- p.y = 0;
- sp.y = screen->r.max.y;
- line(screen, p, sp, Endsquare, Endsquare, 0, colors[Dfmed].im, ZP);
-
sp.x = sp.y = 0;
p.x = left + 2;
p.y = screen->r.min.y + 2;
@@ -186,25 +219,16 @@
}
sel = screen->r;
- r = screen->r;
p.x = left + 2;
- sel.max.x = p.x + colwidth[0];
- replclipr(screen, 0, sel);
- string(screen, p, col, sp, f, getmeta(i)->artist[0]);
- p.x += colwidth[0] + 8;
- sel.min.x = p.x;
- sel.max.x = p.x + colwidth[1];
- replclipr(screen, 0, sel);
- string(screen, p, col, sp, f, getmeta(i)->album);
- p.x += colwidth[1] + 8;
- sel.min.x = p.x;
- sel.max.x = p.x + colwidth[2];
- replclipr(screen, 0, sel);
- string(screen, p, col, sp, f, getmeta(i)->title);
+ for(j = 0; cols[j] != 0; j++){
+ sel.max.x = p.x + colwidth[j];
+ replclipr(screen, 0, sel);
+ string(screen, p, col, sp, f, getcol(getmeta(i), cols[j]));
+ p.x += colwidth[j] + 8;
+ }
+ replclipr(screen, 0, screen->r);
- replclipr(screen, 0, r);
-
if(pcurplaying == i){
Point rightp, leftp;
leftp.y = rightp.y = p.y - 1;
@@ -797,6 +821,13 @@
}
}
+static void
+usage(void)
+{
+ fprint(2, "usage: %s [-c aAdDtTp]\n", argv0);
+ sysfatal("usage");
+}
+
void
threadmain(int argc, char **argv)
{
@@ -812,7 +843,16 @@
};
int fd, n, scrolling, oldpcur, oldbuttons, pnew;
- USED(argc); USED(argv);
+ ARGBEGIN{
+ case 'c':
+ cols = EARGF(usage());
+ if(strlen(cols) >= nelem(colwidth))
+ sysfatal("max %d columns allowed", nelem(colwidth));
+ break;
+ default:
+ usage();
+ break;
+ }ARGEND;
audio = open("/dev/audio", OWRITE);
if(audio < 0)