UI: move object selector into 3D view
authorCampbell Barton <ideasman42@gmail.com>
Tue, 1 May 2018 18:12:06 +0000 (20:12 +0200)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 1 May 2018 20:33:10 +0000 (22:33 +0200)
This matches the new convention for left-handed mode selectors,
however we're still undecided on exactly how this should work.

For now test this out as a convention for all space types.

release/scripts/startup/bl_ui/space_topbar.py
release/scripts/startup/bl_ui/space_view3d.py
source/blender/editors/include/UI_interface.h
source/blender/editors/space_view3d/view3d_header.c
source/blender/makesrna/intern/rna_ui_api.c

index 0189f9fc100144f9b85df81f83dde728c5fc4ce6..dad13ce9f1e43d99c45b953dc3edd00263508b93 100644 (file)
@@ -117,13 +117,12 @@ class TOPBAR_HT_lower_bar(Header):
         # Object Mode
         # -----------
 
+        # Testing move to 3D header.
+        '''
         object_mode = 'OBJECT' if object is None else object.mode
         act_mode_item = bpy.types.Object.bl_rna.properties['mode'].enum_items[object_mode]
         layout.operator_menu_enum("object.mode_set", "mode", text=act_mode_item.name, icon=act_mode_item.icon)
-
-    def draw_center(self, context):
-        layout = self.layout
-        mode = context.mode
+        '''
 
         # Active Tool
         # -----------
@@ -131,6 +130,10 @@ class TOPBAR_HT_lower_bar(Header):
         from .space_toolsystem_common import ToolSelectPanelHelper
         ToolSelectPanelHelper.draw_active_tool_header(context, layout)
 
+    def draw_center(self, context):
+        layout = self.layout
+        mode = context.mode
+
         layout.separator()
 
         # Object Mode Options
index 23ae4118a5777645a93407fa1a427257ff973778..089e83c9aab73a2120b0433abf3bf16853a70e67 100644 (file)
@@ -42,6 +42,13 @@ class VIEW3D_HT_header(Header):
         row = layout.row(align=True)
         row.template_header()
 
+        mode = 'OBJECT' if obj is None else obj.mode
+        act_mode_item = bpy.types.Object.bl_rna.properties['mode'].enum_items[mode]
+        layout.operator_menu_enum("object.mode_set", "mode", text=act_mode_item.name, icon=act_mode_item.icon)
+        del act_mode_item
+
+        layout.template_header_3D_mode()
+
         VIEW3D_MT_editor_menus.draw_collapsible(context, layout)
 
         # Contains buttons like Mode, Pivot, Manipulator, Layer, Mesh Select Mode...
@@ -52,7 +59,9 @@ class VIEW3D_HT_header(Header):
         layout.template_header_3D()
 
         if obj:
-            mode = obj.mode
+            # Set above:
+            # mode = obj.mode
+
             # Particle edit
             if mode == 'PARTICLE_EDIT':
                 row.prop(toolsettings.particle_edit, "select_mode", text="", expand=True)
index 20c4552e6b29a249cb1ef8d866acc72f2a51da6b..33dc12f83aa336a645cb82f069e902f2f474999b 100644 (file)
@@ -1031,6 +1031,7 @@ eAutoPropButsReturn uiTemplateOperatorPropertyButs(
         const struct bContext *C, uiLayout *layout, struct wmOperator *op,
         bool (*check_prop)(struct PointerRNA *, struct PropertyRNA *),
         const eButLabelAlign label_align, const short flag);
+void uiTemplateHeader3D_mode(uiLayout *layout, struct bContext *C);
 void uiTemplateHeader3D(uiLayout *layout, struct bContext *C);
 void uiTemplateEditModeSelection(uiLayout *layout, struct bContext *C);
 void uiTemplateReportsBanner(uiLayout *layout, struct bContext *C);
index 8f6f0b70fdc193980fe15fe2f332815562352f0c..52a8562b6ba94d8353c9308659a5df2f13aaadce 100644 (file)
@@ -274,6 +274,47 @@ void uiTemplateEditModeSelection(uiLayout *layout, struct bContext *C)
        }
 }
 
+static void uiTemplatePaintModeSelection(uiLayout *layout, struct bContext *C)
+{
+       ViewLayer *view_layer = CTX_data_view_layer(C);
+       Object *ob = OBACT(view_layer);
+
+       /* Manipulators aren't used in paint modes */
+       if (!ELEM(ob->mode, OB_MODE_SCULPT, OB_MODE_PARTICLE_EDIT)) {
+               /* masks aren't used for sculpt and particle painting */
+               PointerRNA meshptr;
+
+               RNA_pointer_create(ob->data, &RNA_Mesh, ob->data, &meshptr);
+               if (ob->mode & (OB_MODE_TEXTURE_PAINT)) {
+                       uiItemR(layout, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+               }
+               else {
+                       uiLayout *row = uiLayoutRow(layout, true);
+                       uiItemR(row, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+                       uiItemR(row, &meshptr, "use_paint_mask_vertex", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+               }
+       }
+}
+
+void uiTemplateHeader3D_mode(uiLayout *layout, struct bContext *C)
+{
+       /* Extracted from: uiTemplateHeader3D */
+       ViewLayer *view_layer = CTX_data_view_layer(C);
+       Object *ob = OBACT(view_layer);
+       Object *obedit = CTX_data_edit_object(C);
+       bGPdata *gpd = CTX_data_gpencil_data(C);
+
+       bool is_paint = (
+               ob && !(gpd && (gpd->flag & GP_DATA_STROKE_EDITMODE)) &&
+               ELEM(ob->mode,
+                    OB_MODE_SCULPT, OB_MODE_VERTEX_PAINT, OB_MODE_WEIGHT_PAINT, OB_MODE_TEXTURE_PAINT));
+
+       uiTemplateEditModeSelection(layout, C);
+       if ((obedit == NULL) && is_paint) {
+               uiTemplatePaintModeSelection(layout, C);
+       }
+}
+
 void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
 {
        bScreen *screen = CTX_wm_screen(C);
@@ -310,21 +351,11 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
        }
 
        if (obedit == NULL && is_paint) {
-               /* Manipulators aren't used in paint modes */
-               if (!ELEM(ob->mode, OB_MODE_SCULPT, OB_MODE_PARTICLE_EDIT)) {
-                       /* masks aren't used for sculpt and particle painting */
-                       PointerRNA meshptr;
-
-                       RNA_pointer_create(ob->data, &RNA_Mesh, ob->data, &meshptr);
-                       if (ob->mode & (OB_MODE_TEXTURE_PAINT)) {
-                               uiItemR(layout, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
-                       }
-                       else {
-                               row = uiLayoutRow(layout, true);
-                               uiItemR(row, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
-                               uiItemR(row, &meshptr, "use_paint_mask_vertex", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
-                       }
-               }
+               /* Currently Python calls this directly. */
+#if 0
+               uiTemplatePaintModeSelection(layout, C);
+#endif
+
        }
        else {
                /* Transform widget / manipulators */
@@ -337,6 +368,9 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
                /* Scene lock */
                uiItemR(layout, &v3dptr, "lock_camera_and_layers", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
        }
-       
+
+       /* Currently Python calls this directly. */
+#if 0
        uiTemplateEditModeSelection(layout, C);
+#endif
 }
index eb23f6244384fe3beedc0ee1fae6d0f2d0e7239a..cb72e237577dbe9d7849ea69ca1fa69ebea1c24a 100644 (file)
@@ -982,6 +982,9 @@ void RNA_api_ui_layout(StructRNA *srna)
        RNA_def_function_flag(func, FUNC_USE_CONTEXT);
        RNA_def_function_ui_description(func, "Inserts common 3DView header UI (selectors for context mode, shading, etc.)");
 
+       func = RNA_def_function(srna, "template_header_3D_mode", "uiTemplateHeader3D_mode");
+       RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+       RNA_def_function_ui_description(func, "");
 
        func = RNA_def_function(srna, "template_edit_mode_selection", "uiTemplateEditModeSelection");
        RNA_def_function_flag(func, FUNC_USE_CONTEXT);