From: NeilBrown Date: Sun, 3 Sep 2023 11:46:48 +0000 (+1000) Subject: menu: add menu-clear interface X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=e5f2a11675ca8b5aef89ec29b91242e9537f132e;p=edlib.git menu: add menu-clear interface This allows a menu to be cleared prior to recreating it. I think this is easier that allowing fine-grained editing. Signed-off-by: NeilBrown --- diff --git a/doc-list.c b/doc-list.c index 1aef17a4..8fca2b6f 100644 --- a/doc-list.c +++ b/doc-list.c @@ -143,6 +143,33 @@ DEF_CMD(list_add_elmnt) m->ref.p = e; return 1; } + +DEF_CMD(list_del_elmnt) +{ + struct list *l = ci->home->doc_data; + struct mark *m = ci->mark; + struct mark *m2; + struct elmnt *e; + + if (!m) + return Enoarg; + if (!m->ref.p) + return Efalse; + e = m->ref.p; + while ((m2 = mark_next(m)) && m2->ref.p == e) + m = m2; + if (e == list_last_entry(&l->content, struct elmnt, list)) + m->ref.p = NULL; + else + m->ref.p = list_next_entry(e, list); + while ((m2 = mark_prev(m)) && m2->ref.p == e) { + m2->ref.p = m->ref.p; + m = m2; + } + list_del(&e->list); + unalloc(e, pane); + return 1; +} static char *key(struct list_head *le, const void *data) { @@ -213,6 +240,7 @@ static void list_init_map(void) key_add(list_map, "doc:get-attr", &list_get_attr); key_add(list_map, "doc:shares-ref", &list_shares_ref); key_add(list_map, "doc:list-add", &list_add_elmnt); + key_add(list_map, "doc:list-del", &list_del_elmnt); key_add(list_map, "doc:list-sort", &list_sort); key_add(list_map, "Close", &list_close); } diff --git a/lib-menu.c b/lib-menu.c index 98a1adfc..5b0f17ba 100644 --- a/lib-menu.c +++ b/lib-menu.c @@ -42,6 +42,16 @@ DEF_CMD(menu_add) return 1; } +DEF_CMD(menu_clear) +{ + struct mark *m = vmark_new(ci->focus, MARK_UNGROUPED, NULL); + + call("doc:set-ref", ci->home, 1, m); + while (call("doc:list-del", ci->home, 0, m) > 0) + ; + return 1; +} + DEF_CMD(menu_attr) { if (ci->str && strcmp(ci->str, "BG") == 0) { @@ -158,6 +168,7 @@ static void menu_init_map(void) key_add(menu_map, "render:reposition", &menu_reposition); key_add(menu_map, "menu-add", &menu_add); + key_add(menu_map, "menu-clear", &menu_clear); key_add(menu_map, "Cancel", &menu_abort); key_add(menu_map, "K:Enter", &menu_done); key_add(menu_map, "menu-select", &menu_done);