class EntityLogicsView(QWidget):
    def __init__(self):
        super().__init__()
        self._editEntity = None
        self._canEditLogics = False

        self._logicMenu = EntityLogicMenu(self)

        self._rootLayout = QVBoxLayout()

        self._transformView = EditTransformValue()
        self._rootLayout.addWidget(self._transformView)

        self._addLogicBt = QPushButton("Add Logic")
        self._addLogicBt.setEnabled(False)
        self._addLogicBt.clicked.connect(self._signal_addLogicBt_clicked)
        self._rootLayout.addWidget(self._addLogicBt)

        self._logicsLayout = QVBoxLayout()

        self._frame = QFrame()
        self._frameLayout = QVBoxLayout()
        self._frameLayout.addLayout(self._logicsLayout)
        self._frameLayout.addStretch()
        self._frame.setLayout(self._frameLayout)
        self._frame.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self._frame.customContextMenuRequested.connect(
            self._signal_frame_contexMenuRequested)

        self._scroll = QScrollArea()
        self._scroll.setWidget(self._frame)
        self._scroll.setWidgetResizable(True)

        self._rootLayout.addWidget(self._scroll)

        self.setLayout(self._rootLayout)
        self.setMinimumWidth(360)

        RegisterForMessage(MsgSetEditEntity, self._onSetEditEntity)
        RegisterForMessage(MsgChangeEditEntity, self._onSetEditEntity)
        RegisterForMessage(MsgAddLogicToEntity, self._onAddLogicView)
        RegisterForMessage(MsgOnLogicDataEdited, self._onFetchDataFromNative)

    def _buildLogicsList(self):
        ClearLayout(self._logicsLayout)
        if self._editEntity is None:
            return
        self._editEntity.setDoNotSync(True)
        for logic in self._editEntity.getLogics():
            logicView = LogicView(logic)
            logicView.setEnabled(self._canEditLogics)
            self._logicsLayout.addWidget(logicView)
        self._editEntity.setDoNotSync(False)

    def _onSetEditEntity(self, msg):
        self._editEntity = msg.entity
        self._canEditLogics = msg.canEditLogics
        if self._editEntity is not None:
            if self._canEditLogics:
                self._addLogicBt.setEnabled(True)
            else:
                self._addLogicBt.setEnabled(False)
        else:
            self._addLogicBt.setEnabled(False)
        self._buildLogicsList()

    def _onAddLogicView(self, msg):
        if self._editEntity != msg.entity:
            raise RuntimeError(
                "Edit entity is not target entity for a new logic")
        logicView = LogicView(msg.logic)
        self._logicsLayout.addWidget(logicView)

    def removeLogicView(self, entityLogicId):
        for i in range(self._logicsLayout.count()):
            item = self._logicsLayout.itemAt(i)
            widget = item.widget()
            if widget is not None:
                if widget._entityLogic.getNativeId() == entityLogicId:
                    self._logicsLayout.removeWidget(widget)
                    widget.close()
                    return

    def _onFetchDataFromNative(self, msg):
        if self._editEntity != msg.value.getEntity():
            return
        if not self._editEntity.shouldSyncWithNative():
            return
        for i in range(self._logicsLayout.count()):
            item = self._logicsLayout.itemAt(i)
            widget = item.widget()
            widget.fetchDataFromNative()

    def _signal_addLogicBt_clicked(self):
        SendMessage(MsgOnAddLogicBtPressed(self._editEntity))

    def _signal_frame_contexMenuRequested(self, pt):
        for i in range(self._logicsLayout.count()):
            widget = self._logicsLayout.itemAt(i).widget()
            if widget is not None:
                if widget.underMouse():
                    return
        globalPt = self._frame.mapToGlobal(pt)
        self._logicMenu.onMenuRequestedOnEntity(globalPt, self._editEntity)
Esempio n. 2
0
class LogicViewTopBar(QWidget):
    def __init__(self):
        super().__init__()

        self._canCopy = True

        self._entityLogic = None

        self._frame = QFrame()
        self._frame.setFrameStyle(QFrame.StyledPanel)
        self._frame.setFrameShadow(QFrame.Plain)

        self._frameLayout = QHBoxLayout()
        self._frameLayout.setSpacing(1)
        self._frameLayout.setContentsMargins(0, 0, 0, 0)
        self._frame.setContextMenuPolicy(Qt.CustomContextMenu)
        self._frame.customContextMenuRequested.connect(
            self._signal_frame_contexMenuRequested)

        self._expandLogicBt = QPushButton()
        self._expandLogicBt.setIcon(self.style().standardIcon(
            QStyle.SP_TitleBarShadeButton))
        self._expandLogicBt.setFlat(True)
        self._frameLayout.addWidget(self._expandLogicBt)

        self._logicNameLabel = QLabel()
        self._frameLayout.addWidget(self._logicNameLabel)

        self._frameLayout.addStretch()

        self._removeLogicBt = QPushButton()
        self._removeLogicBt.setIcon(self.style().standardIcon(
            QStyle.SP_TitleBarCloseButton))
        self._removeLogicBt.setFlat(True)
        self._removeLogicBt.clicked.connect(self._signal_removeBt_clicked)
        self._frameLayout.addWidget(self._removeLogicBt)

        self._frame.setLayout(self._frameLayout)

        self._rootLayout = QVBoxLayout()
        self._rootLayout.setSpacing(0)
        self._rootLayout.setContentsMargins(0, 0, 0, 0)

        self._rootLayout.addWidget(self._frame)

        self.setLayout(self._rootLayout)

    def _setupLogic(self, entityLogic):
        self._entityLogic = entityLogic
        self._logicNameLabel.setText(self._entityLogic.getName())

    def _setCanCopy(self, copyFlag):
        self._canCopy = copyFlag

    def _signal_removeBt_clicked(self):
        GetEventManager().onRemoveEntityLogicBtClicked(self._entityLogic)

    def _signal_frame_contexMenuRequested(self, pt):
        if not self._canCopy:
            return
        menu = EntityLogicMenu(self)
        globalPt = self._frame.mapToGlobal(pt)
        menu.onMenuRequestedOnLogic(globalPt, self._entityLogic)