From 920f0b4882ce9ada53be63aa9da4a23d8b0ee728 Mon Sep 17 00:00:00 2001 From: David Cattermole Date: Thu, 25 Jun 2020 16:22:58 +0930 Subject: [PATCH] Only update Maya selection when the Solver UI window has active focus. Removed temp fix for the same problem by using evalDeferred to update selection. --- .../mmSolver/tools/solver/maya_callbacks.py | 15 +++-------- .../tools/solver/widget/attribute_widget.py | 25 +++++++++++-------- .../tools/solver/widget/object_widget.py | 16 +++++++----- 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/python/mmSolver/tools/solver/maya_callbacks.py b/python/mmSolver/tools/solver/maya_callbacks.py index 69a2c217a..1c3b0dfa4 100644 --- a/python/mmSolver/tools/solver/maya_callbacks.py +++ b/python/mmSolver/tools/solver/maya_callbacks.py @@ -550,15 +550,8 @@ def selection_changed_func(clientData): """ if mmapi.is_solver_running() is True: return - - def func(): - if mmapi.is_solver_running() is True: - return - sel_uuids = maya.cmds.ls(selection=True, uuid=True) or [] - valid = uiutils.isValidQtObject(clientData) - if clientData is not None and valid is True: - clientData.setNodeSelection(sel_uuids) - return - - maya.cmds.evalDeferred(func, lowestPriority=True) + sel_uuids = maya.cmds.ls(selection=True, uuid=True) or [] + valid = uiutils.isValidQtObject(clientData) + if clientData is not None and valid is True: + clientData.setNodeSelection(sel_uuids) return diff --git a/python/mmSolver/tools/solver/widget/attribute_widget.py b/python/mmSolver/tools/solver/widget/attribute_widget.py index de465cb52..9edadb3f5 100644 --- a/python/mmSolver/tools/solver/widget/attribute_widget.py +++ b/python/mmSolver/tools/solver/widget/attribute_widget.py @@ -484,16 +484,21 @@ def selectionChanged(self, selected, deselected): selected_nodes = _lookupMayaNodesFromAttrUINodes( selected_indexes, self.filterModel) - # Because an attribute and node may refer to the same - # underlying node name, we must be sure we don't deselect a - # node that has other attributes selected. - deselect_nodes = list(set(deselect_nodes) - set(selected_nodes)) - try: - mmapi.set_solver_running(True) # disable selection callback. - lib_maya_utils.add_scene_selection(select_nodes) - lib_maya_utils.remove_scene_selection(deselect_nodes) - finally: - mmapi.set_solver_running(False) # enable selection callback + if self.isActiveWindow() is True: + # Only allow Maya selection changes when the user has the + # UI focused. This breaks the Maya and Qt selection + # callback cycle. + + # Because an attribute and node may refer to the same + # underlying node name, we must be sure we don't deselect a + # node that has other attributes selected. + deselect_nodes = list(set(deselect_nodes) - set(selected_nodes)) + try: + mmapi.set_solver_running(True) # disable selection callback. + lib_maya_utils.add_scene_selection(select_nodes) + lib_maya_utils.remove_scene_selection(deselect_nodes) + finally: + mmapi.set_solver_running(False) # enable selection callback return @QtCore.Slot(bool) diff --git a/python/mmSolver/tools/solver/widget/object_widget.py b/python/mmSolver/tools/solver/widget/object_widget.py index 59551ad6d..f63183982 100644 --- a/python/mmSolver/tools/solver/widget/object_widget.py +++ b/python/mmSolver/tools/solver/widget/object_widget.py @@ -388,12 +388,16 @@ def selectionChanged(self, selected, deselected): deselect_indexes, self.filterModel ) - try: - mmapi.set_solver_running(True) # disable selection callback. - lib_maya_utils.add_scene_selection(select_nodes) - lib_maya_utils.remove_scene_selection(deselect_nodes) - finally: - mmapi.set_solver_running(False) # enable selection callback + if self.isActiveWindow() is True: + # Only allow Maya selection changes when the user has the + # UI focused. This breaks the Maya and Qt selection + # callback cycle. + try: + mmapi.set_solver_running(True) # disable selection callback. + lib_maya_utils.add_scene_selection(select_nodes) + lib_maya_utils.remove_scene_selection(deselect_nodes) + finally: + mmapi.set_solver_running(False) # enable selection callback return @QtCore.Slot(bool)