commit 4043e0c796f3be54414ef903caaa95f6f08aa8e0
parent 3c6cb23a13a590c0a68b521ddb6ccde9a55287fc
Author: Louis Burda <quent.burda@gmail.com>
Date: Sat, 4 Feb 2023 16:06:53 +0100
Add popup for deletion of tags
Diffstat:
M | src/tui.c | | | 55 | ++++++++++++++++++++++++++++++++++++++++++++----------- |
1 file changed, 44 insertions(+), 11 deletions(-)
diff --git a/src/tui.c b/src/tui.c
@@ -1,4 +1,3 @@
-#include <stdbool.h>
#define NCURSES_WIDECHAR 1
#define _GNU_SOURCE
@@ -41,6 +40,7 @@ enum {
typedef char *(*completion_gen)(const char *text, int fwd, int state);
static void pane_title(struct pane *pane, bool highlight, const char *fmtstr, ...);
+static bool confirm_popup(const char *prompt);
static char *command_name_gen(const char *text, int fwd, int state);
static char *track_vis_name_gen(const char *text, int fwd, int state);
@@ -51,7 +51,7 @@ static bool rename_current_tag(void);
static bool toggle_current_tag(void);
static void select_only_current_tag(void);
static void seek_next_selected_tag(void);
-static void delete_selected_tag(void);
+static void delete_current_tag(void);
static bool tag_pane_input(wint_t c);
static void tag_pane_vis(struct pane *pane, int sel);
@@ -60,7 +60,7 @@ static bool play_selected_track(void);
static bool seek_track_tag(struct track *target);
static bool seek_track(struct track *target);
static bool rename_current_track(void);
-static bool delete_selected_track(void);
+static bool delete_current_track(void);
static bool track_pane_input(wint_t c);
static void track_pane_vis(struct pane *pane, int sel);
@@ -150,6 +150,36 @@ pane_title(struct pane *pane, bool highlight, const char *fmtstr, ...)
style_off(pane->win, STYLE_TITLE);
}
+bool
+confirm_popup(const char *prompt)
+{
+ WINDOW *win;
+ int maxx, maxy;
+ int sx, sy, w, h;
+ int tx, ty;
+ unsigned int c;
+
+ getmaxyx(stdscr, maxy, maxx);
+
+ w = 30;
+ h = 5;
+ sx = (maxx - w) / 2;
+ sy = (maxy - h) / 2;
+ win = newwin(h, w, sy, sx);
+
+ tx = (w - strlen(prompt)) / 2;
+ ty = h / 2;
+ wborder(win, 0, 0, 0, 0, 0, 0, 0, 0);
+ mvwprintw(win, ty, tx, "%s", prompt);
+ wrefresh(win);
+
+ while ((c = wgetch(win)) && c >= 128);
+
+ delwin(win);
+
+ return c == 'y';
+}
+
char *
command_name_gen(const char *text, int fwd, int reset)
{
@@ -325,6 +355,8 @@ toggle_current_tag(void)
list_push_back(&tags_sel, &tag->link_sel);
}
+ playlist_outdated = true;
+
return true;
}
@@ -332,7 +364,6 @@ void
select_only_current_tag(void)
{
list_clear(&tags_sel);
-
toggle_current_tag();
}
@@ -368,14 +399,19 @@ seek_next_selected_tag(void)
}
void
-delete_selected_tag(void)
+delete_current_tag(void)
{
struct link *link;
struct tag *tag;
+ if (!confirm_popup("Delete tag?"))
+ return;
+
link = list_at(&tags, tag_nav.sel);
if (!link) return;
tag = UPCAST(link, struct tag, link);
+ if (link_inuse(&tag->link_sel))
+ playlist_outdated = true;
tag_rm(tag, true);
}
@@ -391,11 +427,9 @@ tag_pane_input(wint_t c)
break;
case KEY_SPACE: /* toggle tag */
toggle_current_tag();
- playlist_outdated = true;
break;
case KEY_ENTER: /* select only current tag */
select_only_current_tag();
- playlist_outdated = true;
break;
case KEY_PPAGE: /* seek half a page up */
listnav_update_sel(&tag_nav, tag_nav.sel - tag_nav.wlen / 2);
@@ -416,8 +450,7 @@ tag_pane_input(wint_t c)
seek_next_selected_tag();
break;
case L'D': /* delete tag */
- delete_selected_tag();
- playlist_outdated = true;
+ delete_current_tag();
break;
default:
return false;
@@ -542,7 +575,7 @@ rename_current_track(void)
}
bool
-delete_selected_track(void)
+delete_current_track(void)
{
struct link *link;
struct track *track;
@@ -597,7 +630,7 @@ track_pane_input(wint_t c)
seek_track(player.track);
break;
case L'D': /* delete track */
- delete_selected_track();
+ delete_current_track();
break;
default:
return false;