version 1.45, 2020/05/16 15:54:20 |
version 1.46, 2020/05/16 16:02:24 |
|
|
mode_tree_draw_cb drawcb; |
mode_tree_draw_cb drawcb; |
mode_tree_search_cb searchcb; |
mode_tree_search_cb searchcb; |
mode_tree_menu_cb menucb; |
mode_tree_menu_cb menucb; |
|
mode_tree_height_cb heightcb; |
|
|
struct mode_tree_list children; |
struct mode_tree_list children; |
struct mode_tree_list saved; |
struct mode_tree_list saved; |
|
|
|
|
int expanded; |
int expanded; |
int tagged; |
int tagged; |
|
int draw_as_parent; |
|
|
struct mode_tree_list children; |
struct mode_tree_list children; |
TAILQ_ENTRY(mode_tree_item) entry; |
TAILQ_ENTRY(mode_tree_item) entry; |
|
|
} |
} |
} |
} |
|
|
static void |
void |
mode_tree_up(struct mode_tree_data *mtd, int wrap) |
mode_tree_up(struct mode_tree_data *mtd, int wrap) |
{ |
{ |
if (mtd->current == 0) { |
if (mtd->current == 0) { |
|
|
return (mtd->line_list[mtd->current].item->itemdata); |
return (mtd->line_list[mtd->current].item->itemdata); |
} |
} |
|
|
|
const char * |
|
mode_tree_get_current_name(struct mode_tree_data *mtd) |
|
{ |
|
return (mtd->line_list[mtd->current].item->name); |
|
} |
|
|
void |
void |
mode_tree_expand_current(struct mode_tree_data *mtd) |
mode_tree_expand_current(struct mode_tree_data *mtd) |
{ |
{ |
|
|
} |
} |
} |
} |
|
|
|
void |
|
mode_tree_collapse_current(struct mode_tree_data *mtd) |
|
{ |
|
if (mtd->line_list[mtd->current].item->expanded) { |
|
mtd->line_list[mtd->current].item->expanded = 0; |
|
mode_tree_build(mtd); |
|
} |
|
} |
|
|
static int |
static int |
mode_tree_get_tag(struct mode_tree_data *mtd, uint64_t tag, u_int *found) |
mode_tree_get_tag(struct mode_tree_data *mtd, uint64_t tag, u_int *found) |
{ |
{ |
|
|
struct mode_tree_data * |
struct mode_tree_data * |
mode_tree_start(struct window_pane *wp, struct args *args, |
mode_tree_start(struct window_pane *wp, struct args *args, |
mode_tree_build_cb buildcb, mode_tree_draw_cb drawcb, |
mode_tree_build_cb buildcb, mode_tree_draw_cb drawcb, |
mode_tree_search_cb searchcb, mode_tree_menu_cb menucb, void *modedata, |
mode_tree_search_cb searchcb, mode_tree_menu_cb menucb, |
|
mode_tree_height_cb heightcb, void *modedata, |
const struct menu_item *menu, const char **sort_list, u_int sort_size, |
const struct menu_item *menu, const char **sort_list, u_int sort_size, |
struct screen **s) |
struct screen **s) |
{ |
{ |
|
|
mtd->drawcb = drawcb; |
mtd->drawcb = drawcb; |
mtd->searchcb = searchcb; |
mtd->searchcb = searchcb; |
mtd->menucb = menucb; |
mtd->menucb = menucb; |
|
mtd->heightcb = heightcb; |
|
|
TAILQ_INIT(&mtd->children); |
TAILQ_INIT(&mtd->children); |
|
|
|
|
mtd->zoomed = -1; |
mtd->zoomed = -1; |
} |
} |
|
|
|
static void |
|
mode_tree_set_height(struct mode_tree_data *mtd) |
|
{ |
|
struct screen *s = &mtd->screen; |
|
u_int height; |
|
|
|
if (mtd->heightcb != NULL) { |
|
height = mtd->heightcb(mtd, screen_size_y(s)); |
|
if (height < screen_size_y(s)) |
|
mtd->height = screen_size_y(s) - height; |
|
} else { |
|
mtd->height = (screen_size_y(s) / 3) * 2; |
|
if (mtd->height > mtd->line_size) |
|
mtd->height = screen_size_y(s) / 2; |
|
} |
|
if (mtd->height < 10) |
|
mtd->height = screen_size_y(s); |
|
if (screen_size_y(s) - mtd->height < 2) |
|
mtd->height = screen_size_y(s); |
|
} |
|
|
void |
void |
mode_tree_build(struct mode_tree_data *mtd) |
mode_tree_build(struct mode_tree_data *mtd) |
{ |
{ |
|
|
mode_tree_set_current(mtd, tag); |
mode_tree_set_current(mtd, tag); |
|
|
mtd->width = screen_size_x(s); |
mtd->width = screen_size_x(s); |
if (mtd->preview) { |
if (mtd->preview) |
mtd->height = (screen_size_y(s) / 3) * 2; |
mode_tree_set_height(mtd); |
if (mtd->height > mtd->line_size) |
else |
mtd->height = screen_size_y(s) / 2; |
|
if (mtd->height < 10) |
|
mtd->height = screen_size_y(s); |
|
if (screen_size_y(s) - mtd->height < 2) |
|
mtd->height = screen_size_y(s); |
|
} else |
|
mtd->height = screen_size_y(s); |
mtd->height = screen_size_y(s); |
mode_tree_check_selected(mtd); |
mode_tree_check_selected(mtd); |
} |
} |
|
|
struct mode_tree_item *mti, *saved; |
struct mode_tree_item *mti, *saved; |
|
|
log_debug("%s: %llu, %s %s", __func__, (unsigned long long)tag, |
log_debug("%s: %llu, %s %s", __func__, (unsigned long long)tag, |
name, text); |
name, (text == NULL ? "" : text)); |
|
|
mti = xcalloc(1, sizeof *mti); |
mti = xcalloc(1, sizeof *mti); |
mti->parent = parent; |
mti->parent = parent; |
|
|
|
|
mti->tag = tag; |
mti->tag = tag; |
mti->name = xstrdup(name); |
mti->name = xstrdup(name); |
mti->text = xstrdup(text); |
if (text != NULL) |
|
mti->text = xstrdup(text); |
|
|
saved = mode_tree_find_item(&mtd->saved, tag); |
saved = mode_tree_find_item(&mtd->saved, tag); |
if (saved != NULL) { |
if (saved != NULL) { |
|
|
} |
} |
|
|
void |
void |
|
mode_tree_draw_as_parent(struct mode_tree_item *mti) |
|
{ |
|
mti->draw_as_parent = 1; |
|
} |
|
|
|
void |
mode_tree_remove(struct mode_tree_data *mtd, struct mode_tree_item *mti) |
mode_tree_remove(struct mode_tree_data *mtd, struct mode_tree_item *mti) |
{ |
{ |
struct mode_tree_item *parent = mti->parent; |
struct mode_tree_item *parent = mti->parent; |
|
|
tag = "*"; |
tag = "*"; |
else |
else |
tag = ""; |
tag = ""; |
xasprintf(&text, "%-*s%s%s%s: ", keylen, key, start, mti->name, |
xasprintf(&text, "%-*s%s%s%s%s", keylen, key, start, mti->name, |
tag); |
tag, (mti->text != NULL) ? ": " : "" ); |
width = utf8_cstrwidth(text); |
width = utf8_cstrwidth(text); |
if (width > w) |
if (width > w) |
width = w; |
width = w; |
|
|
if (i != mtd->current) { |
if (i != mtd->current) { |
screen_write_clearendofline(&ctx, 8); |
screen_write_clearendofline(&ctx, 8); |
screen_write_nputs(&ctx, w, &gc0, "%s", text); |
screen_write_nputs(&ctx, w, &gc0, "%s", text); |
format_draw(&ctx, &gc0, w - width, mti->text, NULL); |
if (mti->text != NULL) { |
|
format_draw(&ctx, &gc0, w - width, mti->text, |
|
NULL); |
|
} |
} else { |
} else { |
screen_write_clearendofline(&ctx, gc.bg); |
screen_write_clearendofline(&ctx, gc.bg); |
screen_write_nputs(&ctx, w, &gc, "%s", text); |
screen_write_nputs(&ctx, w, &gc, "%s", text); |
format_draw(&ctx, &gc, w - width, mti->text, NULL); |
if (mti->text != NULL) { |
|
format_draw(&ctx, &gc, w - width, mti->text, |
|
NULL); |
|
} |
} |
} |
free(text); |
free(text); |
|
|
|
|
|
|
line = &mtd->line_list[mtd->current]; |
line = &mtd->line_list[mtd->current]; |
mti = line->item; |
mti = line->item; |
|
if (mti->draw_as_parent) |
|
mti = mti->parent; |
|
|
screen_write_cursormove(&ctx, 0, h, 0); |
screen_write_cursormove(&ctx, 0, h, 0); |
screen_write_box(&ctx, w, sy - h); |
screen_write_box(&ctx, w, sy - h); |
|
|
xasprintf(&text, " %s (sort: %s%s)", mti->name, |
if (mtd->sort_list != NULL) { |
mtd->sort_list[mtd->sort_crit.field], |
xasprintf(&text, " %s (sort: %s%s)", mti->name, |
mtd->sort_crit.reversed ? ", reversed" : ""); |
mtd->sort_list[mtd->sort_crit.field], |
|
mtd->sort_crit.reversed ? ", reversed" : ""); |
|
} else |
|
xasprintf(&text, " %s", mti->name); |
if (w - 2 >= strlen(text)) { |
if (w - 2 >= strlen(text)) { |
screen_write_cursormove(&ctx, 1, h, 0); |
screen_write_cursormove(&ctx, 1, h, 0); |
screen_write_puts(&ctx, &gc0, "%s", text); |
screen_write_puts(&ctx, &gc0, "%s", text); |
|
|
else |
else |
screen_write_puts(&ctx, &gc0, "active"); |
screen_write_puts(&ctx, &gc0, "active"); |
screen_write_puts(&ctx, &gc0, ") "); |
screen_write_puts(&ctx, &gc0, ") "); |
} |
} else |
|
screen_write_puts(&ctx, &gc0, " "); |
} |
} |
free(text); |
free(text); |
|
|
|
|
break; |
break; |
case 'O': |
case 'O': |
mtd->sort_crit.field++; |
mtd->sort_crit.field++; |
if (mtd->sort_crit.field == mtd->sort_size) |
if (mtd->sort_crit.field >= mtd->sort_size) |
mtd->sort_crit.field = 0; |
mtd->sort_crit.field = 0; |
mode_tree_build(mtd); |
mode_tree_build(mtd); |
break; |
break; |