Skip to content

Commit

Permalink
Add MGED_OBJ functab entry for menu strings
Browse files Browse the repository at this point in the history
This lets us hide the arb cntrl_menu exposure, and eliminate another
(small, admittedly) switch table.
  • Loading branch information
starseeker committed Jan 15, 2025
1 parent f1f7b71 commit 92f7979
Show file tree
Hide file tree
Showing 7 changed files with 163 additions and 85 deletions.
89 changes: 5 additions & 84 deletions src/mged/edsol.c
Original file line number Diff line number Diff line change
Expand Up @@ -1399,97 +1399,18 @@ f_get_sedit_menus(ClientData clientData, Tcl_Interp *interp, int UNUSED(argc), c
struct mged_state *s = ctp->s;
struct rt_db_internal *ip = &s->s_edit.es_int;

struct menu_item *mip = (struct menu_item *)NULL;
struct bu_vls vls = BU_VLS_INIT_ZERO;

if (s->edit_state.global_editing_state != ST_S_EDIT)
return TCL_ERROR;

switch (s->s_edit.es_int.idb_type) {
case ID_ARB8:
{
struct bu_vls vls2 = BU_VLS_INIT_ZERO;
int arb_type = rt_arb_std_type(&s->s_edit.es_int, s->s_edit.tol);

/* title */
bu_vls_printf(&vls, "{{ARB MENU} {}}");

/* build "move edge" menu */
mip = which_menu[arb_type-4];
/* submenu title */
bu_vls_printf(&vls2, "{{%s} {}}", mip->menu_string);
for (++mip; mip->menu_func != NULL; ++mip)
bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string);

bu_vls_printf(&vls, " {{%s} {%s}}", cntrl_menu[1].menu_string, bu_vls_addr(&vls2));
bu_vls_trunc(&vls2, 0);

/* build "move face" menu */
mip = which_menu[arb_type+1];
/* submenu title */
bu_vls_printf(&vls2, "{{%s} {}}", mip->menu_string);
for (++mip; mip->menu_func != NULL; ++mip)
bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string);

bu_vls_printf(&vls, " {{%s} {%s}}", cntrl_menu[2].menu_string, bu_vls_addr(&vls2));
bu_vls_trunc(&vls2, 0);

/* build "rotate face" menu */
mip = which_menu[arb_type+6];
/* submenu title */
bu_vls_printf(&vls2, "{{%s} {}}", mip->menu_string);
for (++mip; mip->menu_func != NULL; ++mip)
bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string);

bu_vls_printf(&vls, " {{%s} {%s}}", cntrl_menu[3].menu_string, bu_vls_addr(&vls2));
bu_vls_free(&vls2);
}

break;
case ID_ARS:
{
struct bu_vls vls2 = BU_VLS_INIT_ZERO;

/* build ARS PICK MENU Tcl list */

mip = ars_pick_menu;
/* title */
bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string);
for (++mip; mip->menu_func != NULL; ++mip)
bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string);

mip = ars_menu;
/* title */
bu_vls_printf(&vls, " {{%s} {}}", mip->menu_string);

/* pick vertex menu */
bu_vls_printf(&vls, " {{%s} {%s}}", (++mip)->menu_string,
bu_vls_addr(&vls2));

for (++mip; mip->menu_func != NULL; ++mip)
bu_vls_printf(&vls, " {{%s} {}}", mip->menu_string);

bu_vls_free(&vls2);
}

break;
default:
if (MGED_OBJ[ip->idb_type].ft_menu_item)
mip = (*MGED_OBJ[ip->idb_type].ft_menu_item)(&s->tol.tol);

if (mip == (struct menu_item *)NULL)
break;

/* title */
bu_vls_printf(&vls, " {{%s} {}}", mip->menu_string);

for (++mip; mip->menu_func != NULL; ++mip)
bu_vls_printf(&vls, " {{%s} {}}", mip->menu_string);

break;
if (MGED_OBJ[ip->idb_type].ft_menu_str) {
int ret = (*MGED_OBJ[ip->idb_type].ft_menu_str)(&vls, ip, &s->tol.tol);
if (ret != BRLCAD_OK)
return TCL_ERROR;
}

Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)0);
Tcl_AppendResult(interp, bu_vls_cstr(&vls), (char *)0);
bu_vls_free(&vls);

return TCL_OK;
Expand Down
46 changes: 46 additions & 0 deletions src/mged/primitives/edarb.c
Original file line number Diff line number Diff line change
Expand Up @@ -516,6 +516,52 @@ mged_arb_menu_item(const struct bn_tol *UNUSED(tol))
return cntrl_menu;
}

int
mged_arb_menu_str(struct bu_vls *mstr, const struct rt_db_internal *ip, const struct bn_tol *tol)
{
if (!mstr || !ip)
return BRLCAD_ERROR;

struct menu_item *mip = NULL;
struct bu_vls vls2 = BU_VLS_INIT_ZERO;
int arb_type = rt_arb_std_type(ip, tol);

/* title */
bu_vls_printf(mstr, "{{ARB MENU} {}}");

/* build "move edge" menu */
mip = which_menu[arb_type-4];
/* submenu title */
bu_vls_printf(&vls2, "{{%s} {}}", mip->menu_string);
for (++mip; mip->menu_func != NULL; ++mip)
bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string);

bu_vls_printf(mstr, " {{%s} {%s}}", cntrl_menu[1].menu_string, bu_vls_addr(&vls2));
bu_vls_trunc(&vls2, 0);

/* build "move face" menu */
mip = which_menu[arb_type+1];
/* submenu title */
bu_vls_printf(&vls2, "{{%s} {}}", mip->menu_string);
for (++mip; mip->menu_func != NULL; ++mip)
bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string);

bu_vls_printf(mstr, " {{%s} {%s}}", cntrl_menu[2].menu_string, bu_vls_addr(&vls2));
bu_vls_trunc(&vls2, 0);

/* build "rotate face" menu */
mip = which_menu[arb_type+6];
/* submenu title */
bu_vls_printf(&vls2, "{{%s} {}}", mip->menu_string);
for (++mip; mip->menu_func != NULL; ++mip)
bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string);

bu_vls_printf(mstr, " {{%s} {%s}}", cntrl_menu[3].menu_string, bu_vls_addr(&vls2));
bu_vls_free(&vls2);

return BRLCAD_OK;
}

const char *
mged_arb_keypoint(
point_t *pt,
Expand Down
1 change: 0 additions & 1 deletion src/mged/primitives/edarb.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
#include "raytrace.h"
#include "mged.h"

extern struct menu_item cntrl_menu[];
extern struct menu_item *which_menu[];

extern fastf_t es_peqn[7][4]; /* ARBs defining plane equations */
Expand Down
33 changes: 33 additions & 0 deletions src/mged/primitives/edars.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,39 @@ mged_ars_menu_item(const struct bn_tol *UNUSED(tol))
return ars_menu;
}

int
mged_ars_menu_str(struct bu_vls *mstr, const struct rt_db_internal *ip, const struct bn_tol *UNUSED(tol))
{
if (!mstr || !ip)
return BRLCAD_ERROR;

struct menu_item *mip = NULL;
struct bu_vls vls2 = BU_VLS_INIT_ZERO;

/* build ARS PICK MENU Tcl list */

mip = ars_pick_menu;
/* title */
bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string);
for (++mip; mip->menu_func != NULL; ++mip)
bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string);

mip = ars_menu;
/* title */
bu_vls_printf(mstr, " {{%s} {}}", mip->menu_string);

/* pick vertex menu */
bu_vls_printf(mstr, " {{%s} {%s}}", (++mip)->menu_string,
bu_vls_addr(&vls2));

for (++mip; mip->menu_func != NULL; ++mip)
bu_vls_printf(mstr, " {{%s} {}}", mip->menu_string);

bu_vls_free(&vls2);

return BRLCAD_OK;
}

void
ecmd_ars_pick(struct mged_state *s)
{
Expand Down
23 changes: 23 additions & 0 deletions src/mged/primitives/generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,29 @@ mged_generic_srot(
MAT_IDN(s->s_edit.incr_change);
}

int
mged_generic_menu_str(struct bu_vls *mstr, const struct rt_db_internal *ip, const struct bn_tol *tol)
{
if (!mstr || !ip)
return BRLCAD_ERROR;

struct menu_item *mip = NULL;

if (MGED_OBJ[ip->idb_type].ft_menu_item)
mip = (*MGED_OBJ[ip->idb_type].ft_menu_item)(tol);

if (!mip)
return BRLCAD_OK;

/* title */
bu_vls_printf(mstr, " {{%s} {}}", mip->menu_string);

for (++mip; mip->menu_func != NULL; ++mip)
bu_vls_printf(mstr, " {{%s} {}}", mip->menu_string);

return BRLCAD_OK;
}

int
mged_generic_edit(
struct mged_state *s,
Expand Down
7 changes: 7 additions & 0 deletions src/mged/primitives/mged_functab.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,10 @@ mged_generic_edit_xy(
void
mged_set_edflag(struct mged_state *s, int edflag);

int
mged_generic_menu_str(struct bu_vls *mstr, const struct rt_db_internal *ip, const struct bn_tol *tol);


struct mged_functab {
uint32_t magic;
char ft_name[17]; /* current longest name is 16 chars, need one element for terminating NULL */
Expand Down Expand Up @@ -157,6 +161,9 @@ struct mged_functab {
void (*ft_prim_edit_destroy)(void *);
#define MGEDFUNCTAB_FUNC_PRIMEDIT_DESTROY_CAST(_func) ((void(*)(void *)((void (*)(void))_func))

int (*ft_menu_str)(struct bu_vls *m, const struct rt_db_internal *ip, const struct bn_tol *tol);
#define MGEDFUNCTAB_FUNC_MENU_STR_CAST(_func) ((int(*)(struct bu_vls *, const struct rt_db_internal *, const struct bn_tol *))((void (*)(void))_func))

struct menu_item *(*ft_menu_item)(const struct bn_tol *tol);
#define MGEDFUNCTAB_FUNC_MENU_ITEM_CAST(_func) ((struct menu_item *(*)(const struct bn_tol *))((void (*)(void))_func))

Expand Down
Loading

0 comments on commit 92f7979

Please sign in to comment.