def createTreeView(self):
        """
        Set up the tree view.
        """
        self.treeView = attr_treeview.AttributeTreeView()
        self.ui.treeViewLayout.addWidget(self.treeView)

        root = attr_nodes.PlugNode('root')
        self.model = attr_nodes.AttrModel(root, font=self.font)
        self.filterModel = QtCore.QSortFilterProxyModel()
        self.filterModel.setSourceModel(self.model)
        self.filterModel.setDynamicSortFilter(False)
        self.header = QtWidgets.QHeaderView(QtCore.Qt.Horizontal,
                                            parent=self.treeView)
        Qt.QtCompat.QHeaderView.setSectionResizeMode(
            self.header, QtWidgets.QHeaderView.ResizeToContents)
        self.treeView.setHeader(self.header)

        self.treeView.setModel(self.filterModel)
        self.treeView.setSortingEnabled(True)
        self.treeView.sortByColumn(0, QtCore.Qt.AscendingOrder)
        self.treeView.setSelectionMode(
            QtWidgets.QAbstractItemView.MultiSelection)
        self.selModel = self.treeView.selectionModel()
        self.selModel.selectionChanged.connect(self.selectionChanged)

        # Always hide the UUID Column - it's used for selection of
        # ModelIndexes with Maya node UUIDs only.
        hidden = True
        column = self.model.getColumnIndexFromColumnName(
            const.ATTR_COLUMN_NAME_UUID)
        self.treeView.setColumnHidden(column, hidden)
        return
示例#2
0
def attributesToUINodes(col, attr_list, show_anm, show_stc, show_lck):
    """
    Convert a list of mmSolver API Attributes into classes to be used
    in the Solver UI.

    :param col: The Collection the Attributes belong to.
    :param col: Collection

    :param attr_list: List of Attributes to convert.
    :type attr_list: [Attribute, ..]

    :param show_anm: Should the animated attributes be visible?
    :type show_anm: bool

    :param show_stc: Should the static attributes be visible?
    :type show_stc: bool

    :param show_lck: Should the locked attributes be visible?
    :type show_lck: bool

    :returns: A hierarchy of UI nodes to be viewed in a 'tree view'.
    :rtype: PlugNode
    """
    root = attr_nodes.PlugNode('root')
    maya_nodes = dict()
    for attr in attr_list:
        attr_state = attr.get_state()
        is_animated = attr_state == mmapi.ATTR_STATE_ANIMATED
        is_static = attr_state == mmapi.ATTR_STATE_STATIC
        is_locked = attr_state == mmapi.ATTR_STATE_LOCKED
        if is_animated is True and show_anm is False:
            continue
        elif is_static is True and show_stc is False:
            continue
        elif is_locked is True and show_lck is False:
            continue
        full_name = attr.get_node(full_path=True)
        maya_node = maya_nodes.get(full_name)
        data = {'data': attr, 'collection': col}
        if maya_node is None:
            node_data = dict()
            # Add only the first attribute to the MayaNode
            # object. Other attributes will be added as they come up.
            node_data['data'] = [attr]
            short_name = full_name.rpartition('|')[-1]
            maya_node = attr_nodes.MayaNode(short_name,
                                            data=node_data,
                                            parent=root)
            maya_node.setNeverHasChildren(False)
            maya_nodes[full_name] = maya_node
        else:
            # Add subsequent attributes to the MayaNode object.
            node_data = maya_node.data()
            node_data['data'].append(attr)
            maya_node.setData(node_data)
        a = attr.get_attr()
        attr_node = attr_nodes.AttrNode(a, data=data, parent=maya_node)
        attr_node.setNeverHasChildren(True)
    return root
示例#3
0
def attributesToUINodes(attr_list):
    root = attr_nodes.PlugNode('root')
    maya_nodes = dict()
    for attr in attr_list:
        n = attr.get_node()
        a = attr.get_attr()
        maya_node = maya_nodes.get(n)
        if maya_node is None:
            data = {'data': None}
            maya_node = attr_nodes.MayaNode(n, data=data, parent=root)
            maya_nodes[n] = maya_node
        data = {'data': attr}
        attr_node = attr_nodes.AttrNode(a, data=data, parent=maya_node)
    return root
示例#4
0
def attributesToUINodes(col, attr_list, show_anm, show_stc, show_lck):
    """
    Convert a list of mmSolver API Attributes into classes to be used
    in the Solver UI.

    :param attr_list: List of Attributes to convert.
    :type attr_list: [Attribute, ..]

    :param show_anm: Should the animated attributes be visible?
    :type show_anm: bool

    :param show_stc: Should the static attributes be visible?
    :type show_stc: bool

    :param show_lck: Should the locked attributes be visible?
    :type show_lck: bool

    :returns: A hierarchy of UI nodes to be viewed in a 'tree view'.
    :rtype: PlugNode
    """
    root = attr_nodes.PlugNode('root')
    maya_nodes = dict()
    for attr in attr_list:
        n = attr.get_node()
        if attr.is_animated() is True and show_anm is False:
            continue
        elif attr.is_static() is True and show_stc is False:
            continue
        elif attr.is_locked() is True and show_lck is False:
            continue
        maya_node = maya_nodes.get(n)
        data = {'data': attr, 'collection': col}
        if maya_node is None:
            uuid = attr.get_node_uid()
            node_data = dict()
            # Add the first attribute to the MayaNode object.
            node_data['data'] = [attr]
            node_data['uuid'] = uuid
            maya_node = attr_nodes.MayaNode(n, data=node_data, parent=root)
            maya_nodes[n] = maya_node
        else:
            # Add subsequent attributes to the MayaNode object.
            node_data = maya_node.data()
            node_data['data'].append(attr)
            maya_node.setData(node_data)
        a = attr.get_attr()
        attr_node = attr_nodes.AttrNode(a, data=data, parent=maya_node)
    return root
示例#5
0
def attributesToUINodes(attr_list, show_anm, show_stc, show_lck):
    """
    Convert a list of mmSolver API Attributes into classes to be used
    in the Solver UI.

    :param attr_list: List of Attributes to convert.
    :type attr_list: [Attribute, ..]

    :param show_anm: Should the animated attributes be visible?
    :type show_anm: bool

    :param show_stc: Should the static attributes be visible?
    :type show_stc: bool

    :param show_lck: Should the locked attributes be visible?
    :type show_lck: bool

    :returns: A hierarchy of UI nodes to be viewed in a 'tree view'.
    :rtype: PlugNode
    """
    root = attr_nodes.PlugNode('root')
    maya_nodes = dict()
    for attr in attr_list:
        n = attr.get_node()
        if attr.is_animated() is True and show_anm is False:
            continue
        elif attr.is_static() is True and show_stc is False:
            continue
        elif attr.is_locked() is True and show_lck is False:
            continue
        maya_node = maya_nodes.get(n)
        data = {'data': attr}
        if maya_node is None:
            maya_node = attr_nodes.MayaNode(n, data=data, parent=root)
            maya_nodes[n] = maya_node
        a = attr.get_attr()
        attr_node = attr_nodes.AttrNode(a, data=data, parent=maya_node)
    return root
示例#6
0
    def createTreeView(self):
        """
        Set up the tree view.
        """
        root = attr_nodes.PlugNode('root')
        self.model = attr_nodes.AttrModel(root, font=self.font)
        self.filterModel = QtCore.QSortFilterProxyModel()
        self.filterModel.setSourceModel(self.model)
        self.filterModel.setDynamicSortFilter(False)
        self.header = QtWidgets.QHeaderView(QtCore.Qt.Horizontal,
                                            parent=self.treeView)
        Qt.QtCompat.QHeaderView.setSectionResizeMode(
            self.header, QtWidgets.QHeaderView.ResizeToContents)
        self.treeView.setHeader(self.header)

        self.treeView.setModel(self.filterModel)
        self.treeView.setSortingEnabled(True)
        self.treeView.sortByColumn(0, QtCore.Qt.AscendingOrder)
        self.treeView.setSelectionMode(
            QtWidgets.QAbstractItemView.MultiSelection)
        self.selModel = self.treeView.selectionModel()
        self.selModel.selectionChanged.connect(self.selectionChanged)
        return
def attributesToUINodes(attr_list):
    """
    Convert a list of mmSolver API Attributes into classes to be used
    in the Solver UI.

    :param attr_list: List of Attributes to convert.
    :type attr_list: [Attribute, ..]

    :returns: A hierarchy of UI nodes to be viewed in a 'tree view'.
    :rtype: PlugNode
    """
    root = attr_nodes.PlugNode('root')
    maya_nodes = dict()
    for attr in attr_list:
        n = attr.get_node()
        maya_node = maya_nodes.get(n)
        data = {'data': attr}
        if maya_node is None:
            maya_node = attr_nodes.MayaNode(n, data=data, parent=root)
            maya_nodes[n] = maya_node
        a = attr.get_attr()
        attr_node = attr_nodes.AttrNode(a, data=data, parent=maya_node)
    return root
示例#8
0
    def __init__(self, parent=None, *args, **kwargs):
        super(SolverLayout, self).__init__(*args, **kwargs)
        self.setupUi(self)

        # Store the parent window class, so we can set the applyBtn enabled
        # state.
        self._parentObject = parent

        # Hide the Solve Info line until it's set up. GitHub Issue #56
        self.solveInfoLine_lineEdit.setVisible(False)

        # Collection Combo Box.
        self.collectionName_model = uimodels.StringDataListModel()
        self.collectionName_comboBox.setModel(self.collectionName_model)
        self.collectionName_comboBox.currentIndexChanged.connect(
            self.collectionIndexChanged
        )

        # Collection Select
        self.collectionSelect_pushButton.clicked.connect(
            self.collectionSelectClicked
        )

        # Object Nodes
        # TODO: Perhaps we should remove a tree view and research how
        # we can embed a Maya Outliner inside our layout with a filter
        # to only show markers (and their parents), this would provide
        # a lot of default functionality from Maya.
        root = object_nodes.ObjectNode('root')
        self.object_model = object_nodes.ObjectModel(root, font=self.font)
        self.object_filterModel = QtCore.QSortFilterProxyModel()
        self.object_filterModel.setSourceModel(self.object_model)
        self.object_filterModel.setDynamicSortFilter(False)
        self.object_treeView.setModel(self.object_filterModel)
        self.object_treeView.setSortingEnabled(True)
        self.object_treeView.sortByColumn(0, QtCore.Qt.AscendingOrder)
        self.object_treeView.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
        self.object_selModel = self.object_treeView.selectionModel()
        self.object_selModel.selectionChanged.connect(
            self.objectNodeSelectionChanged
        )
        self.objectToggleCamera_toolButton.clicked.connect(
            self.objectToggleCameraClicked,
        )
        self.objectToggleMarker_toolButton.clicked.connect(
            self.objectToggleMarkerClicked,
        )
        self.objectToggleBundle_toolButton.clicked.connect(
            self.objectToggleBundleClicked,
        )

        # Object Add and Remove buttons
        self.objectAdd_toolButton.clicked.connect(
            self.objectAddClicked
        )
        self.objectRemove_toolButton.clicked.connect(
            self.objectRemoveClicked
        )

        # Attr Nodes
        root = attr_nodes.PlugNode('root')
        self.attribute_model = attr_nodes.AttrModel(root, font=self.font)
        self.attribute_filterModel = QtCore.QSortFilterProxyModel()
        self.attribute_filterModel.setSourceModel(self.attribute_model)
        self.attribute_filterModel.setDynamicSortFilter(False)
        self.attribute_treeView.setModel(self.attribute_filterModel)
        self.attribute_treeView.setSortingEnabled(True)
        self.attribute_treeView.sortByColumn(0, QtCore.Qt.AscendingOrder)
        self.attribute_treeView.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
        self.attribute_selModel = self.attribute_treeView.selectionModel()
        self.attribute_selModel.selectionChanged.connect(
            self.attrNodeSelectionChanged
        )

        # Attr Add and Remove buttons
        self.attributeAdd_toolButton.clicked.connect(
            self.attrAddClicked
        )
        self.attributeRemove_toolButton.clicked.connect(
            self.attrRemoveClicked
        )

        # Solver Nodes
        self.solver_model = solver_nodes.SolverModel(font=self.font)
        self.solver_filterModel = QtCore.QSortFilterProxyModel()
        self.solver_filterModel.setSourceModel(self.solver_model)
        self.solver_filterModel.setDynamicSortFilter(False)
        self.solver_tableView.setModel(self.solver_filterModel)
        self.solver_tableView.setSortingEnabled(False)
        self.solver_selModel = self.solver_tableView.selectionModel()

        # Set up custom widgets for viewing and editing the columns.
        self.solver_attrFilterDelegate = solver_nodes.AttributeComboBoxDelegate()
        self.solver_tableView.setItemDelegateForColumn(
            2,
            self.solver_attrFilterDelegate,
        )
        self.solver_strategyDelegate = solver_nodes.StrategyComboBoxDelegate()
        self.solver_tableView.setItemDelegateForColumn(
            3,
            self.solver_strategyDelegate,
        )

        # Solver Add and Remove buttons
        self.solverAdd_toolButton.clicked.connect(
            self.solverAddClicked
        )
        self.solverRemove_toolButton.clicked.connect(
            self.solverRemoveClicked
        )

        # TODO: Write functions for Move Up/Down buttons. Until then,
        #       we'll hide the buttons to avoid confusion.
        self.solverMoveUp_toolButton.setVisible(False)
        self.solverMoveDown_toolButton.setVisible(False)
        # self.solverMoveUp_toolButton.clicked.connect(
        #     self.solverMoveUpClicked
        # )
        # self.solverMoveDown_toolButton.clicked.connect(
        #     self.solverMoveDownClicked
        # )

        # Override Current Frame
        self.overrideCurrentFrame_checkBox.stateChanged.connect(
            self.overrideCurrentFrameChanged
        )

        # Populate the UI with data.
        self.updateDynamicWindowTitle()
        self.updateCollectionModel()
        self.updateObjectToggleButtons()
        self.updateObjectModel()
        self.updateAttributeModel()
        self.updateSolverModel()
        self.updateSolveValidState()
        return
示例#9
0
    def __init__(self, parent=None, *args, **kwargs):
        super(SolverLayout, self).__init__(*args, **kwargs)
        self.setupUi(self)

        # Store the parent window class, so we can set the applyBtn enabled
        # state.
        self._parentObject = parent

        # Collection Combo Box.
        self.collectionName_model = uimodels.StringDataListModel()
        self.collectionName_comboBox.setModel(self.collectionName_model)
        self.collectionName_comboBox.currentIndexChanged.connect(
            self.collectionIndexChanged)

        # Collection Select
        self.collectionSelect_pushButton.clicked.connect(
            self.collectionSelectClicked)

        # Object Nodes
        root = object_nodes.ObjectNode('root')
        self.object_model = object_nodes.ObjectModel(root, font=self.font)
        self.object_filterModel = QtCore.QSortFilterProxyModel()
        self.object_filterModel.setSourceModel(self.object_model)
        self.object_filterModel.setDynamicSortFilter(False)
        self.object_header = QtWidgets.QHeaderView(QtCore.Qt.Horizontal,
                                                   parent=self.object_treeView)
        self.object_header.setSectionResizeMode(
            QtWidgets.QHeaderView.ResizeToContents)
        self.object_treeView.setHeader(self.object_header)
        self.object_treeView.setModel(self.object_filterModel)
        self.object_treeView.setSortingEnabled(True)
        self.object_treeView.sortByColumn(0, QtCore.Qt.AscendingOrder)
        self.object_treeView.setSelectionMode(
            QtWidgets.QAbstractItemView.MultiSelection)
        self.object_selModel = self.object_treeView.selectionModel()
        self.object_selModel.selectionChanged.connect(
            self.objectNodeSelectionChanged)
        self.objectToggleCamera_toolButton.clicked.connect(
            self.objectToggleCameraClicked, )
        self.objectToggleMarker_toolButton.clicked.connect(
            self.objectToggleMarkerClicked, )
        self.objectToggleBundle_toolButton.clicked.connect(
            self.objectToggleBundleClicked, )

        # Object Add and Remove buttons
        self.objectAdd_toolButton.clicked.connect(self.objectAddClicked)
        self.objectRemove_toolButton.clicked.connect(self.objectRemoveClicked)

        # Attr Nodes
        root = attr_nodes.PlugNode('root')
        self.attribute_model = attr_nodes.AttrModel(root, font=self.font)
        self.attribute_filterModel = QtCore.QSortFilterProxyModel()
        self.attribute_filterModel.setSourceModel(self.attribute_model)
        self.attribute_filterModel.setDynamicSortFilter(False)
        self.attribute_header = QtWidgets.QHeaderView(
            QtCore.Qt.Horizontal, parent=self.attribute_treeView)
        self.attribute_header.setSectionResizeMode(
            QtWidgets.QHeaderView.ResizeToContents)
        self.attribute_treeView.setHeader(self.attribute_header)

        self.attribute_treeView.setModel(self.attribute_filterModel)
        self.attribute_treeView.setSortingEnabled(True)
        self.attribute_treeView.sortByColumn(0, QtCore.Qt.AscendingOrder)
        self.attribute_treeView.setSelectionMode(
            QtWidgets.QAbstractItemView.MultiSelection)
        self.attribute_selModel = self.attribute_treeView.selectionModel()
        self.attribute_selModel.selectionChanged.connect(
            self.attrNodeSelectionChanged)
        self.attributeToggleAnimated_toolButton.clicked.connect(
            self.attributeToggleAnimatedClicked, )
        self.attributeToggleStatic_toolButton.clicked.connect(
            self.attributeToggleStaticClicked, )
        self.attributeToggleLocked_toolButton.clicked.connect(
            self.attributeToggleLockedClicked, )

        # Attr Add and Remove buttons
        self.attributeAdd_toolButton.clicked.connect(self.attrAddClicked)
        self.attributeRemove_toolButton.clicked.connect(self.attrRemoveClicked)

        # Solver Nodes
        self.solver_model = solver_nodes.SolverModel(font=self.font)
        self.solver_filterModel = QtCore.QSortFilterProxyModel()
        self.solver_filterModel.setSourceModel(self.solver_model)
        self.solver_filterModel.setDynamicSortFilter(False)
        self.solver_tableView.setModel(self.solver_filterModel)
        self.solver_tableView.setSortingEnabled(False)
        self.solver_selModel = self.solver_tableView.selectionModel()

        # Set up custom widgets for viewing and editing the columns.
        self.solver_attrFilterDelegate = solver_nodes.AttributeComboBoxDelegate(
        )
        attr_idx = self.solver_model.getColumnIndexFromColumnName(
            const.SOLVER_COLUMN_NAME_ATTRIBUTES)
        strategy_idx = self.solver_model.getColumnIndexFromColumnName(
            const.SOLVER_COLUMN_NAME_STRATEGY)
        self.solver_tableView.setItemDelegateForColumn(
            attr_idx,
            self.solver_attrFilterDelegate,
        )
        self.solver_strategyDelegate = solver_nodes.StrategyComboBoxDelegate()
        self.solver_tableView.setItemDelegateForColumn(
            strategy_idx,
            self.solver_strategyDelegate,
        )

        # Solver Add and Remove buttons
        self.solverAdd_toolButton.clicked.connect(self.solverAddClicked)
        self.solverRemove_toolButton.clicked.connect(self.solverRemoveClicked)

        # TODO: Write functions for Move Up/Down buttons. Until then,
        #       we'll hide the buttons to avoid confusion.
        self.solverMoveUp_toolButton.setVisible(False)
        self.solverMoveDown_toolButton.setVisible(False)
        # self.solverMoveUp_toolButton.clicked.connect(
        #     self.solverMoveUpClicked
        # )
        # self.solverMoveDown_toolButton.clicked.connect(
        #     self.solverMoveDownClicked
        # )

        # Override Current Frame
        self.overrideCurrentFrame_checkBox.stateChanged.connect(
            self.overrideCurrentFrameChanged)

        # Populate the UI with data.
        self.updateDynamicWindowTitle()
        self.updateCollectionModel()
        self.updateObjectToggleButtons()
        self.updateObjectColumnVisibility()
        self.updateObjectModel()
        self.updateAttributeToggleButtons()
        self.updateAttributeColumnVisibility()
        self.updateAttributeModel()
        self.updateSolverModel()
        self.updateSolveValidState()
        return