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

Campbell Barton bf-committers@blender.org
Mon, 19 Jul 2004 09:19:45 +1000


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
>
>
>  
>


-- 
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