Beispiel #1
0
 def __init__(self, manager, parent=None):
     AbstractTreeModel.__init__(self, parent)
     self.excludedModel = BundleItemExcludedListModel(manager, self)
     self.manager = manager
Beispiel #2
0
class BundleItemMenuTreeModel(AbstractTreeModel):
    menuChanged = QtCore.pyqtSignal()

    def __init__(self, manager, parent=None):
        AbstractTreeModel.__init__(self, parent)
        self.excludedModel = BundleItemExcludedListModel(manager, self)
        self.manager = manager

    def excludedListModel(self):
        return self.excludedModel

    def _build_menu(self, items, parent, submenus={}, allActionItems=[]):
        for uuid in items:
            if uuid.startswith("-"):
                separatorNode = BundleItemMenuTreeNode(
                    uuid, BundleItemMenuTreeNode.SEPARATOR, parent=parent)
                parent.appendChild(separatorNode)
            else:
                item = self.manager.getBundleItem(uuid)
                if item != None:
                    if item in allActionItems:
                        allActionItems.remove(item)
                    bundleItemNode = BundleItemMenuTreeNode(
                        item.name, BundleItemMenuTreeNode.ITEM, item, parent)
                    parent.appendChild(bundleItemNode)
                elif uuid in submenus:
                    submenuNode = BundleItemMenuTreeNode(
                        submenus[uuid]['name'], BundleItemMenuTreeNode.SUBMENU,
                        uuid, parent)
                    parent.appendChild(submenuNode)
                    self._build_menu(submenus[uuid]['items'], submenuNode,
                                     submenus, allActionItems)

    def setBundle(self, bundle):
        self.clear()
        # allActionItems is a list with all bundleItems in te bundle
        allActionItems = self.manager.findBundleItems(bundle=bundle,
                                                      TYPE="command")
        allActionItems += self.manager.findBundleItems(bundle=bundle,
                                                       TYPE="snippet")
        allActionItems += self.manager.findBundleItems(bundle=bundle,
                                                       TYPE="macro")
        if bundle.mainMenu is not None:
            self._build_menu(bundle.mainMenu['items'], self.rootNode,
                             bundle.mainMenu['submenus'], allActionItems)
            # allActionItems tiene los items que no estan el menu
            if 'excludedItems' in bundle.mainMenu:
                for uuid in bundle.mainMenu['excludedItems']:
                    item = self.manager.getBundleItem(uuid)
                    if item != None:
                        if item in allActionItems:
                            allActionItems.remove(item)
                        self.excludedModel.appendExcludedItem(item)
        # allActionItems tiene los items que no estan en el menu ni en la lista de excluidos
        for item in allActionItems:
            self.excludedModel.appendExcludedItem(item)
        self.layoutChanged.emit()

    def clear(self):
        self.excludedModel.clear()
        AbstractTreeModel.clear(self)

    def add_submenu(self, submenuNode, submenus):
        items = []
        for node in submenuNode.childNodes():
            if node.nodeType == BundleItemMenuTreeNode.ITEM:
                items.append(str(node.data.uuid).upper())
            elif node.nodeType == BundleItemMenuTreeNode.SUBMENU:
                self.add_submenu(node, submenus)
            elif node.nodeType == BundleItemMenuTreeNode.SEPARATOR:
                items.append(node.nodeName())
        submenus[submenuNode.data] = {
            "items": items,
            "name": submenuNode.nodeName()
        }

    def getMainMenu(self):
        items = []
        submenus = {}
        for node in self.rootNode.childNodes():
            if node.nodeType == BundleItemMenuTreeNode.ITEM:
                items.append(str(node.data.uuid).upper())
            elif node.nodeType == BundleItemMenuTreeNode.SUBMENU:
                items.append(node.data)
                self.add_submenu(node, submenus)
            elif node.nodeType == BundleItemMenuTreeNode.SEPARATOR:
                items.append(node.nodeName())
        mainMenu = {"items": items, "submenus": submenus}
        excludedItems = self.excludedModel.getExcludedItems()
        if excludedItems:
            mainMenu['excludedItems'] = excludedItems
        return mainMenu

    def data(self, index, role):
        if role in [QtCore.Qt.DisplayRole, QtCore.Qt.EditRole]:
            node = self.node(index)
            return node.nodeName()
        else:
            return None

    def setData(self, index, value, role):
        if not index.isValid():
            return False
        if role == QtCore.Qt.EditRole:
            node = self.node(index)
            if node.nodeType == BundleItemMenuTreeNode.SUBMENU:
                node.setNodeName(value)
                self.menuChanged.emit()
            elif node.nodeType == BundleItemMenuTreeNode.ITEM:
                self.manager.updateBundleItem(node.data, name=value)
                node.setNodeName(value)
            self.dataChanged.emit(index, index)
            return True
        return False

    def flags(self, index):
        defaultFlags = QtCore.QAbstractItemModel.flags(self, index)
        if index.isValid():
            node = self.node(index)
            if node.nodeType == BundleItemMenuTreeNode.SUBMENU:
                return defaultFlags | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled | QtCore.Qt.ItemIsEditable
            elif node.nodeType == BundleItemMenuTreeNode.SEPARATOR:
                return defaultFlags | QtCore.Qt.ItemIsDragEnabled
            elif node.nodeType == BundleItemMenuTreeNode.ITEM:
                return defaultFlags | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsEditable
        else:
            return QtCore.Qt.ItemIsDropEnabled | defaultFlags

    def mimeTypes(self):
        return ['application/x-ets-qt4-instance']

    def mimeData(self, index):
        node = self.node(index[0])
        mimeData = PyMimeData(node)
        return mimeData

    def dropMimeData(self, mimedata, action, row, column, parentIndex):
        if action == QtCore.Qt.IgnoreAction:
            return True

        if not mimedata.hasFormat("application/x-ets-qt4-instance"):
            return False

        dragNode = mimedata.instance()

        parentNode = self.node(parentIndex)

        if dragNode.nodeParent() == None:
            #The node belongs to a exludeListModel
            if dragNode.nodeType == BundleItemMenuTreeNode.SEPARATOR:
                #Make a copy of separator
                separatorNode = BundleItemMenuTreeNode(
                    dragNode.nodeName(), BundleItemMenuTreeNode.SEPARATOR)
                parentNode.insertChild(row, separatorNode)
            elif dragNode.nodeType == BundleItemMenuTreeNode.SUBMENU:
                #Make a copy of submenu
                uuid = str(self.manager.uuidgen()).upper()
                submenuNode = BundleItemMenuTreeNode(
                    dragNode.nodeName(), BundleItemMenuTreeNode.SUBMENU, uuid)
                parentNode.insertChild(row, submenuNode)
            elif dragNode.nodeType == BundleItemMenuTreeNode.ITEM:
                self.excludedModel.removeMenuItem(dragNode)
                parentNode.insertChild(row, dragNode)
        elif dragNode.nodeParent() == parentNode:
            #Reparent
            currentRow = dragNode.row()
            row = row if currentRow >= row else row - 1
            parentNode.removeChild(dragNode)
            parentNode.insertChild(row, dragNode)
        else:
            #Reparent
            dragNode.nodeParent().removeChild(dragNode)
            parentNode.insertChild(row, dragNode)
        self.menuChanged.emit()
        self.layoutChanged.emit()
        return True

    def removeMenuItem(self, item):
        index = self.createIndex(item.row(), 0, item)
        parentIndex = self.parent(index)
        parentNode = self.node(parentIndex)
        self.beginRemoveRows(parentIndex, item.row(), item.row())
        parentNode.removeChild(item)
        self.endRemoveRows()
        self.menuChanged.emit()
Beispiel #3
0
class BundleMenuTreeModel(AbstractTreeModel):
    menuChanged = QtCore.Signal()
    
    def __init__(self, manager, **kwargs):
        super(BundleMenuTreeModel, self).__init__(**kwargs)
        self.excludedModel = BundleItemExcludedListModel(manager, self)
        self.manager = manager
    
    def excludedListModel(self):
        return self.excludedModel
    
    def _build_menu(self, items, parent, submenus = {}, allActionItems = []):
        for uuid in items:
            if uuid.startswith("-"):
                separatorNode = BundleItemMenuTreeNode(uuid, BundleItemMenuTreeNode.SEPARATOR, parent = parent)
                parent.appendChild(separatorNode)
            else:
                item = self.manager.getBundleItem(uuid)
                if item is not None:
                    if item in allActionItems:
                        allActionItems.remove(item)
                    bundleItemNode = BundleItemMenuTreeNode(item.name, BundleItemMenuTreeNode.ITEM, item, parent)
                    parent.appendChild(bundleItemNode)
                elif uuid in submenus:
                    submenuNode = BundleItemMenuTreeNode(submenus[uuid]['name'], BundleItemMenuTreeNode.SUBMENU, uuid, parent)
                    parent.appendChild(submenuNode)
                    self._build_menu(submenus[uuid]['items'], submenuNode, submenus, allActionItems)

    def setBundle(self, bundle):
        self.clear()
        # allActionItems is a list with all bundleItems in te bundle
        allActionItems = self.manager.findBundleItems(bundle = bundle, TYPE = "command")
        allActionItems += self.manager.findBundleItems(bundle = bundle, TYPE = "snippet")
        allActionItems += self.manager.findBundleItems(bundle = bundle, TYPE = "macro")
        if bundle.mainMenu is not None:
            self._build_menu(bundle.mainMenu['items'], self.rootNode, bundle.mainMenu['submenus'], allActionItems)
            # allActionItems tiene los items que no estan el menu
            if 'excludedItems' in bundle.mainMenu:
                for uuid in bundle.mainMenu['excludedItems']:
                    item = self.manager.getBundleItem(uuid)
                    if item is not None:
                        if item in allActionItems:
                            allActionItems.remove(item)
                        self.excludedModel.appendExcludedItem(item)
        # allActionItems tiene los items que no estan en el menu ni en la lista de excluidos
        for item in allActionItems:
            self.excludedModel.appendExcludedItem(item)
        self.layoutChanged.emit()
    
    def clear(self):
        self.excludedModel.clear()
        AbstractTreeModel.clear(self)

    def add_submenu(self, submenuNode, submenus):
        items = []
        for node in submenuNode.childNodes():
            if node.nodeType == BundleItemMenuTreeNode.ITEM:
                items.append(str(node.data.uuid).upper())
            elif node.nodeType == BundleItemMenuTreeNode.SUBMENU:
                self.add_submenu(node, submenus)
            elif node.nodeType == BundleItemMenuTreeNode.SEPARATOR:
                items.append(node.nodeName())
        submenus[submenuNode.data] = { "items": items, "name": submenuNode.nodeName() }
        
    def getMainMenu(self):
        items = []
        submenus = {}
        for node in self.rootNode.childNodes():
            if node.nodeType == BundleItemMenuTreeNode.ITEM:
                items.append(str(node.data.uuid).upper())
            elif node.nodeType == BundleItemMenuTreeNode.SUBMENU:
                items.append(node.data)
                self.add_submenu(node, submenus)
            elif node.nodeType == BundleItemMenuTreeNode.SEPARATOR:
                items.append(node.nodeName())
        mainMenu = {"items": items, "submenus": submenus }
        excludedItems = self.excludedModel.getExcludedItems()
        if excludedItems:
            mainMenu['excludedItems'] = excludedItems
        return mainMenu

    def data(self, index, role):
        if role in [ QtCore.Qt.DisplayRole, QtCore.Qt.EditRole ]:
            node = self.node(index)
            return node.nodeName()
        else:
            return None

    def setData(self, index, value, role):  
        if not index.isValid():  
            return False
        if role == QtCore.Qt.EditRole:  
            node = self.node(index)
            if node.nodeType == BundleItemMenuTreeNode.SUBMENU:
                node.setNodeName(value)
                self.menuChanged.emit()
            elif node.nodeType == BundleItemMenuTreeNode.ITEM:
                self.manager.updateBundleItem(node.data, name = value)
                node.setNodeName(value)
            self.dataChanged.emit(index, index)
            return True
        return False

    def flags(self, index):
        defaultFlags = QtCore.QAbstractItemModel.flags(self, index)
        if index.isValid():
            node = self.node(index)
            if node.nodeType == BundleItemMenuTreeNode.SUBMENU:
                return defaultFlags | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled | QtCore.Qt.ItemIsEditable
            elif node.nodeType == BundleItemMenuTreeNode.SEPARATOR:
                return defaultFlags | QtCore.Qt.ItemIsDragEnabled
            elif node.nodeType == BundleItemMenuTreeNode.ITEM:
                return defaultFlags | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsEditable
        else:
            return QtCore.Qt.ItemIsDropEnabled | defaultFlags
    
    def mimeTypes(self):
        return [ 'application/x-ets-qt4-instance' ]

    def mimeData(self, index):
        node = self.node(index[0])
        mimeData = PyMimeData(node)
        return mimeData

    def dropMimeData(self, mimedata, action, row, column, parentIndex):
        if action == QtCore.Qt.IgnoreAction:
            return True
        
        if not mimedata.hasFormat("application/x-ets-qt4-instance"):
            return False
        
        dragNode = mimedata.instance()
        
        parentNode = self.node(parentIndex)
        
        if dragNode.nodeParent() is None:
            #The node belongs to a exludeListModel
            if dragNode.nodeType == BundleItemMenuTreeNode.SEPARATOR:
                #Make a copy of separator
                separatorNode = BundleItemMenuTreeNode(dragNode.nodeName(), BundleItemMenuTreeNode.SEPARATOR)
                parentNode.insertChild(row, separatorNode)
            elif dragNode.nodeType == BundleItemMenuTreeNode.SUBMENU:
                #Make a copy of submenu
                uuid = str(self.manager.uuidgen()).upper()
                submenuNode = BundleItemMenuTreeNode(dragNode.nodeName(), BundleItemMenuTreeNode.SUBMENU, uuid)
                parentNode.insertChild(row, submenuNode)
            elif dragNode.nodeType == BundleItemMenuTreeNode.ITEM:
                self.excludedModel.removeMenuItem(dragNode)
                parentNode.insertChild(row, dragNode)
        elif dragNode.nodeParent() == parentNode:
            #Reparent
            currentRow = dragNode.row()
            row = row if currentRow >= row else row - 1
            parentNode.removeChild(dragNode)
            parentNode.insertChild(row, dragNode)
        else:
            #Reparent
            dragNode.nodeParent().removeChild(dragNode)
            parentNode.insertChild(row, dragNode)
        self.menuChanged.emit()
        self.layoutChanged.emit()
        return True
        
    def removeMenuItem(self, item):
        index = self.createIndex(item.row(), 0, item)
        parentIndex = self.parent(index)
        parentNode = self.node(parentIndex)
        self.beginRemoveRows(parentIndex, item.row(), item.row())
        parentNode.removeChild(item)
        self.endRemoveRows()
        self.menuChanged.emit()
Beispiel #4
0
 def __init__(self, manager, **kwargs):
     super(BundleMenuTreeModel, self).__init__(**kwargs)
     self.excludedModel = BundleItemExcludedListModel(manager, self)
     self.manager = manager
Beispiel #5
0
 def __init__(self, manager, parent = None):
     AbstractTreeModel.__init__(self, parent)
     self.excludedModel = BundleItemExcludedListModel(manager, self)
     self.manager = manager