]> git.neil.brown.name Git - edlib.git/commitdiff
menu: add menu-clear interface
authorNeilBrown <neil@brown.name>
Sun, 3 Sep 2023 11:46:48 +0000 (21:46 +1000)
committerNeilBrown <neil@brown.name>
Mon, 4 Sep 2023 23:07:53 +0000 (09:07 +1000)
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 <neil@brown.name>
doc-list.c
lib-menu.c

index 1aef17a47fc569e79a8d5efac945e5887df1661c..8fca2b6f73636adaeeb6c4ebae56f9dd36e0980f 100644 (file)
@@ -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);
 }
index 98a1adfc6478f3d4f0bd6d0379def24264e62d45..5b0f17ba3b85df06475a7ecf293d5a94e7b3e511 100644 (file)
@@ -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);