class ScenarioManager(QtCore.QObject): def __init__(self, game): super(ScenarioManager, self).__init__() self.game = game self.import_scenarios() self.scenario_dialog = QDialog(self.game.main_window) uic.loadUi('./manitae/core/ui/ScenarioDialog.ui', self.scenario_dialog) def import_scenarios(self): self.available_scenarios = [] self.name_to_class = {} for x in pkgutil.walk_packages(['manitae/scenarios']): if not(x[1].startswith('ui_')): __import__("manitae.scenarios." + x[1]) name = eval("manitae.scenarios." + x[1] + '.' + x[1] + ".NAME") self.available_scenarios.append(name) self.name_to_class[name] = x[1] self.scenario_config_widgets = {} for n, c in self.name_to_class.items(): w = eval("manitae.scenarios.{0}.{0}.get_config_widget()".format(c)) self.scenario_config_widgets[n] = w self.scenario_list_model = QtGui.QStringListModel() self.scenario_list_model.setStringList(self.available_scenarios) def get_scenario(self): self.scenario_dialog.comboBox.setModel(self.scenario_list_model) self.scenario_dialog.comboBox.activated[str].connect(self.update_scenario_dialog_widget) self.active_widget = None self.update_scenario_dialog_widget(self.scenario_dialog.comboBox.currentText(), True) result = self.scenario_dialog.exec_() if result == QDialog.Accepted: name = self.scenario_dialog.comboBox.currentText() if not(name): raise NoScenarioSelectedError() widget = self.active_widget c = self.name_to_class[str(name)] self.scenario = eval("manitae.scenarios.{0}.{0}(self.game, widget)".format(c)) return self.scenario else: raise NoScenarioSelectedError() def update_scenario_dialog_widget(self, scenario_str, first = False): new_active_widget = self.scenario_config_widgets[str(scenario_str)] if self.active_widget != new_active_widget: if not(first): self.scenario_dialog.widget.layout().removeWidget(self.active_widget) self.scenario_dialog.widget.layout().addWidget(new_active_widget) self.active_widget = new_active_widget self.scenario_dialog.update()