[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