[Bf-committers] Patch- 3d view Object sel menu
Daniel Dunbar
bf-committers@blender.org
Sun, 18 Jul 2004 08:01:19 -0700 (PDT)
This code has a potential bug of overwriting the stack
in the string handling code.
--- Campbell Barton <cbarton@metavr.com> wrote:
> Hi all
> This patch pops up a menu of all objects under the mouse and Alt+RMP
> I quite like it for large scenes where you have meny objects.
>
> - Cam
> > Index: source/blender/src/editview.c
> ===================================================================
> RCS file: /cvsroot/bf-blender/blender/source/blender/src/editview.c,v
> retrieving revision 1.25
> diff -u -r1.25 editview.c
> --- source/blender/src/editview.c 16 Jul 2004 01:34:19 -0000 1.25
> +++ source/blender/src/editview.c 18 Jul 2004 07:52:34 -0000
> @@ -539,6 +539,9 @@
> }
> }
>
> +/* The max number of menu items in an object select menu */
> +#define SEL_MENU_SIZE 22
> +
> void mouse_select(void)
> {
> Base *base, *startbase=NULL, *basact=NULL, *oldbasact=NULL;
> @@ -546,6 +549,14 @@
> int temp, a, dist=100;
> short hits, mval[2];
>
> + /* menuText should be the initial size of text (22 atm) + ( SEL_MENU_SIZE * 26)
> + 26 being the longest possible length for a menu item */
> + char menuText[512] = "Select Object%t";
> + char menuIndexChar[2];
> + short baseCount = 0;
> + Base *baseList[SEL_MENU_SIZE]; /* baseList is used to store all possible bases to bring up a
> menu */
> + /*end select menu */
> +
> /* always start list from basact */
> startbase= FIRSTBASE;
> if(BASACT && BASACT->next) startbase= BASACT->next;
> @@ -589,15 +600,55 @@
> if(base->lay & G.vd->lay) {
> for(a=0; a<hits; a++) {
> /* index was converted */
> - if(base->selcol==buffer[ (4 * a) + 3 ]) basact= base;
> + if(base->selcol==buffer[ (4 * a) + 3 ]) {
> +
> + /* Generate menu text */
> + if (G.qual & LR_ALTKEY) {
> + if (baseCount < SEL_MENU_SIZE) {
> + baseList[baseCount] = base;
> + strcat(menuText, "|"); /* Seperate menu items */
> + sprintf(menuIndexChar, "%d", baseCount+1); /* Turn Base count into a string */
> + strcat(menuText, base->object->id.name+2); /*Object name*/
> + strcat(menuText, "%x");
> + strcat(menuText, menuIndexChar);
> + baseCount++;
> + } /* end generating menu*/
> + } else { /* no altkey, no menu */
> + basact= base; /* No menu so we need to do this now */
> + }
> + }
> }
> }
> - if(basact) break;
> +
> + /* Act normaly if Menu isnt being used */
> + if (!(G.qual & LR_ALTKEY)) {
> + if(basact) break; /* No menu so we need to do this now */
> + }
>
> base= base->next;
> if(base==0) base= FIRSTBASE;
> if(base==startbase) break;
> }
> +
> +
> + /* Menu only if the altkey is pressed */
> + if (G.qual & LR_ALTKEY) {
> + /* USE MENU IF MORE THEN 1 ITEM ARE UNDER THE MOUSE*/
> + if (baseCount == 1) { /* Only 1 item, dont bother with a menu */
> + base = baseList[0];
> + basact = base;
> + } else { /* We have more then 1 item under the mouse cursor */
> + baseCount = pupmenu(menuText);
> +
> + if (baseCount != -1) { /* If nothing is selected then dont do anything */
> + base = baseList[baseCount-1];
> + basact = base;
> + } else {
> + return; /* No menu item selected so give up now */
> + }
> + }
> + } /*end altkey/menu option*/
> +
> }
> }
>
> Index: source/blender/src/header_view3d.c
> ===================================================================
> RCS file: /cvsroot/bf-blender/blender/source/blender/src/header_view3d.c,v
> retrieving revision 1.59
> diff -u -r1.59 header_view3d.c
> --- source/blender/src/header_view3d.c 16 Jul 2004 02:10:52 -0000 1.59
> +++ source/blender/src/header_view3d.c 18 Jul 2004 07:52:39 -0000
> @@ -1041,6 +1041,24 @@
> case 4: /* Select Same UV */
> get_same_uv();
> break;
> + case 5: /* Select Same Material */
> + get_same_mat();
> + break;
> + case 6: /* Select Same Mode */
> + get_same_mode();
> + break;
> + case 7: /* Select Same Normal */
> + get_same_normal();
> + break;
> + case 8: /* Select Same Area */
> + get_same_area();
> + break;
> + case 9: /* Select Same Vert colour */
> + get_same_vcol();
> + break;
> + case 10: /* Select Same Vert colour */
> + get_same_uvco();
> + break;
> }
> allqueue(REDRAWVIEW3D, 0);
> }
> @@ -1059,7 +1077,16 @@
>
> uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20,
> menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
> uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse", 0, yco-=20, menuwidth,
> 19, NULL, 0.0, 0.0, 1, 3, "");
> - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same UV", 0, yco-=20, menuwidth,
> 19, NULL, 0.0, 0.0, 1, 4, "");
> +
> + uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
> +
> + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same UV Image", 0, yco-=20,
> menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
> + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same Material", 0, yco-=20, menuwidth,
> 19, NULL, 0.0, 0.0, 1, 5, "");
> + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same Mode", 0, yco-=20, menuwidth, 19,
> NULL, 0.0, 0.0, 1, 6, "");
> + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same Normal", 0, yco-=20, menuwidth,
> 19, NULL, 0.0, 0.0, 1, 7, "");
> + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same Area", 0, yco-=20, menuwidth, 19,
> NULL, 0.0, 0.0, 1, 8, "");
> + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same Vert Col", 0, yco-=20, menuwidth,
> 19, NULL, 0.0, 0.0, 1, 9, "");
> + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same UV Coords", 0, yco-=20,
> menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
>
> if(curarea->headertype==HEADERTOP) {
> uiBlockSetDirection(block, UI_DOWN);
> @@ -1072,6 +1099,7 @@
> uiTextBoundsBlock(block, 50);
> return block;
> }
> +
>
> void do_view3d_edit_snapmenu(void *arg, int event)
> {
>
=====
daniel dunbar
daniel@zuster.org