Nodes to be created at the location in which the mouse cursor was initially
authorJuho Vepsalainen <bebraw@gmail.com>
Sat, 23 Feb 2008 10:33:36 +0000 (10:33 +0000)
committerJuho Vepsalainen <bebraw@gmail.com>
Sat, 23 Feb 2008 10:33:36 +0000 (10:33 +0000)
This commit changes the way new nodes are created. Previously nodes were created
at the last location of the mouse cursor before creating a new node. After this
commit the nodes are created at the initial location in which the cursor was
before the menu used to add the node was opened.

This makes it possible for the user to predict where the new node appears without
having to move it to desired location like before. There is no option for this as
this behaviour is clearly superior to previous.

Codewise it uses static variables. This is something to fix during 2.50 rewrite.

Thanks to paprmh for contribution!

source/blender/include/BIF_toolbox.h
source/blender/src/header_node.c
source/blender/src/toolbox.c

index 523345a115d284e574c21cc6b3b716280d0cb55c..39f86aefe73500e0f3621cb68868bdd2b9a3c6d5 100644 (file)
@@ -73,4 +73,6 @@ typedef struct TBitem {
 } TBitem;
 void toolbox_generic( struct TBitem *generic_menu ); /* for external toolbox - python only for now */
 
+void toolbox_mousepos( short *mpos, int save ); /* saves/restores mouse position when entering/exiting menus */
+
 #endif
index ffd8cd5fc4bded2023a93793a7124660a39eb568..dd6ae890b01b9f72d2917fe084d790f489f21851 100644 (file)
@@ -216,7 +216,7 @@ void do_node_addmenu(void *arg, int event)
                else node->flag &= ~NODE_TEST;
        }
        
-       getmouseco_areawin(mval);
+       toolbox_mousepos(mval, 0 ); /* get initial mouse position */
        areamouseco_to_ipoco(G.v2d, mval, &locx, &locy);
        node= node_add_node(snode, event, locx, locy);
        
index c2773611bb2c38f8223479a5b7c3676de42d3f5b..e02066f3a3b94e6aa508792dd5acf2dff2586d27 100644 (file)
@@ -1977,6 +1977,9 @@ void toolbox_n(void)
                }
        }
        
+       /* save present mouse position */
+       toolbox_mousepos(mval, 1);
+
        mywinset(G.curscreen->mainwin); // we go to screenspace
        
        block= uiNewBlock(&tb_listb, "toolbox", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
@@ -2307,3 +2310,25 @@ void toolbox_generic( TBitem *generic_menu )
        
        mywinset(curarea->win);
 }
+
+/* save or restore mouse position when entering/exiting menus */
+void toolbox_mousepos( short *mpos, int save )
+{
+       static short initpos[2];
+       static int tog;
+       
+       if (save) {
+               getmouseco_areawin(mpos);
+               initpos[0]= mpos[0];
+               initpos[1]= mpos[1];
+               tog=1;
+       } else {
+               if (tog) {
+                       mpos[0]= initpos[0];
+                       mpos[1]= initpos[1];
+               } else {
+                       getmouseco_areawin(mpos);
+               }
+               tog= 0;
+       }
+}