Merged 38822-39182
[blender.git] / source / blender / editors / space_view3d / view3d_header.c
index 76e076b..993c28f 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * $Id$
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  * ***** END GPL LICENSE BLOCK *****
  */
 
+/** \file blender/editors/space_view3d/view3d_header.c
+ *  \ingroup spview3d
+ */
+
+
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 
 #include "DNA_scene_types.h"
+#include "DNA_object_types.h"
 
 #include "RNA_access.h"
 
 #include "MEM_guardedalloc.h"
 
-#include "BKE_action.h"
-#include "BKE_brush.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
+
 #include "BKE_context.h"
-#include "BKE_curve.h"
 #include "BKE_depsgraph.h"
-#include "BKE_displist.h"
 #include "BKE_effect.h"
-#include "BKE_global.h"
-#include "BKE_image.h"
-#include "BKE_library.h"
 #include "BKE_main.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
 #include "BKE_paint.h"
-#include "BKE_particle.h"
 #include "BKE_screen.h"
-#include "BKE_utildefines.h" /* for VECCOPY */
 
 #include "ED_mesh.h"
 #include "ED_util.h"
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
 
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
-
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
-#include "BLI_editVert.h"
-
 #include "UI_interface.h"
 #include "UI_resources.h"
 
@@ -91,9 +86,6 @@
 #define TEST_EDITMESH  if(obedit==0) return; \
                                                if( (v3d->lay & obedit->lay)==0 ) return;
 
-/* XXX port over */    
-extern void borderselect();
-
 /* view3d handler codes */
 #define VIEW3D_HANDLER_BACKGROUND      1
 #define VIEW3D_HANDLER_PROPERTIES      2
@@ -137,11 +129,12 @@ static void handle_view3d_lock(bContext *C)
                if(v3d->localvd==NULL && v3d->scenelock && sa->spacetype==SPACE_VIEW3D) {
                        /* copy to scene */
                        scene->lay= v3d->lay;
+                       scene->layact= v3d->layact;
                        scene->camera= v3d->camera;
 
                        /* not through notifiery, listener don't have context
                           and non-open screens or spaces need to be updated too */
-                       ED_view3d_scene_layers_update(bmain, scene);
+                       BKE_screen_view3d_main_sync(&bmain->screen, scene);
                        
                        /* notifiers for scene update */
                        WM_event_add_notifier(C, NC_SCENE|ND_LAYER, scene);
@@ -149,7 +142,27 @@ static void handle_view3d_lock(bContext *C)
        }
 }
 
-static int layers_exec(bContext *C, wmOperator *op)
+/* layer code is on three levels actually:
+- here for operator
+- uiTemplateLayers in interface/ code for buttons
+- ED_view3d_scene_layer_set for RNA
+ */
+static void view3d_layers_editmode_ensure(Scene *scene, View3D *v3d)
+{
+       /* sanity check - when in editmode disallow switching the editmode layer off since its confusing
+        * an alternative would be to always draw the editmode object. */
+       if(scene->obedit && (scene->obedit->lay & v3d->lay)==0) {
+               int bit;
+               for(bit=0; bit<32; bit++) {
+                       if(scene->obedit->lay & (1<<bit)) {
+                               v3d->lay |= 1<<bit;
+                               break;
+                       }
+               }
+       }
+}
+
+static int view3d_layers_exec(bContext *C, wmOperator *op)
 {
        Scene *scene= CTX_data_scene(C);
        ScrArea *sa= CTX_wm_area(C);
@@ -159,14 +172,21 @@ static int layers_exec(bContext *C, wmOperator *op)
        
        if(nr < 0)
                return OPERATOR_CANCELLED;
-       
-       
+
        if(nr == 0) {
                /* all layers */
-               v3d->lay |= (1<<20)-1;
-
                if(!v3d->layact)
                        v3d->layact= 1;
+
+               if (toggle && v3d->lay == ((1<<20)-1)) {
+                       /* return to active layer only */
+                       v3d->lay = v3d->layact;
+
+                       view3d_layers_editmode_ensure(scene, v3d);
+               }
+               else {
+                       v3d->lay |= (1<<20)-1;
+               }               
        }
        else {
                int bit;
@@ -179,19 +199,10 @@ static int layers_exec(bContext *C, wmOperator *op)
                                v3d->lay |= (1<<nr);
                } else {
                        v3d->lay = (1<<nr);
-
-                       /* sanity check - when in editmode disallow switching the editmode layer off since its confusing
-                        * an alternative would be to always draw the editmode object. */
-                       if(scene->obedit && (scene->obedit->lay & v3d->lay)==0) {
-                               for(bit=0; bit<32; bit++) {
-                                       if(scene->obedit->lay & (1<<bit)) {
-                                               v3d->lay |= 1<<bit;
-                                               break;
-                                       }
-                               }
-                       }
                }
-               
+
+               view3d_layers_editmode_ensure(scene, v3d);
+
                /* set active layer, ensure to always have one */
                if(v3d->lay & (1<<nr))
                   v3d->layact= 1<<nr;
@@ -207,8 +218,7 @@ static int layers_exec(bContext *C, wmOperator *op)
        
        if(v3d->scenelock) handle_view3d_lock(C);
        
-       /* new layers might need unflushed events events */
-       DAG_scene_update_flags(scene, v3d->lay);        /* tags all that moves and flushes */
+       DAG_on_visible_update(CTX_data_main(C), FALSE);
 
        ED_area_tag_redraw(sa);
        
@@ -217,7 +227,7 @@ static int layers_exec(bContext *C, wmOperator *op)
 
 /* applies shift and alt, lazy coding or ok? :) */
 /* the local per-keymap-entry keymap will solve it */
-static int layers_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int view3d_layers_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
        if(event->ctrl || event->oskey)
                return OPERATOR_PASS_THROUGH;
@@ -229,12 +239,12 @@ static int layers_invoke(bContext *C, wmOperator *op, wmEvent *event)
                int nr= RNA_int_get(op->ptr, "nr") + 10;
                RNA_int_set(op->ptr, "nr", nr);
        }
-       layers_exec(C, op);
+       view3d_layers_exec(C, op);
        
        return OPERATOR_FINISHED;
 }
 
-int layers_poll(bContext *C)
+static int view3d_layers_poll(bContext *C)
 {
        return (ED_operator_view3d_active(C) && CTX_wm_view3d(C)->localvd==NULL);
 }
@@ -247,9 +257,9 @@ void VIEW3D_OT_layers(wmOperatorType *ot)
        ot->idname= "VIEW3D_OT_layers";
        
        /* api callbacks */
-       ot->invoke= layers_invoke;
-       ot->exec= layers_exec;
-       ot->poll= layers_poll;
+       ot->invoke= view3d_layers_invoke;
+       ot->exec= view3d_layers_exec;
+       ot->poll= view3d_layers_poll;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -262,7 +272,7 @@ void VIEW3D_OT_layers(wmOperatorType *ot)
 static char *view3d_modeselect_pup(Scene *scene)
 {
        Object *ob= OBACT;
-       static char string[1024];
+       static char string[256];
        static char formatstr[] = "|%s %%x%d %%i%d";
        char *str = string;
 
@@ -270,7 +280,8 @@ static char *view3d_modeselect_pup(Scene *scene)
        
        str += sprintf(str, formatstr, "Object Mode", OB_MODE_OBJECT, ICON_OBJECT_DATA);
        
-       if(ob==NULL) return string;
+       if(ob==NULL || ob->data==NULL) return string;
+       if(ob->id.lib || ((ID *)ob->data)->lib) return string;
        
        /* if active object is editable */
        if ( ((ob->type == OB_MESH)
@@ -303,12 +314,12 @@ static char *view3d_modeselect_pup(Scene *scene)
        if (ob->particlesystem.first || modifiers_findByType(ob, eModifierType_Cloth) || modifiers_findByType(ob, eModifierType_Softbody)) {
                str += sprintf(str, formatstr, "Particle Mode", OB_MODE_PARTICLE_EDIT, ICON_PARTICLEMODE);
        }
-
+       (void)str;
        return (string);
 }
 
 
-static void do_view3d_header_buttons(bContext *C, void *arg, int event)
+static void do_view3d_header_buttons(bContext *C, void *UNUSED(arg), int event)
 {
        wmWindow *win= CTX_wm_window(C);
        ToolSettings *ts= CTX_data_tool_settings(C);
@@ -363,8 +374,9 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event)
        case B_SEL_FACE:
                if(em) {
                        if( shift==0 || em->selectmode==0){
-                               if( ((ts->selectmode ^ SCE_SELECT_FACE) == SCE_SELECT_VERTEX) || ((ts->selectmode ^ SCE_SELECT_FACE) == SCE_SELECT_EDGE)){
-                                       if(ctrl) EM_convertsel(em, (ts->selectmode ^ SCE_SELECT_FACE),SCE_SELECT_FACE);
+                               if( ((em->selectmode ^ SCE_SELECT_FACE) == SCE_SELECT_VERTEX) || ((em->selectmode ^ SCE_SELECT_FACE) == SCE_SELECT_EDGE)){
+                                       if(ctrl)
+                                               EM_convertsel(em, (em->selectmode ^ SCE_SELECT_FACE),SCE_SELECT_FACE);
                                }
                                em->selectmode = SCE_SELECT_FACE;
                        }
@@ -421,6 +433,27 @@ static int object_mode_icon(int mode)
        return ICON_OBJECT_DATAMODE;
 }
 
+void uiTemplateEditModeSelection(uiLayout *layout, struct bContext *C)
+{
+       Object *obedit = CTX_data_edit_object(C);
+       uiBlock *block= uiLayoutGetBlock(layout);
+
+       uiBlockSetHandleFunc(block, do_view3d_header_buttons, NULL);
+
+       if(obedit && (obedit->type == OB_MESH)) {
+               EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
+               uiLayout *row;
+
+               row= uiLayoutRow(layout, 1);
+               block= uiLayoutGetBlock(row);
+               uiDefIconButBitS(block, TOG, SCE_SELECT_VERTEX, B_SEL_VERT, ICON_VERTEXSEL, 0,0,UI_UNIT_X,UI_UNIT_Y, &em->selectmode, 1.0, 0.0, 0, 0, "Vertex select mode");
+               uiDefIconButBitS(block, TOG, SCE_SELECT_EDGE, B_SEL_EDGE, ICON_EDGESEL, 0,0,UI_UNIT_X,UI_UNIT_Y, &em->selectmode, 1.0, 0.0, 0, 0, "Edge select mode");
+               uiDefIconButBitS(block, TOG, SCE_SELECT_FACE, B_SEL_FACE, ICON_FACESEL, 0,0,UI_UNIT_X,UI_UNIT_Y, &em->selectmode, 1.0, 0.0, 0, 0, "Face select mode");
+
+               BKE_mesh_end_editmesh(obedit->data, em);
+       }
+}
+
 void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
 {
        bScreen *screen= CTX_wm_screen(C);
@@ -433,8 +466,9 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
        Object *obedit = CTX_data_edit_object(C);
        uiBlock *block;
        uiLayout *row;
+       const float dpi_fac= UI_DPI_FAC;
        
-       RNA_pointer_create(&screen->id, &RNA_Space3DView, v3d, &v3dptr);        
+       RNA_pointer_create(&screen->id, &RNA_SpaceView3D, v3d, &v3dptr);        
        RNA_pointer_create(&scene->id, &RNA_ToolSettings, ts, &toolsptr);
        RNA_pointer_create(&scene->id, &RNA_Scene, scene, &sceneptr);
 
@@ -449,59 +483,44 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
                v3d->modeselect = ob->mode;
        else
                v3d->modeselect = OB_MODE_OBJECT;
-               
-       v3d->flag &= ~V3D_MODE;
-       
-       /* not sure what the v3d->flag is useful for now... modeselect is confusing */
-       if(obedit) v3d->flag |= V3D_EDITMODE;
-       if(ob && (ob->mode & OB_MODE_POSE)) v3d->flag |= V3D_POSEMODE;
-       if(ob && (ob->mode & OB_MODE_VERTEX_PAINT)) v3d->flag |= V3D_VERTEXPAINT;
-       if(ob && (ob->mode & OB_MODE_WEIGHT_PAINT)) v3d->flag |= V3D_WEIGHTPAINT;
-       if(ob && (ob->mode & OB_MODE_TEXTURE_PAINT)) v3d->flag |= V3D_TEXTUREPAINT;
-       if(paint_facesel_test(ob)) v3d->flag |= V3D_FACESELECT;
 
        uiBlockBeginAlign(block);
        uiDefIconTextButS(block, MENU, B_MODESELECT, object_mode_icon(v3d->modeselect), view3d_modeselect_pup(scene) , 
-                         0,0,126,20, &(v3d->modeselect), 0, 0, 0, 0, "Mode");
+                         0,0,126 * dpi_fac, UI_UNIT_Y, &(v3d->modeselect), 0, 0, 0, 0, "Mode");
        uiBlockEndAlign(block);
        
        /* Draw type */
-       uiItemR(layout, "", 0, &v3dptr, "viewport_shading", UI_ITEM_R_ICON_ONLY);
+       uiItemR(layout, &v3dptr, "viewport_shade", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
 
        if (obedit==NULL && ((ob && ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT)))) {
                /* Manipulators aren't used in weight paint mode */
                
                PointerRNA meshptr;
-
                RNA_pointer_create(&ob->id, &RNA_Mesh, ob->data, &meshptr);
-               uiItemR(layout, "", 0, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY);
+               if(ob->mode & (OB_MODE_TEXTURE_PAINT|OB_MODE_VERTEX_PAINT)) {
+                       uiItemR(layout, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+               } else {
+                       // Jason
+                       row= uiLayoutRow(layout, 1);
+                       uiItemR(row, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+                       uiItemR(row, &meshptr, "wp_vert_sel", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+               }
        } else {
-               char *str_menu;
+               const char *str_menu;
 
                row= uiLayoutRow(layout, 1);
-               uiItemR(row, "", 0, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY);
-               uiItemR(row, "", 0, &v3dptr, "pivot_point_align", UI_ITEM_R_ICON_ONLY);
-
-               /* NDOF */
-               /* Not implemented yet
-                if (G.ndofdevice ==0 ) {
-                       uiDefIconTextButC(block, ICONTEXTROW,B_NDOF, ICON_NDOF_TURN, ndof_pup(), 0,0,XIC+10,YIC, &(v3d->ndofmode), 0, 3.0, 0, 0, "Ndof mode");
-               
-                       uiDefIconButC(block, TOG, B_NDOF,  ICON_NDOF_DOM,
-                                         0,0,XIC,YIC,
-                                         &v3d->ndoffilter, 0, 1, 0, 0, "dominant axis");       
-               }
-                */
+               uiItemR(row, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+               uiItemR(row, &v3dptr, "use_pivot_point_align", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
 
                /* Transform widget / manipulators */
                row= uiLayoutRow(layout, 1);
-               uiItemR(row, "", 0, &v3dptr, "manipulator", UI_ITEM_R_ICON_ONLY);
+               uiItemR(row, &v3dptr, "show_manipulator", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
                block= uiLayoutGetBlock(row);
                
                if(v3d->twflag & V3D_USE_MANIPULATOR) {
-                       uiDefIconButBitS(block, TOG, V3D_MANIP_TRANSLATE, B_MAN_TRANS, ICON_MAN_TRANS, 0,0,XIC,YIC, &v3d->twtype, 1.0, 0.0, 0, 0, "Translate manipulator mode");
-                       uiDefIconButBitS(block, TOG, V3D_MANIP_ROTATE, B_MAN_ROT, ICON_MAN_ROT, 0,0,XIC,YIC, &v3d->twtype, 1.0, 0.0, 0, 0, "Rotate manipulator mode");
-                       uiDefIconButBitS(block, TOG, V3D_MANIP_SCALE, B_MAN_SCALE, ICON_MAN_SCALE, 0,0,XIC,YIC, &v3d->twtype, 1.0, 0.0, 0, 0, "Scale manipulator mode");
+                       uiDefIconButBitC(block, TOG, V3D_MANIP_TRANSLATE, B_MAN_TRANS, ICON_MAN_TRANS, 0,0,UI_UNIT_X,UI_UNIT_Y, &v3d->twtype, 1.0, 0.0, 0, 0, "Translate manipulator mode");
+                       uiDefIconButBitC(block, TOG, V3D_MANIP_ROTATE, B_MAN_ROT, ICON_MAN_ROT, 0,0,UI_UNIT_X,UI_UNIT_Y, &v3d->twtype, 1.0, 0.0, 0, 0, "Rotate manipulator mode");
+                       uiDefIconButBitC(block, TOG, V3D_MANIP_SCALE, B_MAN_SCALE, ICON_MAN_SCALE, 0,0,UI_UNIT_X,UI_UNIT_Y, &v3d->twtype, 1.0, 0.0, 0, 0, "Scale manipulator mode");
                }
                        
                if (v3d->twmode > (BIF_countTransformOrientation(C) - 1) + V3D_MANIP_CUSTOM) {
@@ -509,33 +528,23 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
                }
                        
                str_menu = BIF_menustringTransformOrientation(C, "Orientation");
-               uiDefButS(block, MENU, B_MAN_MODE, str_menu,0,0,70,YIC, &v3d->twmode, 0, 0, 0, 0, "Transform Orientation");
-               MEM_freeN(str_menu);
+               uiDefButC(block, MENU, B_MAN_MODE, str_menu,0,0,70 * dpi_fac, UI_UNIT_Y, &v3d->twmode, 0, 0, 0, 0, "Transform Orientation");
+               MEM_freeN((void *)str_menu);
        }
-               
+
        if(obedit==NULL && v3d->localvd==NULL) {
-               int ob_lay = ob ? ob->lay : 0;
+               unsigned int ob_lay = ob ? ob->lay : 0;
                
                /* Layers */
                if (v3d->scenelock)
-                       uiTemplateLayers(layout, &sceneptr, "visible_layers", &v3dptr, "used_layers", ob_lay);
+                       uiTemplateLayers(layout, &sceneptr, "layers", &v3dptr, "layers_used", ob_lay);
                else
-                       uiTemplateLayers(layout, &v3dptr, "visible_layers", &v3dptr, "used_layers", ob_lay);
+                       uiTemplateLayers(layout, &v3dptr, "layers", &v3dptr, "layers_used", ob_lay);
 
                /* Scene lock */
-               uiItemR(layout, "", 0, &v3dptr, "lock_camera_and_layers", UI_ITEM_R_ICON_ONLY);
+               uiItemR(layout, &v3dptr, "lock_camera_and_layers", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
        }
        
-       /* selection modus, dont use python for this since it cant do the toggle buttons with shift+click as well as clicking to set one. */
-       if(obedit && (obedit->type == OB_MESH)) {
-               EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-
-               row= uiLayoutRow(layout, 1);
-               block= uiLayoutGetBlock(row);
-               uiDefIconButBitS(block, TOG, SCE_SELECT_VERTEX, B_SEL_VERT, ICON_VERTEXSEL, 0,0,XIC,YIC, &em->selectmode, 1.0, 0.0, 0, 0, "Vertex select mode");
-               uiDefIconButBitS(block, TOG, SCE_SELECT_EDGE, B_SEL_EDGE, ICON_EDGESEL, 0,0,XIC,YIC, &em->selectmode, 1.0, 0.0, 0, 0, "Edge select mode");
-               uiDefIconButBitS(block, TOG, SCE_SELECT_FACE, B_SEL_FACE, ICON_FACESEL, 0,0,XIC,YIC, &em->selectmode, 1.0, 0.0, 0, 0, "Face select mode");
-
-               BKE_mesh_end_editmesh(obedit->data, em);
-       }
+       uiTemplateEditModeSelection(layout, C);
 }
+