[Bf-committers] Patch- 3d view Object sel menu

Campbell Barton bf-committers@blender.org
Mon, 19 Jul 2004 10:37:23 +1000


Wouldent menuIndexChar - be fine with anything up to 99 since its 2 chars?

- Cam



Daniel Dunbar wrote:

>I wasn't actually talking about the [512] buffer (although I
>generally advocate just using a dynamic string (BLI_dynStr for
>example) so you don't have to even think about whether there
>is an overflow risk. (Although I agree, currently [512] is
>probably safe). However, menuIndexChar will overrun as soon 
>as you have more than 10 items in a menu.
>
>--- Campbell Barton <cbarton@metavr.com> wrote:
>  
>
>>Wheres the bug? how can I fix it?
>>- Cam
>>
>>Daniel Dunbar wrote:
>>
>>    
>>
>>>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
>>>_______________________________________________
>>>Bf-committers mailing list
>>>Bf-committers@blender.org
>>>http://www.blender.org/mailman/listinfo/bf-committers
>>>
>>>
>>> 
>>>      
>>>
>=== message truncated ===
>
>
>=====
>daniel dunbar
>daniel@zuster.org
>_______________________________________________
>Bf-committers mailing list
>Bf-committers@blender.org
>http://www.blender.org/mailman/listinfo/bf-committers
>
>
>  
>


-- 
Campbell J Barton

133 Hope Street
Geelong West, Victoria 3218 Australia

URL:    http://www.metavr.com
e-mail: cbarton@metavr.com
phone: AU (03) 5229 0241