def __init__(self, options: Options, preset_manager: PresetManager, preview: bool): super().__init__() self.setupUi(self) self.setWindowTitle("Randovania {}".format(VERSION)) self.is_preview_mode = preview self.setAcceptDrops(True) common_qt_lib.set_default_window_icon(self) self.intro_label.setText(self.intro_label.text().format(version=VERSION)) self._preset_manager = preset_manager if preview: debug.set_level(2) # Signals self.newer_version_signal.connect(self.display_new_version) self.background_tasks_button_lock_signal.connect(self.enable_buttons_with_background_tasks) self.progress_update_signal.connect(self.update_progress) self.stop_background_process_button.clicked.connect(self.stop_background_process) self.options_changed_signal.connect(self.on_options_changed) self.intro_play_now_button.clicked.connect(lambda: self.welcome_tab_widget.setCurrentWidget(self.tab_play)) self.open_faq_button.clicked.connect(self._open_faq) self.open_database_viewer_button.clicked.connect(self._open_data_visualizer) self.import_permalink_button.clicked.connect(self._import_permalink) self.create_new_seed_button.clicked.connect( lambda: self.welcome_tab_widget.setCurrentWidget(self.tab_create_seed)) # Menu Bar self.menu_action_data_visualizer.triggered.connect(self._open_data_visualizer) self.menu_action_item_tracker.triggered.connect(self._open_item_tracker) self.menu_action_edit_new_database.triggered.connect(self._open_data_editor_default) self.menu_action_edit_existing_database.triggered.connect(self._open_data_editor_prompt) self.menu_action_validate_seed_after.triggered.connect(self._on_validate_seed_change) self.menu_action_timeout_generation_after_a_time_limit.triggered.connect(self._on_generate_time_limit_change) self.generate_seed_tab = GenerateSeedTab(self, self, self, options) self.generate_seed_tab.setup_ui() self._details_window = SeedDetailsWindow(self, self, options) self._details_window.added_to_tab = False # Needs the GenerateSeedTab self._create_open_map_tracker_actions() # Setting this event only now, so all options changed trigger only once options.on_options_changed = self.options_changed_signal.emit self._options = options with options: self.on_options_changed() self.main_tab_widget.setCurrentIndex(0) # Update hints text self._update_hints_text()
def __init__(self, options: Options, preview: bool): super().__init__() self.setupUi(self) self.setWindowTitle("Randovania {}".format(VERSION)) self.is_preview_mode = preview self.setAcceptDrops(True) set_default_window_icon(self) if preview: debug._DEBUG_LEVEL = 2 # Signals self.newer_version_signal.connect(self.display_new_version) self.background_tasks_button_lock_signal.connect( self.enable_buttons_with_background_tasks) self.progress_update_signal.connect(self.update_progress) self.stop_background_process_button.clicked.connect( self.stop_background_process) self.options_changed_signal.connect(self.on_options_changed) # Menu Bar self.menu_action_data_visualizer.triggered.connect( self._open_data_visualizer) self.menu_action_existing_seed_details.triggered.connect( self._open_existing_seed_details) self.menu_action_tracker.triggered.connect(self._open_tracker) self.menu_action_edit_new_database.triggered.connect( self._open_data_editor_default) self.menu_action_edit_existing_database.triggered.connect( self._open_data_editor_prompt) _translate = QtCore.QCoreApplication.translate self.tabs = [] self.tab_windows = [ (ISOManagementWindow, "ROM Settings"), (LogicSettingsWindow, "Logic Settings"), (ItemQuantitiesWindow, "Item Quantities"), ] for i, tab in enumerate(self.tab_windows): self.windows.append(tab[0](self, self, options)) self.tabs.append(self.windows[i].centralWidget) self.tabWidget.insertTab(i, self.tabs[i], _translate("MainWindow", tab[1])) # Setting this event only now, so all options changed trigger only once options.on_options_changed = self.options_changed_signal.emit self._options = options self.on_options_changed() self.tabWidget.setCurrentIndex(0) get_latest_version(self.newer_version_signal.emit)
def test_context_manager_with_no_changes_doesnt_save( mock_save_to_disk: MagicMock, option: Options): # Setup settings_changed = MagicMock() option.on_options_changed = settings_changed # Run with option: pass # Assert mock_save_to_disk.assert_not_called() settings_changed.assert_not_called()
def test_save_with_context_manager(mock_save_to_disk: MagicMock, option: Options): # Setup settings_changed = MagicMock() option._output_directory = Path("start") option.on_options_changed = settings_changed # Run with option: option.output_directory = Path("end") # Assert mock_save_to_disk.assert_called_once_with(option) settings_changed.assert_called_once_with()
def test_save_with_context_manager(mock_save_to_disk: MagicMock, option: Options): # Setup settings_changed = MagicMock() option._dark_mode = False option.on_options_changed = settings_changed # Run with option: option.dark_mode = True # Assert mock_save_to_disk.assert_called_once_with(option) settings_changed.assert_called_once_with()
def test_edit_during_options_changed(tmpdir): # Setup option = Options(Path(tmpdir)) option._output_directory = Path("start") def on_changed(): with option: option.output_directory = Path("final") option.on_options_changed = on_changed # Run with option: option.output_directory = Path("middle") second_option = Options(Path(tmpdir)) second_option.load_from_disk() # Assert assert option.output_directory == Path("final") assert option.output_directory == second_option.output_directory
def test_edit_during_options_changed(tmpdir): # Setup option = Options(Path(tmpdir)) option._selected_tracker = "start" def on_changed(): with option: option.selected_tracker = "final" option.on_options_changed = on_changed # Run with option: option.selected_tracker = "middle" second_option = Options(Path(tmpdir)) second_option.load_from_disk() # Assert assert option.selected_tracker == "final" assert option.selected_tracker == second_option.selected_tracker
def test_click_on_preset_tree(tab, preset_manager, game: RandovaniaGame, skip_qtbot, tmp_path, allow_experimental): preset = preset_manager.default_preset_for_game(game) options = Options(tmp_path, None) with options: options.experimental_games = allow_experimental options.on_options_changed = lambda: tab.on_options_changed(options) tab._options = options tab._window_manager.preset_manager = preset_manager tab.setup_ui() tab.on_options_changed(options) # Run item = tab.window.create_preset_tree.preset_to_item.get(preset.uuid) # assert item.parent().text(0) == "1" if not game.data.development_state.can_view(allow_experimental): assert item is None else: tab.window.create_preset_tree.selectionModel().reset() item.setSelected(True) # Assert assert tab._current_preset_data.get_preset() == preset.get_preset()
def __init__(self, options: Options, preset_manager: PresetManager, network_client: QtNetworkClient, preview: bool): super().__init__() self.setupUi(self) self.setWindowTitle("Randovania {}".format(VERSION)) self._is_preview_mode = preview self.setAcceptDrops(True) common_qt_lib.set_default_window_icon(self) # Remove all hardcoded link color about_document: QtGui.QTextDocument = self.about_text_browser.document( ) about_document.setHtml(about_document.toHtml().replace( "color:#0000ff;", "")) self.browse_racetime_label.setText( self.browse_racetime_label.text().replace("color:#0000ff;", "")) self.intro_label.setText( self.intro_label.text().format(version=VERSION)) self._preset_manager = preset_manager self.network_client = network_client if preview: debug.set_level(2) # Signals self.newer_version_signal.connect(self.display_new_version) self.options_changed_signal.connect(self.on_options_changed) self.GameDetailsSignal.connect(self._open_game_details) self.intro_play_now_button.clicked.connect( lambda: self.welcome_tab_widget.setCurrentWidget(self.tab_play)) self.open_faq_button.clicked.connect(self._open_faq) self.open_database_viewer_button.clicked.connect( partial(self._open_data_visualizer_for_game, RandovaniaGame.PRIME2)) self.import_permalink_button.clicked.connect(self._import_permalink) self.import_game_file_button.clicked.connect(self._import_spoiler_log) self.browse_racetime_button.clicked.connect(self._browse_racetime) self.browse_sessions_button.clicked.connect( self._browse_for_game_session) self.host_new_game_button.clicked.connect(self._host_game_session) self.create_new_seed_button.clicked.connect( lambda: self.welcome_tab_widget.setCurrentWidget(self. tab_create_seed)) # Menu Bar for action, game in ((self.menu_action_visualize_prime_1, RandovaniaGame.PRIME1), (self.menu_action_visualize_prime_2, RandovaniaGame.PRIME2), (self.menu_action_visualize_prime_3, RandovaniaGame.PRIME3)): action.triggered.connect( partial(self._open_data_visualizer_for_game, game)) for action, game in ((self.menu_action_edit_prime_1, RandovaniaGame.PRIME1), (self.menu_action_edit_prime_2, RandovaniaGame.PRIME2), (self.menu_action_edit_prime_3, RandovaniaGame.PRIME3)): action.triggered.connect( partial(self._open_data_editor_for_game, game)) self.menu_action_item_tracker.triggered.connect( self._open_item_tracker) self.menu_action_map_tracker.triggered.connect( self._on_menu_action_map_tracker) self.menu_action_edit_existing_database.triggered.connect( self._open_data_editor_prompt) self.menu_action_validate_seed_after.triggered.connect( self._on_validate_seed_change) self.menu_action_timeout_generation_after_a_time_limit.triggered.connect( self._on_generate_time_limit_change) self.menu_action_dark_mode.triggered.connect( self._on_menu_action_dark_mode) self.menu_action_open_auto_tracker.triggered.connect( self._open_auto_tracker) self.menu_action_previously_generated_games.triggered.connect( self._on_menu_action_previously_generated_games) self.menu_action_layout_editor.triggered.connect( self._on_menu_action_layout_editor) self.action_login_window.triggered.connect(self._action_login_window) self.generate_seed_tab = GenerateSeedTab(self, self, options) self.generate_seed_tab.setup_ui() # Needs the GenerateSeedTab self._setup_difficulties_menu() # Setting this event only now, so all options changed trigger only once options.on_options_changed = self.options_changed_signal.emit self._options = options with options: self.on_options_changed() self.main_tab_widget.setCurrentIndex(0) # Update hints text self._update_hints_text()
def __init__(self, options: Options, preview: bool): super().__init__() self.setupUi(self) self.setWindowTitle("Randovania {}".format(VERSION)) self.is_preview_mode = preview self.setAcceptDrops(True) set_default_window_icon(self) self.intro_label.setText( self.intro_label.text().format(version=VERSION)) if preview: debug.set_level(2) # Signals self.newer_version_signal.connect(self.display_new_version) self.background_tasks_button_lock_signal.connect( self.enable_buttons_with_background_tasks) self.progress_update_signal.connect(self.update_progress) self.stop_background_process_button.clicked.connect( self.stop_background_process) self.options_changed_signal.connect(self.on_options_changed) # Menu Bar self.menu_action_data_visualizer.triggered.connect( self._open_data_visualizer) self.menu_action_existing_seed_details.triggered.connect( self._open_existing_seed_details) self.menu_action_tracker.triggered.connect(self._open_tracker) self.menu_action_edit_new_database.triggered.connect( self._open_data_editor_default) self.menu_action_edit_existing_database.triggered.connect( self._open_data_editor_prompt) self.menu_action_export_iso.triggered.connect(self._export_iso) self.menu_action_validate_seed_after.triggered.connect( self._on_validate_seed_change) self.menu_action_timeout_generation_after_a_time_limit.triggered.connect( self._on_generate_time_limit_change) self.menu_action_export_iso.setEnabled(False) _translate = QtCore.QCoreApplication.translate self.tabs = [] from randovania.gui.game_patches_window import GamePatchesWindow from randovania.gui.iso_management_window import ISOManagementWindow from randovania.gui.logic_settings_window import LogicSettingsWindow from randovania.gui.cosmetic_window import CosmeticWindow from randovania.gui.main_rules import MainRulesWindow self.tab_windows = [ (ISOManagementWindow, "ROM Settings"), (GamePatchesWindow, "Game Patches"), (MainRulesWindow, "Main Rules"), (LogicSettingsWindow, "Logic Settings"), (CosmeticWindow, "Cosmetic"), ] for i, tab in enumerate(self.tab_windows): self.windows.append(tab[0](self, self, options)) self.tabs.append(self.windows[i].centralWidget) self.tabWidget.insertTab(i + 1, self.tabs[i], _translate("MainWindow", tab[1])) # Setting this event only now, so all options changed trigger only once options.on_options_changed = self.options_changed_signal.emit self._options = options with options: self.on_options_changed() self.tabWidget.setCurrentIndex(0) # Update hints text self._update_hints_text()
def __init__(self, options: Options, preset_manager: PresetManager, network_client, preview: bool): super().__init__() self.setupUi(self) self.setWindowTitle("Randovania {}".format(VERSION)) self._is_preview_mode = preview self.setAcceptDrops(True) common_qt_lib.set_default_window_icon(self) self.setup_about_text() self.setup_welcome_text() self.browse_racetime_label.setText( self.browse_racetime_label.text().replace("color:#0000ff;", "")) self._preset_manager = preset_manager self.network_client = network_client if preview: debug.set_level(2) if randovania.is_frozen(): self.menu_bar.removeAction(self.menu_edit.menuAction()) # Signals self.options_changed_signal.connect(self.on_options_changed) self.GameDetailsSignal.connect(self._open_game_details) self.InitPostShowSignal.connect(self.initialize_post_show) self.intro_play_now_button.clicked.connect( lambda: self.main_tab_widget.setCurrentWidget(self.tab_play)) self.open_faq_button.clicked.connect(self._open_faq) self.open_database_viewer_button.clicked.connect( partial(self._open_data_visualizer_for_game, RandovaniaGame.METROID_PRIME_ECHOES)) self.import_permalink_button.clicked.connect(self._import_permalink) self.import_game_file_button.clicked.connect(self._import_spoiler_log) self.browse_racetime_button.clicked.connect(self._browse_racetime) self.create_new_seed_button.clicked.connect( lambda: self.main_tab_widget.setCurrentWidget(self.tab_create_seed )) # Menu Bar self.game_menus = [] self.menu_action_edits = [] for game in RandovaniaGame.sorted_all_games(): # Sub-Menu in Open Menu game_menu = QtWidgets.QMenu(self.menu_open) game_menu.setTitle(_t(game.long_name)) game_menu.game = game if game.data.development_state.can_view(False): self.menu_open.addAction(game_menu.menuAction()) self.game_menus.append(game_menu) game_trick_details_menu = QtWidgets.QMenu(game_menu) game_trick_details_menu.setTitle(_t("Trick Details")) self._setup_trick_difficulties_menu_on_show( game_trick_details_menu, game) game_data_visualizer_action = QtGui.QAction(game_menu) game_data_visualizer_action.setText(_t("Data Visualizer")) game_data_visualizer_action.triggered.connect( partial(self._open_data_visualizer_for_game, game)) game_menu.addAction(game_trick_details_menu.menuAction()) game_menu.addAction(game_data_visualizer_action) # Data Editor action = QtGui.QAction(self) action.setText(_t(game.long_name)) self.menu_internal.addAction(action) action.triggered.connect( partial(self._open_data_editor_for_game, game)) self.menu_action_edits.append(action) self.menu_action_edit_existing_database.triggered.connect( self._open_data_editor_prompt) self.menu_action_validate_seed_after.triggered.connect( self._on_validate_seed_change) self.menu_action_timeout_generation_after_a_time_limit.triggered.connect( self._on_generate_time_limit_change) self.menu_action_dark_mode.triggered.connect( self._on_menu_action_dark_mode) self.menu_action_experimental_games.triggered.connect( self._on_menu_action_experimental_games) self.menu_action_open_auto_tracker.triggered.connect( self._open_auto_tracker) self.menu_action_previously_generated_games.triggered.connect( self._on_menu_action_previously_generated_games) self.menu_action_log_files_directory.triggered.connect( self._on_menu_action_log_files_directory) self.menu_action_layout_editor.triggered.connect( self._on_menu_action_layout_editor) # Setting this event only now, so all options changed trigger only once options.on_options_changed = self.options_changed_signal.emit self._options = options self.main_tab_widget.setCurrentIndex(0)