2 Copyright (C) 1997-2017 JDERobot Developers Team 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 2 of the License, or 7 (at your option) any later version. 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU Library General Public License for more details. 14 You should have received a copy of the GNU General Public License 15 along with this program; if not, see <http://www.gnu.org/licenses/>. 17 Authors : Okan Asik (asik.okan@gmail.com) 20 from PyQt5.QtWidgets
import QGraphicsScene, QGraphicsItem, QAction, QMenu
21 from PyQt5.QtCore
import Qt, pyqtSignal
22 from PyQt5.QtWidgets
import QGraphicsScene, QAction, QMenu
23 from visualstates.core.state
import State
24 from visualstates.gui.state.codedialog
import CodeDialog
25 from visualstates.gui.state.idtextboxgraphicsitem
import IdTextBoxGraphicsItem
26 from visualstates.gui.state.renamediaolog
import RenameDialog
27 from visualstates.gui.transition.transitioncodedialog
import TransitionCodeDialog
28 from visualstates.gui.transition.transitiontype
import TransitionType
29 from visualstates.core.namespace
import Namespace
30 from visualstates.core.transition
import Transition
31 from visualstates.gui.automata.optype
import OpType
32 from visualstates.gui.state.guistate
import StateGraphicsItem
33 from visualstates.gui.transition.guitransition
import TransitionGraphicsItem
38 stateInserted = pyqtSignal(
'QGraphicsItem')
39 stateRemoved = pyqtSignal(
'QGraphicsItem')
40 stateImported = pyqtSignal()
41 transitionInserted = pyqtSignal(
'QGraphicsItem')
42 transitionRemoved = pyqtSignal(
'QGraphicsItem')
43 stateNameChangedSignal = pyqtSignal(
'QGraphicsItem')
44 activeStateChanged = pyqtSignal()
45 activeNamespaceChanged = pyqtSignal()
48 super(QGraphicsScene, self).
__init__(parent)
79 self.renameStateAction.triggered.connect(self.
renameState)
85 self.makeInitialAction.triggered.connect(self.
makeInitial)
88 self.copyStateAction.triggered.connect(self.
copyState)
91 self.removeStateAction.triggered.connect(self.
removeState)
94 self.pasteStateAction.triggered.connect(self.
pasteState)
97 self.importStateAction.triggered.connect(self.
importState)
110 dialog = RenameDialog(
'Rename', self.selectedState.stateData.name)
116 dialog = CodeDialog(
'State Code', self.selectedState.stateData.code)
123 for child
in self.activeState.getChildren():
124 child.setInitial(
False)
125 child.getGraphicsItem().setInitial(
False)
127 self.selectedState.setInitial(
True)
128 self.selectedState.stateData.setInitial(
True)
131 self.
copiedState = self.selectedState.stateData.getNewCopy()
135 self.copiedState.x = self.currentScenePos.x()
136 self.copiedState.y = self.currentScenePos.y()
145 if isinstance(item, StateGraphicsItem):
147 self.stateImported.emit()
150 dialog = RenameDialog(
'Rename', self.selectedTransition.transitionData.name)
156 dialog = TransitionCodeDialog(
'Transition Code', self.selectedTransition.transitionData)
163 transition = self.selectedTransition.transitionData
164 transition.origin.removeOriginTransition(transition)
165 transition.destination.removeDestTransition(transition)
168 QGraphicsScene.mousePressEvent(self, qGraphicsSceneMouseEvent)
171 if not tranItem
in self.items():
172 self.addItem(tranItem)
174 self.transitionInserted.emit(tranItem)
181 if not stateItem
in self.items():
182 self.addItem(stateItem)
183 self.activeState.addChild(stateItem.stateData)
184 if len(self.activeState.getChildren()) == 1:
189 self.stateInserted.emit(stateItem)
196 for tran
in stateItem.stateData.getOriginTransitions():
197 print(
'removing origin tran:' + tran.name)
198 tran.destination.removeDestTransition(tran)
199 self.removeItem(tran.getGraphicsItem())
200 self.transitionRemoved.emit(tran.getGraphicsItem())
202 for tran
in stateItem.stateData.getDestTransitions():
203 print(
'removing destination tran:' + tran.name)
204 tran.origin.removeOriginTransition(tran)
205 self.removeItem(tran.getGraphicsItem())
206 self.transitionRemoved.emit(tran.getGraphicsItem())
208 if self.
origin == stateItem:
211 self.removeItem(stateItem)
212 self.activeState.removeChild(stateItem.stateData)
214 self.stateRemoved.emit(stateItem)
221 QGraphicsScene.mouseReleaseEvent(self, qGraphicsSceneMouseEvent)
224 if self.
operationType == OpType.ADDSTATE
and qGraphicsSceneMouseEvent.button() == Qt.LeftButton:
225 selectedItems = self.items(qGraphicsSceneMouseEvent.scenePos())
226 if len(selectedItems) == 0:
228 namespace = Namespace(
'',
'')
230 state = State(sIndex,
'state' + str(sIndex),
False, namespace, self.
activeState)
231 state.setPos(qGraphicsSceneMouseEvent.scenePos().x(),
232 qGraphicsSceneMouseEvent.scenePos().y())
237 elif self.
operationType == OpType.ADDTRANSITION
and qGraphicsSceneMouseEvent.button() == Qt.LeftButton:
238 selectedItems = self.items(qGraphicsSceneMouseEvent.scenePos())
239 if len(selectedItems) > 0:
242 if isinstance(item, StateGraphicsItem):
246 tran = Transition(tIndex,
'transition ' + str(tIndex),
247 self.origin.stateData, self.destination.stateData)
262 QGraphicsScene.mouseReleaseEvent(self, qGraphicsSceneMouseEvent)
265 selectedItems = self.items(qGraphicsSceneContextMenuEvent.scenePos())
266 if len(selectedItems) > 0:
268 if isinstance(item, StateGraphicsItem):
270 elif isinstance(item, TransitionGraphicsItem):
272 elif len(selectedItems) == 0:
276 selectedItems = self.items(qGraphicsSceneMouseEvent.scenePos())
277 if len(selectedItems) > 0:
278 if isinstance(selectedItems[0], IdTextBoxGraphicsItem):
279 QGraphicsScene.mouseDoubleClickEvent(self, qGraphicsSceneMouseEvent)
283 if isinstance(item, StateGraphicsItem):
285 QGraphicsScene.mouseDoubleClickEvent(self, qGraphicsSceneMouseEvent)
300 action = cMenu.exec_(qEvent.screenPos())
309 action = cMenu.exec_(qEvent.screenPos())
315 action = cMenu.exec_(qEvent.screenPos())
329 while item.parentItem()
is not None:
330 item = item.parentItem()
334 self.selectedState.textGraphics.setPlainText(newName)
335 self.selectedState.textGraphics.textChanged.emit(newName)
338 self.selectedTransition.transitionData.name = newName
339 self.selectedTransition.textGraphics.setPlainText(newName)
340 self.selectedTransition.textGraphics.textChanged.emit(newName)
343 self.selectedState.stateData.code = newCode
346 transition = self.selectedTransition.transitionData
347 transition.setType(type)
348 if type == TransitionType.TEMPORAL:
349 transition.setTemporalTime(typeValue)
350 elif type == TransitionType.CONDITIONAL:
351 transition.setCondition(typeValue)
353 transition.setCode(code)
356 self.stateNameChangedSignal.emit(state)
378 self.activeNamespaceChanged.emit()
382 for child
in state.getChildren():
384 transitions = transitions + child.getOriginTransitions()
386 for tran
in transitions:
390 self.activeStateChanged.emit()
398 for child
in self.activeState.getChildren():
399 child.resetGraphicsItem()
400 for tran
in child.getOriginTransitions():
401 tran.resetGraphicsItem()
404 """Reset Indices of Automata 405 Helper Funtion for creating new AutomataScene""" 410 """Updates AutomataScene's Largest State and Transition ID""" 414 for tran
in rootState.getOriginTransitions():
418 for child
in rootState.getChildren():
def showSceneContextMenu(self, qEvent)
def getParentItem(self, item)
def getTransitionIndex(self)
def displayState(self, state)
def stateTextEditStarted(self)
def __init__(self, parent=None)
def stateTextEditFinished(self)
def mouseReleaseEvent(self, qGraphicsSceneMouseEvent)
def mouseDoubleClickEvent(self, qGraphicsSceneMouseEvent)
def setOperationType(self, type)
def showTransitionContextMenu(self, tranItem, qEvent)
def contextMenuEvent(self, qGraphicsSceneContextMenuEvent)
def stateCodeChanged(self, newCode)
def externalTransitionNameChanged(self, newName)
def stateNameChanged(self, state)
def mousePressEvent(self, qGraphicsSceneMouseEvent)
def removeTransition(self)
def removeStateItem(self, stateItem)
def editStateCode(self, state)
def externalStateNameChanged(self, newName)
def showStateContextMenu(self, stateItem, qEvent)
def addTransitionItem(self, tranItem, isInsertion=True)
def setLastIndexes(self, rootState)
def addStateItem(self, stateItem, isInsertion=True)
def setActiveState(self, state)
def editTransitionCode(self)
def renameTransition(self)
def transitionCodeChanged(self, type, typeValue, code)