Fix #21470: changing brush settings redraws the 3d view unecessarily,
[blender-staging.git] / source / blender / editors / space_view3d / space_view3d.c
index bcfc00712371be9ceff8874b511b76d46fc8ba71..92e3b35f6145a17e8d9bc9b723e5c05480662132 100644 (file)
 #include <string.h>
 #include <stdio.h>
 
-#include "DNA_action_types.h"
-#include "DNA_armature_types.h"
 #include "DNA_object_types.h"
-#include "DNA_space_types.h"
 #include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_view3d_types.h"
 
 #include "MEM_guardedalloc.h"
 
 #include "BKE_utildefines.h"
 #include "BKE_image.h"
 
-#include "ED_armature.h"
-#include "ED_space_api.h"
 #include "ED_screen.h"
 #include "ED_object.h"
 
 #include "BIF_gl.h"
 
-#include "GPU_draw.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
 
-#include "UI_interface.h"
-#include "UI_resources.h"
-#include "UI_view2d.h"
 
 #include "RNA_access.h"
 
+#include "UI_resources.h"
+
 #include "view3d_intern.h"     // own include
 
 /* ******************** manage regions ********************* */
@@ -422,10 +413,16 @@ static int view3d_mat_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
 
 static int view3d_ima_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
 {
-       if(drag->type==WM_DRAG_ID) {
-               ID *id= (ID *)drag->poin;
-               if( GS(id->name)==ID_IM )
-                       return 1;
+       if( ED_view3d_give_base_under_cursor(C, event->mval) ) {
+               if(drag->type==WM_DRAG_ID) {
+                       ID *id= (ID *)drag->poin;
+                       if( GS(id->name)==ID_IM )
+                               return 1;
+               }
+               else if(drag->type==WM_DRAG_PATH){
+                       if(ELEM(drag->icon, 0, ICON_FILE_IMAGE))        /* rule might not work? */
+                               return 1;
+               }
        }
        return 0;
 }
@@ -446,10 +443,20 @@ static void view3d_ob_drop_copy(wmDrag *drag, wmDropBox *drop)
 static void view3d_id_drop_copy(wmDrag *drag, wmDropBox *drop)
 {
        ID *id= (ID *)drag->poin;
-
+       
        RNA_string_set(drop->ptr, "name", id->name+2);
 }
 
+static void view3d_id_path_drop_copy(wmDrag *drag, wmDropBox *drop)
+{
+       ID *id= (ID *)drag->poin;
+       
+       if(id)
+               RNA_string_set(drop->ptr, "name", id->name+2);
+       if(drag->path[0]) 
+               RNA_string_set(drop->ptr, "filepath", drag->path);
+}
+
 
 /* region dropbox definition */
 static void view3d_dropboxes(void)
@@ -458,7 +465,7 @@ static void view3d_dropboxes(void)
        
        WM_dropbox_add(lb, "OBJECT_OT_add_named_cursor", view3d_ob_drop_poll, view3d_ob_drop_copy);
        WM_dropbox_add(lb, "OBJECT_OT_drop_named_material", view3d_mat_drop_poll, view3d_id_drop_copy);
-       WM_dropbox_add(lb, "MESH_OT_drop_named_image", view3d_ima_drop_poll, view3d_id_drop_copy);
+       WM_dropbox_add(lb, "MESH_OT_drop_named_image", view3d_ima_drop_poll, view3d_id_path_drop_copy);
 }
 
 
@@ -516,13 +523,19 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
        switch(wmn->category) {
                case NC_ANIMATION:
                        switch(wmn->data) {
-                               case ND_KEYFRAME_EDIT:
                                case ND_KEYFRAME_PROP:
-                               case ND_NLA_EDIT:
                                case ND_NLA_ACTCHANGE:
-                               case ND_ANIMCHAN_SELECT:
                                        ED_region_tag_redraw(ar);
                                        break;
+                               case ND_NLA:
+                               case ND_KEYFRAME:
+                                       if (wmn->action == NA_EDITED)
+                                               ED_region_tag_redraw(ar);
+                                       break;
+                               case ND_ANIMCHAN:
+                                       if (wmn->action == NA_SELECTED)
+                                               ED_region_tag_redraw(ar);
+                                       break;
                        }
                        break;
                case NC_SCENE:
@@ -550,8 +563,7 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
                                case ND_MODIFIER:
                                case ND_CONSTRAINT:
                                case ND_KEYS:
-                               case ND_PARTICLE_SELECT:
-                               case ND_PARTICLE_DATA:
+                               case ND_PARTICLE:
                                        ED_region_tag_redraw(ar);
                                        break;
                        }
@@ -575,7 +587,7 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
                        break;
                case NC_BRUSH:
                        if(wmn->action == NA_EDITED)
-                               ED_region_tag_redraw(ar);
+                               ED_region_tag_redraw_overlay(ar);
                        break;                  
                case NC_MATERIAL:
                        switch(wmn->data) {
@@ -603,6 +615,10 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
                         * more context than just the region */
                        ED_region_tag_redraw(ar);
                        break;
+               case NC_TEXTURE:        
+                       /* same as above */
+                       ED_region_tag_redraw(ar);
+                       break;
                case NC_SPACE:
                        if(wmn->data == ND_SPACE_VIEW3D) {
                                if (wmn->subtype == NS_VIEW3D_GPU) {
@@ -698,12 +714,15 @@ static void view3d_buttons_area_listener(ARegion *ar, wmNotifier *wmn)
        switch(wmn->category) {
                case NC_ANIMATION:
                        switch(wmn->data) {
-                               case ND_KEYFRAME_EDIT:
                                case ND_KEYFRAME_PROP:
-                               case ND_NLA_EDIT:
                                case ND_NLA_ACTCHANGE:
                                        ED_region_tag_redraw(ar);
                                        break;
+                               case ND_NLA:
+                               case ND_KEYFRAME:
+                                       if (wmn->action == NA_EDITED)
+                                               ED_region_tag_redraw(ar);
+                                       break;  
                        }
                        break;
                case NC_SCENE:
@@ -781,6 +800,25 @@ static void view3d_tools_area_draw(const bContext *C, ARegion *ar)
        ED_region_panels(C, ar, 1, CTX_data_mode_string(C), -1);
 }
 
+static void view3d_props_area_listener(ARegion *ar, wmNotifier *wmn)
+{
+       /* context changes */
+       switch(wmn->category) {
+               case NC_WM:
+                       if(wmn->data == ND_HISTORY)
+                               ED_region_tag_redraw(ar);
+                       break;
+               case NC_SCENE:
+                       if(wmn->data == ND_MODE)
+                               ED_region_tag_redraw(ar);
+                       break;
+               case NC_SPACE:
+                       if(wmn->data == ND_SPACE_VIEW3D)
+                               ED_region_tag_redraw(ar);
+                       break;
+       }
+}
+
 static int view3d_context(const bContext *C, const char *member, bContextDataResult *result)
 {
        View3D *v3d= CTX_wm_view3d(C);
@@ -809,7 +847,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
                                }
                        }
                }
-
+               CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                return 1;
        }
        else if(CTX_data_equals(member, "selected_editable_objects") || CTX_data_equals(member, "selected_editable_bases")) {
@@ -827,7 +865,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
                                }
                        }
                }
-               
+               CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                return 1;
        }
        else if(CTX_data_equals(member, "visible_objects") || CTX_data_equals(member, "visible_bases")) {
@@ -843,7 +881,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
                                }
                        }
                }
-               
+               CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                return 1;
        }
        else if(CTX_data_equals(member, "selectable_objects") || CTX_data_equals(member, "selectable_bases")) {
@@ -859,7 +897,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
                                }
                        }
                }
-               
+               CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                return 1;
        }
        else if(CTX_data_equals(member, "active_base")) {
@@ -963,7 +1001,7 @@ void ED_spacetype_view3d(void)
        art->prefsizex= 0;
        art->prefsizey= 120;
        art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_FRAMES;
-       art->listener= view3d_buttons_area_listener;
+       art->listener= view3d_props_area_listener;
        art->init= view3d_tools_area_init;
        art->draw= view3d_tools_area_draw;
        BLI_addhead(&st->regiontypes, art);