UI: Improve toolbar width snapping
authorHarley Acheson <harley.acheson@gmail.com>
Fri, 3 Jan 2020 04:37:35 +0000 (15:37 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 3 Jan 2020 04:37:35 +0000 (15:37 +1100)
Allow narrower toolbar before snapping to two column layout.

source/blender/editors/screen/area_utils.c

index 61fb9d5a3a8c0aafccd6cc5e69e8cbd1666338f9..fc76b3f7c0948e72edff50adfe2279b2507c54eb 100644 (file)
@@ -33,6 +33,7 @@
 #include "ED_screen.h"
 
 #include "UI_interface.h"
+#include "UI_interface_icons.h"
 
 /* -------------------------------------------------------------------- */
 /** \name Generic Tool System Region Callbacks
@@ -63,17 +64,23 @@ void ED_region_generic_tools_region_message_subscribe(const struct bContext *UNU
 int ED_region_generic_tools_region_snap_size(const ARegion *ar, int size, int axis)
 {
   if (axis == 0) {
-    /* Note, this depends on the icon size: see #ICON_DEFAULT_HEIGHT_TOOLBAR. */
-    const float snap_units[] = {2 + 0.8f, 4 + 0.8f};
     const float aspect = BLI_rctf_size_x(&ar->v2d.cur) / (BLI_rcti_size_x(&ar->v2d.mask) + 1);
+    const int icon_size = ICON_DEFAULT_HEIGHT_TOOLBAR / aspect;
+    const float column = 1.25f * icon_size;
+    const float margin = 0.5f * icon_size;
+    const float snap_units[] = {
+        column + margin, (2.0f * column) + margin, (2.7f * column) + margin};
     int best_diff = INT_MAX;
     int best_size = size;
-    for (uint i = 0; i < ARRAY_SIZE(snap_units); i += 1) {
-      const int test_size = (snap_units[i] * U.widget_unit) / (UI_DPI_FAC * aspect);
-      const int test_diff = ABS(test_size - size);
-      if (test_diff < best_diff) {
-        best_size = test_size;
-        best_diff = test_diff;
+    /* Only snap if less than last snap unit. */
+    if (size <= snap_units[ARRAY_SIZE(snap_units) - 1]) {
+      for (uint i = 0; i < ARRAY_SIZE(snap_units); i += 1) {
+        const int test_size = snap_units[i];
+        const int test_diff = ABS(test_size - size);
+        if (test_diff < best_diff) {
+          best_size = test_size;
+          best_diff = test_diff;
+        }
       }
     }
     return best_size;