diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp
index 38af63464..99a2f229f 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp
@@ -1065,34 +1065,57 @@ void GLGizmosManager::update_on_off_state(const Vec2d& mouse_pos)
     float scaled_stride_y = scaled_icons_size + scaled_gap_y;
     float top_y = 0.5f * (cnv_h - height) + scaled_border;
 
-    for (GizmosMap::iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it)
+    auto inside = [scaled_border, scaled_icons_size, &mouse_pos](float top_y) {
+        return (scaled_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= scaled_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size);
+    };
+
+    bool could_activate = true;
+    for (std::pair<const GLGizmosManager::EType, GLGizmoBase*> &type_and_gizmo : m_gizmos)
     {
-        if ((it->second == nullptr) || !it->second->is_selectable())
+        GLGizmoBase *gizmo = type_and_gizmo.second;
+        if ((gizmo == nullptr) || !gizmo->is_selectable())
             continue;
 
-        bool inside = (scaled_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= scaled_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size);
-        if (it->second->is_activable() && inside)
-        {
-            if ((it->second->get_state() == GLGizmoBase::On))
-            {
-                it->second->set_state(GLGizmoBase::Hover);
-                m_current = Undefined;
-            }
-            else if ((it->second->get_state() == GLGizmoBase::Hover))
-            {
-                it->second->set_state(GLGizmoBase::On);
-                m_current = it->first;
+        if (! (gizmo->is_activable() && inside(top_y))) {
+            gizmo->set_state(GLGizmoBase::Off);
+            if (gizmo->get_state() != GLGizmoBase::Off) {
+                // Gizmo refused to leave it's active state. Don't try to select
+                could_activate = false;
             }
         }
-        else
-            it->second->set_state(GLGizmoBase::Off);
 
         top_y += scaled_stride_y;
     }
 
-    GizmosMap::iterator it = m_gizmos.find(m_current);
-    if ((it != m_gizmos.end()) && (it->second != nullptr) && (it->second->get_state() != GLGizmoBase::On))
-        it->second->set_state(GLGizmoBase::On);
+    top_y = 0.5f * (cnv_h - height) + scaled_border;
+    for (std::pair<const GLGizmosManager::EType, GLGizmoBase*> &type_and_gizmo : m_gizmos)
+    {
+        GLGizmoBase *gizmo = type_and_gizmo.second;
+        if ((gizmo == nullptr) || !gizmo->is_selectable())
+            continue;
+
+        if (gizmo->is_activable() && inside(top_y))
+        {
+            if ((gizmo->get_state() == GLGizmoBase::On))
+            {
+                gizmo->set_state(GLGizmoBase::Hover);
+                m_current = Undefined;
+            }
+            else if ((gizmo->get_state() == GLGizmoBase::Hover) && could_activate)
+            {
+                gizmo->set_state(GLGizmoBase::On);
+                m_current = type_and_gizmo.first;
+            }
+        }
+
+        top_y += scaled_stride_y;
+    }
+
+    if (could_activate) {
+        GizmosMap::iterator it = m_gizmos.find(m_current);
+        if ((it != m_gizmos.end()) && (it->second != nullptr) && (it->second->get_state() != GLGizmoBase::On))
+            it->second->set_state(GLGizmoBase::On);
+    }
 }
 
 std::string GLGizmosManager::update_hover_state(const Vec2d& mouse_pos)