static void edit_ap_rule(struct nh_autopick_option *desc, struct nh_autopickup_rules *ar, int ruleno) { struct nh_autopickup_rule *r = &ar->rules[ruleno]; struct nh_autopickup_rule tmprule; struct nh_menuitem *items; int i, icount, size = 7, n, selected[1], newpos; char query[BUFSZ], buf[BUFSZ], *classname; items = malloc(sizeof(struct nh_menuitem) * size); do { icount = 0; sprintf(buf, "rule position:\t[%d]", ruleno + 1); add_menu_item(items, size, icount, 1, buf, 0, 0); sprintf(buf, "name pattern:\t[%s]", r->pattern); add_menu_item(items, size, icount, 2, buf, 0, 0); classname = NULL; for (i = 0; i < desc->numclasses && !classname; i++) if (desc->classes[i].id == r->oclass) classname = desc->classes[i].caption; sprintf(buf, "object type:\t[%s]", classname); add_menu_item(items, size, icount, 3, buf, 0, 0); sprintf(buf, "beatitude:\t[%s]", bucnames[r->buc]); add_menu_item(items, size, icount, 4, buf, 0, 0); sprintf(buf, "action:\t[%s]", r->action == AP_GRAB ? "GRAB" : "LEAVE"); add_menu_item(items, size, icount, 5, buf, 0, 0); add_menu_txt(items, size, icount, "", MI_TEXT); add_menu_item(items, size, icount, 6, "delete this rule", 'x', 0); n = curses_display_menu(items, icount, "Edit rule:", PICK_ONE, selected); if (n <= 0) break; switch (selected[0]) { /* move this rule */ case 1: sprintf(query, "New rule position: (1 - %d), currently: %d", ar->num_rules, ruleno + 1); buf[0] = '\0'; curses_getline(query, buf); if (!*buf || *buf == '\033') break; newpos = atoi(buf); if (newpos <= 0 || newpos > ar->num_rules) { curses_msgwin("Invalid rule position."); break; } newpos--; if (newpos == ruleno) break; tmprule = ar->rules[ruleno]; /* shift the rules around */ if (newpos > ruleno) { for (i = ruleno; i < newpos; i++) ar->rules[i] = ar->rules[i+1]; } else { for (i = ruleno; i > newpos; i--) ar->rules[i] = ar->rules[i-1]; } ar->rules[newpos] = tmprule; goto out; /* edit the pattern */ case 2: sprintf(query, "New name pattern (empty matches everything):"); buf[0] = '\0'; curses_getline(query, buf); if (*buf != '\033') strncpy(r->pattern, buf, sizeof(r->pattern)); r->pattern[sizeof(r->pattern)-1] = '\0'; break; /* edit object class match */ case 3: r->oclass = get_autopickup_oclass(desc, r->oclass); break; /* edit beatitude match */ case 4: r->buc = get_autopickup_buc(r->buc); break; /* toggle action */ case 5: if (r->action == AP_GRAB) r->action = AP_LEAVE; else r->action = AP_GRAB; break; /* delete */ case 6: for (i = ruleno; i < ar->num_rules - 1; i++) ar->rules[i] = ar->rules[i+1]; ar->num_rules--; ar->rules = realloc(ar->rules, ar->num_rules * sizeof(struct nh_autopickup_rule)); goto out; /* break just beaks the switch .. doh */ } } while (n > 0); out: free(items); }
static void edit_ap_rule(struct nh_autopick_option *desc, struct nh_autopickup_rules *ar, int ruleno) { struct nh_autopickup_rule *r = &ar->rules[ruleno]; struct nh_autopickup_rule tmprule; struct nh_menulist menu; int i, selected[1], newpos, allocsize; char query[BUFSZ], buf[BUFSZ]; const char *classname; do { init_menulist(&menu); snprintf(buf, ARRAY_SIZE(buf), "rule position:\t[%d]", ruleno + 1); add_menu_item(&menu, 1, buf, 0, 0); snprintf(buf, ARRAY_SIZE(buf), "name pattern:\t[%s]", r->pattern); add_menu_item(&menu, 2, buf, 0, 0); classname = NULL; for (i = 0; i < desc->numclasses && !classname; i++) if (desc->classes[i].id == r->oclass) classname = desc->classes[i].caption; snprintf(buf, ARRAY_SIZE(buf), "object type:\t[%s]", classname); add_menu_item(&menu, 3, buf, 0, 0); snprintf(buf, ARRAY_SIZE(buf), "beatitude:\t[%s]", bucnames[r->buc]); add_menu_item(&menu, 4, buf, 0, 0); snprintf(buf, ARRAY_SIZE(buf), "action:\t[%s]", r->action == AP_GRAB ? "GRAB" : "LEAVE"); add_menu_item(&menu, 5, buf, 0, 0); add_menu_txt(&menu, "", MI_TEXT); add_menu_item(&menu, 6, "delete this rule", 'x', 0); curses_display_menu(&menu, "Edit rule:", PICK_ONE, PLHINT_RIGHT, selected, curses_menu_callback); if (*selected == CURSES_MENU_CANCELLED) return; switch (selected[0]) { /* move this rule */ case 1: snprintf(query, ARRAY_SIZE(query), "New rule position: (1 - %d), currently: %d", ar->num_rules, ruleno + 1); newpos = ar->num_rules; curses_getline(query, &newpos, rule_position_callback); newpos--; if (newpos == ruleno || newpos < 0) break; tmprule = ar->rules[ruleno]; /* shift the rules around */ if (newpos > ruleno) { for (i = ruleno; i < newpos; i++) ar->rules[i] = ar->rules[i + 1]; } else { for (i = ruleno; i > newpos; i--) ar->rules[i] = ar->rules[i - 1]; } ar->rules[newpos] = tmprule; return; /* edit the pattern */ case 2: snprintf(query, ARRAY_SIZE(query), "New name pattern (empty matches everything):"); curses_getline(query, r->pattern, rule_pattern_callback); break; /* edit object class match */ case 3: r->oclass = get_autopickup_oclass(desc, r->oclass); break; /* edit beatitude match */ case 4: r->buc = get_autopickup_buc(r->buc); break; /* toggle action */ case 5: if (r->action == AP_GRAB) r->action = AP_LEAVE; else r->action = AP_GRAB; break; /* delete */ case 6: for (i = ruleno; i < ar->num_rules - 1; i++) ar->rules[i] = ar->rules[i + 1]; ar->num_rules--; allocsize = ar->num_rules; if (allocsize < 1) allocsize = 1; ar->rules = realloc(ar->rules, allocsize * sizeof (struct nh_autopickup_rule)); return; } } while (1); }