Esempio n. 1
0
    def __init__(self, context, signals):

        super(MainWindow, self).__init__()

        self.signals = signals
        self.context = context

        self.resize(800, 480)
        self.setWindowTitle(self.context.getText("pyqx", "title"))

        self.statusBar = self.statusBar()
        self.menuBar = self.createMenuBar()
        self.toolBar = self.createToolBar()
        self.createDockWidgets()

        self.ctrlPressed = False

        self.mainWidget = MainWidget(context, signals, self)
        self.setCentralWidget(self.mainWidget)

        self.imagePosLabel = QtWidgets.QLabel()
        self.imagePosLabel.setObjectName("ImagePosLabel")

        self.signals.autoUpdateTool.connect(self.setCurrentTool)
        self.signals.enterCanvas.connect(self.showImagePosition)
        self.signals.leaveCanvas.connect(self.hideImagePosition)
        self.signals.overCanvas.connect(self.setImagePosition)

        self.show()
Esempio n. 2
0
 def build(self):
     """
     Construir o aplicativo
     """
     # tags e endereços dos dados do MODBUS
     modbus_addrs = {
         # 'tag'         : [endereço, multiplicador, tabela¹, unidade]
         # ¹tabela: 0 = coil; 1 - holding register
         'estado_mot': [800, None, 0, None],
         'freq_des': [799, 1, 1, 'Hz'],
         't_part': [798, 10, 1, 's'],
         'auto_control': [1000, None, 0, None],
         'freq_mot': [800, 10, 1, 'Hz'],
         'tensao': [801, 1, 1, 'V'],
         'rotacao': [803, 1, 1, 'RPM'],
         'pot_entrada': [804, 10, 1, 'W'],
         'corrente': [805, 100, 1, 'A (RMS)'],
         'temp_estator': [806, 10, 1, 'ºC'],
         'vz_entrada': [807, 100, 1, 'L/s'],
         'nivel': [808, 10, 1, 'L'],
         'nivel_h': [809, None, 0, None],
         'nivel_l': [810, None, 0, None],
         'solenoide': [801, None, 0, None]
     }
     db_path = "G:\\Meu Drive\\UFJF\\Engenharia Eletrica\\2020-1\\04 - Informatica Industrial\\ERE\\Trabalhos\\Trabalho_2\\DK\\Supervisorio\\db\\scada.db"
     self._widget = MainWidget(scan_time=1000,
                               server_ip='127.0.0.1',
                               server_port=502,
                               modbus_addrs=modbus_addrs,
                               db_path=db_path)
     return self._widget
Esempio n. 3
0
def main():
    app = QApplication(sys.argv)
    w = MainWidget()
    w.setWindowTitle("Игра \"Жизнь\"")
    w.setFixedSize(w.geometry().width(), w.geometry().height())
    w.show()
    return app.exec_()
Esempio n. 4
0
	def __init__(self, data, com):

		super(MainWindow,self).__init__()

		self.com = com
		self.data = data

		self.com.enterCanvas.connect(self.showImagePosition)
		self.com.leaveCanvas.connect(self.hideImagePosition)
		self.com.overCanvas.connect(self.setImagePosition)

		self.onClickPalette = False
		self.resize(800,480)
		self.setWindowTitle(self.data.getText("pix2pics", "title"))
		self.statusBar = self.statusBar()
		self.menuBar = self.createMenuBar()
		self.toolBar = self.createToolBar()
		self.createDockWidgets()
		self.mainWidget = MainWidget(128, 96, data, com, Qt.red, self)

		self.imagePosLabel = QtGui.QLabel()
		self.imagePosLabel.setObjectName("ImagePosLabel")

		# El Widget alrededor del cual gira la MainWindow es mainWidget
		self.setCentralWidget(self.mainWidget)

		self.show()
Esempio n. 5
0
	def __init__(self, context, signals):

		super(MainWindow, self).__init__()

		self.signals = signals
		self.context = context

		self.resize(800,480)
		self.setWindowTitle(self.context.getText("pyqx", "title"))
		
		self.statusBar = self.statusBar()
		self.menuBar = self.createMenuBar()
		self.toolBar = self.createToolBar()
		self.createDockWidgets()

		self.ctrlPressed = False

		self.mainWidget = MainWidget(context, signals, self)
		self.setCentralWidget(self.mainWidget)

		self.imagePosLabel = QtWidgets.QLabel()
		self.imagePosLabel.setObjectName("ImagePosLabel")

		self.signals.autoUpdateTool.connect(self.setCurrentTool)
		self.signals.enterCanvas.connect(self.showImagePosition)
		self.signals.leaveCanvas.connect(self.hideImagePosition)
		self.signals.overCanvas.connect(self.setImagePosition)

		self.show()
Esempio n. 6
0
    def __init__(self, app=None):
        #QMainWindow.__init__(self, None)
        super(MainWindow, self).__init__(None)
        self.setupUi(self)

        self.app = app
        self.iface = backend.pm.Iface()

        self.busy = QProgressIndicator(self)
        self.busy.setFixedSize(QSize(20, 20))

        self.setWindowIcon(
            QIcon("/usr/share/package-manager/data/tray-zero.svg"))

        self.setCentralWidget(MainWidget(self))
        self.cw = self.centralWidget()

        self.settingsDialog = SettingsDialog(self)

        self.initializeActions()
        self.initializeStatusBar()
        self.initializeTray()
        self.connectMainSignals()

        self.pdsMessageBox = PMessageBox(self)
    def __init__(self):
        super(MainController, self).__init__()
        self.mainWidget = MainWidget()
        self.ControllerCommunication = ControllerCommunication()
        self.ControllerCommunication._consumingThread_()

        self.ControllerCommunication.Room1_led.connect(self.change_led_text1)
        self.ControllerCommunication.Room2_led.connect(self.change_led_text2)

        self.ControllerCommunication.Room1_music_track_name.connect(self.update_track_name1)
        self.ControllerCommunication.Room2_music_track_name.connect(self.update_track_name2)

        self.ControllerCommunication.Room1_music_status.connect(self.update_track_status1)
        self.ControllerCommunication.Room2_music_status.connect(self.update_track_status2)

        # self.ControllerCommunication.Room1_led_On_Msg.connect(self.update_text_led_on)
        # self.ControllerCommunication.Room2_led_On_Msg.connect(self.update_text_led2_on)
        #
        # self.ControllerCommunication.Room1_led_Off_Msg.connect(self.update_text_led_off)
        # self.ControllerCommunication.Room2_led_Off_Msg.connect(self.update_text_led2_off)

        self.ControllerCommunication.Room1_music_volume.connect(self.update_room1_volume)
        self.ControllerCommunication.Room2_music_volume.connect(self.update_room2_volume)


        self.mainWidget.ui.pushButton_5.clicked.connect(self.clear_text)
Esempio n. 8
0
 def __init__(self, parent=None):
     KXmlGuiWindow.__init__(self, parent)
     self.setupUi(self)
     self.setWindowIcon(KIcon(":/data/package-manager.png"))
     self.setCentralWidget(MainWidget(self))
     self.settingsDialog = SettingsDialog(self)
     self.initializeActions()
     self.initializeStatusBar()
     self.initializeTray()
     self.connectMainSignals()
     
     self.offlinemanager = OfflineManager()
     self.connectOfflineSignals()
    def __init__(self):
        super(MainController, self).__init__()
        self.ser = Serial(WIFLY_SERIAL_PORT, WIFLY_BAUD_RATE)
        self.wiflyReceiver = WiflyReceiver(self.ser)
        self.wiflySender = WiflySender(self.ser)
        self.rover = Rover()
        self.mainWidget = MainWidget()
        self.wiflyReceiverThread = QThread()
        self.wiflyReceiver.moveToThread(self.wiflyReceiverThread)
        self.wiflySenderThread = QThread()
        self.wiflySender.moveToThread(self.wiflySenderThread)
        self.simState = SIMULATION_STATE_PHASE_1
        self.simTimer = QTimer()
        self.simTimer.setSingleShot(True)

        self.wiflyReceiver.msgReceived.connect(self.mainWidget.appendMsg)
        self.wiflyReceiver.msgReceived.connect(self.rover.processData)
        self.newCommand.connect(self.wiflySender.sendMsg)
        self.appStart.connect(self.wiflyReceiver.processMsg)
        self.mainWidget.ui.gearSlider.valueChanged.connect(
            self.manualGearChange)
        self.mainWidget.ui.upButton.clicked.connect(self.manualMoveForward)
        self.mainWidget.ui.downButton.clicked.connect(self.manualMoveBackward)
        self.mainWidget.ui.leftButton.clicked.connect(self.manualMoveLeft)
        self.mainWidget.ui.rightButton.clicked.connect(self.manualMoveRight)
        self.mainWidget.ui.brakeButton.clicked.connect(self.manualStop)
        self.mainWidget.ui.simulationButton.clicked.connect(
            self.simulationStart)
        self.rover.newRoverPosition.connect(self.drawRover)
        self.rover.newWallDetected.connect(self.drawNewWall)
        self.simTimer.timeout.connect(self.simulationUpdate)

        self.mapScene = QGraphicsScene(0, 0, WORLD_X / CANVAS_RATIO,
                                       WORLD_Y / CANVAS_RATIO)
        self.mainWidget.ui.mappingGraphicsView.setScene(self.mapScene)

        self.roverRect = QGraphicsRectItem()
        self.mapScene.addItem(self.roverRect)
        """
Esempio n. 10
0
    def setup_window(self):
        self.widget_stack = QStackedWidget(self)
        self.main_widget = MainWidget()
        self.exercise_widget = ExerciseWidget()
        self.exercise_view_widget = ViewWidget()

        self.widget_stack.addWidget(self.main_widget)
        self.widget_stack.addWidget(self.exercise_widget)
        self.widget_stack.addWidget(self.exercise_view_widget)

        self.main_widget.start_exercise_file.connect(self.show_exercise_window)
        self.main_widget.open_exercise_file.connect(
            self.show_exercise_view_widget)
        self.exercise_view_widget.return_button.clicked.connect(
            self.show_main_widget)
Esempio n. 11
0
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        self.setWindowIcon(QtGui.QIcon(":/images/Ir_48x48.png"))

        self.centralViewer = MainWidget()
        self.settings = {}
        self.initSettngs()

        self.connect(self.centralViewer, QtCore.SIGNAL("quitclicked"),
                     self.close)
        self.connect(self.centralViewer, QtCore.SIGNAL("settingsclicked"),
                     self.doSettings)
        self.connect(self.centralViewer, QtCore.SIGNAL("aboutclicked"),
                     self.doAbout)
        self.connect(self.centralViewer, QtCore.SIGNAL("registerclicked"),
                     self.doRegister)
        self.connect(self.centralViewer, QtCore.SIGNAL("helpclicked"),
                     self.doHelp)
        self.connect(self.centralViewer, QtCore.SIGNAL("doclicked"),
                     self.doSettingsAndStart)
        self.setCentralWidget(self.centralViewer)
        self.createActions()
        self.createMenus()
        #self.createToolbar()

        self.has_registered = config.is_registered_fun()
        if self.has_registered:
            self.setWindowTitle(
                QtGui.QApplication.translate("main",
                                             "Hibosoft Batch Image Resizer",
                                             None,
                                             QtGui.QApplication.UnicodeUTF8))
        else:
            self.setWindowTitle(
                QtGui.QApplication.translate(
                    "main",
                    "Hibosoft Batch Image Resizer ( Evaluation Version )",
                    None, QtGui.QApplication.UnicodeUTF8))
Esempio n. 12
0
    def __init__(self, app=None):
        KXmlGuiWindow.__init__(self, None)
        self.setupUi(self)

        self.app = app
        self.iface = backend.pm.Iface()

        self.busy = QProgressIndicator(self)
        self.busy.setFixedSize(QSize(20, 20))

        self.setWindowIcon(KIcon(":/data/package-manager.png"))

        self.setCentralWidget(MainWidget(self))
        self.cw = self.centralWidget()

        self.settingsDialog = SettingsDialog(self)

        self.initializeActions()
        self.initializeStatusBar()
        self.initializeTray()
        self.connectMainSignals()

        self.pdsMessageBox = PMessageBox(self)
    def __init__(self):
        super(MainController, self).__init__()
        self.ser = Serial(WIFLY_SERIAL_PORT, WIFLY_BAUD_RATE)
        self.wiflyReceiver = WiflyReceiver(self.ser)
        self.wiflySender = WiflySender(self.ser)
        self.rover = Rover()
        self.mainWidget = MainWidget()
        self.wiflyReceiverThread = QThread()
        self.wiflyReceiver.moveToThread(self.wiflyReceiverThread)
        self.wiflySenderThread = QThread()
        self.wiflySender.moveToThread(self.wiflySenderThread)
        self.simState = SIMULATION_STATE_PHASE_1
        self.simTimer = QTimer()
        self.simTimer.setSingleShot(True)

        self.wiflyReceiver.msgReceived.connect(self.mainWidget.appendMsg)
        self.wiflyReceiver.msgReceived.connect(self.rover.processData)
        self.newCommand.connect(self.wiflySender.sendMsg)
        self.appStart.connect(self.wiflyReceiver.processMsg)
        self.mainWidget.ui.gearSlider.valueChanged.connect(self.manualGearChange)
        self.mainWidget.ui.upButton.clicked.connect(self.manualMoveForward)
        self.mainWidget.ui.downButton.clicked.connect(self.manualMoveBackward)
        self.mainWidget.ui.leftButton.clicked.connect(self.manualMoveLeft)
        self.mainWidget.ui.rightButton.clicked.connect(self.manualMoveRight)
        self.mainWidget.ui.brakeButton.clicked.connect(self.manualStop)
        self.mainWidget.ui.simulationButton.clicked.connect(self.simulationStart)
        self.rover.newRoverPosition.connect(self.drawRover)
        self.rover.newWallDetected.connect(self.drawNewWall)
        self.simTimer.timeout.connect(self.simulationUpdate)

        self.mapScene = QGraphicsScene(0, 0, WORLD_X / CANVAS_RATIO, WORLD_Y / CANVAS_RATIO)
        self.mainWidget.ui.mappingGraphicsView.setScene(self.mapScene)

        self.roverRect = QGraphicsRectItem()
        self.mapScene.addItem(self.roverRect)

        """
Esempio n. 14
0
    def __init__(self):
        super(MainWindow, self).__init__()
        uic.loadUi('main.ui', self)

        self.setWindowTitle(_App.APP_NAME)
        self.setWindowIcon(QIcon('./res/versaicon.png')) 

        self.currentWidget = CurrentWidget.NONE

        self.mainwidget = MainWidget(self)
        #self.reviewwidget = ReviewWidget(self)

        self.mainStacked.addWidget(self.mainwidget)
        #self.mainStacked.addWidget(self.reviewwidget)

        self.actionExit.triggered.connect(self.close)
        self.actionDbClear.triggered.connect(self.mainwidget.on_dbclear_triggered)
        self.actionDbClearAll.triggered.connect(self.mainwidget.on_dbclearall_triggerd)
        self.actionDownloadFiles.triggered.connect(self.mainwidget.on_downloadfiles_triggered)
        self.actionReviewCount.triggered.connect(self.mainwidget.on_reviewcount_triggered)

        self.setMainWidget()

        self.showMaximized()
class MainController(QObject):

    appstart = pyqtSignal()

    def __init__(self):
        super(MainController, self).__init__()
        self.mainWidget = MainWidget()
        self.ControllerCommunication = ControllerCommunication()
        self.ControllerCommunication._consumingThread_()

        self.ControllerCommunication.Room1_led.connect(self.change_led_text1)
        self.ControllerCommunication.Room2_led.connect(self.change_led_text2)

        self.ControllerCommunication.Room1_music_track_name.connect(self.update_track_name1)
        self.ControllerCommunication.Room2_music_track_name.connect(self.update_track_name2)

        self.ControllerCommunication.Room1_music_status.connect(self.update_track_status1)
        self.ControllerCommunication.Room2_music_status.connect(self.update_track_status2)

        # self.ControllerCommunication.Room1_led_On_Msg.connect(self.update_text_led_on)
        # self.ControllerCommunication.Room2_led_On_Msg.connect(self.update_text_led2_on)
        #
        # self.ControllerCommunication.Room1_led_Off_Msg.connect(self.update_text_led_off)
        # self.ControllerCommunication.Room2_led_Off_Msg.connect(self.update_text_led2_off)

        self.ControllerCommunication.Room1_music_volume.connect(self.update_room1_volume)
        self.ControllerCommunication.Room2_music_volume.connect(self.update_room2_volume)


        self.mainWidget.ui.pushButton_5.clicked.connect(self.clear_text)

    """
        Updating GUI elements for room 1

                                        _
                                      /' )
                                     (_, |
                                       | |
                                       | |
                                       (_)
    """
    @pyqtSlot(str)
    def change_led_text1(self, led1_status):
        """
        change led text for room 1
        :param led1_status:
        :return:
        """
        self.mainWidget.ui.pushButton.setText(led1_status)
        self.mainWidget.ui.textEdit.insertPlainText("Turned room 1 light " + led1_status + " !")
        self.mainWidget.ui.textEdit.moveCursor(QTextCursor.Start)


    @pyqtSlot(str)
    def update_track_name1(self, track1_name):
        """
        change music track name for room 1
        :param track1_name:
        :return:
        """
        self.mainWidget.ui.music_track_name_label.setText(track1_name)
        self.mainWidget.ui.textEdit.insertPlainText("Room 1 playing " + track1_name + "...")
        self.mainWidget.ui.textEdit.moveCursor(QTextCursor.Start)

    @pyqtSlot(str)
    def update_track_status1(self, track1_status):
        """
        change music status name for room 2
        :param track1_status:
        :return:
        """
        self.mainWidget.ui.music_label_status.setText(track1_status)

    """
        Updating GUI elements for room 2

                                       __
                                     /'__`\
                                    (_)  ) )
                                       /' /
                                     /' /( )
                                    (_____/'
    """

    @pyqtSlot(str)
    def change_led_text2(self, led2_status):
        """
        change led text for room 2
        :param led2_status:
        :return:
        """
        self.mainWidget.ui.pushButton_2.setText(led2_status)
        self.mainWidget.ui.textEdit.insertPlainText("Turned room 2 light " + led2_status + " !")
        self.mainWidget.ui.textEdit.moveCursor(QTextCursor.Start)

    @pyqtSlot(str)
    def update_track_name2(self, track2_name):
        """
        change music status name for room 2
        :param track2_name:
        :return:
        """
        self.mainWidget.ui.music_track_name_label_2.setText(track2_name)
        self.mainWidget.ui.textEdit.insertPlainText("Room 2 playing " + track2_name + "...")
        self.mainWidget.ui.textEdit.moveCursor(QTextCursor.Start)


    @pyqtSlot(str)
    def update_track_status2(self, track2_status):
        """
        change music status name for room 2
        :param track2_status:
        :return:
        """
        self.mainWidget.ui.music_label_status_2.setText(track2_status)

    @pyqtSlot(int)
    def update_room1_volume(self, num):
        self.mainWidget.ui.lcdNumber.display(num)

    @pyqtSlot(int)
    def update_room2_volume(self, num2):
        self.mainWidget.ui.lcdNumber_2.display(num2)

    # @pyqtSlot()
    # def update_text_led_on(self):
    #     self.mainWidget.ui.textBrowser.append("Turned room 1 light on !")
    #
    # @pyqtSlot()
    # def update_text_led2_on(self):
    #     self.mainWidget.ui.textBrowser.append("Turned room 2 light on !")
    #
    # @pyqtSlot()
    # def update_text_led_off(self):
    #     self.mainWidget.ui.textBrowser.append("Turned room 1 light off !")
    #
    # @pyqtSlot()
    # def update_text_led2_off(self):
    #     self.mainWidget.ui.textBrowser.append("Turned room 2 light off !")
    @pyqtSlot()
    def clear_text(self):
        self.mainWidget.ui.textEdit.clear()

    def start(self):
        self.mainWidget.show()
        self.mainWidget.showFullScreen()
        self.appstart.emit()
Esempio n. 16
0
from mainwidget import MainWidget
from PyQt5.QtWidgets import QApplication

if __name__ == "__main__":

    app = QApplication([])
    app.setStyle("Fusion")

    window = MainWidget()

    window.show()
    app.exec_()
class MainController(QObject):

    appStart = pyqtSignal()
    newCommand = pyqtSignal(tuple)

    def __init__(self):
        super(MainController, self).__init__()
        self.ser = Serial(WIFLY_SERIAL_PORT, WIFLY_BAUD_RATE)
        self.wiflyReceiver = WiflyReceiver(self.ser)
        self.wiflySender = WiflySender(self.ser)
        self.rover = Rover()
        self.mainWidget = MainWidget()
        self.wiflyReceiverThread = QThread()
        self.wiflyReceiver.moveToThread(self.wiflyReceiverThread)
        self.wiflySenderThread = QThread()
        self.wiflySender.moveToThread(self.wiflySenderThread)
        self.simState = SIMULATION_STATE_PHASE_1
        self.simTimer = QTimer()
        self.simTimer.setSingleShot(True)

        self.wiflyReceiver.msgReceived.connect(self.mainWidget.appendMsg)
        self.wiflyReceiver.msgReceived.connect(self.rover.processData)
        self.newCommand.connect(self.wiflySender.sendMsg)
        self.appStart.connect(self.wiflyReceiver.processMsg)
        self.mainWidget.ui.gearSlider.valueChanged.connect(self.manualGearChange)
        self.mainWidget.ui.upButton.clicked.connect(self.manualMoveForward)
        self.mainWidget.ui.downButton.clicked.connect(self.manualMoveBackward)
        self.mainWidget.ui.leftButton.clicked.connect(self.manualMoveLeft)
        self.mainWidget.ui.rightButton.clicked.connect(self.manualMoveRight)
        self.mainWidget.ui.brakeButton.clicked.connect(self.manualStop)
        self.mainWidget.ui.simulationButton.clicked.connect(self.simulationStart)
        self.rover.newRoverPosition.connect(self.drawRover)
        self.rover.newWallDetected.connect(self.drawNewWall)
        self.simTimer.timeout.connect(self.simulationUpdate)

        self.mapScene = QGraphicsScene(0, 0, WORLD_X / CANVAS_RATIO, WORLD_Y / CANVAS_RATIO)
        self.mainWidget.ui.mappingGraphicsView.setScene(self.mapScene)

        self.roverRect = QGraphicsRectItem()
        self.mapScene.addItem(self.roverRect)

        """
        rect1 = QGraphicsRectItem()
        rect2 = QGraphicsRectItem()
        self.mapScene.addItem(rect1)
        self.mapScene.addItem(rect2)
        rect1.setRect(100, 100, 20, 40)
        rect2.setRect(100, 100, 20, 40)
        #rect.moveBy(10, 50)
        rect2.setTransformOriginPoint(100, 100)
        rect2.setRotation(-10)
        print rect1.rect().center()
        #print rect2.transformOriginPoint().x(), rect2.transformOriginPoint().y()
        """

    @pyqtSlot(tuple, tuple)
    def drawNewWall(self, wallFront, wallRear):
        pFront = QGraphicsRectItem(wallFront[0] / CANVAS_RATIO,
                                   wallFront[1] / CANVAS_RATIO,
                                   DOT_SIZE, DOT_SIZE)
        pRear = QGraphicsRectItem(wallRear[0] / CANVAS_RATIO,
                                  wallRear[1] / CANVAS_RATIO,
                                  DOT_SIZE, DOT_SIZE)
        self.mapScene.addItem(pFront)
        self.mapScene.addItem(pRear)

    @pyqtSlot(tuple, float)
    def drawRover(self, center, orientation):
        self.roverRect.setRect((center[0] - ROVER_WIDTH / 2) / CANVAS_RATIO,
                               (center[1] - ROVER_LENGTH / 2) / CANVAS_RATIO,
                               ROVER_WIDTH / CANVAS_RATIO, ROVER_LENGTH / CANVAS_RATIO)
        self.roverRect.setTransformOriginPoint(center[0] / CANVAS_RATIO, center[1] / CANVAS_RATIO)
        self.roverRect.setRotation(math.degrees(-orientation))

    @pyqtSlot()
    def manualGearChange(self):
        gear = self.mainWidget.ui.gearSlider.value()
        self.mainWidget.ui.gearLcdNumber.display(gear)
        self.rover.roverGear = gear
        self.rover.updateMotorCommand()
        self.newCommand.emit(tuple(self.rover.commandMsg))

    @pyqtSlot()
    def manualMoveForward(self):
        self.rover.roverDirection = ROVER_DIRECTION_FORWARD
        self.rover.updateMotorCommand()
        self.newCommand.emit(tuple(self.rover.commandMsg))

    @pyqtSlot()
    def manualMoveBackward(self):
        self.rover.roverDirection = ROVER_DIRECTION_BACKWARD
        self.rover.updateMotorCommand()
        self.newCommand.emit(tuple(self.rover.commandMsg))

    @pyqtSlot()
    def manualMoveLeft(self):
        self.rover.roverDirection = ROVER_DIRECTION_LEFT
        self.rover.updateMotorCommand()
        self.newCommand.emit(tuple(self.rover.commandMsg))

    @pyqtSlot()
    def manualMoveRight(self):
        self.rover.roverDirection = ROVER_DIRECTION_RIGHT
        self.rover.updateMotorCommand()
        self.newCommand.emit(tuple(self.rover.commandMsg))

    @pyqtSlot()
    def manualStop(self):
        self.mainWidget.ui.gearSlider.setValue(0)

    @pyqtSlot()
    def simulationStart(self):
        self.simState == SIMULATION_STATE_PHASE_1
        self.simTimer.start(5000)

    @pyqtSlot()
    def simulationUpdate(self):
        if self.simState == SIMULATION_STATE_PHASE_1:
            self.simState = SIMULATION_STATE_PHASE_2
            self.rover.roverGear = 2
            self.rover.roverDirection = ROVER_DIRECTION_FORWARD
            self.rover.updateMotorCommand()
            self.newCommand.emit(tuple(self.rover.commandMsg))
            self.simTimer.start(16000)
        elif self.simState == SIMULATION_STATE_PHASE_2:
            self.simState = SIMULATION_STATE_PHASE_3
            self.rover.roverDirection = ROVER_DIRECTION_BACKWARD
            self.rover.updateMotorCommand()
            self.newCommand.emit(tuple(self.rover.commandMsg))
            self.simTimer.start(6100)
        elif self.simState == SIMULATION_STATE_PHASE_3:
            self.simState = SIMULATION_STATE_PHASE_4
            self.rover.roverDirection = ROVER_DIRECTION_LEFT
            self.rover.updateMotorCommand()
            self.newCommand.emit(tuple(self.rover.commandMsg))
            self.simTimer.start(3500)
        elif self.simState == SIMULATION_STATE_PHASE_4:
            self.simState = SIMULATION_STATE_PHASE_5
            self.rover.roverDirection = ROVER_DIRECTION_BACKWARD
            self.rover.updateMotorCommand()
            self.newCommand.emit(tuple(self.rover.commandMsg))
            self.simTimer.start(8300)
        elif self.simState == SIMULATION_STATE_PHASE_5:
            self.rover.roverGear = 0
            self.rover.roverDirection = ROVER_DIRECTION_STOP
            self.rover.updateMotorCommand()
            self.newCommand.emit(tuple(self.rover.commandMsg))

    def start(self):
        self.mainWidget.show()
        self.wiflyReceiverThread.start()
        self.wiflySenderThread.start()
        self.appStart.emit()
Esempio n. 18
0
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.mainwidget = MainWidget(self)
        self.setCentralWidget(self.mainwidget)
        self.setWindowTitle('Pocketpick')
Esempio n. 19
0
 def build(self):
     """
     construtor
     """
     self._widget = MainWidget()
     return self._widget
Esempio n. 20
0
class MainWindow(QtWidgets.QMainWindow):

	def __init__(self, context, signals):

		super(MainWindow, self).__init__()

		self.signals = signals
		self.context = context

		self.resize(800,480)
		self.setWindowTitle(self.context.getText("pyqx", "title"))
		
		self.statusBar = self.statusBar()
		self.menuBar = self.createMenuBar()
		self.toolBar = self.createToolBar()
		self.createDockWidgets()

		self.ctrlPressed = False

		self.mainWidget = MainWidget(context, signals, self)
		self.setCentralWidget(self.mainWidget)

		self.imagePosLabel = QtWidgets.QLabel()
		self.imagePosLabel.setObjectName("ImagePosLabel")

		self.signals.autoUpdateTool.connect(self.setCurrentTool)
		self.signals.enterCanvas.connect(self.showImagePosition)
		self.signals.leaveCanvas.connect(self.hideImagePosition)
		self.signals.overCanvas.connect(self.setImagePosition)

		self.show()

	def createPopupMenu(self):

		pass # Reimplementando esta función conseguimos que no se creen los menús popup cuando hacemos click derecho en toolbars/dockwidgets.

	def createToolBarActions(self):

		l = []

		self.tools = QtWidgets.QActionGroup(self)

		tools = ["selection", "magicwand", "pencil", "eraser", "colorpicker", "fill", "gradient", "exchange"]
		connects = [lambda: self.context.changeCurrentTool(Pixeler.Tools.Selection),
					lambda: self.context.changeCurrentTool(Pixeler.Tools.MagicWand),
					lambda: self.context.changeCurrentTool(Pixeler.Tools.Pencil),
					lambda: self.context.changeCurrentTool(Pixeler.Tools.Eraser),
					lambda: self.context.changeCurrentTool(Pixeler.Tools.ColorPicker),
					lambda: self.context.changeCurrentTool(Pixeler.Tools.Fill),
					lambda: self.context.changeCurrentTool(Pixeler.Tools.Gradient),
					lambda: self.context.changeCurrentTool(Pixeler.Tools.Exchange)]
		shortcuts = ['Z', '', 'X', 'C', 'A', 'S', 'D', '']

		for i in range(len(tools)):
			a = QtWidgets.QAction(QtGui.QIcon( os.path.join("themes", self.context.theme, tools[i] + ".png") ), self.context.getText("tools", tools[i]) + " (" + shortcuts[i] + ")", self.tools)
			a.setCheckable(True)
			a.setShortcut(shortcuts[i])
			if connects[i] != 0: a.toggled.connect(connects[i])
			l.append(a)

		a = QtWidgets.QAction(QtGui.QIcon( os.path.join("themes", self.context.theme, "zoomin.png") ), self.context.getText("tools", "zoomin"), self.tools)
		a.setShortcut("Ctrl++")
		a.triggered.connect(self.zoomIn)
		l.append(a)

		a = QtWidgets.QAction(QtGui.QIcon( os.path.join("themes", self.context.theme, "zoomout.png") ), self.context.getText("tools", "zoomout"), self.tools)
		a.setShortcut("Ctrl+-")
		a.triggered.connect(self.zoomOut)
		l.append(a)

		l[self.context.currentTool].setChecked(True)

		return l

	def createToolBar(self):

		toolBar = QtWidgets.QToolBar()
		l = self.createToolBarActions()

		j = 0
		for i in l:
			toolBar.addAction(i)
			if j == 7:
				toolBar.addSeparator()
			j += 1

		toolBar.setMovable(False)
		toolBar.setOrientation(Qt.Vertical)
		self.addToolBar(Qt.LeftToolBarArea, toolBar)

		return toolBar

	def createFileActions(self):

		ids = ["new", "open", "save", "saveas", "exit"]
		icons = ["document-new.png", "document-open.png", "document-save.png", "document-save-as.png", "application-exit.png"]
		shortcuts = ['Ctrl+N', 'Ctrl+O', 'Ctrl+S', 'Ctrl+Shift+S', 'Ctrl+Q']
		connects = [self.newFile, self.openFile, self.saveFile, self.saveFileAs, self.close]

		l = []

		for i in range(len(ids)):
			a = QtWidgets.QAction(QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_file_labels", ids[i]), self)
			a.setShortcut(shortcuts[i])
			a.triggered.connect(self.restoreFocus)
			a.setStatusTip(self.context.getText("menu_file_status_tips", ids[i]))
			if connects[i] != 0: a.triggered.connect(connects[i])
			l.append(a)

		l.insert(4,0) # Los ceros simbolizan separadores

		return l

	def createEditActions(self):

		ids = ["undo", "redo", "selectall", "deselect", "cut", "copy", "paste", "clear", "preferences"]
		icons = ["edit-undo.png", "edit-redo.png", "", "", "edit-cut.png", "edit-copy.png", "edit-paste.png", "edit-clear.png", "document-properties.png"]
		shortcuts = ['Ctrl+Z', 'Ctrl+Y', "Ctrl+A", "Ctrl+Shift+A", 'Ctrl+X', 'Ctrl+C', 'Ctrl+V', 'Del', '']
		connects = [self.undo, self.redo, self.selectAll, self.deselect, self.cut, self.copy, self.paste, self.clear, self.showPreferences]

		l = []

		for i in range(len(ids)):
			a = QtWidgets.QAction(QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_edit_labels", ids[i]), self)
			a.setShortcut(shortcuts[i])
			a.triggered.connect(self.restoreFocus)
			a.setStatusTip(self.context.getText("menu_edit_status_tips", ids[i]))
			if connects[i] != 0: a.triggered.connect(connects[i])
			l.append(a)

		# Los ceros simbolizan separadores
		l.insert(2,0)
		l.insert(5,0)
		l.insert(10,0)

		return l

	def createViewActions(self):

		ids = ["pixel_grid", "matrix_grid"]
		icons = ["", ""]
		shortcuts = ['Ctrl+G', 'Ctrl+M']
		connects = [self.setPixelGrid, self.setMatrixGrid]

		l = []

		for i in range(len(ids)):
			a = QtWidgets.QAction(QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_view_labels", ids[i]), self)
			a.setShortcut(shortcuts[i])
			a.triggered.connect(self.restoreFocus)
			a.setStatusTip(self.context.getText("menu_view_status_tips", ids[i]))
			if connects[i] != 0: a.triggered.connect(connects[i])
			a.setCheckable(True)
			l.append(a)

		l.insert(2,0) # Los ceros simbolizan separadores

		# Algunas opcionas son chekables, lo consideramos:
		l[0].setCheckable(True)
		if self.context.grid: l[0].setChecked(True)
		l[1].setCheckable(True)
		if self.context.matrixGrid: l[1].setChecked(True)

		return l

	def createTransformActions(self):

		ids = ["flip_hor", "flip_ver", "rotate_cw", "rotate_ccw", "rotate_180", "resize", "resize_canvas"]
		icons = ["", "", "", "", "", "", ""]
		shortcuts = ['', '', '', '', '', '', '']
		connects = [self.flipHorizontally,self.flipVertically,self.rotate90CW,self.rotate90CCW,self.rotate180,self.showResizeImageDialog,self.showResizeCanvasDialog]

		l = []

		for i in range(len(ids)):
			a = QtWidgets.QAction(QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_transform_labels", ids[i]), self)
			a.setShortcut(shortcuts[i])
			a.triggered.connect(self.restoreFocus)
			a.setStatusTip(self.context.getText("menu_transform_status_tips", ids[i]))
			if connects[i] != 0: a.triggered.connect(connects[i])
			l.append(a)

		# Los ceros simbolizan separadores
		l.insert(2,0)
		l.insert(6,0)

		return l

	def createHelpActions(self):

		ids = ["contents", "about"]
		icons = ["help-contents.png", "help-about.png"]
		shortcuts = ['F1', 'Ctrl+B']
		connects = [self.showHelp, self.showAboutDialog]

		l = []

		for i in range(len(ids)):
			a = QtWidgets.QAction(QtGui.QIcon("images/" + icons[i]), self.context.getText("menu_help_labels", ids[i]), self)
			a.setShortcut(shortcuts[i])
			a.triggered.connect(self.restoreFocus)
			a.setStatusTip(self.context.getText("menu_help_status_tips", ids[i]))
			if connects[i] != 0: a.triggered.connect(connects[i])
			l.append(a)

		l.insert(1,0) # Los ceros simbolizan separadores

		return l

	def createMenuBar(self):
		
		menubar = self.menuBar()
		fileMenu = menubar.addMenu(self.context.getText("menu", "file"))
		editMenu = menubar.addMenu(self.context.getText("menu", "edit"))
		viewMenu = menubar.addMenu(self.context.getText("menu", "view"))
		transformMenu = menubar.addMenu(self.context.getText("menu", "transform"))
		helpMenu = menubar.addMenu(self.context.getText("menu", "help"))
		fileActions = self.createFileActions()
		editActions = self.createEditActions()
		viewActions = self.createViewActions()
		transformActions = self.createTransformActions()
		helpActions = self.createHelpActions()
		for i in fileActions:
			if i == 0: fileMenu.addSeparator()
			else: fileMenu.addAction(i)
		for i in editActions:
			if i == 0: editMenu.addSeparator()
			else: editMenu.addAction(i)
		for i in viewActions:
			if i == 0: viewMenu.addSeparator()
			else: viewMenu.addAction(i)
		for i in helpActions:
			if i == 0: helpMenu.addSeparator()
			else: helpMenu.addAction(i)
		for i in transformActions:
			if i == 0: transformMenu.addSeparator()
			else: transformMenu.addAction(i)

		return menubar

	def createDockWidgets(self):
		
		# Palette widget
		self.palette = QtWidgets.QDockWidget(self.context.getText("dock_widgets", "palette"), self)
		self.palette.setAllowedAreas(Qt.RightDockWidgetArea)
		self.palette.setFeatures(QtWidgets.QDockWidget.NoDockWidgetFeatures)

		paletteWidget = Palette(self.context, self.signals)

		self.palette.setWidget(paletteWidget)
		self.palette.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)

		self.addDockWidget(Qt.RightDockWidgetArea, self.palette)

		# Tool Properties widget
		self.toolProperties = ToolProperties(self.context.getText("dock_widgets", "tool_properties"), self.context, self.signals)
		self.addDockWidget(Qt.RightDockWidgetArea, self.toolProperties)
		self.toolProperties.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)

		# Preview
		self.preview = Preview(self.context.getText("dock_widgets", "preview"), self.context, self.signals, self)
		self.addDockWidget(Qt.RightDockWidgetArea, self.preview)

	def restoreFocus(self):

		print("Restoring Focus")
		self.ctrlPressed = False
		self.releaseMouse()
		self.releaseKeyboard()
		QtCore.QCoreApplication.instance().restoreOverrideCursor()

	def setCurrentTool(self, index):

		self.tools.actions()[0].setChecked(True)
		self.signals.updateTool.emit(0)

	def zoomIn(self):

		if self.context.currentImage().zoom < 25:
			self.context.currentImage().zoom += 1
			self.signals.zoom.emit()

	def zoomOut(self):

		if self.context.currentImage().zoom > 1:
			self.context.currentImage().zoom -= 1
			self.signals.zoom.emit()

	def newFile(self):

		d = NewFileDialog(self.context, self)

	def openFile(self):
		
		fileName = QtWidgets.QFileDialog.getOpenFileName(self,
					self.context.getText("dialog_open", "title"),
					"/home",
					self.context.getText("dialog_open", "images") + u" (*.bmp *.gif *.png *.xpm *.jpg);;" + self.context.getText("dialog_open", "all_files") + u" (*)")
		if fileName:
			self.context.loadImage(fileName)

	def saveFile(self):

		if self.context.currentImage().fileName == "":
			self.saveFileAs()
		else:	
			self.context.currentImage().save()

	def saveFileAs(self):

		d = QtWidgets.QFileDialog()
		fileName, filterName = d.getSaveFileName(self,
					self.context.getText("dialog_save", "title"), 
					"", 
					"*.bmp;;*.gif;;*.png;;*.xpm;;*.jpg")

		if fileName.split(".")[-1] in ["bmp", "gif", "png", "xpm", "jpg"]:
			self.context.currentImage().fileName = fileName
			self.signals.fileNameChanged.emit(self.context.getCurrentImagePos(), os.path.basename(str(fileName)))
		else:
			self.context.currentImage().fileName = fileName + filterName[1:]
			self.signals.fileNameChanged.emit(self.context.getCurrentImagePos(), os.path.basename(str(fileName + filterName[1:])))
		self.context.currentImage().save()

	def close(self):

		pass

	def undo(self):

		if self.context.currentImage().posHistory > 0:
			self.context.currentImage().posHistory -= 1
			self.context.currentImage().image = QtWidgets.QImage(self.context.currentImage().history[self.context.currentImage().posHistory])
			self.signals.updateCanvas.emit()
			self.signals.resizeCanvas.emit()

	def redo(self):

		if self.context.currentImage().posHistory < len(self.context.currentImage().history)-1:
			self.context.currentImage().posHistory += 1
			self.context.currentImage().image = QtWidgets.QImage(self.context.currentImage().history[self.context.currentImage().posHistory])
			self.signals.updateCanvas.emit()
			self.signals.resizeCanvas.emit()

	def selectAll(self):

		self.mainWidget.currentWidget().canvas.selectAll()

	def deselect(self):

		self.mainWidget.currentWidget().canvas.applySelection()

	def cut(self):

		self.signals.cutImage.emit()

	def copy(self):

		self.signals.copyImage.emit()

	def paste(self):

		clipboard = QtWidgets.QApplication.clipboard()
		if not clipboard.image().isNull():
			self.signals.pasteImage.emit()
			self.signals.updateCanvas.emit()

	def clear(self):

		self.signals.clearImage.emit()

	def showPreferences(self):

		d = Preferences(self.context, self.signals, self)

	def setPixelGrid(self):

		self.context.grid = not self.context.grid
		self.signals.updateCanvas.emit()
		self.context.setDefault("grid", "grid", self.context.grid)

	def setMatrixGrid(self):

		self.context.matrixGrid = not self.context.matrixGrid
		self.signals.updateCanvas.emit()
		self.context.setDefault("grid", "matrix_grid", self.context.matrixGrid)

	def flipHorizontally(self):

		pass

	def flipVertically(self):

		pass

	def rotate90CW(self):

		pass

	def rotate90CCW(self):

		pass

	def rotate180(self):

		pass

	def showResizeImageDialog(self):

		pass

	def showResizeCanvasDialog(self):

		pass

	def showHelp(self):

		pass

	def showAboutDialog(self):

		pass

	def showImagePosition(self):

		if self.imagePosLabel.isHidden():
			self.statusBar.insertWidget(0, self.imagePosLabel, 0)
			self.imagePosLabel.show()

	def hideImagePosition(self):

		self.statusBar.removeWidget(self.imagePosLabel)

	def setImagePosition(self, x, y):

		self.imagePosLabel.setText("  Pos: (" + str(x) + ", " + str(y) + ")")

	def keyPressEvent(self, event):

		super(MainWindow, self).keyPressEvent(event)

		if event.key() == Qt.Key_Control:
			print("Control Pressed")
			self.ctrlPressed = True
			QtCore.QCoreApplication.instance().setOverrideCursor(self.context.colorPickerCur)
			self.signals.ctrlPressed.emit()
			self.grabMouse()
			self.grabKeyboard()

		elif event.key() == Qt.Key_Plus:
			if self.context.currentTool == 1:
				self.context.setPencilSize(self.context.pencilSize+1)
			elif self.context.currentTool == 2:
				self.context.setEraserSize(self.context.eraserSize+1)

		elif event.key() == Qt.Key_Minus:
			if self.context.currentTool == 1:
				self.context.setPencilSize(self.context.pencilSize-1)
			elif self.context.currentTool == 2:
				self.context.setEraserSize(self.context.eraserSize-1)

		else:
			QtCore.QCoreApplication.instance().restoreOverrideCursor()
			self.releaseMouse()
			self.releaseKeyboard()

	def keyReleaseEvent(self, event):

		super(MainWindow, self).keyReleaseEvent(event)

		if event.key() == Qt.Key_Control:
			self.ctrlPressed = False
			QtCore.QCoreApplication.instance().restoreOverrideCursor()
			self.releaseMouse()
			self.releaseKeyboard()

	def mousePressEvent(self, event):

		super(MainWindow, self).mousePressEvent(event)

		if self.ctrlPressed:
			print("Picking Desktop Color")
			widget = QtCore.QCoreApplication.instance().desktop().screen()
			im = QtWidgets.QPixmap.grabWindow(widget.winId()).toImage() # Captura de pantalla
			c = QtWidgets.QColor(im.pixel(QtWidgets.QCursor.pos())) # Cogemos el color de la posición del cursor
			if event.button() == Qt.LeftButton:
				self.context.changePrimaryColor(c) # Cambiamos el color primario actual por el que hemos cogido
			elif event.button() == Qt.RightButton:
				self.context.changeSecondaryColor(c) # Cambiamos el color secundario actual por el que hemos cogido
			# im.save("desktop.png") # Guardar la captura de pantalla en un archivo
			# print "Getting color " + c.red(), c.green(), c.blue() + " from screen" # Comprueba qué color coge

	def mouseMoveEvent(self, event):

		super(MainWindow, self).mouseMoveEvent(event)

		# Lo mismo de antes pero para cuando el ratón se mueve
		if self.ctrlPressed:
			widget = QtCore.QCoreApplication.instance().desktop().screen()
			im = QtWidgets.QPixmap.grabWindow(widget.winId()).toImage() # Captura de pantalla
			c = QtWidgets.QColor(im.pixel(QtWidgets.QCursor.pos())) # Cogemos el color de la posición del cursor
			if event.buttons() == Qt.LeftButton:
				self.context.changePrimaryColor(c) # Cambiamos el color primario actual por el que hemos cogido
			elif event.buttons() == Qt.RightButton:
				self.context.changeSecondaryColor(c) # Cambiamos el color secundario actual por el que hemos cogido

	def wheelEvent(self, event):

		if self.ctrlPressed:
			if event.delta() > 0:
				self.zoomIn()
			else:
				self.zoomOut()

		super(MainWindow, self).wheelEvent(event)

	def closeEvent(self, event):

		l = []
		for i in range(len(self.context.images)):
			if self.context.images[i].modified: l.append(i)

		if len(l) > 0:
			# Mostrar diálogo
			reply = QtWidgets.QMessageBox.warning(self, self.context.getText("dialog_exit", "title"),
				self.context.getText("dialog_exit", "message"),
				QtWidgets.QMessageBox.SaveAll | QtWidgets.QMessageBox.Discard | QtWidgets.QMessageBox.Cancel,
				QtWidgets.QMessageBox.Cancel)
			if reply == QtWidgets.QMessageBox.Discard:
				event.accept()
			elif reply == QtWidgets.QMessageBox.Cancel:
				event.ignore()  
				return
			elif reply == QtWidgets.QMessageBox.SaveAll:
				for i in l:
					self.mainWidget.setCurrentIndex(i)
					self.context.setCurrentImagePos(i)
					self.saveFile()
				event.accept()
				return

			

		self.context.saveDefaults()

		super(MainWindow, self).closeEvent(event)
Esempio n. 21
0
import sys

from PySide6.QtWidgets import QApplication
from mainwidget import MainWidget

if __name__ == "__main__":
    app = QApplication(sys.argv)

    widget = MainWidget()
    widget.show()

    sys.exit(app.exec_())
Esempio n. 22
0
 def build(self):
     mw = MainWidget()
     Clock.schedule_interval(mw.update, 0.05)
     return mw
class MainController(QObject):

    appStart = pyqtSignal()
    newCommand = pyqtSignal(tuple)

    def __init__(self):
        super(MainController, self).__init__()
        self.ser = Serial(WIFLY_SERIAL_PORT, WIFLY_BAUD_RATE)
        self.wiflyReceiver = WiflyReceiver(self.ser)
        self.wiflySender = WiflySender(self.ser)
        self.rover = Rover()
        self.mainWidget = MainWidget()
        self.wiflyReceiverThread = QThread()
        self.wiflyReceiver.moveToThread(self.wiflyReceiverThread)
        self.wiflySenderThread = QThread()
        self.wiflySender.moveToThread(self.wiflySenderThread)
        self.simState = SIMULATION_STATE_PHASE_1
        self.simTimer = QTimer()
        self.simTimer.setSingleShot(True)

        self.wiflyReceiver.msgReceived.connect(self.mainWidget.appendMsg)
        self.wiflyReceiver.msgReceived.connect(self.rover.processData)
        self.newCommand.connect(self.wiflySender.sendMsg)
        self.appStart.connect(self.wiflyReceiver.processMsg)
        self.mainWidget.ui.gearSlider.valueChanged.connect(
            self.manualGearChange)
        self.mainWidget.ui.upButton.clicked.connect(self.manualMoveForward)
        self.mainWidget.ui.downButton.clicked.connect(self.manualMoveBackward)
        self.mainWidget.ui.leftButton.clicked.connect(self.manualMoveLeft)
        self.mainWidget.ui.rightButton.clicked.connect(self.manualMoveRight)
        self.mainWidget.ui.brakeButton.clicked.connect(self.manualStop)
        self.mainWidget.ui.simulationButton.clicked.connect(
            self.simulationStart)
        self.rover.newRoverPosition.connect(self.drawRover)
        self.rover.newWallDetected.connect(self.drawNewWall)
        self.simTimer.timeout.connect(self.simulationUpdate)

        self.mapScene = QGraphicsScene(0, 0, WORLD_X / CANVAS_RATIO,
                                       WORLD_Y / CANVAS_RATIO)
        self.mainWidget.ui.mappingGraphicsView.setScene(self.mapScene)

        self.roverRect = QGraphicsRectItem()
        self.mapScene.addItem(self.roverRect)
        """
        rect1 = QGraphicsRectItem()
        rect2 = QGraphicsRectItem()
        self.mapScene.addItem(rect1)
        self.mapScene.addItem(rect2)
        rect1.setRect(100, 100, 20, 40)
        rect2.setRect(100, 100, 20, 40)
        #rect.moveBy(10, 50)
        rect2.setTransformOriginPoint(100, 100)
        rect2.setRotation(-10)
        print rect1.rect().center()
        #print rect2.transformOriginPoint().x(), rect2.transformOriginPoint().y()
        """

    @pyqtSlot(tuple, tuple)
    def drawNewWall(self, wallFront, wallRear):
        pFront = QGraphicsRectItem(wallFront[0] / CANVAS_RATIO,
                                   wallFront[1] / CANVAS_RATIO, DOT_SIZE,
                                   DOT_SIZE)
        pRear = QGraphicsRectItem(wallRear[0] / CANVAS_RATIO,
                                  wallRear[1] / CANVAS_RATIO, DOT_SIZE,
                                  DOT_SIZE)
        self.mapScene.addItem(pFront)
        self.mapScene.addItem(pRear)

    @pyqtSlot(tuple, float)
    def drawRover(self, center, orientation):
        self.roverRect.setRect((center[0] - ROVER_WIDTH / 2) / CANVAS_RATIO,
                               (center[1] - ROVER_LENGTH / 2) / CANVAS_RATIO,
                               ROVER_WIDTH / CANVAS_RATIO,
                               ROVER_LENGTH / CANVAS_RATIO)
        self.roverRect.setTransformOriginPoint(center[0] / CANVAS_RATIO,
                                               center[1] / CANVAS_RATIO)
        self.roverRect.setRotation(math.degrees(-orientation))

    @pyqtSlot()
    def manualGearChange(self):
        gear = self.mainWidget.ui.gearSlider.value()
        self.mainWidget.ui.gearLcdNumber.display(gear)
        self.rover.roverGear = gear
        self.rover.updateMotorCommand()
        self.newCommand.emit(tuple(self.rover.commandMsg))

    @pyqtSlot()
    def manualMoveForward(self):
        self.rover.roverDirection = ROVER_DIRECTION_FORWARD
        self.rover.updateMotorCommand()
        self.newCommand.emit(tuple(self.rover.commandMsg))

    @pyqtSlot()
    def manualMoveBackward(self):
        self.rover.roverDirection = ROVER_DIRECTION_BACKWARD
        self.rover.updateMotorCommand()
        self.newCommand.emit(tuple(self.rover.commandMsg))

    @pyqtSlot()
    def manualMoveLeft(self):
        self.rover.roverDirection = ROVER_DIRECTION_LEFT
        self.rover.updateMotorCommand()
        self.newCommand.emit(tuple(self.rover.commandMsg))

    @pyqtSlot()
    def manualMoveRight(self):
        self.rover.roverDirection = ROVER_DIRECTION_RIGHT
        self.rover.updateMotorCommand()
        self.newCommand.emit(tuple(self.rover.commandMsg))

    @pyqtSlot()
    def manualStop(self):
        self.mainWidget.ui.gearSlider.setValue(0)

    @pyqtSlot()
    def simulationStart(self):
        self.simState == SIMULATION_STATE_PHASE_1
        self.simTimer.start(5000)

    @pyqtSlot()
    def simulationUpdate(self):
        if self.simState == SIMULATION_STATE_PHASE_1:
            self.simState = SIMULATION_STATE_PHASE_2
            self.rover.roverGear = 2
            self.rover.roverDirection = ROVER_DIRECTION_FORWARD
            self.rover.updateMotorCommand()
            self.newCommand.emit(tuple(self.rover.commandMsg))
            self.simTimer.start(16000)
        elif self.simState == SIMULATION_STATE_PHASE_2:
            self.simState = SIMULATION_STATE_PHASE_3
            self.rover.roverDirection = ROVER_DIRECTION_BACKWARD
            self.rover.updateMotorCommand()
            self.newCommand.emit(tuple(self.rover.commandMsg))
            self.simTimer.start(6100)
        elif self.simState == SIMULATION_STATE_PHASE_3:
            self.simState = SIMULATION_STATE_PHASE_4
            self.rover.roverDirection = ROVER_DIRECTION_LEFT
            self.rover.updateMotorCommand()
            self.newCommand.emit(tuple(self.rover.commandMsg))
            self.simTimer.start(3500)
        elif self.simState == SIMULATION_STATE_PHASE_4:
            self.simState = SIMULATION_STATE_PHASE_5
            self.rover.roverDirection = ROVER_DIRECTION_BACKWARD
            self.rover.updateMotorCommand()
            self.newCommand.emit(tuple(self.rover.commandMsg))
            self.simTimer.start(8300)
        elif self.simState == SIMULATION_STATE_PHASE_5:
            self.rover.roverGear = 0
            self.rover.roverDirection = ROVER_DIRECTION_STOP
            self.rover.updateMotorCommand()
            self.newCommand.emit(tuple(self.rover.commandMsg))

    def start(self):
        self.mainWidget.show()
        self.wiflyReceiverThread.start()
        self.wiflySenderThread.start()
        self.appStart.emit()
Esempio n. 24
0
class MainWindow(QtGui.QMainWindow):
	"""
	La clase MainWindow es la ventana principal del programa.
	"""

	def __init__(self, data, com):

		super(MainWindow,self).__init__()

		self.com = com
		self.data = data

		self.com.enterCanvas.connect(self.showImagePosition)
		self.com.leaveCanvas.connect(self.hideImagePosition)
		self.com.overCanvas.connect(self.setImagePosition)

		self.onClickPalette = False
		self.resize(800,480)
		self.setWindowTitle(self.data.getText("pix2pics", "title"))
		self.statusBar = self.statusBar()
		self.menuBar = self.createMenuBar()
		self.toolBar = self.createToolBar()
		self.createDockWidgets()
		self.mainWidget = MainWidget(128, 96, data, com, Qt.red, self)

		self.imagePosLabel = QtGui.QLabel()
		self.imagePosLabel.setObjectName("ImagePosLabel")

		# El Widget alrededor del cual gira la MainWindow es mainWidget
		self.setCentralWidget(self.mainWidget)

		self.show()

	def createPopupMenu(self):

		pass # Reimplementando esta función conseguimos que no se creen los menús popup cuando hacemos click derecho en toolbars/dockwidgets.

	def createToolBarActions(self):

		# Llista d'accions
		l = []

		self.tools = QtGui.QActionGroup(self)

		tools = ["selection", "pencil", "eraser", "colorpicker", "fill", "gradient", "exchange"]
		connects = [self.setSelectionTool, self.setPencilTool, self.setEraserTool, self.setColorPickerTool, self.setFillTool, self.setGradientTool, self.setExchangeTool]
		shortcuts = ['Z', 'X', 'C', 'A', 'S', 'D', '']

		for i in range(len(tools)):
			a = QtGui.QAction(QtGui.QIcon( os.path.join("themes", self.data.theme, tools[i] + ".png") ), self.data.getText("tools", tools[i]) + " (" + shortcuts[i] + ")", self.tools)
			a.setCheckable(True)
			a.setShortcut(shortcuts[i])
			if connects[i] != 0: a.toggled.connect(connects[i])
			l.append(a)

		a = QtGui.QAction(QtGui.QIcon( os.path.join("themes", self.data.theme, "zoomin.png") ), self.data.getText("tools", "zoomin"), self.tools)
		a.setShortcut("Ctrl++")
		a.triggered.connect(self.zoomIn)
		l.append(a)

		a = QtGui.QAction(QtGui.QIcon( os.path.join("themes", self.data.theme, "zoomout.png") ), self.data.getText("tools", "zoomout"), self.tools)
		a.setShortcut("Ctrl+-")
		a.triggered.connect(self.zoomOut)
		l.append(a)

		l[self.data.currentTool].setChecked(True)

		return l

	def createToolBar(self):

		toolBar = QtGui.QToolBar()
		l = self.createToolBarActions()

		j = 0
		for i in l:
			toolBar.addAction(i)
			if j == 6:
				toolBar.addSeparator()
			j += 1

		toolBar.setMovable(False)
		toolBar.setOrientation(Qt.Vertical)
		self.addToolBar(Qt.LeftToolBarArea, toolBar)

		return toolBar

	def createFileActions(self):

		# Llistes de propietats (de cada acció)
		ids = ["new", "open", "save", "saveas", "exit"]
		icons = ["document-new.png", "document-open.png", "document-save.png", "document-save-as.png", "application-exit.png"]
		shortcuts = ['Ctrl+N', 'Ctrl+O', 'Ctrl+S', 'Ctrl+Shift+S', 'Ctrl+Q']
		connects = [self.showNewFileDialog, self.openFile, self.saveFile, self.saveFileAs, self.close]

		# Llista d'accions
		l = []

		for i in range(len(ids)):
			a = QtGui.QAction(QtGui.QIcon("images/" + icons[i]), self.data.getText("menu_file_labels", ids[i]), self)
			a.setShortcut(shortcuts[i])
			a.triggered.connect(self.restoreFocus)
			a.setStatusTip(self.data.getText("menu_file_status_tips", ids[i]))
			if connects[i] != 0: a.triggered.connect(connects[i])
			l.append(a)

		# Insertem els zeros que simbolitzen separadors
		l.insert(4,0)

		return l

	def createEditActions(self):

		# Llistes de propietats (de cada acció)
		ids = ["undo", "redo", "selectall", "deselect", "invert", "cut", "copy", "paste", "clear", "preferences"]
		icons = ["edit-undo.png", "edit-redo.png", "", "", "", "edit-cut.png", "edit-copy.png", "edit-paste.png", "edit-clear.png", "document-properties.png"]
		shortcuts = ['Ctrl+Z', 'Ctrl+Y', "", "", "", 'Ctrl+X', 'Ctrl+C', 'Ctrl+V', 'Del', '']
		connects = [self.undo, self.redo, 0, 0, 0, self.cut, self.copy, self.paste, self.clear, self.showPreferences]

		# Llista d'accions
		l = []

		for i in range(len(ids)):
			a = QtGui.QAction(QtGui.QIcon("images/" + icons[i]), self.data.getText("menu_edit_labels", ids[i]), self)
			a.setShortcut(shortcuts[i])
			a.triggered.connect(self.restoreFocus)
			a.setStatusTip(self.data.getText("menu_edit_status_tips", ids[i]))
			if connects[i] != 0: a.triggered.connect(connects[i])
			l.append(a)

		# Insertem els zeros que simbolitzen separadors
		l.insert(2,0)
		l.insert(6,0)
		l.insert(11,0)

		return l

	def createViewActions(self):

		# Llistes de propietats (de cada acció)
		ids = ["pixel_grid", "matrix_grid"]
		icons = ["", ""]
		shortcuts = ['Ctrl+G', 'Ctrl+M']
		connects = [self.setPixelGrid, self.setMatrixGrid]

		# Llista d'accions
		l = []

		for i in range(len(ids)):
			a = QtGui.QAction(QtGui.QIcon("images/" + icons[i]), self.data.getText("menu_view_labels", ids[i]), self)
			a.setShortcut(shortcuts[i])
			a.triggered.connect(self.restoreFocus)
			a.setStatusTip(self.data.getText("menu_view_status_tips", ids[i]))
			if connects[i] != 0: a.triggered.connect(connects[i])
			a.setCheckable(True)
			l.append(a)

		# Insertem els zeros que simbolitzen separadors
		l.insert(2,0)

		# Algunas opcionas son chekables, lo consideramos:
		l[0].setCheckable(True)
		if self.data.grid: l[0].setChecked(True)
		l[1].setCheckable(True)
		if self.data.matrixGrid: l[1].setChecked(True)

		return l

	def createTransformActions(self):

		# Llistes de propietats (de cada acció)
		ids = ["flip_hor", "flip_ver", "rotate_cw", "rotate_ccw", "rotate_180", "resize", "resize_canvas"]
		icons = ["", "", "", "", "", "", ""]
		shortcuts = ['', '', '', '', '', '', '']
		connects = [self.flipHorizontally,self.flipVertically,self.rotate90CW,self.rotate90CCW,self.rotate180,self.showResizeImageDialog,self.showResizeCanvasDialog]

		# Llista d'accions
		l = []

		for i in range(len(ids)):
			a = QtGui.QAction(QtGui.QIcon("images/" + icons[i]), self.data.getText("menu_transform_labels", ids[i]), self)
			a.setShortcut(shortcuts[i])
			a.triggered.connect(self.restoreFocus)
			a.setStatusTip(self.data.getText("menu_transform_status_tips", ids[i]))
			if connects[i] != 0: a.triggered.connect(connects[i])
			l.append(a)

		l.insert(2,0)
		l.insert(6,0)

		return l

	def createHelpActions(self):

		# Llistes de propietats (de cada acció)
		ids = ["contents", "about"]
		icons = ["help-contents.png", "help-about.png"]
		shortcuts = ['F1', 'Ctrl+B']
		connects = [self.showHelp, self.showAboutDialog]

		# Llista d'accions
		l = []

		for i in range(len(ids)):
			a = QtGui.QAction(QtGui.QIcon("images/" + icons[i]), self.data.getText("menu_help_labels", ids[i]), self)
			a.setShortcut(shortcuts[i])
			a.triggered.connect(self.restoreFocus)
			a.setStatusTip(self.data.getText("menu_help_status_tips", ids[i]))
			if connects[i] != 0: a.triggered.connect(connects[i])
			l.append(a)

		# Insertem els zeros que simbolitzen separadors
		l.insert(1,0)

		return l

	def restoreFocus(self):

		self.releaseMouse()
		self.releaseKeyboard()
		QtCore.QCoreApplication.instance().restoreOverrideCursor()

	def createMenuBar(self):
		
		menubar = self.menuBar()
		fileMenu = menubar.addMenu(self.data.getText("menu", "file"))
		editMenu = menubar.addMenu(self.data.getText("menu", "edit"))
		viewMenu = menubar.addMenu(self.data.getText("menu", "view"))
		transformMenu = menubar.addMenu(self.data.getText("menu", "transform"))
		helpMenu = menubar.addMenu(self.data.getText("menu", "help"))
		fileActions = self.createFileActions()
		editActions = self.createEditActions()
		viewActions = self.createViewActions()
		transformActions = self.createTransformActions()
		helpActions = self.createHelpActions()
		for i in fileActions:
			if i == 0: fileMenu.addSeparator()
			else: fileMenu.addAction(i)
		for i in editActions:
			if i == 0: editMenu.addSeparator()
			else: editMenu.addAction(i)
		for i in viewActions:
			if i == 0: viewMenu.addSeparator()
			else: viewMenu.addAction(i)
		for i in helpActions:
			if i == 0: helpMenu.addSeparator()
			else: helpMenu.addAction(i)
		for i in transformActions:
			if i == 0: transformMenu.addSeparator()
			else: transformMenu.addAction(i)

		return menubar
		
	def createDockWidgets(self):
		
		# Palette widget

		self.palette = QtGui.QDockWidget(self.data.getText("dock_widgets", "palette"), self)
		self.palette.setAllowedAreas(Qt.RightDockWidgetArea)
		self.palette.setFeatures(QtGui.QDockWidget.NoDockWidgetFeatures)

		paletteWidget = Palette(self.data, self.com)

		self.palette.setWidget(paletteWidget)
		self.palette.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)

		self.addDockWidget(Qt.RightDockWidgetArea, self.palette)

		# Tool Properties widget

		self.toolProperties = ToolProperties(self.data.getText("dock_widgets", "tool_properties"), self.data, self.com)
		self.addDockWidget(Qt.RightDockWidgetArea, self.toolProperties)
		self.palette.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)

		# Preview

		self.preview = Preview(self.data.getText("dock_widgets", "preview"), self.data, self.com, self)
		self.addDockWidget(Qt.RightDockWidgetArea, self.preview)
		
	def zoomIn(self):

		if self.data.zoom < 25:
			self.data.zoom += 1
			#self.mainWidget.canvas.setFixedSize(self.data.image.width()*self.data.zoom, self.data.image.height()*self.data.zoom)
			self.scaleImage(self.data.zoom)
			self.mainWidget.canvas.update()
			self.com.zoom.emit()

	def zoomOut(self):

		if self.data.zoom > 1:
			self.data.zoom -= 1
			#self.mainWidget.canvas.setFixedSize(self.data.image.width()*self.data.zoom, self.data.image.height()*self.data.zoom)
			self.scaleImage(self.data.zoom)
			self.mainWidget.canvas.update()
			self.com.zoom.emit()

	def scaleImage(self, zoom):
		
		#self.mainWidget.canvas.resize(zoom * self.data.image.size())
		self.com.resizeCanvas.emit()

		self.adjustScrollBar(self.mainWidget.horizontalScrollBar(), zoom)
		self.adjustScrollBar(self.mainWidget.verticalScrollBar(), zoom)
		
	def adjustScrollBar(self, scrollBar, zoom):

		scrollBar.setValue((scrollBar.maximum() - scrollBar.minimum()) / 2)

	def flipHorizontally(self):

		self.data.flipHorizontally()
		self.com.updateCanvas.emit()

	def flipVertically(self):

		self.data.flipVertically()
		self.com.updateCanvas.emit()

	def rotate90CW(self):

		self.data.rotate90CW()
		self.com.updateCanvas.emit()
		if not self.data.selection:
			self.com.newImage.emit()
		
	def rotate90CCW(self):

		self.data.rotate90CCW()
		self.com.updateCanvas.emit()
		if not self.data.selection:
			self.com.newImage.emit()

	def rotate180(self):

		self.data.rotate180()
		self.com.updateCanvas.emit()

	def showResizeImageDialog(self):

		d = ResizeImageDialog(self)

	def showResizeCanvasDialog(self):

		d = ResizeCanvasDialog(self)
		
	def setPencilSize(self, size):

		self.pencilSize.setText(str(size))
		self.data.pencilSize = size

	def setSelectionTool(self):

		self.data.currentTool = 0
		self.com.updateTool.emit()

	def setPencilTool(self):

		self.data.currentTool = 1
		self.com.updateTool.emit()

	def setEraserTool(self):

		self.data.currentTool = 2
		self.com.updateTool.emit()

	def setColorPickerTool(self):

		self.data.currentTool = 3
		self.com.updateTool.emit()

	def setFillTool(self):

		self.data.currentTool = 4
		self.com.updateTool.emit()

	def setGradientTool(self):

		self.data.currentTool = 5
		self.com.updateTool.emit()

	def setExchangeTool(self):

		self.data.currentTool = 6
		self.com.updateTool.emit()

	def showImagePosition(self):

		if self.imagePosLabel.isHidden():
			self.imagePosLabel.setText( str(self.data.ximage) + str(self.data.yimage) )
			self.statusBar.insertWidget(0, self.imagePosLabel, 0)
			self.imagePosLabel.show()
			#self.imagePosLabel.move(self.statusBar.width()/2,self.imagePosLabel.y())

	def hideImagePosition(self):

		self.statusBar.removeWidget(self.imagePosLabel)

	def setImagePosition(self, x, y):

		self.imagePosLabel.setText("  Pos: (" + str(x) + ", " + str(y) + ")")
	
	def showNewFileDialog(self):

		d = NewFileDialog(self.data, self)

	def showHelp(self):

		url = QtCore.QUrl("http://nataczajohnson.wix.com/pixs2pics#!page3/cee5")
		QtGui.QDesktopServices.openUrl(url)

	def showAboutDialog(self):

		d = QtGui.QMessageBox.about(self, self.data.getText("dialog_about", "title"), self.data.getText("dialog_about", "description"))

	def showPreferences(self):

		d = Preferences(self.data, self.com, self)

	def newImage(self, w, h):

		self.data.newImage(w, h)

	def openFile(self):
		
		fileName = QtGui.QFileDialog.getOpenFileName(self,
					self.data.getText("dialog_open", "title"),
					"/home",
					self.data.getText("dialog_open", "images") + u" (*.bmp *.gif *.png *.xpm *.jpg);;" + self.data.getText("dialog_open", "all_files") + u" (*)")
		if fileName:
			self.data.loadImage(fileName)

	def saveFile(self):

		if self.data.defaultFileName == "":
			self.saveFileAs()
		else:	
			self.data.image.save(self.data.defaultFileName)

	def saveFileAs(self):

		d = QtGui.QFileDialog()
		fileName, filterName = d.getSaveFileNameAndFilter(self,
					self.data.getText("dialog_save", "title"), 
					"", 
					"*.bmp;;*.gif;;*.png;;*.xpm;;*.jpg")
		self.data.image.save(fileName+filterName[1:])
		self.data.defaultFileName = fileName + filterName[1:]

	def undo(self):

		if self.data.posHistory > 0:
			self.data.posHistory -= 1
			self.data.image = QtGui.QImage(self.data.history[self.data.posHistory])
			self.com.updateCanvas.emit()
			self.com.resizeCanvas.emit()

	def redo(self):

		if self.data.posHistory < len(self.data.history)-1:
			self.data.posHistory += 1
			self.data.image = QtGui.QImage(self.data.history[self.data.posHistory])
			self.com.updateCanvas.emit()
			self.com.resizeCanvas.emit()

	def cut(self):

		self.com.cutImage.emit()

	def copy(self):

		self.com.copyImage.emit()

	def paste(self):

		clipboard = QtGui.QApplication.clipboard()
		if not clipboard.image().isNull():
			self.com.pasteImage.emit()
			self.com.updateCanvas.emit()

	def clear(self):

		self.com.clearImage.emit()

	def setPixelGrid(self):

		self.data.grid = not self.data.grid
		self.com.updateCanvas.emit()
		self.data.setDefault("grid", "grid", self.data.grid)

	def setMatrixGrid(self):

		self.data.matrixGrid = not self.data.matrixGrid
		self.com.updateCanvas.emit()
		self.data.setDefault("grid", "matrix_grid", self.data.matrixGrid)

	def keyPressEvent(self, event):

		super(MainWindow, self).keyPressEvent(event)

		if event.key() == Qt.Key_Control:
			self.onClickPalette = True
			QtCore.QCoreApplication.instance().setOverrideCursor(self.data.colorPickerCur)
			self.com.onClickPalette.emit()
			self.grabMouse()
			#self.grabKeyboard()

		elif event.key() == Qt.Key_Plus:
			if self.data.currentTool == 1:
				self.data.setPencilSize(self.data.pencilSize+1)
			elif self.data.currentTool == 2:
				self.data.setEraserSize(self.data.eraserSize+1)

		elif event.key() == Qt.Key_Minus:
			if self.data.currentTool == 1:
				self.data.setPencilSize(self.data.pencilSize-1)
			elif self.data.currentTool == 2:
				self.data.setEraserSize(self.data.eraserSize-1)

		else:
			QtCore.QCoreApplication.instance().restoreOverrideCursor()
			self.releaseMouse()
			self.releaseKeyboard()


	def keyReleaseEvent(self, event):

		super(MainWindow, self).keyReleaseEvent(event)

		if event.key() == Qt.Key_Control:
			self.onClickPalette = False
			QtCore.QCoreApplication.instance().restoreOverrideCursor()
			self.releaseMouse()
			self.releaseKeyboard()

	def mousePressEvent(self, event):

		super(MainWindow, self).mousePressEvent(event)

		# --- Paleta "onClick" ---
		# Cuando pulsamos Ctrl y hacemos click con el mouse creamos una captura de pantalla.
		# Luego de esa captura extraemos el color en la posición del cursor y lo establecemos
		# como color principal.
		if self.onClickPalette:
			widget = QtCore.QCoreApplication.instance().desktop().screen()
			im = QtGui.QPixmap.grabWindow(widget.winId()).toImage() # Captura de pantalla
			c = QtGui.QColor(im.pixel(QtGui.QCursor.pos())) # Cogemos el color de la posición del cursor
			if event.button() == Qt.LeftButton:
				self.data.changePrimaryColor(c) # Cambiamos el color primario actual por el que hemos cogido
			elif event.button() == Qt.RightButton:
				self.data.changeSecondaryColor(c) # Cambiamos el color secundario actual por el que hemos cogido
			# im.save("desktop.png") # Guardar la captura de pantalla en un archivo
			# print "Getting color " + c.red(), c.green(), c.blue() + " from screen" # Comprueba qué color coge

	def mouseMoveEvent(self, event):

		super(MainWindow, self).mouseMoveEvent(event)

		# Lo mismo de antes pero para cuando el ratón se mueve
		if self.onClickPalette:
			widget = QtCore.QCoreApplication.instance().desktop().screen()
			im = QtGui.QPixmap.grabWindow(widget.winId()).toImage() # Captura de pantalla
			c = QtGui.QColor(im.pixel(QtGui.QCursor.pos())) # Cogemos el color de la posición del cursor
			if event.buttons() == Qt.LeftButton:
				self.data.changePrimaryColor(c) # Cambiamos el color primario actual por el que hemos cogido
			elif event.buttons() == Qt.RightButton:
				self.data.changeSecondaryColor(c) # Cambiamos el color secundario actual por el que hemos cogido

	def wheelEvent(self, event):

		if self.onClickPalette:
			if event.delta() > 0:
				self.zoomIn()
			else:
				self.zoomOut()

		super(MainWindow, self).wheelEvent(event)

	def closeEvent(self, event):

		reply = QtGui.QMessageBox.warning(self, self.data.getText("dialog_exit", "title"),
			self.data.getText("dialog_exit", "message"),
			QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard | QtGui.QMessageBox.Cancel,
			QtGui.QMessageBox.Save)
		if reply == QtGui.QMessageBox.Discard:
			event.accept()
		elif reply == QtGui.QMessageBox.Cancel:
			event.ignore()  
			return 
		elif reply == QtGui.QMessageBox.Save:
			self.saveFile()
			event.accept()

		self.data.saveDefaults()

		super(MainWindow, self).closeEvent(event)
Esempio n. 25
0
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, context, signals):

        super(MainWindow, self).__init__()

        self.signals = signals
        self.context = context

        self.resize(800, 480)
        self.setWindowTitle(self.context.getText("pyqx", "title"))

        self.statusBar = self.statusBar()
        self.menuBar = self.createMenuBar()
        self.toolBar = self.createToolBar()
        self.createDockWidgets()

        self.ctrlPressed = False

        self.mainWidget = MainWidget(context, signals, self)
        self.setCentralWidget(self.mainWidget)

        self.imagePosLabel = QtWidgets.QLabel()
        self.imagePosLabel.setObjectName("ImagePosLabel")

        self.signals.autoUpdateTool.connect(self.setCurrentTool)
        self.signals.enterCanvas.connect(self.showImagePosition)
        self.signals.leaveCanvas.connect(self.hideImagePosition)
        self.signals.overCanvas.connect(self.setImagePosition)

        self.show()

    def createPopupMenu(self):

        pass  # Reimplementando esta función conseguimos que no se creen los menús popup cuando hacemos click derecho en toolbars/dockwidgets.

    def createToolBarActions(self):

        l = []

        self.tools = QtWidgets.QActionGroup(self)

        tools = [
            "selection", "magicwand", "pencil", "eraser", "colorpicker",
            "fill", "gradient", "exchange"
        ]
        connects = [
            lambda: self.context.changeCurrentTool(Pixeler.Tools.Selection),
            lambda: self.context.changeCurrentTool(Pixeler.Tools.MagicWand),
            lambda: self.context.changeCurrentTool(Pixeler.Tools.Pencil),
            lambda: self.context.changeCurrentTool(Pixeler.Tools.Eraser),
            lambda: self.context.changeCurrentTool(Pixeler.Tools.ColorPicker),
            lambda: self.context.changeCurrentTool(Pixeler.Tools.Fill),
            lambda: self.context.changeCurrentTool(Pixeler.Tools.Gradient),
            lambda: self.context.changeCurrentTool(Pixeler.Tools.Exchange)
        ]
        shortcuts = ['Z', '', 'X', 'C', 'A', 'S', 'D', '']

        for i in range(len(tools)):
            a = QtWidgets.QAction(
                QtGui.QIcon(
                    os.path.join("themes", self.context.theme,
                                 tools[i] + ".png")),
                self.context.getText("tools", tools[i]) + " (" + shortcuts[i] +
                ")", self.tools)
            a.setCheckable(True)
            a.setShortcut(shortcuts[i])
            if connects[i] != 0: a.toggled.connect(connects[i])
            l.append(a)

        a = QtWidgets.QAction(
            QtGui.QIcon(
                os.path.join("themes", self.context.theme, "zoomin.png")),
            self.context.getText("tools", "zoomin"), self.tools)
        a.setShortcut("Ctrl++")
        a.triggered.connect(self.zoomIn)
        l.append(a)

        a = QtWidgets.QAction(
            QtGui.QIcon(
                os.path.join("themes", self.context.theme, "zoomout.png")),
            self.context.getText("tools", "zoomout"), self.tools)
        a.setShortcut("Ctrl+-")
        a.triggered.connect(self.zoomOut)
        l.append(a)

        l[self.context.currentTool].setChecked(True)

        return l

    def createToolBar(self):

        toolBar = QtWidgets.QToolBar()
        l = self.createToolBarActions()

        j = 0
        for i in l:
            toolBar.addAction(i)
            if j == 7:
                toolBar.addSeparator()
            j += 1

        toolBar.setMovable(False)
        toolBar.setOrientation(Qt.Vertical)
        self.addToolBar(Qt.LeftToolBarArea, toolBar)

        return toolBar

    def createFileActions(self):

        ids = ["new", "open", "save", "saveas", "exit"]
        icons = [
            "document-new.png", "document-open.png", "document-save.png",
            "document-save-as.png", "application-exit.png"
        ]
        shortcuts = ['Ctrl+N', 'Ctrl+O', 'Ctrl+S', 'Ctrl+Shift+S', 'Ctrl+Q']
        connects = [
            self.newFile, self.openFile, self.saveFile, self.saveFileAs,
            self.close
        ]

        l = []

        for i in range(len(ids)):
            a = QtWidgets.QAction(
                QtGui.QIcon("images/" + icons[i]),
                self.context.getText("menu_file_labels", ids[i]), self)
            a.setShortcut(shortcuts[i])
            a.triggered.connect(self.restoreFocus)
            a.setStatusTip(
                self.context.getText("menu_file_status_tips", ids[i]))
            if connects[i] != 0: a.triggered.connect(connects[i])
            l.append(a)

        l.insert(4, 0)  # Los ceros simbolizan separadores

        return l

    def createEditActions(self):

        ids = [
            "undo", "redo", "selectall", "deselect", "cut", "copy", "paste",
            "clear", "preferences"
        ]
        icons = [
            "edit-undo.png", "edit-redo.png", "", "", "edit-cut.png",
            "edit-copy.png", "edit-paste.png", "edit-clear.png",
            "document-properties.png"
        ]
        shortcuts = [
            'Ctrl+Z', 'Ctrl+Y', "Ctrl+A", "Ctrl+Shift+A", 'Ctrl+X', 'Ctrl+C',
            'Ctrl+V', 'Del', ''
        ]
        connects = [
            self.undo, self.redo, self.selectAll, self.deselect, self.cut,
            self.copy, self.paste, self.clear, self.showPreferences
        ]

        l = []

        for i in range(len(ids)):
            a = QtWidgets.QAction(
                QtGui.QIcon("images/" + icons[i]),
                self.context.getText("menu_edit_labels", ids[i]), self)
            a.setShortcut(shortcuts[i])
            a.triggered.connect(self.restoreFocus)
            a.setStatusTip(
                self.context.getText("menu_edit_status_tips", ids[i]))
            if connects[i] != 0: a.triggered.connect(connects[i])
            l.append(a)

        # Los ceros simbolizan separadores
        l.insert(2, 0)
        l.insert(5, 0)
        l.insert(10, 0)

        return l

    def createViewActions(self):

        ids = ["pixel_grid", "matrix_grid"]
        icons = ["", ""]
        shortcuts = ['Ctrl+G', 'Ctrl+M']
        connects = [self.setPixelGrid, self.setMatrixGrid]

        l = []

        for i in range(len(ids)):
            a = QtWidgets.QAction(
                QtGui.QIcon("images/" + icons[i]),
                self.context.getText("menu_view_labels", ids[i]), self)
            a.setShortcut(shortcuts[i])
            a.triggered.connect(self.restoreFocus)
            a.setStatusTip(
                self.context.getText("menu_view_status_tips", ids[i]))
            if connects[i] != 0: a.triggered.connect(connects[i])
            a.setCheckable(True)
            l.append(a)

        l.insert(2, 0)  # Los ceros simbolizan separadores

        # Algunas opcionas son chekables, lo consideramos:
        l[0].setCheckable(True)
        if self.context.grid: l[0].setChecked(True)
        l[1].setCheckable(True)
        if self.context.matrixGrid: l[1].setChecked(True)

        return l

    def createTransformActions(self):

        ids = [
            "flip_hor", "flip_ver", "rotate_cw", "rotate_ccw", "rotate_180",
            "resize", "resize_canvas"
        ]
        icons = ["", "", "", "", "", "", ""]
        shortcuts = ['', '', '', '', '', '', '']
        connects = [
            self.flipHorizontally, self.flipVertically, self.rotate90CW,
            self.rotate90CCW, self.rotate180, self.showResizeImageDialog,
            self.showResizeCanvasDialog
        ]

        l = []

        for i in range(len(ids)):
            a = QtWidgets.QAction(
                QtGui.QIcon("images/" + icons[i]),
                self.context.getText("menu_transform_labels", ids[i]), self)
            a.setShortcut(shortcuts[i])
            a.triggered.connect(self.restoreFocus)
            a.setStatusTip(
                self.context.getText("menu_transform_status_tips", ids[i]))
            if connects[i] != 0: a.triggered.connect(connects[i])
            l.append(a)

        # Los ceros simbolizan separadores
        l.insert(2, 0)
        l.insert(6, 0)

        return l

    def createHelpActions(self):

        ids = ["contents", "about"]
        icons = ["help-contents.png", "help-about.png"]
        shortcuts = ['F1', 'Ctrl+B']
        connects = [self.showHelp, self.showAboutDialog]

        l = []

        for i in range(len(ids)):
            a = QtWidgets.QAction(
                QtGui.QIcon("images/" + icons[i]),
                self.context.getText("menu_help_labels", ids[i]), self)
            a.setShortcut(shortcuts[i])
            a.triggered.connect(self.restoreFocus)
            a.setStatusTip(
                self.context.getText("menu_help_status_tips", ids[i]))
            if connects[i] != 0: a.triggered.connect(connects[i])
            l.append(a)

        l.insert(1, 0)  # Los ceros simbolizan separadores

        return l

    def createMenuBar(self):

        menubar = self.menuBar()
        fileMenu = menubar.addMenu(self.context.getText("menu", "file"))
        editMenu = menubar.addMenu(self.context.getText("menu", "edit"))
        viewMenu = menubar.addMenu(self.context.getText("menu", "view"))
        transformMenu = menubar.addMenu(
            self.context.getText("menu", "transform"))
        helpMenu = menubar.addMenu(self.context.getText("menu", "help"))
        fileActions = self.createFileActions()
        editActions = self.createEditActions()
        viewActions = self.createViewActions()
        transformActions = self.createTransformActions()
        helpActions = self.createHelpActions()
        for i in fileActions:
            if i == 0: fileMenu.addSeparator()
            else: fileMenu.addAction(i)
        for i in editActions:
            if i == 0: editMenu.addSeparator()
            else: editMenu.addAction(i)
        for i in viewActions:
            if i == 0: viewMenu.addSeparator()
            else: viewMenu.addAction(i)
        for i in helpActions:
            if i == 0: helpMenu.addSeparator()
            else: helpMenu.addAction(i)
        for i in transformActions:
            if i == 0: transformMenu.addSeparator()
            else: transformMenu.addAction(i)

        return menubar

    def createDockWidgets(self):

        # Palette widget
        self.palette = QtWidgets.QDockWidget(
            self.context.getText("dock_widgets", "palette"), self)
        self.palette.setAllowedAreas(Qt.RightDockWidgetArea)
        self.palette.setFeatures(QtWidgets.QDockWidget.NoDockWidgetFeatures)

        paletteWidget = Palette(self.context, self.signals)

        self.palette.setWidget(paletteWidget)
        self.palette.setSizePolicy(QtWidgets.QSizePolicy.Preferred,
                                   QtWidgets.QSizePolicy.Minimum)

        self.addDockWidget(Qt.RightDockWidgetArea, self.palette)

        # Tool Properties widget
        self.toolProperties = ToolProperties(
            self.context.getText("dock_widgets", "tool_properties"),
            self.context, self.signals)
        self.addDockWidget(Qt.RightDockWidgetArea, self.toolProperties)
        self.toolProperties.setSizePolicy(QtWidgets.QSizePolicy.Preferred,
                                          QtWidgets.QSizePolicy.Expanding)

        # Preview
        self.preview = Preview(self.context.getText("dock_widgets", "preview"),
                               self.context, self.signals, self)
        self.addDockWidget(Qt.RightDockWidgetArea, self.preview)

    def restoreFocus(self):

        print("Restoring Focus")
        self.ctrlPressed = False
        self.releaseMouse()
        self.releaseKeyboard()
        QtCore.QCoreApplication.instance().restoreOverrideCursor()

    def setCurrentTool(self, index):

        self.tools.actions()[0].setChecked(True)
        self.signals.updateTool.emit(0)

    def zoomIn(self):

        if self.context.currentImage().zoom < 25:
            self.context.currentImage().zoom += 1
            self.signals.zoom.emit()

    def zoomOut(self):

        if self.context.currentImage().zoom > 1:
            self.context.currentImage().zoom -= 1
            self.signals.zoom.emit()

    def newFile(self):

        d = NewFileDialog(self.context, self)

    def openFile(self):

        fileName = QtWidgets.QFileDialog.getOpenFileName(
            self, self.context.getText("dialog_open", "title"), "/home",
            self.context.getText("dialog_open", "images") +
            u" (*.bmp *.gif *.png *.xpm *.jpg);;" +
            self.context.getText("dialog_open", "all_files") + u" (*)")
        if fileName:
            self.context.loadImage(fileName)

    def saveFile(self):

        if self.context.currentImage().fileName == "":
            self.saveFileAs()
        else:
            self.context.currentImage().save()

    def saveFileAs(self):

        d = QtWidgets.QFileDialog()
        fileName, filterName = d.getSaveFileName(
            self, self.context.getText("dialog_save", "title"), "",
            "*.bmp;;*.gif;;*.png;;*.xpm;;*.jpg")

        if fileName.split(".")[-1] in ["bmp", "gif", "png", "xpm", "jpg"]:
            self.context.currentImage().fileName = fileName
            self.signals.fileNameChanged.emit(
                self.context.getCurrentImagePos(),
                os.path.basename(str(fileName)))
        else:
            self.context.currentImage().fileName = fileName + filterName[1:]
            self.signals.fileNameChanged.emit(
                self.context.getCurrentImagePos(),
                os.path.basename(str(fileName + filterName[1:])))
        self.context.currentImage().save()

    def close(self):

        pass

    def undo(self):

        if self.context.currentImage().posHistory > 0:
            self.context.currentImage().posHistory -= 1
            self.context.currentImage().image = QtWidgets.QImage(
                self.context.currentImage().history[
                    self.context.currentImage().posHistory])
            self.signals.updateCanvas.emit()
            self.signals.resizeCanvas.emit()

    def redo(self):

        if self.context.currentImage().posHistory < len(
                self.context.currentImage().history) - 1:
            self.context.currentImage().posHistory += 1
            self.context.currentImage().image = QtWidgets.QImage(
                self.context.currentImage().history[
                    self.context.currentImage().posHistory])
            self.signals.updateCanvas.emit()
            self.signals.resizeCanvas.emit()

    def selectAll(self):

        self.mainWidget.currentWidget().canvas.selectAll()

    def deselect(self):

        self.mainWidget.currentWidget().canvas.applySelection()

    def cut(self):

        self.signals.cutImage.emit()

    def copy(self):

        self.signals.copyImage.emit()

    def paste(self):

        clipboard = QtWidgets.QApplication.clipboard()
        if not clipboard.image().isNull():
            self.signals.pasteImage.emit()
            self.signals.updateCanvas.emit()

    def clear(self):

        self.signals.clearImage.emit()

    def showPreferences(self):

        d = Preferences(self.context, self.signals, self)

    def setPixelGrid(self):

        self.context.grid = not self.context.grid
        self.signals.updateCanvas.emit()
        self.context.setDefault("grid", "grid", self.context.grid)

    def setMatrixGrid(self):

        self.context.matrixGrid = not self.context.matrixGrid
        self.signals.updateCanvas.emit()
        self.context.setDefault("grid", "matrix_grid", self.context.matrixGrid)

    def flipHorizontally(self):

        pass

    def flipVertically(self):

        pass

    def rotate90CW(self):

        pass

    def rotate90CCW(self):

        pass

    def rotate180(self):

        pass

    def showResizeImageDialog(self):

        pass

    def showResizeCanvasDialog(self):

        pass

    def showHelp(self):

        pass

    def showAboutDialog(self):

        pass

    def showImagePosition(self):

        if self.imagePosLabel.isHidden():
            self.statusBar.insertWidget(0, self.imagePosLabel, 0)
            self.imagePosLabel.show()

    def hideImagePosition(self):

        self.statusBar.removeWidget(self.imagePosLabel)

    def setImagePosition(self, x, y):

        self.imagePosLabel.setText("  Pos: (" + str(x) + ", " + str(y) + ")")

    def keyPressEvent(self, event):

        super(MainWindow, self).keyPressEvent(event)

        if event.key() == Qt.Key_Control:
            print("Control Pressed")
            self.ctrlPressed = True
            QtCore.QCoreApplication.instance().setOverrideCursor(
                self.context.colorPickerCur)
            self.signals.ctrlPressed.emit()
            self.grabMouse()
            self.grabKeyboard()

        elif event.key() == Qt.Key_Plus:
            if self.context.currentTool == 1:
                self.context.setPencilSize(self.context.pencilSize + 1)
            elif self.context.currentTool == 2:
                self.context.setEraserSize(self.context.eraserSize + 1)

        elif event.key() == Qt.Key_Minus:
            if self.context.currentTool == 1:
                self.context.setPencilSize(self.context.pencilSize - 1)
            elif self.context.currentTool == 2:
                self.context.setEraserSize(self.context.eraserSize - 1)

        else:
            QtCore.QCoreApplication.instance().restoreOverrideCursor()
            self.releaseMouse()
            self.releaseKeyboard()

    def keyReleaseEvent(self, event):

        super(MainWindow, self).keyReleaseEvent(event)

        if event.key() == Qt.Key_Control:
            self.ctrlPressed = False
            QtCore.QCoreApplication.instance().restoreOverrideCursor()
            self.releaseMouse()
            self.releaseKeyboard()

    def mousePressEvent(self, event):

        super(MainWindow, self).mousePressEvent(event)

        if self.ctrlPressed:
            print("Picking Desktop Color")
            widget = QtCore.QCoreApplication.instance().desktop().screen()
            im = QtWidgets.QPixmap.grabWindow(
                widget.winId()).toImage()  # Captura de pantalla
            c = QtWidgets.QColor(im.pixel(QtWidgets.QCursor.pos(
            )))  # Cogemos el color de la posición del cursor
            if event.button() == Qt.LeftButton:
                self.context.changePrimaryColor(
                    c
                )  # Cambiamos el color primario actual por el que hemos cogido
            elif event.button() == Qt.RightButton:
                self.context.changeSecondaryColor(
                    c
                )  # Cambiamos el color secundario actual por el que hemos cogido
            # im.save("desktop.png") # Guardar la captura de pantalla en un archivo
            # print "Getting color " + c.red(), c.green(), c.blue() + " from screen" # Comprueba qué color coge

    def mouseMoveEvent(self, event):

        super(MainWindow, self).mouseMoveEvent(event)

        # Lo mismo de antes pero para cuando el ratón se mueve
        if self.ctrlPressed:
            widget = QtCore.QCoreApplication.instance().desktop().screen()
            im = QtWidgets.QPixmap.grabWindow(
                widget.winId()).toImage()  # Captura de pantalla
            c = QtWidgets.QColor(im.pixel(QtWidgets.QCursor.pos(
            )))  # Cogemos el color de la posición del cursor
            if event.buttons() == Qt.LeftButton:
                self.context.changePrimaryColor(
                    c
                )  # Cambiamos el color primario actual por el que hemos cogido
            elif event.buttons() == Qt.RightButton:
                self.context.changeSecondaryColor(
                    c
                )  # Cambiamos el color secundario actual por el que hemos cogido

    def wheelEvent(self, event):

        if self.ctrlPressed:
            if event.delta() > 0:
                self.zoomIn()
            else:
                self.zoomOut()

        super(MainWindow, self).wheelEvent(event)

    def closeEvent(self, event):

        l = []
        for i in range(len(self.context.images)):
            if self.context.images[i].modified: l.append(i)

        if len(l) > 0:
            # Mostrar diálogo
            reply = QtWidgets.QMessageBox.warning(
                self, self.context.getText("dialog_exit", "title"),
                self.context.getText("dialog_exit", "message"),
                QtWidgets.QMessageBox.SaveAll | QtWidgets.QMessageBox.Discard
                | QtWidgets.QMessageBox.Cancel, QtWidgets.QMessageBox.Cancel)
            if reply == QtWidgets.QMessageBox.Discard:
                event.accept()
            elif reply == QtWidgets.QMessageBox.Cancel:
                event.ignore()
                return
            elif reply == QtWidgets.QMessageBox.SaveAll:
                for i in l:
                    self.mainWidget.setCurrentIndex(i)
                    self.context.setCurrentImagePos(i)
                    self.saveFile()
                event.accept()
                return

        self.context.saveDefaults()

        super(MainWindow, self).closeEvent(event)
Esempio n. 26
0
# -*- coding: utf-8 -*-

from PyQt5.QtWidgets import QApplication, QToolTip
from PyQt5.QtGui import QFont

from globalvalue import setMainWidget, DefaultFontList, DefaultFontSize, DefaultFontSizeForToolTip
from mainwidget import MainWidget

import sys
from localelanguage import initLocale


if __name__ == '__main__':

    #init locale
    initLocale()

    app = QApplication(sys.argv)
    #Try to init font with default font list
    for fontName in DefaultFontList:
        font = QFont(fontName, DefaultFontSize)
        if font.exactMatch():
            app.setFont(font)
            tipFont = QFont(fontName, DefaultFontSizeForToolTip)
            QToolTip.setFont(tipFont)
            break

    mainWidget = MainWidget()
    setMainWidget(mainWidget)

    sys.exit(app.exec_())