[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