class HeroPoolView(QtGui.QWidget): heroes_per_row=16 def __init__(self, parent=None): super(HeroPoolView, self).__init__(parent) def load_data_locally(self): try: self.heroes = DataManager().load_hero_data() except IOError: info = QtGui.QMessageBox('Datafile not found', 'I couldn\'t load the data file from within the current directory, do you want me to download it from the website?', QtGui.QMessageBox.Information, QtGui.QMessageBox.Ok, QtGui.QMessageBox.Cancel, QtGui.QMessageBox.NoButton, self) if info.exec_() == QtGui.QMessageBox.Ok: self.download_data() else: self.buttons = [] layout = QtGui.QGridLayout() layout.addWidget(self.create_searchfield(), 0, 13, 1, 3) for i, hero in enumerate(self.heroes): pb = HeroButton(hero, self) pb.left_click.connect(self.parentWidget().parentWidget().hero_selected) pb.right_click.connect(self.parentWidget().parentWidget().show_hero_info) layout.addWidget(pb, 1+i/HeroPoolView.heroes_per_row, i%HeroPoolView.heroes_per_row) self.buttons.append(pb) self.setLayout(layout) def create_searchfield(self): self.search = QtGui.QLineEdit(self) self.search.textChanged.connect(self.highlight_heroes) return self.search def highlight_heroes(self, text): for hero_button in self.buttons: if text in hero_button.hero.name and hero_button.hero.available: hero_button.setEnabled(True) else: hero_button.setEnabled(False) def download_data(self): self.parentWidget().parentWidget().switch_to_progressview() self.download_manager = DownloadManager() self.thread = QtCore.QThread() self.download_manager.moveToThread(self.thread) self.thread.started.connect(self.download_manager.start) self.download_manager.hero_loaded.connect(self.parentWidget().parentWidget().progress.update) self.download_manager.job_done.connect(self.thread.quit) self.download_manager.job_done.connect(self.data_loaded) self.thread.start() def data_loaded(self): heroes = self.download_manager.heroes DataManager().save_hero_data(heroes) self.load_data_locally() def get_hero_by_name(self, hero_name): return next((hero for hero in self.heroes if hero.name == hero_name), None) def hero_selected(self, hero): hero_button = next(hb for hb in self.buttons if hb.hero.name == hero.name) hero_button.setEnabled(False) hero_button.hero.available = False self.search.setText('') def hero_back_to_pool(self, hero): hero_button = next(hb for hb in self.buttons if hb.hero.name == hero.name) hero_button.setEnabled(True) hero_button.hero.available = True self.search.setText('') def get_available_heroes(self): return [hb.hero for hb in self.buttons if hb.hero.available] def disconnect_all(self): for hero_button in self.buttons: hero_button.left_click.disconnect(self.parentWidget().parentWidget().hero_selected)
class HeroPoolView(QtGui.QWidget): heroes_per_row = 16 def __init__(self, parent=None): super(HeroPoolView, self).__init__(parent) def load_data_locally(self): try: self.heroes = DataManager().load_hero_data() except IOError: info = QtGui.QMessageBox( 'Datafile not found', 'I couldn\'t load the data file from within the current directory, do you want me to download it from the website?', QtGui.QMessageBox.Information, QtGui.QMessageBox.Ok, QtGui.QMessageBox.Cancel, QtGui.QMessageBox.NoButton, self) if info.exec_() == QtGui.QMessageBox.Ok: self.download_data() else: self.buttons = [] layout = QtGui.QGridLayout() layout.addWidget(self.create_searchfield(), 0, 13, 1, 3) for i, hero in enumerate(self.heroes): pb = HeroButton(hero, self) pb.left_click.connect( self.parentWidget().parentWidget().hero_selected) pb.right_click.connect( self.parentWidget().parentWidget().show_hero_info) layout.addWidget(pb, 1 + i / HeroPoolView.heroes_per_row, i % HeroPoolView.heroes_per_row) self.buttons.append(pb) self.setLayout(layout) def create_searchfield(self): self.search = QtGui.QLineEdit(self) self.search.textChanged.connect(self.highlight_heroes) return self.search def highlight_heroes(self, text): for hero_button in self.buttons: if text in hero_button.hero.name and hero_button.hero.available: hero_button.setEnabled(True) else: hero_button.setEnabled(False) def download_data(self): self.parentWidget().parentWidget().switch_to_progressview() self.download_manager = DownloadManager() self.thread = QtCore.QThread() self.download_manager.moveToThread(self.thread) self.thread.started.connect(self.download_manager.start) self.download_manager.hero_loaded.connect( self.parentWidget().parentWidget().progress.update) self.download_manager.job_done.connect(self.thread.quit) self.download_manager.job_done.connect(self.data_loaded) self.thread.start() def data_loaded(self): heroes = self.download_manager.heroes DataManager().save_hero_data(heroes) self.load_data_locally() def get_hero_by_name(self, hero_name): return next((hero for hero in self.heroes if hero.name == hero_name), None) def hero_selected(self, hero): hero_button = next(hb for hb in self.buttons if hb.hero.name == hero.name) hero_button.setEnabled(False) hero_button.hero.available = False self.search.setText('') def hero_back_to_pool(self, hero): hero_button = next(hb for hb in self.buttons if hb.hero.name == hero.name) hero_button.setEnabled(True) hero_button.hero.available = True self.search.setText('') def get_available_heroes(self): return [hb.hero for hb in self.buttons if hb.hero.available] def disconnect_all(self): for hero_button in self.buttons: hero_button.left_click.disconnect( self.parentWidget().parentWidget().hero_selected)