WM: use different drag thresholds for mouse/tablet events
authorCampbell Barton <ideasman42@gmail.com>
Thu, 30 May 2019 04:47:24 +0000 (14:47 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 30 May 2019 05:03:19 +0000 (15:03 +1000)
Now a small threshold is used for mouse input,
avoiding delay when gizmos are activated on drag.

Tablet input threshold remains unchanged since
it's easier to make small movements when using a tablet.

A larger threshold for non-cursor input is now used (typically keyboard)
which improves usability when the "Pie Menu on Drag" key-map preference.

release/scripts/startup/bl_ui/space_userpref.py
source/blender/blenkernel/BKE_blender_version.h
source/blender/blenloader/intern/versioning_userdef.c
source/blender/makesdna/DNA_userdef_types.h
source/blender/makesrna/intern/rna_userdef.c
source/blender/windowmanager/intern/wm_event_system.c

index d1d65d7..79f7cdf 100644 (file)
@@ -1433,9 +1433,11 @@ class USERPREF_PT_input_mouse(PreferencePanel, Panel):
         flow.prop(inputs, "use_mouse_emulate_3_button")
         flow.prop(inputs, "use_mouse_continuous")
         flow.prop(inputs, "use_drag_immediately")
+        flow.prop(inputs, "mouse_double_click_time", text="Double Click Speed")
+        flow.prop(inputs, "drag_threshold_mouse")
+        flow.prop(inputs, "drag_threshold_tablet")
         flow.prop(inputs, "drag_threshold")
         flow.prop(inputs, "move_threshold")
-        flow.prop(inputs, "mouse_double_click_time", text="Double Click Speed")
 
 
 class USERPREF_PT_navigation_orbit(PreferencePanel, Panel):
index 7461a1b..887082a 100644 (file)
@@ -27,7 +27,7 @@
  * \note Use #STRINGIFY() rather than defining with quotes.
  */
 #define BLENDER_VERSION 280
-#define BLENDER_SUBVERSION 72
+#define BLENDER_SUBVERSION 73
 /** Several breakages with 280, e.g. collections vs layers. */
 #define BLENDER_MINVERSION 280
 #define BLENDER_MINSUBVERSION 0
index 89f4d86..7ff9dd7 100644 (file)
@@ -411,9 +411,6 @@ void BLO_version_defaults_userpref_blend(Main *bmain, UserDef *userdef)
         userdef->ndof_flag |= NDOF_TURNTABLE;
       }
     }
-    if (userdef->tweak_threshold == 0) {
-      userdef->tweak_threshold = 10;
-    }
   }
 
   /* NOTE!! from now on use userdef->versionfile and userdef->subversionfile */
@@ -604,6 +601,12 @@ void BLO_version_defaults_userpref_blend(Main *bmain, UserDef *userdef)
     userdef->pref_flag |= USER_PREF_FLAG_SAVE;
   }
 
+  if (!USER_VERSION_ATLEAST(280, 73)) {
+    userdef->drag_threshold = 30;
+    userdef->drag_threshold_mouse = 3;
+    userdef->drag_threshold_tablet = 10;
+  }
+
   /**
    * Include next version bump.
    */
index fa12de5..3fbdbbb 100644 (file)
@@ -735,7 +735,9 @@ typedef struct UserDef {
 
   /** Options for text rendering. */
   short text_render;
-  char _pad9[2];
+  char _pad9;
+
+  char navigation_mode;
 
   /** From texture.h. */
   struct ColorBand coba_weight;
@@ -744,9 +746,11 @@ typedef struct UserDef {
   /** Default color for newly created Grease Pencil layers. */
   float gpencil_new_layer_col[4];
 
-  short tweak_threshold;
+  /** Drag pixels (scaled by DPI). */
+  char drag_threshold_mouse;
+  char drag_threshold_tablet;
+  char drag_threshold;
   char move_threshold;
-  char navigation_mode;
 
   char font_path_ui[1024];
   char font_path_ui_mono[1024];
index d06e938..f505e4d 100644 (file)
@@ -5201,23 +5201,37 @@ static void rna_def_userdef_input(BlenderRNA *brna)
   RNA_def_property_ui_text(prop, "Walk Navigation", "Settings for walk navigation mode");
 
   /* tweak tablet & mouse preset */
+  prop = RNA_def_property(srna, "drag_threshold_mouse", PROP_INT, PROP_PIXEL);
+  RNA_def_property_range(prop, 3, 255);
+  RNA_def_property_ui_text(prop,
+                           "Mouse Drag Threshold",
+                           "Number of pixels to drag before a tweak/drag event is triggered "
+                           "for mouse/track-pad input "
+                           "(otherwise click events are detected)");
+
+  prop = RNA_def_property(srna, "drag_threshold_tablet", PROP_INT, PROP_PIXEL);
+  RNA_def_property_range(prop, 3, 255);
+  RNA_def_property_ui_text(prop,
+                           "Tablet Drag Threshold",
+                           "Number of pixels to drag before a tweak/drag event is triggered "
+                           "for tablet input "
+                           "(otherwise click events are detected)");
+
   prop = RNA_def_property(srna, "drag_threshold", PROP_INT, PROP_PIXEL);
-  RNA_def_property_int_sdna(prop, NULL, "tweak_threshold");
-  RNA_def_property_range(prop, 3, 1024);
-  RNA_def_property_ui_text(
-      prop,
-      "Drag Threshold",
-      "Number of pixels you have to drag before a tweak/drag event is triggered "
-      "(otherwise click events are detected)");
+  RNA_def_property_range(prop, 3, 255);
+  RNA_def_property_ui_text(prop,
+                           "Drag Threshold",
+                           "Number of pixels to drag before a drag event is triggered "
+                           "for keyboard and other non mouse/tablet input "
+                           "(otherwise click events are detected)");
 
   prop = RNA_def_property(srna, "move_threshold", PROP_INT, PROP_PIXEL);
   RNA_def_property_range(prop, 0, 255);
   RNA_def_property_ui_range(prop, 0, 10, 1, -1);
-  RNA_def_property_ui_text(
-      prop,
-      "Motion Threshold",
-      "Number of pixels you have to before the cursor is considered to have moved "
-      "(used for cycling selected items on successive clicks)");
+  RNA_def_property_ui_text(prop,
+                           "Motion Threshold",
+                           "Number of pixels to before the cursor is considered to have moved "
+                           "(used for cycling selected items on successive clicks)");
 
   /* tablet pressure curve */
   prop = RNA_def_property(srna, "pressure_threshold_max", PROP_FLOAT, PROP_FACTOR);
index 7aad89a..387bc94 100644 (file)
@@ -5191,9 +5191,20 @@ bool WM_window_modal_keymap_status_draw(bContext *UNUSED(C), wmWindow *win, uiLa
  *
  * \{ */
 
-int WM_event_drag_threshold(const struct wmEvent *UNUSED(event))
+int WM_event_drag_threshold(const struct wmEvent *event)
 {
-  return (int)((float)U.tweak_threshold * U.dpi_fac);
+  int drag_threshold;
+  if (WM_event_is_tablet(event)) {
+    drag_threshold = U.drag_threshold_tablet;
+  }
+  else if (ISMOUSE(event->prevtype)) {
+    drag_threshold = U.drag_threshold_mouse;
+  }
+  else {
+    /* Typically keyboard, could be NDOF button or other less common types. */
+    drag_threshold = U.drag_threshold;
+  }
+  return drag_threshold * U.dpi_fac;
 }
 
 bool WM_event_drag_test_with_delta(const wmEvent *event, const int drag_delta[2])