Esempio n. 1
0
	def __init__(self, parent=None):
		super(MainWindow, self).__init__(parent)
		self.ui = uic.loadUi("mainwindow.ui",self)
		self.setWindowTitle("python-whiteboard")
		self.setWindowFlags( qt.Qt.CustomizeWindowHint | qt.Qt.WindowMinimizeButtonHint |
			qt.Qt.WindowCloseButtonHint )
		
		self.connected = False
		self.calibrated = False
		self.active = False
		self.mustquit = False
		
		self.wii = None
		self.cursor = None
		
		self.batteryLevel.reset()
		self.batteryLevel.setRange(0,99)
		self.batteryLevel.setValue(0)
		
		conf = Configuration()

		self.ui.pushButtonConnect.clicked.connect(self.connectWii)
		self.ui.pushButtonCalibrate.clicked.connect(self.calibrateWiiScreen)
		self.ui.pushButtonActivate.clicked.connect(self.activateWii)
		self.ui.pushButtonLoadCal.clicked.connect(self.calibrateWiiFromSettings)
		self.ui.pushButtonSettings.clicked.connect(self.showHideSettings)
		self.ui.comboProfiles.currentIndexChanged.connect(self.changeProfile)
		self.updateButtons()

		self.ui.actionQuit.triggered.connect(self.mustQuit)
		self.ui.actionHelp.triggered.connect(self.showAboutDlg)
		self.ui.actionNew_Profile.triggered.connect(self.addProfile)
		self.ui.actionDelete_Current_Profile.triggered.connect(self.delCurrentProfile)
		self.ui.actionWipe_configuration.triggered.connect(self.wipeConfiguration)

		self.ui.moveOnlyCheck.setChecked( conf.getValueStr('moveonly') == 'Yes' )
		self.ui.moveOnlyCheck.stateChanged.connect(self.checkMoveOnly)

		if conf.getValueStr("autoconnect") == "Yes":
			self.timer = qt.QTimer(self)
			self.timer.setInterval(500)
			self.timer.timeout.connect(self.autoConnect)
			self.timer.start()
		
		self.timer2 = qt.QTimer(self)
		self.timer2.setInterval(4000)
		self.timer2.timeout.connect(self.checkWii)
		self.timer2.start()
		
		self.confDialog = ConfigDialog(self, self.wii)
		layout = QtWidgets.QGridLayout()
		layout.addWidget(self.confDialog)
		self.ui.confContainer.setLayout(layout)
		self.ui.confContainer.setVisible(False)
		
		self.refreshProfiles()
		
		self.center()
Esempio n. 2
0
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.ui = uic.loadUi("mainwindow.ui", self)
        self.setWindowTitle("python-whiteboard")
        self.setWindowFlags(qt.Qt.CustomizeWindowHint
                            | qt.Qt.WindowMinimizeButtonHint
                            | qt.Qt.WindowCloseButtonHint)

        self.connected = False
        self.calibrated = False
        self.active = False
        self.mustquit = False

        self.wii = None
        self.cursor = None

        self.batteryLevel.reset()
        self.batteryLevel.setRange(0, 99)
        self.batteryLevel.setValue(0)

        conf = Configuration()

        self.ui.pushButtonConnect.clicked.connect(self.connectWii)
        self.ui.pushButtonCalibrate.clicked.connect(self.calibrateWiiScreen)
        self.ui.pushButtonActivate.clicked.connect(self.activateWii)
        self.ui.pushButtonLoadCal.clicked.connect(
            self.calibrateWiiFromSettings)
        self.ui.pushButtonSettings.clicked.connect(self.showHideSettings)
        self.ui.comboProfiles.currentIndexChanged.connect(self.changeProfile)
        self.updateButtons()

        self.ui.actionQuit.triggered.connect(self.mustQuit)
        self.ui.actionHelp.triggered.connect(self.showAboutDlg)
        self.ui.actionNew_Profile.triggered.connect(self.addProfile)
        self.ui.actionDelete_Current_Profile.triggered.connect(
            self.delCurrentProfile)
        self.ui.actionWipe_configuration.triggered.connect(
            self.wipeConfiguration)

        self.ui.moveOnlyCheck.setChecked(conf.getValueStr('moveonly') == 'Yes')
        self.ui.moveOnlyCheck.stateChanged.connect(self.checkMoveOnly)

        if conf.getValueStr("autoconnect") == "Yes":
            self.timer = qt.QTimer(self)
            self.timer.setInterval(500)
            self.timer.timeout.connect(self.autoConnect)
            self.timer.start()

        self.timer2 = qt.QTimer(self)
        self.timer2.setInterval(4000)
        self.timer2.timeout.connect(self.checkWii)
        self.timer2.start()

        self.confDialog = ConfigDialog(self, self.wii)
        layout = QtWidgets.QGridLayout()
        layout.addWidget(self.confDialog)
        self.ui.confContainer.setLayout(layout)
        self.ui.confContainer.setVisible(False)

        self.refreshProfiles()

        self.center()
Esempio n. 3
0
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.ui = uic.loadUi("mainwindow.ui", self)
        self.setWindowTitle("python-whiteboard")
        self.setWindowFlags(qt.Qt.CustomizeWindowHint
                            | qt.Qt.WindowMinimizeButtonHint
                            | qt.Qt.WindowCloseButtonHint)

        self.connected = False
        self.calibrated = False
        self.active = False
        self.mustquit = False

        self.wii = None
        self.cursor = None

        self.batteryLevel.reset()
        self.batteryLevel.setRange(0, 99)
        self.batteryLevel.setValue(0)

        conf = Configuration()

        self.ui.pushButtonConnect.clicked.connect(self.connectWii)
        self.ui.pushButtonCalibrate.clicked.connect(self.calibrateWiiScreen)
        self.ui.pushButtonActivate.clicked.connect(self.activateWii)
        self.ui.pushButtonLoadCal.clicked.connect(
            self.calibrateWiiFromSettings)
        self.ui.pushButtonSettings.clicked.connect(self.showHideSettings)
        self.ui.comboProfiles.currentIndexChanged.connect(self.changeProfile)
        self.updateButtons()

        self.ui.actionQuit.triggered.connect(self.mustQuit)
        self.ui.actionHelp.triggered.connect(self.showAboutDlg)
        self.ui.actionNew_Profile.triggered.connect(self.addProfile)
        self.ui.actionDelete_Current_Profile.triggered.connect(
            self.delCurrentProfile)
        self.ui.actionWipe_configuration.triggered.connect(
            self.wipeConfiguration)

        self.ui.moveOnlyCheck.setChecked(conf.getValueStr('moveonly') == 'Yes')
        self.ui.moveOnlyCheck.stateChanged.connect(self.checkMoveOnly)

        if conf.getValueStr("autoconnect") == "Yes":
            self.timer = qt.QTimer(self)
            self.timer.setInterval(500)
            self.timer.timeout.connect(self.autoConnect)
            self.timer.start()

        self.timer2 = qt.QTimer(self)
        self.timer2.setInterval(4000)
        self.timer2.timeout.connect(self.checkWii)
        self.timer2.start()

        self.confDialog = ConfigDialog(self, self.wii)
        layout = QtWidgets.QGridLayout()
        layout.addWidget(self.confDialog)
        self.ui.confContainer.setLayout(layout)
        self.ui.confContainer.setVisible(False)

        self.refreshProfiles()

        self.center()

    def changeProfile(self, i):
        conf = Configuration()
        if i == 0:
            conf.setGroup("default")
        else:
            g = str(self.ui.comboProfiles.currentText())
            conf.setGroup(hashlib.md5(g.encode('utf-8')).hexdigest())

        self.confDialog.refreshWidgets()
        self.ui.moveOnlyCheck.setChecked(conf.getValueStr('moveonly') == 'Yes')

    def refreshProfiles(self):
        conf = Configuration()
        self.ui.comboProfiles.clear()
        self.ui.comboProfiles.addItem(self.tr("default"))

        for p in conf.getProfileList():
            self.ui.comboProfiles.addItem(p)

        self.confDialog.refreshWidgets()
        self.ui.moveOnlyCheck.setChecked(conf.getValueStr('moveonly') == 'Yes')

    def addProfile(self):
        profName, ok = QtWidgets.QInputDialog.getText(self,
                                                      self.tr("New Profile"),
                                                      self.tr('Name:'))

        profName = str(profName)
        if ok and profName != '':
            conf = Configuration()
            profiles = conf.getProfileList()
            for p in profiles:
                if p == profName: return
            profiles.append(profName)
            conf.setProfileList(profiles)
            self.refreshProfiles()
            i = self.ui.comboProfiles.findText(profName)
            self.ui.comboProfiles.setCurrentIndex(i)

    def delCurrentProfile(self):
        i = self.ui.comboProfiles.currentIndex()
        currentProfile = str(self.ui.comboProfiles.currentText())
        if i == 0: return
        conf = Configuration()
        profiles = conf.getProfileList()
        profiles = [p for p in profiles if p != currentProfile]
        conf.setProfileList(profiles)
        self.refreshProfiles()
        self.ui.comboProfiles.setCurrentIndex(0)

    def wipeConfiguration(self):
        conf = Configuration()
        conf.wipe()
        msgbox = QtWidgets.QMessageBox(self)
        msgbox.setText(
            self.tr("The application will close. Please restart manually"))
        msgbox.setModal(True)
        ret = msgbox.exec_()
        self.mustQuit()

    def showHideSettings(self):
        self.ui.confContainer.setVisible(not self.ui.confContainer.isVisible())
        QtWidgets.QApplication.processEvents()
        if self.ui.confContainer.isVisible():
            self.ui.pushButtonSettings.setText(self.tr('Hide settings'))
            # Res¡ze to max
            self.resize(1000, 1000)
        else:
            self.ui.pushButtonSettings.setText(self.tr('Show settings'))
            self.adjustSize()

    def checkMoveOnly(self, i):
        conf = Configuration()
        if self.sender().isChecked():
            conf.saveValue('moveonly', 'Yes')
            if self.cursor:
                self.cursor.noClicks = True
        else:
            conf.saveValue('moveonly', 'No')
            if self.cursor:
                self.cursor.noClicks = False

    def showAboutDlg(self):
        about = AboutDlg(self)
        about.show()
        about.exec_()

    def checkWii(self):
        if self.wii == None: return
        if self.connected == False: return
        if self.wii.checkStatus() == False:
            # Deactivate cursor
            self.deactivateWii()
            # Deactivate device
            self.connected = False
            self.calibrated = False
            self.active = False
            self.pushButtonConnect.setText(self.tr("Connect"))
            self.updateButtons()
            self.ui.label_utilization.setText(self.tr("Utilization: 0%"))
            self.clearScreenGraphic()
            self.batteryLevel.setValue(0)

            msgbox = QtWidgets.QMessageBox(self)
            msgbox.setText(self.tr("Wii device disconnected"))
            msgbox.setModal(True)
            ret = msgbox.exec_()
            return
        self.batteryLevel.setValue(self.wii.battery() * 100)

    def autoConnect(self):
        if self.isVisible():
            self.timer.stop()
            self.connectWii()
        else:
            self.timer.start()

    def drawScreenGraphic(self):
        max_x = self.wiiScreen.geometry().width()
        max_y = self.wiiScreen.geometry().height()
        self.scene = qt.QGraphicsScene()
        self.scene.setSceneRect(0, 0, max_x, max_y)
        quad = QtGui.QPolygonF()
        for p in self.wii.calibrationPoints:
            x = max_x * p[0] / Wiimote.MAX_X
            y = max_y * (1 - old_div(float(p[1]), Wiimote.MAX_Y))
            quad.append(qt.QPointF(x, y))
        self.scene.addPolygon(quad)
        self.wiiScreen.setScene(self.scene)
        self.wiiScreen.show()

    def clearScreenGraphic(self):
        if self.wiiScreen.scene():
            self.scene.clear()

    def center(self):
        screen = QtWidgets.QDesktopWidget().screenGeometry()
        size = self.geometry()
        self.move(old_div((screen.width() - size.width()), 2),
                  old_div((screen.height() - size.height()), 2))

    def updateButtons(self):
        if self.connected == False:
            self.ui.pushButtonConnect.setEnabled(1)
            self.ui.pushButtonCalibrate.setEnabled(0)
            self.ui.pushButtonActivate.setEnabled(0)
            self.ui.pushButtonLoadCal.setEnabled(0)
            #self.ui.frame_mouseControl.setEnabled(1)
            self.statusBar().showMessage("")
            return

        self.statusBar().showMessage(self.tr("Connected to ") + self.wii.addr)

        if self.calibrated == False:
            self.ui.pushButtonConnect.setEnabled(1)
            self.ui.pushButtonCalibrate.setEnabled(1)
            self.ui.pushButtonActivate.setEnabled(0)
            self.ui.pushButtonLoadCal.setEnabled(1)
            #self.ui.frame_mouseControl.setEnabled(1)
            return
        if self.active == False:
            self.ui.pushButtonConnect.setEnabled(1)
            self.ui.pushButtonCalibrate.setEnabled(1)
            self.ui.pushButtonActivate.setEnabled(1)
            self.ui.pushButtonLoadCal.setEnabled(1)
            #self.ui.frame_mouseControl.setEnabled(1)
            return
        else:
            self.ui.pushButtonConnect.setEnabled(0)
            self.ui.pushButtonCalibrate.setEnabled(1)
            self.ui.pushButtonLoadCal.setEnabled(0)
            self.ui.pushButtonActivate.setEnabled(1)
            #self.ui.frame_mouseControl.setEnabled(0)

    def disconnectDevice(self):
        if self.active:
            if self.cursor:
                self.cursor.finish()
            self.active = False

        if self.wii:
            self.wii.disable()
            self.wii.close()
            self.wii = None
            self.connected = False
            self.calibrated = False
            self.active = False
            self.pushButtonConnect.setText(self.tr("Connect"))
            self.updateButtons()
            self.ui.label_utilization.setText(self.tr("Utilization: 0%"))
            self.clearScreenGraphic()
            self.batteryLevel.setValue(0)
            self.confDialog.wii = None
            self.confDialog.checkButtons()
            return

    def makeBTNCallback(self):
        def func():
            # Simulate click to calibrate button
            self.ui.pushButtonCalibrate.click()

        return func

    def connectWii(self):
        if self.connected:
            self.disconnectDevice()
            return

        self.wii = Wiimote()
        pBar = PBarDlg(self)
        pBar.setModal(True)
        pBar.show()
        conf = Configuration()
        selectedMac = conf.getValueStr("selectedmac")
        pBar.reInit(selectedMac)
        pool = []
        while 1:
            thread = self.wii.createConnectThread(selectedMac, pool)
            thread.start()

            while not thread.wait(30):
                QtWidgets.QApplication.processEvents()

            if pBar.cancelled == True:
                if self.wii.isConnected():
                    self.wii.close()

                self.wii = None
                pBar.close()
                return

            if selectedMac == '*' and len(pool) >= 1:
                if Configuration().getValueStr('nowaitdevices') == 'Yes':
                    selectedMac = pool[0]
                else:
                    pBar.inform(
                        self.tr('Found ') + str(len(pool)) +
                        self.tr(' Devices. Press to Choose'))

            if self.wii.isConnected():
                self.connected = True
                self.calibrated = False
                self.active = False
                self.updateButtons()
                self.batteryLevel.setValue(self.wii.battery() * 100)
                self.pushButtonConnect.setText(self.tr("Disconnect"))

                pBar.close()

                self.confDialog.wii = self.wii
                self.confDialog.checkButtons()

                self.wii.disable()
                self.wii.putCallbackBTN(self.makeBTNCallback())
                self.wii.putCallbackIR(None)
                self.wii.enable()

                # Start calibration if configuration says so
                conf = Configuration()
                if conf.getValueStr("autocalibration") == "Yes":
                    if conf.getValueStr("automatrix") == "Yes":
                        self.calibrateWiiFromSettings()
                    else:
                        self.calibrateWiiScreen()
                return

            if self.wii.error:
                self.wii = None
                msgbox = QtWidgets.QMessageBox(self)
                msgbox.setWindowTitle(self.tr('Error'))
                msgbox.setText(self.tr("Error. Check your bluetooth driver"))
                msgbox.setModal(True)
                ret = msgbox.exec_()
                pBar.close()
                return

            if pBar.choice:
                if len(pool) == 1:
                    selectedMac = str(pool[0])
                    pBar.reInit(selectedMac)
                else:
                    item, ok = QtWidgets.QInputDialog.getItem(
                        self, self.tr("Warning"), self.tr("Choose device"),
                        pool, 0, False)
                    if ok:
                        selectedMac = str(item)
                        pBar.reInit(selectedMac)
                    else:
                        pBar.close()
                        return

    # doscreen: if doscreen is true, calibrate by manual pointing
    def calibrateWii(self, loadFromSettings=False):
        self.deactivateWii()
        self.ui.label_utilization.setText(self.tr("Utilization: 0%"))
        self.clearScreenGraphic()

        self.calibrated = False
        self.active = False
        try:
            self.wii.state = Wiimote.NONCALIBRATED
            if loadFromSettings:
                # If calibration matrix can't be loaded, calibrate manually
                if not self.loadCalibration(self.wii):
                    doCalibration(self, self.wii)
            else:
                doCalibration(self, self.wii)

            if self.wii.state == Wiimote.CALIBRATED:
                self.calibrated = True
                self.active = False
                self.drawScreenGraphic()
                self.updateButtons()
                self.ui.label_utilization.setText(
                    self.tr("Utilization: ") + "%d%%" %
                    (100.0 * self.wii.utilization))
                self.saveCalibrationPars(self.wii)

                # Activate cursor after calibration (always)
                self.activateWii()
                return

        except CalibrationAbort:
            # Do nothing (user choice)
            pass

        except:
            print("Error during Calibration")
            traceback.print_exc(file=sys.stdout)
            self.updateButtons()
            msgbox = QtWidgets.QMessageBox(self)
            msgbox.setText(self.tr("Error during Calibration"))
            msgbox.setModal(True)
            ret = msgbox.exec_()

        # Installs button callback (for calling calibration)
        self.wii.disable()
        self.wii.putCallbackBTN(self.makeBTNCallback())
        self.wii.putCallbackIR(None)
        self.wii.enable()

    def calibrateWiiScreen(self):
        self.calibrateWii()

    def calibrateWiiFromSettings(self):
        self.calibrateWii(loadFromSettings=True)

    def saveCalibrationPars(self, wii):
        conf = Configuration()
        for i, p in enumerate(wii.screenPoints):
            conf.saveValue("screenPoint" + str(i) + "x", str(p[0]))
            conf.saveValue("screenPoint" + str(i) + "y", str(p[1]))

        for i, p in enumerate(wii.calibrationPoints):
            conf.saveValue("wiiPoint" + str(i) + "x", str(p[0]))
            conf.saveValue("wiiPoint" + str(i) + "y", str(p[1]))

    def loadCalibration(self, wii):
        try:
            conf = Configuration()
            pwii = []
            pscr = []
            for i in range(0, 4):
                p = []
                p.append(float(conf.getValueStr("screenPoint" + str(i) + "x")))
                p.append(float(conf.getValueStr("screenPoint" + str(i) + "y")))
                q = []
                q.append(float(conf.getValueStr("wiiPoint" + str(i) + "x")))
                q.append(float(conf.getValueStr("wiiPoint" + str(i) + "y")))
                pwii.append(list(q))
                pscr.append(list(p))
            wii.calibrate(pscr, pwii)
            return True
        except:
            return False

    def deactivateWii(self):
        if self.active:
            self.cursor.finish()
            self.active = False
            self.pushButtonActivate.setText(self.tr("Activate"))
            self.updateButtons()

    def activateWii(self):
        if self.active:
            # Deactivate
            self.deactivateWii()
        else:
            # Activate
            self.cursor = FakeCursor(self.wii)
            if self.ui.moveOnlyCheck.isChecked():
                self.cursor.noClicks = True

            # Installs button callback (for calling calibration)
            self.wii.disable()
            self.wii.putCallbackBTN(self.makeBTNCallback())

            conf = Configuration()
            zones = [
                conf.getValueStr(z)
                for z in ("zone1", "zone2", "zone3", "zone4")
            ]
            self.cursor.setZones(zones)
            self.cursor.runThread()
            self.active = True
            self.pushButtonActivate.setText(self.tr("Deactivate"))
            self.updateButtons()

    # Exit callback
    def closeEvent(self, e):
        # Unity does not support qt systray anymore.
        # So, I'm putting the old code on hold

        #if self.mustquit:
        #self.disconnectDevice()
        #e.accept()
        #else:
        #msgbox = QtWidgets.QMessageBox(self)
        #msgbox.setText(self.tr("The application will remain active (systray).") + "\n" + \
        #self.tr("To quit, use file->quit menu") )
        #msgbox.setModal( True )
        #ret = msgbox.exec_()
        #self.showHide()
        #e.ignore()

        # Instead, we simply ask if the user wants to really quit.

        msgbox = QtWidgets.QMessageBox(self)
        msgbox.setText(self.tr("Are you sure you want to exit?"))
        msgbox.setStandardButtons(QtWidgets.QMessageBox.Ok
                                  | QtWidgets.QMessageBox.Cancel)
        msgbox.setModal(True)
        ret = msgbox.exec_()
        if ret == QtWidgets.QMessageBox.Ok:
            # Exit the application
            self.disconnectDevice()
            e.accept()
        else:
            e.ignore()

    def showHide(self):
        if self.isVisible():
            self.hide()
        else:
            self.show()

    def mustQuit(self):
        self.mustquit = True
        self.close()
Esempio n. 4
0
class MainWindow(QtGui.QMainWindow):
	
	def __init__(self, parent=None):
		super(MainWindow, self).__init__(parent)
		self.ui = uic.loadUi("mainwindow.ui",self)
		self.setWindowTitle("python-whiteboard")
		self.setWindowFlags( qt.Qt.CustomizeWindowHint | qt.Qt.WindowMinimizeButtonHint |
			qt.Qt.WindowCloseButtonHint )
		
		self.connected = False
		self.calibrated = False
		self.active = False
		self.mustquit = False
		
		self.wii = None
		self.cursor = None
		
		self.batteryLevel.reset()
		self.batteryLevel.setRange(0,99)
		self.batteryLevel.setValue(0)
		
		conf = Configuration()

		self.connect(self.ui.pushButtonConnect,
			QtCore.SIGNAL("clicked()"), self.connectWii)
		
		self.connect(self.ui.pushButtonCalibrate,
			QtCore.SIGNAL("clicked()"), self.calibrateWiiScreen)
		
		self.connect(self.ui.pushButtonActivate,
			QtCore.SIGNAL("clicked()"), self.activateWii)
		
		self.connect(self.ui.pushButtonLoadCal,
			QtCore.SIGNAL("clicked()"), self.calibrateWiiFromSettings)
		
		self.connect(self.ui.pushButtonSettings,
			QtCore.SIGNAL("clicked()"), self.showHideSettings)
		
		self.connect(self.ui.comboProfiles,
			QtCore.SIGNAL("currentIndexChanged(int)"), self.changeProfile)
		
		self.updateButtons()
		
		self.connect(self.ui.actionQuit,
			QtCore.SIGNAL("activated()"), self.mustQuit)
		self.connect(self.ui.actionHelp,
			QtCore.SIGNAL("activated()"), self.showAboutDlg)
		self.connect(self.ui.actionNew_Profile,
			QtCore.SIGNAL("activated()"), self.addProfile)
		self.connect(self.ui.actionDelete_Current_Profile,
			QtCore.SIGNAL("activated()"), self.delCurrentProfile)
		
		
		self.ui.moveOnlyCheck.setChecked( conf.getValueStr('moveonly') == 'Yes' )
		self.connect(self.ui.moveOnlyCheck,
			QtCore.SIGNAL("stateChanged(int)"), self.checkMoveOnly)
		
		if conf.getValueStr("autoconnect") == "Yes":
			self.timer = qt.QTimer(self)
			self.timer.setInterval(500)
			self.connect(self.timer, QtCore.SIGNAL("timeout()"), self.autoConnect)
			self.timer.start()
		
		self.timer2 = qt.QTimer(self)
		self.timer2.setInterval(4000)
		self.connect(self.timer2, QtCore.SIGNAL("timeout()"), self.checkWii)
		self.timer2.start()
		
		self.confDialog = ConfigDialog(self, self.wii)
		layout = QtGui.QGridLayout()
		layout.addWidget(self.confDialog)
		self.ui.confContainer.setLayout(layout)
		self.ui.confContainer.setVisible(False)
		
		self.refreshProfiles()
		
		self.center()
	
	
	def changeProfile(self,i):
		conf = Configuration()
		if i == 0:
			conf.setGroup("default")
		else:
			g = unicode(self.ui.comboProfiles.currentText())
			conf.setGroup(hashlib.md5(g.encode('utf-8')).hexdigest())
		
		self.confDialog.refreshWidgets()
		self.ui.moveOnlyCheck.setChecked( conf.getValueStr('moveonly') == 'Yes' )
	
	
	def refreshProfiles(self):
		conf = Configuration()
		self.ui.comboProfiles.clear()
		self.ui.comboProfiles.addItem(self.tr("default"))
		
		for p in conf.getProfileList():
			self.ui.comboProfiles.addItem(p)
		
		self.confDialog.refreshWidgets()
		self.ui.moveOnlyCheck.setChecked( conf.getValueStr('moveonly') == 'Yes' )
	
	
	def addProfile(self):
		profName, ok = QtGui.QInputDialog.getText(self,
			self.tr("New Profile"), self.tr('Name:'))
		
		profName = unicode(profName)
		if ok and profName != '':
			conf = Configuration()
			profiles = conf.getProfileList()
			for p in profiles:
				if p == profName: return
			profiles.append(profName)
			conf.setProfileList(profiles)
			self.refreshProfiles()
			i = self.ui.comboProfiles.findText(profName)
			self.ui.comboProfiles.setCurrentIndex(i)
	
	
	def delCurrentProfile(self):
		i = self.ui.comboProfiles.currentIndex()
		currentProfile = unicode(self.ui.comboProfiles.currentText())
		if i == 0: return
		conf = Configuration()
		profiles = conf.getProfileList()
		profiles = [ p for p in profiles if p != currentProfile ]
		conf.setProfileList(profiles)
		self.refreshProfiles()
		self.ui.comboProfiles.setCurrentIndex(0)
	
	
	
	def showHideSettings(self):
		self.ui.confContainer.setVisible(not self.ui.confContainer.isVisible())
		QtGui.QApplication.processEvents()
		if self.ui.confContainer.isVisible():
			self.ui.pushButtonSettings.setText(self.tr('Hide settings'))
			# Res¡ze to max
			self.resize(1000,1000)
		else:
			self.ui.pushButtonSettings.setText(self.tr('Show settings'))
			self.adjustSize()
	
	
	def checkMoveOnly(self,i):
		conf = Configuration()
		if self.sender().isChecked():
			conf.saveValue('moveonly','Yes')
			if self.cursor:
				self.cursor.noClicks = True
		else:
			conf.saveValue('moveonly','No')
			if self.cursor:
				self.cursor.noClicks = False
	
	
	def showAboutDlg(self):
		about = AboutDlg(self)
		about.show()
		about.exec_()
	
	
	def checkWii(self):
		if self.wii == None: return
		if self.connected == False: return
		if self.wii.checkStatus() == False:
			# Deactivate cursor
			self.deactivateWii()
			# Deactivate device
			self.connected = False
			self.calibrated = False
			self.active = False
			self.pushButtonConnect.setText(self.tr("Connect"))
			self.updateButtons()
			self.ui.label_utilization.setText(self.tr("Utilization: 0%"))
			self.clearScreenGraphic()
			self.batteryLevel.setValue(0)
			
			msgbox = QtGui.QMessageBox( self )
			msgbox.setText( self.tr("Wii device disconnected") )
			msgbox.setModal( True )
			ret = msgbox.exec_()
			return
		self.batteryLevel.setValue(self.wii.battery()*100)
	
	
	def autoConnect(self):
		if self.isVisible():
			self.timer.stop()
			self.connectWii()
		else:
			self.timer.start()
		

		
	def drawScreenGraphic(self):
		max_x = self.wiiScreen.geometry().width()
		max_y = self.wiiScreen.geometry().height()
		self.scene = qt.QGraphicsScene()
		self.scene.setSceneRect(0,0,max_x,max_y)
		quad = QtGui.QPolygonF()
		for p in self.wii.calibrationPoints:
			x = max_x * p[0]/Wiimote.MAX_X
			y = max_y * (1-float(p[1])/Wiimote.MAX_Y)
			quad.append(qt.QPointF(x,y))
		self.scene.addPolygon(quad)
		self.wiiScreen.setScene(self.scene)
		self.wiiScreen.show()
	
	
	def clearScreenGraphic(self):
		if self.wiiScreen.scene():
			self.scene.clear()


	def center(self):
		screen = QtGui.QDesktopWidget().screenGeometry()
		size = self.geometry()
		self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2)
		
		

	def updateButtons(self):
		if self.connected == False:
			self.ui.pushButtonConnect.setEnabled(1)
			self.ui.pushButtonCalibrate.setEnabled(0)
			self.ui.pushButtonActivate.setEnabled(0)
			self.ui.pushButtonLoadCal.setEnabled(0)
			#self.ui.frame_mouseControl.setEnabled(1)
			self.statusBar().showMessage("")
			return
		
		self.statusBar().showMessage(self.tr("Connected to ") + self.wii.addr)
		
		if self.calibrated == False:
			self.ui.pushButtonConnect.setEnabled(1)
			self.ui.pushButtonCalibrate.setEnabled(1)
			self.ui.pushButtonActivate.setEnabled(0)
			self.ui.pushButtonLoadCal.setEnabled(1)
			#self.ui.frame_mouseControl.setEnabled(1)
			return
		if self.active == False:
			self.ui.pushButtonConnect.setEnabled(1)
			self.ui.pushButtonCalibrate.setEnabled(1)
			self.ui.pushButtonActivate.setEnabled(1)
			self.ui.pushButtonLoadCal.setEnabled(1)
			#self.ui.frame_mouseControl.setEnabled(1)
			return
		else:
			self.ui.pushButtonConnect.setEnabled(0)
			self.ui.pushButtonCalibrate.setEnabled(1)
			self.ui.pushButtonLoadCal.setEnabled(0)
			self.ui.pushButtonActivate.setEnabled(1)
			#self.ui.frame_mouseControl.setEnabled(0)
	
	
	def disconnectDevice(self):
		if self.active:
			if self.cursor:
				self.cursor.finish()
			self.active = False
		
		if self.wii:
			self.wii.disable()
			self.wii.close()
			self.wii = None
			self.connected = False
			self.calibrated = False
			self.active = False
			self.pushButtonConnect.setText(self.tr("Connect"))
			self.updateButtons()
			self.ui.label_utilization.setText(self.tr("Utilization: 0%"))
			self.clearScreenGraphic()
			self.batteryLevel.setValue(0)
			self.confDialog.wii = None
			self.confDialog.checkButtons()
			return


	def makeBTNCallback(self):
		def func():
			# Simulate click to calibrate button
			self.ui.pushButtonCalibrate.click()
		
		return func

	

	def connectWii(self):
		if self.connected:
			self.disconnectDevice()
			return
		
		self.wii = Wiimote()
		pBar = PBarDlg(self)
		pBar.setModal( True )
		pBar.show()
		conf = Configuration()
		selectedMac = conf.getValueStr("selectedmac")
		while 1:
			thread = self.wii.createConnectThread(selectedMac)
			thread.start()
			
			while not thread.wait(30):
				QtGui.QApplication.processEvents()
			
			if pBar.cancelled == True:
				if self.wii.isConnected():
					self.wii.close()
					
				self.wii = None
				pBar.close()
				return

			if self.wii.isConnected():
				self.connected = True
				self.calibrated = False
				self.active = False
				self.updateButtons()
				self.batteryLevel.setValue(self.wii.battery()*100)
				self.pushButtonConnect.setText(self.tr("Disconnect"))
				
				pBar.close()
				
				self.confDialog.wii = self.wii
				self.confDialog.checkButtons()
				
				self.wii.disable()
				self.wii.putCallbackBTN(self.makeBTNCallback())
				self.wii.putCallbackIR(None)
				self.wii.enable()
				
				# Start calibration if configuration says so
				conf = Configuration()
				if conf.getValueStr("autocalibration") == "Yes":
					if conf.getValueStr("automatrix") == "Yes":
						self.calibrateWiiFromSettings()
					else:
						self.calibrateWiiScreen()
				return
			
			if self.wii.error:
				self.wii = None
				msgbox = QtGui.QMessageBox( self )
				msgbox.setWindowTitle( self.tr('Error') )
				msgbox.setText( self.tr("Error. Check your bluetooth driver") )
				msgbox.setModal( True )
				ret = msgbox.exec_()
				pBar.close()
				return
			
			if not self.wii.isConnected() and len(self.wii.wiimotesDetected) > 1:
				item, ok = QtGui.QInputDialog.getItem(self,
					self.tr("Warning"), self.tr("Choose device"), self.wii.wiimotesDetected, 0, False)
				if ok:
					selectedMac = unicode(item)
			
			
			

	# doscreen: if doscreen is true, calibrate by manual pointing
	def calibrateWii(self,loadFromSettings=False):
		self.deactivateWii()		
		self.ui.label_utilization.setText(self.tr("Utilization: 0%"))
		self.clearScreenGraphic()
		
		self.calibrated = False
		self.active = False
		
		self.wii.state = Wiimote.NONCALIBRATED
		if loadFromSettings:
			# If calibration matrix can't be loaded, calibrate manually
			if not self.loadCalibration(self.wii):
				doCalibration(self,self.wii)
		else:
			doCalibration(self,self.wii)
		
		
		if self.wii.state == Wiimote.CALIBRATED:
			self.calibrated = True
			self.active = False
			self.drawScreenGraphic()
			self.updateButtons()
			self.ui.label_utilization.setText(self.tr("Utilization: ") + "%d%%" % (100.0*self.wii.utilization))
			self.saveCalibrationPars(self.wii)
			
			# Activate cursor after calibration (always)
			self.activateWii()
			
		else:
			self.updateButtons()
			msgbox = QtGui.QMessageBox( self )
			msgbox.setText( self.tr("Error during Calibration") )
			msgbox.setModal( True )
			ret = msgbox.exec_()
		
			# Installs button callback (for calling calibration)
			self.wii.disable()
			self.wii.putCallbackBTN(self.makeBTNCallback())
			self.wii.putCallbackIR(None)
			self.wii.enable()

	
	def calibrateWiiScreen(self):
		self.calibrateWii()
	
	
	def calibrateWiiFromSettings(self):
		self.calibrateWii(loadFromSettings=True)


	def saveCalibrationPars(self,wii):
		conf = Configuration()
		for i,p in enumerate(wii.screenPoints):
			conf.saveValue("screenPoint"+str(i)+"x",str(p[0]))
			conf.saveValue("screenPoint"+str(i)+"y",str(p[1]))
		
		for i,p in enumerate(wii.calibrationPoints):
			conf.saveValue("wiiPoint"+str(i)+"x",str(p[0]))
			conf.saveValue("wiiPoint"+str(i)+"y",str(p[1]))
	
	
	def loadCalibration(self,wii):
		try:
			conf = Configuration()
			pwii = []
			pscr = []
			for i in range(0,4):
				p = []
				p.append(float(conf.getValueStr("screenPoint"+str(i)+"x")))
				p.append(float(conf.getValueStr("screenPoint"+str(i)+"y")))
				q = []
				q.append(float(conf.getValueStr("wiiPoint"+str(i)+"x")))
				q.append(float(conf.getValueStr("wiiPoint"+str(i)+"y")))
				pwii.append(list(q))
				pscr.append(list(p))
			wii.calibrate(pscr,pwii)
			return True
		except:
			return False
		
	
	def deactivateWii(self):
		if self.active:
			self.cursor.finish()
			self.active = False
			self.pushButtonActivate.setText(self.tr("Activate"))
			self.updateButtons()
	
	
	def activateWii(self):
		if self.active:
			# Deactivate
			self.deactivateWii()
		else:
			# Activate
			self.cursor = FakeCursor(self.wii)
			if self.ui.moveOnlyCheck.isChecked():
				self.cursor.noClicks = True
			
			# Installs button callback (for calling calibration)
			self.wii.disable()
			self.wii.putCallbackBTN(self.makeBTNCallback())
			
			conf = Configuration()
			zones = [ conf.getValueStr(z) for z in ("zone1","zone2","zone3","zone4") ]
			self.cursor.setZones(zones)
			self.cursor.runThread()
			self.active = True
			self.pushButtonActivate.setText(self.tr("Deactivate"))
			self.updateButtons()
	
	
	# Exit callback
	def closeEvent(self,e):
		if self.mustquit:
			self.disconnectDevice()
			e.accept()
		else:
			msgbox = QtGui.QMessageBox(self)
			msgbox.setText(self.tr("The application will remain active (systray).") + "\n" + \
				self.tr("To quit, use file->quit menu") )
			msgbox.setModal( True )
			ret = msgbox.exec_()
			self.showHide()
			e.ignore()
	
	
	def showHide(self):
		if self.isVisible():
			self.hide()
		else:
			self.show()


	def mustQuit(self):
		self.mustquit = True
		self.close()