Revision: 18147
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18147
Author:   ton
Date:     2008-12-29 13:15:42 +0100 (Mon, 29 Dec 2008)

Log Message:
-----------
2.5

More notifier cleanups: 

NC_SCENE|ND_OB_SELECT : scene level object selections changed
NC_SCENE|ND_OB_ACTIVE : scene level, new active object

NC_OBJECT|ND_BONE_SELECT : object level, bone selection changed
NC_OBJECT|ND_BONE_ACTIVE: object level, new active bone

I've made view3d listen to these, so operators that change
selections don't have to tag own region for redraw anymore.

Also enabled selecting/activating in outliner again.

BTW: Added it in space_action, but Joshua has to code the
proper refresh still :)

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/include/ED_object.h
    branches/blender2.5/blender/source/blender/editors/object/object_edit.c
    
branches/blender2.5/blender/source/blender/editors/space_action/space_action.c
    branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c
    
branches/blender2.5/blender/source/blender/editors/space_outliner/space_outliner.c
    
branches/blender2.5/blender/source/blender/editors/space_view3d/space_view3d.c
    
branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_select.c
    branches/blender2.5/blender/source/blender/windowmanager/WM_types.h

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_object.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_object.h      
2008-12-29 12:04:25 UTC (rev 18146)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_object.h      
2008-12-29 12:15:42 UTC (rev 18147)
@@ -30,10 +30,17 @@
 
 struct wmWindowManager;
 struct Object;
+struct bContext;
+struct Base;
 
 void ED_operatortypes_object(void);
 void ED_keymap_object(struct wmWindowManager *wm);
 
+       /* send your own notifier for select! */
+void ED_base_object_select(struct Base *base, short mode);
+       /* includes notifier */
+void ED_base_object_activate(struct bContext *C, Base *base);
+
 /* cleanup */
 int object_data_is_libdata(struct Object *ob);
 int object_is_libdata(struct Object *ob);

Modified: 
branches/blender2.5/blender/source/blender/editors/object/object_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/object/object_edit.c     
2008-12-29 12:04:25 UTC (rev 18146)
+++ branches/blender2.5/blender/source/blender/editors/object/object_edit.c     
2008-12-29 12:15:42 UTC (rev 18147)
@@ -142,13 +142,67 @@
 
 /* port over here */
 static bContext *C;
-static void set_active_base() {}
 static void error_libdata() {}
 
 /* ********************************** */
 
 /* --------------------------------- */
 
+/* simple API for object selection, rather than just using the flag
+ * this takes into account the 'restrict selection in 3d view' flag.
+ * deselect works always, the restriction just prevents selection */
+
+/* Note: send a NC_SCENE|ND_OB_SELECT notifier yourself! */
+
+void ED_base_object_select(Base *base, short mode)
+{
+       if (base) {
+               if (mode==BA_SELECT) {
+                       if (!(base->object->restrictflag & OB_RESTRICT_SELECT))
+                               if (mode==BA_SELECT) base->flag |= SELECT;
+               }
+               else if (mode==BA_DESELECT) {
+                       base->flag &= ~SELECT;
+               }
+               base->object->flag= base->flag;
+       }
+}
+
+/* also to set active NULL */
+void ED_base_object_activate(bContext *C, Base *base)
+{
+       Scene *scene= CTX_data_scene(C);
+       Base *tbase;
+       
+       /* activating a non-mesh, should end a couple of modes... */
+       //      if(base && base->object->type!=OB_MESH)
+       // XXX          exit_paint_modes();
+       
+       /* sets scene->basact */
+       BASACT= base;
+       
+       if(base) {
+               
+               /* XXX old signals, remember to handle notifiers now! */
+               //              allqueue(REDRAWIPO, base->object->ipowin);
+               //              
select_actionchannel_by_name(base->object->action, "Object", 1);
+               
+               /* disable temporal locks */
+               for(tbase=FIRSTBASE; tbase; tbase= tbase->next) {
+                       if(base!=tbase && (tbase->object->shapeflag & 
OB_SHAPE_TEMPLOCK)) {
+                               tbase->object->shapeflag &= ~OB_SHAPE_TEMPLOCK;
+                               DAG_object_flush_update(scene, tbase->object, 
OB_RECALC_DATA);
+                       }
+               }
+               WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, base->object);
+       }
+       else
+               WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, NULL);
+}
+
+
+
+
 /*
  * Returns true if the Object is a from an external blend file (libdata)
  */
@@ -197,7 +251,7 @@
 
 // XXX if (G.obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* 
freedata, and undo */
        ob= add_object(type);
-       set_active_base(BASACT);
+//     ED_base_object_activate(C, BASACT);
        base_init_from_view3d(BASACT, v3d);
        
        /* only undo pushes on objects without editmode... */
@@ -2791,7 +2845,7 @@
                                
                                /* If the original object is active then make 
this object active */
                                if (ob == obact) {
-                                       set_active_base( basen );
+                                       // XXX ED_base_object_activate(C, 
basen);
                                        basact = basen;
                                }
                        }
@@ -2886,7 +2940,7 @@
                                                
                                                /* If the original object is 
active then make this object active */
                                                if (ob == obact) {
-                                                       set_active_base( basen 
);
+                                                       // XXX 
ED_base_object_activate(C, basen);
                                                        basact = basen;
                                                }
                                                
@@ -5113,7 +5167,7 @@
 //             initTransform(TFM_TRANSLATION, CTX_NONE);
 //             Transform();
        }
-       set_active_base(BASACT);
+       // XXX ED_base_object_activate(C, BASACT);
        if(mode!=2) { /* mode of 2 is used by python to avoid unrequested 
redraws */
                allqueue(REDRAWNLA, 0);
                allqueue(REDRAWACTION, 0);      /* also oops */

Modified: 
branches/blender2.5/blender/source/blender/editors/space_action/space_action.c
===================================================================
--- 
branches/blender2.5/blender/source/blender/editors/space_action/space_action.c  
    2008-12-29 12:04:25 UTC (rev 18146)
+++ 
branches/blender2.5/blender/source/blender/editors/space_action/space_action.c  
    2008-12-29 12:15:42 UTC (rev 18147)
@@ -292,12 +292,21 @@
        switch(wmn->category) {
                case NC_SCENE:
                        switch(wmn->data) {
+                               case ND_OB_ACTIVE:
                                case ND_FRAME:
                                case ND_MARKERS:
                                        ED_region_tag_redraw(ar);
                                        break;
                        }
                        break;
+               case NC_OBJECT:
+                       switch(wmn->data) {
+                               case ND_BONE_ACTIVE:
+                               case ND_BONE_SELECT:
+                                       ED_region_tag_redraw(ar);
+                                       break;
+                       }
+                       break;
        }
 }
 

Modified: 
branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c
===================================================================
--- 
branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c    
    2008-12-29 12:04:25 UTC (rev 18146)
+++ 
branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c    
    2008-12-29 12:15:42 UTC (rev 18147)
@@ -95,6 +95,8 @@
 #include "UI_view2d.h"
 #include "UI_text.h"
 
+#include "ED_object.h"
+
 #include "outliner_intern.h"
 
 #ifdef INTERNATIONAL
@@ -1440,7 +1442,7 @@
        return 0;
 }
 
-static void tree_element_active_object(Scene *scene, SpaceOops *soops, 
TreeElement *te)
+static void tree_element_set_active_object(bContext *C, Scene *scene, 
SpaceOops *soops, TreeElement *te)
 {
        TreeStoreElem *tselem= TREESTORE(te);
        Scene *sce;
@@ -1468,9 +1470,10 @@
        if(base) {
                if(shift) {
                        /* swap select */
-                       if(base->flag & SELECT) base->flag &= ~SELECT;
-                       else if ((base->object->restrictflag & 
OB_RESTRICT_VIEW)==0) base->flag |= SELECT;
-                       base->object->flag= base->flag;
+                       if(base->flag & SELECT)
+                               ED_base_object_select(base, BA_DESELECT);
+                       else 
+                               ED_base_object_select(base, BA_SELECT);
                }
                else {
                        Base *b;
@@ -1479,16 +1482,10 @@
                                b->flag &= ~SELECT;
                                b->object->flag= b->flag;
                        }
-                       if ((base->object->restrictflag & OB_RESTRICT_VIEW)==0) 
{
-                               base->flag |= SELECT;
-                               base->object->flag |= SELECT;
-                       }
+                       ED_base_object_select(base, BA_SELECT);
                }
-// XXX         set_active_base(base);  /* editview.c */
-               
-               allqueue(REDRAWVIEW3D, 1);
-               allqueue(REDRAWOOPS, 0);
-               allqueue(REDRAWINFO, 1);
+               if(C)
+                       ED_base_object_activate(C, base); /* adds notifier */
        }
        
 // XXX if(ob!=G.obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR);
@@ -1981,7 +1978,8 @@
 }
 
 /* generic call for non-id data to make/check active in UI */
-static int tree_element_type_active(Scene *scene, SpaceOops *soops, 
TreeElement *te, TreeStoreElem *tselem, int set)
+/* Context can be NULL when set==0 */
+static int tree_element_type_active(bContext *C, Scene *scene, SpaceOops 
*soops, TreeElement *te, TreeStoreElem *tselem, int set)
 {
        
        switch(tselem->type) {
@@ -1996,7 +1994,7 @@
                case TSE_MODIFIER:
                        return tree_element_active_modifier(te, tselem, set);
                case TSE_LINKED_OB:
-                       if(set) tree_element_active_object(scene, soops, te);
+                       if(set) tree_element_set_active_object(C, scene, soops, 
te);
                        else if(tselem->id==(ID *)OBACT) return 1;
                        break;
                case TSE_LINKED_PSYS:
@@ -2023,7 +2021,7 @@
        return 0;
 }
 
-static int do_outliner_mouse_event(Scene *scene, ARegion *ar, SpaceOops 
*soops, TreeElement *te, short event, float *mval)
+static int do_outliner_mouse_event(bContext *C, Scene *scene, ARegion *ar, 
SpaceOops *soops, TreeElement *te, short event, float *mval)
 {
        int shift= 0, ctrl= 0; // XXX
        
@@ -2073,7 +2071,7 @@
                                } else {
                                        /* always makes active object */
                                        if(tselem->type!=TSE_SEQUENCE && 
tselem->type!=TSE_SEQ_STRIP && tselem->type!=TSE_SEQUENCE_DUP)
-                                               
tree_element_active_object(scene, soops, te);
+                                               
tree_element_set_active_object(C, scene, soops, te);
                                        
                                        if(tselem->type==0) { // the lib blocks
                                                /* editmode? */
@@ -2094,7 +2092,7 @@
                                                }
                                                
                                        }
-                                       else tree_element_type_active(scene, 
soops, te, tselem, 1);
+                                       else tree_element_type_active(C, scene, 
soops, te, tselem, 1);
                                }
                        }
                        else if(event==RIGHTMOUSE) {
@@ -2117,7 +2115,7 @@
        }
        
        for(te= te->subtree.first; te; te= te->next) {
-               if(do_outliner_mouse_event(scene, ar, soops, te, event, mval)) 
return 1;
+               if(do_outliner_mouse_event(C, scene, ar, soops, te, event, 
mval)) return 1;
        }
        return 0;
 }
@@ -2134,7 +2132,7 @@
        UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y 
- ar->winrct.ymin, fmval, fmval+1);
        
        for(te= soops->tree.first; te; te= te->next) {
-               if(do_outliner_mouse_event(scene, ar, soops, te, event->type, 
fmval)) break;
+               if(do_outliner_mouse_event(C, scene, ar, soops, te, 
event->type, fmval)) break;
        }
        
        if(te) {
@@ -3183,7 +3181,7 @@
                                else if(G.obedit && G.obedit->data==tselem->id) 
active= 1;
                                else active= tree_element_active(scene, soops, 
te, 0);
                        }
-                       else active= tree_element_type_active(scene, soops, te, 
tselem, 0);
+                       else active= tree_element_type_active(NULL, scene, 
soops, te, tselem, 0);
                        
                        if(active) {
                                uiSetRoundBox(15);
@@ -3258,7 +3256,7 @@
                        }
                }
                else {
-                       if( tree_element_type_active(scene, soops, te, tselem, 
0) ) active= 2;
+                       if( tree_element_type_active(NULL, scene, soops, te, 
tselem, 0) ) active= 2;
                        glColor4ub(220, 220, 255, 100);
                }
                
@@ -3619,7 +3617,7 @@
                                        char newname[32];
                                        
                                        // always make current object active
-                                       tree_element_active_object(scene, 
soops, te);
+                                       tree_element_set_active_object(C, 
scene, soops, te);
                                        ob= OBACT;
                                        
                                        /* restore bone name */
@@ -3638,7 +3636,7 @@
                                        char newname[32];
                                        
                                        // always make current object active
-                                       tree_element_active_object(scene, 
soops, te);
+                                       tree_element_set_active_object(C, 
scene, soops, te);
                                        ob= OBACT;
                                        
                                        /* restore bone name */

Modified: 
branches/blender2.5/blender/source/blender/editors/space_outliner/space_outliner.c
===================================================================
--- 
branches/blender2.5/blender/source/blender/editors/space_outliner/space_outliner.c
  2008-12-29 12:04:25 UTC (rev 18146)

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to