3D Cursor: Add option to lock it in place to prevent accidental modification
authorJoshua Leung <aligorith@gmail.com>
Sun, 13 Dec 2015 14:06:06 +0000 (03:06 +1300)
committerJoshua Leung <aligorith@gmail.com>
Sun, 13 Dec 2015 14:06:51 +0000 (03:06 +1300)
This option helps users protect themselves from accidentally changing the cursor
location (and not being aware of this until it has already caused problems)
when drawing using Grease Pencil (or with other tools where this is equally likely).
It seems to occur most frequently when using a tablet.

Currently, this only affects the use of the mouse to set the cursor, as this is
where most accidental invocations occur.

(I'm aware that this change may turn out to be quite contentious. Fortunately, it
should be simple to just revert this commit in that case :)

release/scripts/startup/bl_ui/space_view3d.py
source/blender/editors/space_view3d/view3d_edit.c
source/blender/makesdna/DNA_view3d_types.h
source/blender/makesrna/intern/rna_space.c

index 4dc4b667a63b41f4803d429ddb03aad7e0bba5db..da4fb04cb5d782ed94b98a2e2db61e9e10648a6a 100644 (file)
@@ -3005,7 +3005,12 @@ class VIEW3D_PT_view3d_cursor(Panel):
         layout = self.layout
 
         view = context.space_data
-        layout.column().prop(view, "cursor_location", text="Location")
+
+        layout.prop(view, "lock_cursor_location")
+
+        col = layout.column()
+        col.active = not view.lock_cursor_location
+        col.prop(view, "cursor_location", text="Location")
 
 
 class VIEW3D_PT_view3d_name(Panel):
index b09cbedb6fa6c55060f50bbc773a50f863be855e..1d988e9bcfbe5038da2782b78e9566d36ad5b46c 100644 (file)
@@ -4679,9 +4679,21 @@ static int view3d_cursor3d_invoke(bContext *C, wmOperator *UNUSED(op), const wmE
        return OPERATOR_FINISHED;
 }
 
-void VIEW3D_OT_cursor3d(wmOperatorType *ot)
+static int view3d_cursor3d_poll(bContext *C)
 {
+       if (ED_operator_region_view3d_active(C)) {
+               View3D *v3d = CTX_wm_view3d(C);
+               
+               /* only if not locked */
+               if ((v3d->flag & V3D_LOCK_CURSOR) == 0)
+                       return true;
+       }
+       
+       return false;
+}
 
+void VIEW3D_OT_cursor3d(wmOperatorType *ot)
+{
        /* identifiers */
        ot->name = "Set 3D Cursor";
        ot->description = "Set the location of the 3D cursor";
@@ -4689,8 +4701,7 @@ void VIEW3D_OT_cursor3d(wmOperatorType *ot)
 
        /* api callbacks */
        ot->invoke = view3d_cursor3d_invoke;
-
-       ot->poll = ED_operator_region_view3d_active;
+       ot->poll = view3d_cursor3d_poll;
 
        /* flags */
 //     ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
index 0ef8f2616c4a00966a6e518b0e2b22a3fd539a0a..176edd5a5847c10a26236b3b5417a93eb64113b9 100644 (file)
@@ -250,6 +250,7 @@ typedef struct View3D {
 #define V3D_DISPBGPICS         2
 #define V3D_HIDE_HELPLINES     4
 #define V3D_INVALID_BACKBUF    8
+#define V3D_LOCK_CURSOR                16
 
 #define V3D_ALIGN                      1024
 #define V3D_SELECT_OUTLINE     2048
index ad26891c96ae263c48edec7f4ee07d3e722a02a3..53b89336bb509a13b4e31793a9a266bd808784c3 100644 (file)
@@ -2392,6 +2392,11 @@ static void rna_def_space_view3d(BlenderRNA *brna)
        RNA_def_property_boolean_sdna(prop, NULL, "ob_centre_cursor", 1);
        RNA_def_property_ui_text(prop, "Lock to Cursor", "3D View center is locked to the cursor's position");
        RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+       
+       prop = RNA_def_property(srna, "lock_cursor_location", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_LOCK_CURSOR);
+       RNA_def_property_ui_text(prop, "Lock Cursor Location", "3D Cursor location is locked to prevent it from being accidentally moved");
+       RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
 
        prop = RNA_def_property(srna, "viewport_shade", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "drawtype");