コード例 #1
0
ファイル: gui.py プロジェクト: rajcze/warmachine_tourney
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)

        self.ui = ui_mw.Ui_MainWindow()
        self.ui.setupUi(self)
        
        self.changes_to_save = False
        
        self.tournament = Tournament()
        self.ui.t_players.setRowCount(0)
        self.ui.t_pairings.setRowCount(0)
        
        #Set edit box sizes
        metrics = QtGui.QFontMetrics(self.ui.e_pAuid.font())
        self.ui.e_pAuid.setFixedSize(metrics.width("8888"), self.ui.e_pAuid.height())
        self.ui.e_pBuid.setFixedSize(metrics.width("8888"), self.ui.e_pBuid.height())
        metrics = QtGui.QFontMetrics(self.ui.e_pAtp.font())
        self.ui.e_pAtp.setFixedSize(metrics.width("8888"), self.ui.e_pAtp.height())
        self.ui.e_pBtp.setFixedSize(metrics.width("8888"), self.ui.e_pBtp.height())
        self.ui.e_pAcp.setFixedSize(metrics.width("8888"), self.ui.e_pAcp.height())
        self.ui.e_pBcp.setFixedSize(metrics.width("8888"), self.ui.e_pBcp.height())
        self.ui.e_pAkp.setFixedSize(metrics.width("888888"), self.ui.e_pAkp.height())
        self.ui.e_pBkp.setFixedSize(metrics.width("888888"), self.ui.e_pBkp.height())
コード例 #2
0
ファイル: gui.py プロジェクト: rajcze/warmachine_tourney
class PMainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)

        self.ui = ui_mw.Ui_MainWindow()
        self.ui.setupUi(self)
        
        self.changes_to_save = False
        
        self.tournament = Tournament()
        self.ui.t_players.setRowCount(0)
        self.ui.t_pairings.setRowCount(0)
        
        #Set edit box sizes
        metrics = QtGui.QFontMetrics(self.ui.e_pAuid.font())
        self.ui.e_pAuid.setFixedSize(metrics.width("8888"), self.ui.e_pAuid.height())
        self.ui.e_pBuid.setFixedSize(metrics.width("8888"), self.ui.e_pBuid.height())
        metrics = QtGui.QFontMetrics(self.ui.e_pAtp.font())
        self.ui.e_pAtp.setFixedSize(metrics.width("8888"), self.ui.e_pAtp.height())
        self.ui.e_pBtp.setFixedSize(metrics.width("8888"), self.ui.e_pBtp.height())
        self.ui.e_pAcp.setFixedSize(metrics.width("8888"), self.ui.e_pAcp.height())
        self.ui.e_pBcp.setFixedSize(metrics.width("8888"), self.ui.e_pBcp.height())
        self.ui.e_pAkp.setFixedSize(metrics.width("888888"), self.ui.e_pAkp.height())
        self.ui.e_pBkp.setFixedSize(metrics.width("888888"), self.ui.e_pBkp.height())

    def closeEvent(self, event):
        if self.changes_to_save:
            if self.yes_no_dialog("Unsaved changes", "There are unsaved changes. Do you want to save the tournament state before exitting?"):
                self.on_actionSave_tournament_state_triggered(True)
        
        event.accept()

    def __guiclear(self):
        self.ui.t_players.clearContents()
        self.ui.t_players.setRowCount(0)
        self.ui.t_pairings.clearContents()
        self.ui.t_pairings.setRowCount(0)
        self.ui.c_pairRound.clear()
        self.ui.b_addPlayer.setEnabled(True)

    def yes_no_dialog(self, title, question):
        flags = QtGui.QMessageBox.StandardButton.Yes 
        flags |= QtGui.QMessageBox.StandardButton.No
        response = QtGui.QMessageBox.question(self, title,
                                              question,
                                              flags)
        if response == QtGui.QMessageBox.Yes:
            return True
        
        return False

    # ============ TAB PLAYERS ============
    
    def __t_players_fill_row(self, rown, player):
        self.ui.t_players.setItem(rown, 0, QtGui.QTableWidgetItem("%s" % player.uid))
        self.ui.t_players.setItem(rown, 1, QtGui.QTableWidgetItem("%s" % player.name))
        self.ui.t_players.setItem(rown, 2, QtGui.QTableWidgetItem("%s" % player.faction))
        self.ui.t_players.setItem(rown, 3, QtGui.QTableWidgetItem("%s" % player.team))
        self.ui.t_players.setItem(rown, 4, QtGui.QTableWidgetItem("%s" % player.country))
        self.ui.t_players.setItem(rown, 5, QtGui.QTableWidgetItem("%s" % player.tp))
        self.ui.t_players.setItem(rown, 6, QtGui.QTableWidgetItem("%s" % player.sos))
        self.ui.t_players.setItem(rown, 7, QtGui.QTableWidgetItem("%s" % player.cp))
        self.ui.t_players.setItem(rown, 8, QtGui.QTableWidgetItem("%s" % player.kp))
        for column in range(self.ui.t_players.columnCount() - 1):
            self.ui.t_players.resizeColumnToContents(column)
    
    def __t_players_sort_tournament_order(self):
        for column in [8,7,6,5]:
            self.ui.t_players.sortItems(column, QtCore.Qt.SortOrder.DescendingOrder)
    
    def t_players_add_player(self, player):
        rown = self.ui.t_players.rowCount()
        self.ui.t_players.insertRow(rown)
        self.__t_players_fill_row(rown, player)

    def update_t_players_from_tournament(self):
        self.ui.t_players.clearContents()
        self.ui.t_players.setRowCount(0)
        for uid, p in self.tournament.players.iteritems():
            self.t_players_add_player(p)        
        self.__t_players_sort_tournament_order()

    # ------------ Add Player ------------
    
    @QtCore.Slot()
    def on_b_addPlayer_clicked(self):
        name = self.ui.e_name.text()
        faction = self.ui.c_faction.currentText()
        team = self.ui.e_team.text()
        country = self.ui.e_country.text()
        
        uid = self.ui.t_players.rowCount()+1
        p = Player(name, faction, team, country, uid = uid)
        self.tournament.add_player(p)
        self.t_players_add_player(p)
        
        self.tournament.tables = len(self.tournament.players) / 2
        
        # Mark that there are changes to be saved
        self.changes_to_save = True
    
    # ------------ Edit Player ------------    
    
    def __editplayer_guiclear(self):
        self.ui.e_name_2.setText("")
        self.ui.e_team_2.setText("")
        self.ui.e_country_2.setText("")

    @QtCore.Slot(str)
    def on_e_pUid_textEdited(self, text):
        try:
            p = self.tournament.players[text]
        except KeyError:
            self.__editplayer_guiclear()
            return
            
        self.ui.e_name_2.setText(p.name)
        index = self.ui.c_faction_2.findText("%s" % p.factions[0])
        self.ui.c_faction_2.setCurrentIndex(index)
        self.ui.e_team_2.setText(p.team)
        self.ui.e_country_2.setText(p.country)

    @QtCore.Slot()
    def on_b_editPlayer_clicked(self):
        try:
            p = self.tournament.players[self.ui.e_pUid.text()]
        except KeyError:
            QtGui.QMessageBox.warning(self, "Failure", "Player with ID %s does not exist." % self.ui.e_pUid.text())
            return
        
        name = self.ui.e_name_2.text()
        faction = self.ui.c_faction_2.currentText()
        team = self.ui.e_team_2.text()
        country = self.ui.e_country_2.text()

        if not name:
            QtGui.QMessageBox.warning(self, "Failure", "Name must be filled.")
            return
        
        if not self.yes_no_dialog("Save changes", "Are you sure?"):
            return
        
        p.name = name
        p.factions[0] = faction
        p.team = team
        p.country = country
        
        rown = 0
        for rown in range(self.ui.t_players.rowCount()):
            if  self.ui.t_players.item(rown, 0).text() == p.uid:
                break
        self.__t_players_fill_row(rown, p)
        
        self.ui.e_pUid.setText("")
        self.__editplayer_guiclear()
        self._show_pairings(self.tournament.pairings[-1], self.tournament.byes[-1])
        
        # Mark that there are changes to be saved
        self.changes_to_save = True
        

    # ============ TAB PAIRINGS ============

    def _show_pairings(self, pairings, bye):
        tp = self.ui.t_pairings 
        tp.clearContents()
        tp.setRowCount(0)
        
        it = QtGui.QTableWidgetItem
        
        if bye is not None:
            rown = 0
            tp.insertRow(0)            
            tp.setItem(rown, 0, it("Bye"))
            tp.setItem(rown, 1, it(str(bye)))
            
        table_numbers = sorted(pairings.keys())
        for t in table_numbers:
            rown = tp.rowCount()
            tp.insertRow(rown)
            tp.setItem(rown, 0, it("%s" % t))
            tp.setItem(rown, 1, it(str(pairings[t][0])))
            tp.setItem(rown, 2, it(str(pairings[t][1])))
        
        for column in range(tp.columnCount() - 1):
            tp.resizeColumnToContents(column)

    @QtCore.Slot()
    def on_b_startNextRound_clicked(self):
        if len(self.tournament.active_players) < 3:
            QtGui.QMessageBox.information(self, "Information", "At least 3 active players are required to start a round.")
            return
        
        if self.tournament.current_round > -1:
            missing_results = []
            for table, pair in self.tournament.pairings[-1].items():
                if (len(pair[0]._tp) != self.tournament.current_round + 1) or (len(pair[1]._tp) != self.tournament.current_round + 1):
                    missing_results.append(table)
            
            if missing_results:
                QtGui.QMessageBox.information(self, "Information", "Results for tables %r are not filled." % missing_results)
                return
        
        
        pairs, bye = self.tournament.create_pairings()
        self._show_pairings(pairs, bye)
        
        r = self.tournament.current_round + 1
        self.ui.c_pairRound.addItem("%s" % r)
        index = self.ui.c_pairRound.findText("%s" % r)
        self.ui.c_pairRound.setCurrentIndex(index)

        self.ui.statusbar.showMessage("Current round: %s" % r)
        self.ui.b_addPlayer.setEnabled(False)
        
        # Mark that there are changes to be saved
        self.changes_to_save = True
    
    # ============ TAB RESULTS ============
    
    def __addResultGuiClear(self):
        self.ui.e_pAuid.setText("")
        self.ui.e_pBuid.setText("")
        self.ui.e_pAname.setText("")
        self.ui.e_pBname.setText("")
        self.ui.e_pAtp.setText("")
        self.ui.e_pBtp.setText("")
        self.ui.e_pAcp.setText("")
        self.ui.e_pBcp.setText("")
        self.ui.e_pAkp.setText("")
        self.ui.e_pBkp.setText("")
        self.ui.c_pAfaction.clear()
        self.ui.c_pBfaction.clear()
    
    @QtCore.Slot(str)
    def on_e_tblnum_textEdited(self, text):
        if text == "":
            self.__addResultGuiClear()
            return
        if self.tournament.current_round < 0:
            return
        
        try:
            pair = self.tournament.pairings[-1][int(text)]
        except KeyError:
            self.__addResultGuiClear()
            return
        
        self.ui.e_pAuid.setText(pair[0].uid)
        self.ui.e_pBuid.setText(pair[1].uid)
        self.ui.e_pAname.setText(pair[0].name)
        self.ui.e_pBname.setText(pair[1].name)
        
        self.ui.c_pAfaction.clear()
        self.ui.c_pBfaction.clear()
        for faction in pair[0].factions:
            self.ui.c_pAfaction.addItem(faction)
        for faction in pair[1].factions:
            self.ui.c_pBfaction.addItem(faction)

        # if the players already played, prefill also the tp/cp/kp/...
        if len(pair[0]._tp) == (self.tournament.current_round + 1):
            self.ui.e_pAtp.setText(str(pair[0]._tp[-1]))
            self.ui.e_pBtp.setText(str(pair[1]._tp[-1]))
            self.ui.e_pAcp.setText(str(pair[0]._cp[-1]))
            self.ui.e_pBcp.setText(str(pair[1]._cp[-1]))
            self.ui.e_pAkp.setText(str(pair[0]._kp[-1]))
            self.ui.e_pBkp.setText(str(pair[1]._kp[-1]))
            index = self.ui.c_pAfaction.findText(pair[1].factions_played[-1])
            self.ui.c_pAfaction.setCurrentIndex(index)
            index = self.ui.c_pBfaction.findText(pair[0].factions_played[-1])
            self.ui.c_pBfaction.setCurrentIndex(index)
    
    @QtCore.Slot()
    def on_b_saveResult_clicked(self):
        pAuid = self.ui.e_pAuid.text()
        pBuid = self.ui.e_pBuid.text()
        table = self.ui.e_tblnum.text()
        
        if not (table and pAuid and pBuid):
            print "Fill table number"
            return
            
        table = int(table)
        
        pA = self.tournament.players[pAuid]
        pB = self.tournament.players[pBuid]
        
        cround = self.tournament.current_round
        
        if (pA.tables_played[cround] != table) or (pB.tables_played[cround] != table):
            QtGui.QMessageBox.critical(self, "Critical error", "These players did not play on table %s in round %s" % (table, cround + 1))
            return
        
        pAtp = self.ui.e_pAtp.text()
        pAcp = self.ui.e_pAcp.text()
        pAkp = self.ui.e_pAkp.text()
        pBtp = self.ui.e_pBtp.text()
        pBcp = self.ui.e_pBcp.text()
        pBkp = self.ui.e_pBkp.text()
        
        if not (pAtp and pAcp and pAkp and pBtp and pBcp and pBkp):
            QtGui.QMessageBox.information(self, "Information", "You need to fill all the results")
            return
        
        #editing the results
        if len(pA._tp) == cround + 1:        
            if not self.yes_no_dialog("Edit Results", "You are changing once filled results. Are you sure?"):
                return
            pA._tp[-1] = int(pAtp)
            pA._cp[-1] = int(pAcp)
            pA._kp[-1] = int(pAkp)
            pA.factions_played[-1] = self.ui.c_pBfaction.currentText()
            pB._tp[-1] = int(pBtp)
            pB._cp[-1] = int(pBcp)
            pB._kp[-1] = int(pBkp)
            pB.factions_played[-1] = self.ui.c_pAfaction.currentText()
            
        else: #adding new results
            pA._tp.append(int(pAtp))
            pA._cp.append(int(pAcp))
            pA._kp.append(int(pAkp))
            pA.factions_played.append(self.ui.c_pBfaction.currentText())
            pB._tp.append(int(pBtp))
            pB._cp.append(int(pBcp))
            pB._kp.append(int(pBkp))
            pB.factions_played.append(self.ui.c_pAfaction.currentText())
        
        self.update_t_players_from_tournament()
        self.__addResultGuiClear()
        self.ui.e_tblnum.setText("")
        
        # Mark that there are changes to be saved
        self.changes_to_save = True

    # ============ FILE MENU ============

    @QtCore.Slot(bool)
    def on_actionLoad_Players_triggered(self, state):
        if  not self.yes_no_dialog("Load players?", "This will reset the tournament state. Continue?"):
            return
    
        import csv_worker

        self.tournament.clear()
        self.__guiclear()
        for p in csv_worker.read_players():
            uid = self.ui.t_players.rowCount()+1
            p = Player(uid = uid, **p)
            self.tournament.add_player(p)
            self.t_players_add_player(p)
        
        self.tournament.tables = len(self.tournament.players) / 2
        
        # Mark that there are changes to be saved
        self.changes_to_save = True


    @QtCore.Slot(bool)
    def on_actionSave_tournament_state_triggered(self, state):
        #FIXME: add save file dialog
        pickle.dump( self.tournament, open( "save.p", "wb" ) )
        self.changes_to_save = False

    @QtCore.Slot(bool)
    def on_actionLoad_tournament_state_triggered(self, state):
        #FIXME: add load file dialog
        self.tournament = pickle.load( open( "save.p", "rb" ) )
        
        # fill players table
        self.__guiclear()
        for p_uid in sorted(self.tournament.players.keys()):
            self.t_players_add_player(self.tournament.players[p_uid])
        
        # sort them according to Masters 2013
        self.__t_players_sort_tournament_order()
        
        # fill current pairing table
        for i in range(self.tournament.current_round +1):
            self.ui.c_pairRound.addItem("%s" % (i+1))
            index = self.ui.c_pairRound.findText("%s" % (i+1))
            self.ui.c_pairRound.setCurrentIndex(index)
        
        self._show_pairings(self.tournament.pairings[-1], self.tournament.byes[-1])
        
        # update status bar
        self.ui.statusbar.showMessage("Current round: %s" % (self.tournament.current_round + 1))
        
        if self.tournament.current_round > -1:
            self.ui.b_addPlayer.setEnabled(False)
        
        self.changes_to_save = False