class Nexus(QMainWindow): """ Die Hauptklasse des Programms. In dieser Klasse wird die GUI gesteuert und die Würfelwürfe aufgerufen. """ dicePoolChanged = pyqtSignal(int) xAgainChanged = pyqtSignal(int) cursed = pyqtSignal(bool) def __init__(self, parent=None): """ Konstruktor """ self.translator_app = QTranslator() self.translator_qt = QTranslator() QApplication.installTranslator( self.translator_app ) QApplication.installTranslator( self.translator_qt ) QWidget.__init__(self, parent) QCoreApplication.setOrganizationName("Caern") QCoreApplication.setOrganizationDomain("www.caern.de") QCoreApplication.setApplicationName("DiceRoller WoD") QCoreApplication.setApplicationVersion(QString.number(PROGRAM_VERSION_MAJOR) + "." + QString.number(PROGRAM_VERSION_MINOR) + "." + QString.number(PROGRAM_VERSION_CHANGE) ) QApplication.setWindowIcon(QIcon(":/icons/logo/WoD.png")) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.createInfo() #self.createLanguageMenu() self.instantRoll = InstantRoll() self.extendedRoll = ExtendedRoll() # Dieser Zähler bestimmt, wie der rollende Würfel angezeigt wird. self.timerDice = QTimer() # Verzögert die tatsächliche Ausführung des Würfelwurfs. self.timerRoll = QTimer() self.populateUi() self.createConnections() self.initializing() self.setWindowTitle(QCoreApplication.applicationName()) #self.retranslateUi() ## Die von der letzten Benutzung gespeicherte Größe und Position auf dem Bildschirm laden. #self.readSettings() #def closeEvent(self, event): #""" #Diese Funktion wird aufgerufen, wann immer das Programm geschlossen wird. #Die Idee dahinter ist, vor dem Beenden, Größe und Position des Fensters zu speichern. #""" #self.writeSettings() #event.accept() def createInfo(self): """ Erzeugt Tooltips und Hilfe für die einzelnen Teile des Programms. """ self.ui.action_houserules.setStatusTip(self.ui.action_houserules.toolTip()) #def createLanguageMenu(self): #""" #Erzeugt das Menü zum Umschalten zwischen den möglichen Sprachen. #""" #self.menu_language = QMenu( self.tr("&Language") ) #self.actionGroup_language = QActionGroup(self) #self.langPath = getPath() + "/" + PROGRAM_LANGUAGE_PATH #self.dir_qm = QDir( self.langPath ); #self.fileNames = self.dir_qm.entryList( QStringList( "DiceRoller-WoD_*.qm" )); ## Englisch hat keine qm-Datei, also muß es von Hand hinzugefügt werden. #self.action = QAction( "&1 English", self.actionGroup_language ) #self.action.setCheckable( True ) #self.action.setData( "en" ) #self.action.setChecked( True ) #self.menu_language.addAction( self.action ) #self.actionGroup_language.addAction( self.action ) #iter = 0 #for i in self.fileNames: #self.trFilename = unicode(i) #self.locale = unicode(i) #self.locale = self.locale[(self.locale.find( "_" )+1):(self.locale.find( "." ))] #self.translator = QTranslator() #self.translator.load( self.trFilename, self.dir_qm.absolutePath() ) #self.language = self.translator.translate( "MainWindow", "English" ) #self.action = QAction( "&" + QString.number(iter + 2) + " " + self.language, self.actionGroup_language ) #self.action.setCheckable( True ) #self.action.setData( self.locale ) #self.menu_language.addAction ( self.action ) #self.actionGroup_language.addAction ( self.action ) #iter += 1 #self.actionGroup_language.triggered.connect(self.switchLanguage) #self.ui.menuBar.insertMenu(self.ui.menuHelp.menuAction(), self.menu_language) #def switchLanguage( self, action ): #""" #Schaltet zwischen den einzelnen Sprachen um. #""" #self.locale = action.data().toString(); #self.qmPath = getPath() + "/" + PROGRAM_LANGUAGE_PATH ##if self.translator_app.load( "DiceRoller-WoD_" + self.locale, self.qmPath ): ##qDebug("Hat DiceRoller-WoD_" + self.locale + " geladen.") ##if self.translator_qt.load( "qt_" + self.locale, QLibraryInfo.location ( QLibraryInfo.TranslationsPath ) ): ##qDebug("Hat qt_" + self.locale + " geladen.") ## Alle Texte neu setzen #self.retranslateUi() ## Seltsamerweise ist retranslate in Ui_MainWindow leer. Ich weiß nicht, wieso das der Fall ist. #self.ui.retranslateUi(self.ui) #def retranslateUi(self): #""" #Diese Funktion übersetzt alle Texte, welche nicht in der .ui-Datei festgelegt sind, sondern im Quellcode (hier) geschrieben wurden. #""" #self.menu_language.setTitle( self.tr( "&Language" ) ) #self.reset() def populateUi(self): self.svgRenderer = QSvgRenderer(":/icons/W10.svg") self.scene = QGraphicsScene() self.view = QGraphicsView() self.view.setFrameShape(QFrame.NoFrame) self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.view.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.view.setStyleSheet("background-color: transparent;"); self.view.setScene(self.scene) self.ui.horizontalLayout_dice.insertWidget(1, self.view) def createConnections(self): """ Erstelle die Verbindungen zwischen den verschiedenen Klassen und Elementen des Programms. """ self.ui.action_about.triggered.connect(self.aboutApp) self.ui.action_aboutQt.triggered.connect(QApplication.aboutQt) self.ui.action_houserules.toggled.connect(self.setHouserules) self.ui.pushButton_roll.clicked.connect(self.roll) self.ui.spinBox_pool.valueChanged.connect(self.calcDicePool) self.ui.spinBox_pool.valueChanged.connect(self.reset) self.ui.spinBox_modifier.valueChanged.connect(self.calcDicePoolMod) self.ui.spinBox_modifier.valueChanged.connect(self.reset) self.ui.checkBox_rote.toggled.connect(self.instantRoll.setRote) self.ui.checkBox_rote.toggled.connect(self.extendedRoll.setRote) self.ui.checkBox_rote.toggled.connect(self.reset) self.ui.comboBox_xAgain.activated.connect(self.setXAgainThreshold) self.ui.comboBox_xAgain.activated.connect(self.reset) self.ui.groupBox_extended.toggled.connect(self.changeText) self.ui.radioButton_target.toggled.connect(self.changeText) self.ui.radioButton_maxRolls.toggled.connect(self.changeText) self.ui.groupBox_extended.toggled.connect(self.reset) self.ui.radioButton_target.toggled.connect(self.setExtendedMode) self.ui.spinBox_target.valueChanged.connect(self.extendedRoll.setTarget) self.ui.spinBox_target.valueChanged.connect(self.reset) self.ui.spinBox_maxRolls.valueChanged.connect(self.extendedRoll.setMaxRolls) self.ui.spinBox_maxRolls.valueChanged.connect(self.reset) self.ui.checkBox_rollsLimited.toggled.connect(self.extendedRoll.setLimited) self.ui.checkBox_rollsLimited.toggled.connect(self.reset) self.xAgainChanged.connect(self.instantRoll.setThreshold) self.xAgainChanged.connect(self.extendedRoll.setThreshold) self.cursed.connect(self.instantRoll.setCurse) self.cursed.connect(self.extendedRoll.setCurse) self.instantRoll.rolled.connect(self.setResultSuccesses) self.extendedRoll.rolled.connect(self.setResultSuccesses) self.extendedRoll.rollsNeeded.connect(self.setResultRolls) self.instantRoll.rollFinished.connect(self.setResult) self.extendedRoll.rollFinished.connect(self.setResult) self.dicePoolChanged.connect(self.changeDiceDisplay) self.timerDice.timeout.connect(self.displayDice) self.timerRoll.timeout.connect(self._executeRoll) def initializing(self): """ Initialisiert das Programm mit den Startwerten. """ self.ui.action_quit.setIcon(QIcon(":/icons/actions/exit.png")) self.ui.action_about.setIcon(QIcon(":/icons/logo/WoD.png")) self.ui.pushButton_quit.setIcon(self.ui.action_quit.icon()) self.ui.pushButton_roll.setIcon(QIcon(":icons/W10_0.svg")) self.ui.action_quit.setMenuRole(QAction.QuitRole) self.ui.action_about.setText(self.tr("About %1...").arg(QApplication.applicationName())) self.ui.action_about.setMenuRole(QAction.AboutRole) self.ui.spinBox_pool.setValue(2) self.ui.checkBox_rote.setChecked(False) self.ui.comboBox_xAgain.setCurrentIndex(0) self.ui.spinBox_target.setValue(1) self.changeText() self.ui.radioButton_target.setChecked(True) self.ui.groupBox_extended.setChecked(False) self.ui.checkBox_rollsLimited.setChecked(True) self.dice = [] for i in xrange(10): self.W10_x = QGraphicsSvgItem() self.W10_x.setSharedRenderer(self.svgRenderer) self.W10_x.setElementId("layer" + str(i)) #self.W10_x.setVisible(False) # Ich lege diese Liste an, da ich auf die Liste in self.scene irgendwie nicht zugreifen kann. self.dice.append(self.W10_x) #self.scene.addItem(self.W10_x) def displayDice(self, value=None): """ @todo Der Würfel kann mehrmals in Folge das selbe Ergebnis anzeigen, was dazu führt, daß der Bildablauf zu stocken scheint. """ if (value == None): dieValue = Random.random(10)-1 else: dieValue = value for item in self.scene.items(): self.scene.removeItem(item) self.scene.addItem(self.dice[dieValue]) self.view.setSceneRect(self.scene.itemsBoundingRect()) self.view.fitInView(self.dice[dieValue]) def changeDiceDisplay(self, number): """ Diese Funktion bestimmt, wieviele Würfel angezeigt werden. """ pass #if (self.ui.horizontalLayout_dice.count > 2): #pass #randomValue = Random.random(10)-1 #for die in xrange(number): #self.__W10_scene = QGraphicsScene() #self.__W10_scene.addItem(self.dice[randomValue]) #self.__W10_view = QGraphicsView() #self.__W10_view.setScene(self.__W10_scene) #self.__W10_view.setSceneRect(self.scene.itemsBoundingRect()) #self.__W10_view.fitInView(self.dice[randomValue]) #self.ui.horizontalLayout_dice.insertWidget(1, self.__W10_view) def aboutApp(self): """ Zeigt die Info-Nachricht an. """ self.appText = self.tr(""" <h1>%1</h1> <h2>Version: %2</h2> <p>Copyright (C) 2011 by Victor von Rhein<br> EMail: [email protected]</p> """).arg(QCoreApplication.applicationName()).arg(QCoreApplication.applicationVersion()) self.gnuText = self.tr(""" <h2>GNU General Public License</h2> <p>This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p> <p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p> <p>You should have received a copy of the GNU General Public License along with this program. If not, see <a>http://www.gnu.org/licenses/</a>.</p> """) self.wodText = self.tr(""" <h2>%1</h2> <p>%1, %2, the %3 and all referring terms and symbols are copyrighted by %4</p> """).arg("World of Darkness").arg("White Wolf").arg("White Wolf-Logo").arg("White Wolf Inc.") self.aboutText = self.appText + self.gnuText + self.wodText QMessageBox.about(self, "About " + QCoreApplication.applicationName(), self.aboutText ) def roll(self): """ Der Wurf wird durchgeführt. Der tatsächliche Wurf wird aber von den Timern angestoßen. """ # Es wird ein rollender Würfel angezeigt. self.timerDice.start(DICEROLL_TIMER_INTERVAL) self.timerRoll.start(DICEROLL_TIMER_DELAY) def _executeRoll(self): """ Entscheidet vor dem eigentlichen Würfelwurf, ob ein normaler oder ein erweiterter Wurf notwendig ist und führt diesen aus. """ if self.ui.groupBox_extended.isChecked(): #qDebug("Checked") self.extendedRoll.roll() else: #qDebug("Not Checked") self.instantRoll.roll() # Die Anzeige des rollenden Würfels wird angehalten self.timerDice.stop() self.timerRoll.stop() def calcDicePool(self, value): """ Berechnet die Größe des zur Verfügung stehenden Würfelpools, welcher von den Würfeln und den Modifikatoren abhängt. """ self.instantRoll.poolSize = value + self.ui.spinBox_modifier.value() self.extendedRoll.poolSize = self.instantRoll.poolSize self.extendedRoll.limit = value self.dicePoolChanged.emit(self.instantRoll.poolSize) def calcDicePoolMod(self, value): """ Berechnet wie schon calcDicePool() die Größe des Würfelvorrats, allerdings werden dieser Funktion andere Argumente übergeben. """ self.instantRoll.poolSize = value + self.ui.spinBox_pool.value() self.extendedRoll.poolSize = value + self.ui.spinBox_pool.value() def setHouserules(self, value): #qDebug("Test" + str(value)) self.extendedRoll.isHouserules = value def setXAgainThreshold(self, value): """ Legt fest, bei welchem Ergebnis weitergewürfelt werden kann und wann dies überhaupt nicht der Fall sein sollte oder gar Erfolge abgezogen werden können. """ self.__threshold = 0 if (value < 3): self.__threshold = 10 - value # Index 0 entspricht 10 again, 1 entspricht 9 again etc. else: self.__threshold = 11 # Index 3 entspricht "no reroll" self.xAgainChanged.emit(self.__threshold) if (value > 3): self.cursed.emit(True) # Kein reroll und 1er werden Abgezogen. else: self.cursed.emit(False) # 1er werden nicht abgezogen. def setExtendedMode(self, sw): """ Legt den Modus fest, mit welchem der erweiterte Wurf durchgeführt wird. Entweder wird auf ein Ergebnishingewürfelt, oder nach einer bestimmten Anzahl würde die Anzahl der Erfolge gezählt. """ if (sw): self.extendedRoll.isResultInRolls = False else: self.extendedRoll.isResultInRolls = True def setResult(self, value): """ Schreibt das Ergebnis des Wurfs in die GUI. Dabei wird auch je nach Erfolgsqualität bei dem dargestellten Würfel eine andere Augenzahl gezeigt. """ self.ui.statusBar.showMessage(self.tr("Result of diceroll is displayed.")) if (value == DieResult.dramaticFailure): self.ui.label_resultText.setText(self.tr("Dramatic Failure")); self.ui.label_result.setPixmap(QPixmap(":/icons/actions/cnrdelete-all1.png")); self.displayDice(1) elif (value == DieResult.failure): self.ui.label_resultText.setText(self.tr("Failure")); self.ui.label_result.setPixmap(QPixmap(":/icons/actions/fileclose.png")); self.displayDice(Random.random(2, 7)) elif (value == DieResult.success): self.ui.label_resultText.setText(self.tr("Success")); self.ui.label_result.setPixmap(QPixmap(":/icons/actions/ok.png")); self.displayDice(Random.random(8, 9)) else: self.ui.label_resultText.setText(self.tr("Exceptional Success")); self.ui.label_result.setPixmap(QPixmap(":/icons/actions/bookmark.png")); self.displayDice(0) def setResultRolls(self, value): """ Zeigt in der GUI an, wieviele Würfe nötig waren. """ if (self.ui.groupBox_extended.isChecked() and self.ui.radioButton_target.isChecked()): self.ui.lcdNumber_successes.display(value) def setResultSuccesses(self, value): """ Zeigt in der GUI an, wieviele Erfolge erzielt wurden. """ if (not self.ui.groupBox_extended.isChecked() or not self.ui.radioButton_target.isChecked()): self.ui.lcdNumber_successes.display(value) def changeText(self): """ Verändert den Text in der Statuszeile. """ if (self.ui.groupBox_extended.isChecked() and self.ui.radioButton_target.isChecked()): self.ui.label_successes.setText(self.tr("Number of rolls needed:")) else: self.ui.label_successes.setText(self.tr("Number of successes:")) def reset(self): """ Setzt das Programm auf einen definierten Startwert zurück. """ self.ui.label_result.setPixmap(QPixmap(":/icons/actions/fileclose.png")) self.ui.label_resultText.setText(self.tr("No result yet!")) self.ui.lcdNumber_successes.display(0) self.ui.statusBar.showMessage(self.tr("Press the Button to roll the dice!"))
class BKReversaScreen(QWidget): def __init__(self): super(BKReversaScreen,self).__init__() self.sensorActivo = 0 self.inicializarUI() self.distancias=[] def inicializarUI(self): self.setWindowTitle("BlueKing::Reversa") self.setGeometry(0,0,320,240) self.setAutoFillBackground(True) #QGraphicsView/Scene self.view = QGraphicsView() self.view.setStyleSheet("border: 0px;margin: 0px;background-color: #000000;") self.scene = QGraphicsScene(0,0,320,240) self.view.setScene(self.scene) self.baseLayout = QVBoxLayout() self.baseLayout.setContentsMargins(0,0,0,0) self.baseLayout.addWidget(self.view) #Decoracion car_logo = QPixmap("imagenes/car_logo.png") car_logo_item = QGraphicsPixmapItem(car_logo) car_logo_item.setPos(5,5) self.scene.addItem(car_logo_item) self.distlabel = QLabel("-") self.distlabel.setGeometry(20, 20, 280, 200) self.distlabel.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.distlabel.setStyleSheet("color: #00FFFF;font-size: 150px;background-color: transparent;") self.scene.addWidget(self.distlabel) self.measureLabel=QLabel("metros") self.measureLabel.setGeometry(10,190,300,30) self.measureLabel.setAlignment(QtCore.Qt.AlignRight |QtCore.Qt.AlignVCenter) self.measureLabel.setStyleSheet("color: #FFFF00;font-size: 30px; font-weight: bold; font-style: italic;background-color: transparent;") self.scene.addWidget(self.measureLabel) self.setLayout(self.baseLayout) transformacion = QTransform() transformacion.scale(1.0,-1.0) #self.view.setTransform(transformacion) self.show() def mousePressEvent(self, QMouseEvent): if self.sensorActivo == 0: # Iniciar sensores de Proximidad self.sensor1 = BKSensorProximidadDummie(0, 15, 14) self.sensor1.connect(self.sensor1, QtCore.SIGNAL('distancia_sensor'), self.mostrarMedida) self.sensor1.start() self.distancias[0] = 0.0 self.sensor2 = BKSensorProximidadDummie(1, 23, 22) self.sensor2.connect(self.sensor2, QtCore.SIGNAL('distancia_sensor'), self.mostrarMedida) self.sensor2.start() self.distancias[1] = 0.0 self.sensor3 = BKSensorProximidadDummie(2, 25, 24) self.sensor3.connect(self.sensor2, QtCore.SIGNAL('distancia_sensor'), self.mostrarMedida) self.sensor3.start() self.distancias[2] = 0.0 self.sensorActivo = 1 else: # Detener sensores self.sensor1.stop() #self.sensor2.stop() #self.sensor3.stop() def mostrarMedida(self, sensor, numero): # Calcular la menor distancia. self.distancias[sensor] = numero tnumero = 1000.0 for n in range(len(self.distancias)): if self.distancias[n] < tnumero: tnumero = self.distancias[n] if tnumero == 1000.0: self.distlabel.setText("---") else: self.distlabel.setText(`numero`)
class BKHudScreen(QWidget): def __init__(self): super(BKHudScreen, self).__init__() self.bt_address="" self.inicializarUI() self.inicializarConfig() self.hilo = BKOBDLecturaDummie(self.bt_address) self.hilo.connect(self.hilo, self.hilo.senal, self.informacion_recibida) def inicializarConfig(self): # Leer configuraciones config = ConfigParser() config.read("config.ini") self.bt_address = config.get('Scanner','obd_interface') def inicializarUI(self): self.setWindowTitle("BlueKing HUD") self.setGeometry(0,0,320,240) self.setAutoFillBackground(True) self.view = QGraphicsView() self.view.setStyleSheet("border: 0px;margin: 0px;background-color: #000000;") self.scene = QGraphicsScene(0,0,320,240) self.view.setScene(self.scene) self.baseLayout = QVBoxLayout() self.baseLayout.setContentsMargins(0,0,0,0) self.baseLayout.addWidget(self.view) # Decoracion car_logo = QPixmap("imagenes/car_logo.png").scaled(32,32, QtCore.Qt.KeepAspectRatio) car_logo_item = QGraphicsPixmapItem(car_logo) car_logo_item.setPos(5,5) self.scene.addItem(car_logo_item) # Etiqueta km/h kmLabel = QLabel("Km/h") kmLabel.setGeometry(250,120, 70, 25) kmLabel.setStyleSheet("font-size: 25px; color: #C8FF00; background: transparent;text-decoration: italic") self.scene.addWidget(kmLabel) # Etiqueta RPM rpmSigLabel = QLabel("R.P.M.") rpmSigLabel.setGeometry(250, 152, 70, 25) rpmSigLabel.setStyleSheet("font-size: 25px; color: #C8FF00; background: transparent;text-decoration: italic") self.scene.addWidget(rpmSigLabel) # Icono Temperatura thermometro = QPixmap("imagenes/termometro_rojo.png").scaled(25,25, QtCore.Qt.KeepAspectRatio) thermometro_item = QGraphicsPixmapItem(thermometro) thermometro_item.setPos(290, 210) self.scene.addItem(thermometro_item) # Indicadores # Velocidad self.gaugeWidget = BKGauge() self.gaugeWidget.setGeometry(70,50,180,180) self.gaugeWidget.colorDial="#00FF00" self.gaugeWidget.maxValor=250 self.scene.addWidget(self.gaugeWidget) self.velocidadLabel = QLabel("250") self.velocidadLabel.setGeometry(115,90,130,60) self.velocidadLabel.setAlignment(QtCore.Qt.AlignRight |QtCore.Qt.AlignVCenter) self.velocidadLabel.setStyleSheet("font-family: Blutter;font-size: 60px;color: #00FFFF; background: transparent; font-weight: bold; text-align: right;") self.scene.addWidget(self.velocidadLabel) # RPM self.rpmGaugeWidget = BKGauge() self.rpmGaugeWidget.setGeometry(60, 40, 200, 200) self.rpmGaugeWidget.maxValor=25000 self.rpmGaugeWidget.anchoLinea = 20 self.rpmGaugeWidget.colorDial = "#FF0000" self.scene.addWidget(self.rpmGaugeWidget) self.rpmLabel = QLabel("2658") self.rpmLabel.setGeometry(160, 150, 85, 30) self.rpmLabel.setAlignment(QtCore.Qt.AlignRight |QtCore.Qt.AlignVCenter) self.rpmLabel.setStyleSheet("font-family: Blutter;font-size: 30px;color: #FF0009; background-color: transparent;") self.scene.addWidget(self.rpmLabel) # Temperatura Motor self.engTempLabel = QLabel("180") self.engTempLabel.setGeometry(240, 210, 50, 25) self.engTempLabel.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.engTempLabel.setStyleSheet("font-family: Blutter; font-size: 20px; color: #00FF00;background-color: transparent;") self.scene.addWidget(self.engTempLabel) self.setLayout(self.baseLayout) transformacion = QTransform() transformacion.scale(1.0,-1.0) self.view.setTransform(transformacion) self.show() def informacion_recibida(self, datos): # Velocidad if 'velocidad' in datos: self.velocidadLabel.setText(`datos['velocidad']`) self.gaugeWidget.setValor(datos['velocidad']) # RPM if 'rpm' in datos: self.rpmLabel.setText(`datos['rpm']`) self.rpmGaugeWidget.setValor(datos['rpm']) # Temperatura Motor if 'engTemp' in datos: self.engTempLabel.setText(`datos['engTemp']`) def mousePressEvent(self, QMouseEvent): if not self.hilo.corriendo: self.hilo.corriendo = True self.hilo.start()