예제 #1
0
    def _populate_menubars(self) -> None:
        """Fill in the menubars."""
        # ----------
        # Game menu
        # ----------
        # New game (F2)
        new_game_act = self._game_menu.addAction("New game", self._ctrlr.new_game)
        new_game_act.setShortcut("F2")

        # Replay game (F3)
        replay_act = self._game_menu.addAction("Replay", self._ctrlr.restart_game)
        replay_act.setShortcut("F3")

        # Create board
        def switch_create_mode(checked: bool):
            mode = UIMode.CREATE if checked else UIMode.GAME
            self._state.ui_mode = mode
            self._ctrlr.switch_mode(mode)

        self._create_menu_action = create_act = QAction(
            "Create board",
            self,
            checkable=True,
            checked=self._state.ui_mode is UIMode.CREATE,
        )
        self._game_menu.addAction(create_act)
        create_act.triggered.connect(switch_create_mode)

        # Save board
        self._game_menu.addAction("Save board", self._open_save_board_modal)

        # Load board
        self._game_menu.addAction("Load board", self._open_load_board_modal)

        self._game_menu.addSeparator()

        # Current info (F4)
        info_act = self._game_menu.addAction(
            "Current game info", self._open_current_info_modal
        )
        info_act.setShortcut("F4")

        # Solver
        # - Probabilities (F5)
        # - Auto flag (Ctrl+F)
        # - Auto click (Ctrl+Enter)

        # Highscores (F6)
        highscores_act = self._game_menu.addAction(
            "Highscores", self.open_highscores_window
        )
        highscores_act.setShortcut("F6")

        # Stats (F7)

        self._game_menu.addSeparator()

        # Difficulty radiobuttons
        # - Beginner (b)
        # - Intermediate (i)
        # - Expert (e)
        # - Master (m)
        # - Custom (c)
        diff_group = QActionGroup(self)
        diff_group.setExclusive(True)
        for diff in Difficulty:
            diff_act = QAction(diff.name.capitalize(), diff_group, checkable=True)
            self._diff_menu_actions[diff] = diff_act
            self._game_menu.addAction(diff_act)
            diff_act.id = diff
            if diff is self._state.difficulty:
                diff_act.setChecked(True)
            diff_act.triggered.connect(
                lambda _: self._change_difficulty(diff_group.checkedAction().id)
            )
            diff_act.setShortcut(diff.value)

        self._game_menu.addSeparator()

        # Play highscore
        # self._game_menu.addAction("Play highscore", self._open_play_highscore_modal)

        # Zoom
        self._game_menu.addAction("Button size", self._open_zoom_modal)

        # Styles
        # - Buttons
        # - Images
        # - Numbers
        def get_change_style_func(grp, style):
            def change_style():
                self._state.styles[grp] = style
                self._mf_widget.update_style(grp, style)

            return change_style

        styles_menu = QMenu("Styles", self)
        self._game_menu.addMenu(styles_menu)
        for img_group in [CellImageType.BUTTONS]:
            img_group_name = img_group.name.capitalize()
            submenu = QMenu(img_group_name, self)
            styles_menu.addMenu(submenu)
            group = QActionGroup(self)
            group.setExclusive(True)
            for folder in (utils.IMG_DIR / img_group_name).glob("*"):
                style = folder.name
                style_act = QAction(style, self, checkable=True)
                if style == self._state.styles[img_group]:
                    style_act.setChecked(True)
                group.addAction(style_act)
                style_act.triggered.connect(get_change_style_func(img_group, style))
                submenu.addAction(style_act)

        # Advanced options
        self._game_menu.addAction("Advanced options", self._open_advanced_opts_modal)

        self._game_menu.addSeparator()

        # Exit (F4)
        self._game_menu.addAction("Exit", self.close, shortcut="Alt+F4")

        # ----------
        # Options menu
        # ----------
        # First-click success
        def toggle_first_success():
            new_val = not self._state.pending_first_success
            self._state.first_success = new_val
            self._ctrlr.set_first_success(new_val)

        first_act = QAction(
            "Safe start", self, checkable=True, checked=self._state.first_success
        )
        self._opts_menu.addAction(first_act)
        first_act.triggered.connect(toggle_first_success)

        # Drag select
        drag_act = self._opts_menu.addAction(
            "Drag select",
            lambda: setattr(
                self._state, "drag_select", not self._state.pending_drag_select
            ),
        )
        drag_act.setCheckable(True)
        drag_act.setChecked(self._state.drag_select)

        # Max mines per cell option
        def get_change_per_cell_func(n):
            def change_per_cell():
                self._state.per_cell = n
                self._ctrlr.set_per_cell(n)

            return change_per_cell

        per_cell_menu = self._opts_menu.addMenu("Max per cell")
        per_cell_group = QActionGroup(self)
        per_cell_group.setExclusive(True)
        for i in range(1, 4):
            action = QAction(str(i), self, checkable=True)
            per_cell_menu.addAction(action)
            per_cell_group.addAction(action)
            if self._state.per_cell == i:
                action.setChecked(True)
            action.triggered.connect(get_change_per_cell_func(i))

        # ----------
        # Help menu
        # ----------
        rules_act = QAction("Rules", self)
        self._help_menu.addAction(rules_act)
        rules_act.triggered.connect(
            lambda: self._open_text_popup("Rules", FILES_DIR / "rules.txt")
        )

        tips_act = QAction("Tips", self)
        self._help_menu.addAction(tips_act)
        tips_act.triggered.connect(
            lambda: self._open_text_popup("Tips", FILES_DIR / "tips.txt")
        )

        retrieve_act = QAction("Retrieve highscores", self)
        retrieve_act.triggered.connect(self._open_retrieve_highscores_modal)
        self._help_menu.addAction(retrieve_act)

        self._help_menu.addSeparator()

        about_act = QAction("About", self)
        self._help_menu.addAction(about_act)
        about_act.triggered.connect(
            lambda: self._open_text_popup("About", FILES_DIR / "about.txt")
        )
        about_act.setShortcut("F1")