Exemplo n.º 1
0
    def choose_player(self):
        if self.painter.board is not None:
            title = gui.Label("Choose player")
            table = gui.Table()
            players = list(sorted(self.painter.board.players))
            radios = gui.Group(value=self.player_input.value)
            for player in players:
                table.td(gui.Radio(radios, value=str(player)), style=td_style)
            table.tr()
            for player in players:
                table.td(
                    ImageWidget(image=self.items[self.amount][player],
                                style=td_style,
                                width=request("map_editor.view_width"),
                                height=request("map_editor.view_height")))
            button = gui.Button("  Apply  ")
            table.tr()
            table.td(button, style=td_style)
            dialog = gui.Dialog(title, table)

            def on_click():
                dialog.value = int(radios.value)
                dialog.send(gui.CHANGE)
                dialog.close()

            button.connect(gui.CLICK, on_click)
            dialog.connect(gui.CHANGE, lambda: self.new_player(dialog.value))
            dialog.open()
Exemplo n.º 2
0
    def show_cards(self, cards):
        """
        Create the card widgets.
        :param cards: the cards
        """
        # Hide the said tricks widgets.
        for w in self._said_tricks_widgets.values():
            w.clear_actions()
            w.add_action(actions.FadeOutAction(0.5))

        self._card_widgets = {}
        card_size = (130, 184)
        x_min = 290
        x_delta = 50
        y = 400
        cards.sort(cmp_colors_first)

        class HandleCardClicked(object):
            def __init__(self, view, card):
                self._view = view
                self._card = card

            def __call__(self, x, y):
                self._view._handle_say_card(self._card)

        for i, card in enumerate(cards):
            card_image_name = get_card_image_filename(card)
            im = self._rm.get_image(card_image_name)
            w = ImageWidget((x_min + i * x_delta, y), card_size, i, im)
            w.handle_clicked = HandleCardClicked(self, card)
            self._background_widget.add_widget(w)
            self._card_widgets[card] = w
Exemplo n.º 3
0
    def __init__(self, parent):
        super().__init__(parent)

        self.image_widget = ImageWidget(parent)
        self.hist_widget = HistogramWidget(parent)
        self.coord_label = QLabel("", self)
        self.pixel_rgb_label = QLabel('', self)
        self.pixel_hsv_label = QLabel('', self)
        self.pixel_lab_label = QLabel('', self)

        self.hsv_checkbox = QCheckBox("Shift HSV")
        self.hsv_checkbox.toggled.connect(self.slider_update)

        h_slider_box, self.h_slider = self._get_slider_box(
            "H:", -180, 180, 60, self.slider_update
        )

        s_slider_box, self.s_slider = self._get_slider_box(
            "S:", -100, 100, 10, self.slider_update
        )

        v_slider_box, self.v_slider = self._get_slider_box(
            "V:", -100, 100, 10, self.slider_update
        )

        self._set_default()

        self.image_widget.selection_update.connect(self.selection_upd)

        hbox = QHBoxLayout()
        hbox.addWidget(self.image_widget, 20)

        vbox = QVBoxLayout()
        vbox.addWidget(self.hist_widget)
        vbox.addWidget(self.coord_label)
        vbox.addWidget(self.pixel_rgb_label)
        vbox.addWidget(self.pixel_hsv_label)
        vbox.addWidget(self.pixel_lab_label)

        vbox.addWidget(self.hsv_checkbox)
        vbox.addLayout(h_slider_box)
        vbox.addLayout(s_slider_box)
        vbox.addLayout(v_slider_box)

        self._filter_buttons(vbox)

        hbox.addLayout(vbox, 1)

        self.setLayout(hbox)
Exemplo n.º 4
0
    def _create_widgets(self):
        """
        Create the widgets and return the one that contains them all.
        :return: the background widget
        """
        # Create the background widget.
        bg = self._rm.get_image(BACKGROUND_IMAGE, self.screen.get_size())
        bg_widget = ImageWidget((0, 0), self.screen.get_size(), -1, bg)

        # Create the container for the input widgets.
        x = (self.screen.get_width() - INPUT_WIDTH - INPUT_PADDING[1] - INPUT_PADDING[3]) / 2
        y = self.screen.get_height() / 2
        w = INPUT_WIDTH + INPUT_PADDING[1] + INPUT_PADDING[3]
        h = self.screen.get_height() - y
        input_container = Widget((x, y), (w, h), 0)
        bg_widget.add_widget(input_container)

        # Create the input widgets.
        username_input = TextInput((0, 0), INPUT_WIDTH, 0, self._font, padding=INPUT_PADDING, color=INPUT_FORE_COLOR,
                                   fill=INPUT_FILL_COLOR, default_text="username",
                                   default_font=self._default_font)
        host_input = copy.copy(username_input)
        host_input.default_text = "host"
        host_input.position = (0, INPUT_OFFSET)
        port_input = copy.copy(username_input)
        port_input.default_text = "port"
        port_input.position = (0, 2*INPUT_OFFSET)
        input_container.add_widget(username_input)
        input_container.add_widget(host_input)
        input_container.add_widget(port_input)
        self._text_inputs = {"username": username_input, "host": host_input, "port": port_input}

        # Create the button widget.
        btn = special_widgets.simple_button((0, 3*INPUT_OFFSET), (w, 100), "Login", self._font)

        def btn_clicked(x, y):
            self._ev_manager.post(events.LoginRequestedEvent())
        btn.handle_clicked = btn_clicked
        input_container.add_widget(btn)

        # Create the connection failed warning.
        self._connection_failed_warning = special_widgets.warning_widget(None, (400, 100), "Connection failed",
                                                                         self._font, screen_size=self.screen.get_size())
        bg_widget.add_widget(self._connection_failed_warning)
        self._username_taken_warning = special_widgets.warning_widget(None, (400, 100), "Username already taken",
                                                                      self._font, screen_size=self.screen.get_size())
        bg_widget.add_widget(self._username_taken_warning)

        return bg_widget
Exemplo n.º 5
0
 def _player_played_card(self, player, card):
     """
     Show that the player played the card.
     :param player: the player
     :param card: the card
     """
     card_size = (130, 184)
     im_filename = get_card_image_filename(card)
     im = self._rm.get_image(im_filename)
     pos = self._player_positions[player]
     im_w = ImageWidget(
         (pos[0] - card_size[0] / 2, pos[1] - card_size[1] / 2), card_size,
         20 + len(self._played_card_widgets), im)
     self._background_widget.add_widget(im_w)
     x = self.screen.get_width() / 2 - 200 + len(
         self._played_card_widgets) * 60
     y = 150 + len(self._played_card_widgets) * 10
     im_w.add_action(actions.MoveToAction((x, y), 1))
     self._played_card_widgets.append(im_w)
Exemplo n.º 6
0
    def __init__(self, model):
        """Inits the class."""
        Subject.__init__(self)
        QMainWindow.__init__(self)

        # Set model
        self.model = model

        # Create interface elements
        self.menu_bar = MenuBar(self)
        self.tool_bar = ToolBar(self)
        self.exif_area = ExifWidget(self)
        self.image_area = ImageWidget(self)
        self.status_bar = StatusBar()
        about_text = 'IEViewer 1.0' \
                     '<br><br>' \
                     'Copyright © 2021 by' \
                     '<br>' \
                     'Paula Mihalcea' \
                     '<br>' \
                     '<a href="mailto:[email protected]">[email protected]</a>' \
                     '<br><br>' \
                     'This program uses PyQt5, a comprehensive set of Python bindings for Qt v5. Qt is a set of cross-platform C++ libraries that implement high-level APIs for accessing many aspects of modern desktop and mobile systems.\n' \
                     '<br><br>' \
                     'PyQt5 is copyright © Riverbank Computing Limited. Its homepage is <a href="https://www.riverbankcomputing.com/software/pyqt/">https://www.riverbankcomputing.com/software/pyqt/</a>.' \
                     '<br><br>' \
                     'No genasi were harmed in the making of this application. <a href="https://www.dndbeyond.com/races/genasi#WaterGenasi">#GenasiLivesMatter#NereisThalian</a>'
        self.about = AboutWidget('About IEViewer',
                                 about_text,
                                 image_path='icons/about_img.png')

        # Disable GUI elements that are unavailable when no image is opened
        self.menu_bar.disable_widgets()
        self.exif_area.hide()

        # Set layout
        self.setCentralWidget(Layout(self).central_widget)

        # Set window properties
        self.set_window_properties()

        # Install additional event filters
        self.image_area.installEventFilter(self)
Exemplo n.º 7
0
    def _create_widgets(self):
        """
        Create the widgets and return the background widget.
        :return: the background widget
        """
        # Create the background widget.
        bg = self._rm.get_image(BACKGROUND_IMAGE, self.screen.get_size())
        bg_widget = ImageWidget((0, 0), self.screen.get_size(), -1, bg)

        # Create the waiting text.
        wait_box = special_widgets.warning_widget(
            None, (400, 100),
            "Waiting for other players",
            self._font,
            screen_size=self.screen.get_size(),
            close_on_click=False)
        wait_box.visible = True
        bg_widget.add_widget(wait_box)
        self._warnings["wait_box"] = wait_box

        # Create the "invalid num tricks" warning.
        invalid_num_warning = special_widgets.warning_widget(
            None, (400, 100),
            "Invalid number of tricks",
            self._font,
            screen_size=self.screen.get_size())
        bg_widget.add_widget(invalid_num_warning)
        self._warnings["invalid_num_tricks"] = invalid_num_warning

        # Create the chat widget.
        chat_box = special_widgets.warning_widget(
            (10, self.screen.get_height() - 260), (260, 200),
            "chat",
            self._font,
            close_on_click=False)
        chat_box.visible = True
        bg_widget.add_widget(chat_box)

        # Create the "Your move" box.
        your_move_w = Text(
            (self.screen.get_width() - 140, self.screen.get_height() - 110),
            (120, 40),
            0,
            "Your move",
            self._font,
            fill=(0, 0, 0, 160))
        your_move_w.opacity = 0
        bg_widget.add_widget(your_move_w)
        self._user_move_widget = your_move_w

        # Create the trump widgets.
        trump_pos = (180, 180)
        trump_size = (125, 125)
        for color in ["W", "H", "D", "S", "C"]:
            im_filename = get_color_image_filename(color)
            im = self._rm.get_image(im_filename, trump_size)
            im_w = ImageWidget(trump_pos, trump_size, 0, im)
            im_w.opacity = 0
            bg_widget.add_widget(im_w)
            self._trump_widgets[color] = im_w

        # Create the "choose trump" widgets.
        class ChooseHandler(object):
            def __init__(self, view, trump):
                self._view = view
                self._trump = trump

            def __call__(self, x, y):
                self._view._handle_choose_trump(self._trump)

        choose_size = (90, 90)
        choose_trump_bg = pygame.Surface((400, 170), flags=pygame.SRCALPHA)
        choose_trump_bg.fill((0, 0, 0, 160))
        font_obj = self._font.render("Choose the trump:", True,
                                     (255, 255, 255, 255))
        choose_trump_bg.blit(
            font_obj,
            ((choose_trump_bg.get_width() - font_obj.get_width()) / 2, 20))
        choose_trump_container = ImageWidget(
            (self.screen.get_width() / 2 - 200, 200),
            choose_trump_bg.get_size(),
            99,
            choose_trump_bg,
            visible=False)
        for i, color in enumerate(["D", "S", "H", "C"]):
            im_filename = get_color_image_filename(color)
            im = self._rm.get_image(im_filename, choose_size)
            im_w = ImageWidget((i * (choose_size[0] + 10), 70), choose_size, 0,
                               im)
            choose_trump_container.add_widget(im_w)
            im_w.handle_clicked = ChooseHandler(self, color)
        bg_widget.add_widget(choose_trump_container)
        self._choose_trump_widget = choose_trump_container

        return bg_widget
Exemplo n.º 8
0
    def __init__(self, board=None, callback=None, **params):
        pygame.display.set_mode(
            (request("map_editor.width"), request("map_editor.height")))
        gui.Desktop.__init__(self, theme=self.theme, **params)
        self.callback = callback or (lambda *_, **__: None)
        self.connect(gui.QUIT, self.quit)
        self.board = board
        self.filename = None
        container = gui.Container(width=request("map_editor.width"),
                                  height=request("map_editor.height"))

        spacer = request("map_editor.space_size")

        self.new_dialog = NewMapDialog()
        self.new_dialog.connect(gui.CHANGE, self.action_new)
        self.open_dialog = FileDialog("Choose map",
                                      "Choose",
                                      path=folder('map'),
                                      preview=Preview(display_players=False),
                                      exts=['map', 'preset', 'state'])
        self.open_dialog.connect(gui.CHANGE, self.new_map)
        self.save_dialog = FileDialog("Enter filename to save with",
                                      "Choose",
                                      path=folder('map'),
                                      exts=['map'],
                                      save=True)
        self.save_dialog.connect(gui.CHANGE, self.action_saveas)

        # self.help_dialog = HelpDialog()
        # QUESTION: may be put it into json: {"<menu>": "<method name>", ...}
        self.menus = menus = gui.Menus([
            ('File/New', self.new_dialog.open, None),
            ('File/Open', self.open_dialog.open, None),
            ('File/Save', self.action_save, None),
            ('File/Save As', self.save_as, None),
            ('File/Exit', self.quit, None), ('Add/Extend', self.extend, None),
            ('Add/Add top row', self.add_top_row, None),
            ('Add/Add bottom row', self.add_bottom_row, None),
            ('Add/Add left column', self.add_left_column, None),
            ('Add/Add right column', self.add_right_column, None),
            ('Add/Add cells', self.add_cells, None),
            ('Remove/Reduce', self.reduce, None),
            ('Remove/Remove top row', self.remove_top_row, None),
            ('Remove/Remove bottom row', self.remove_bottom_row, None),
            ('Remove/Remove left column', self.remove_left_column, None),
            ('Remove/Remove right column', self.remove_right_column, None),
            ('Remove/Remove the same checkers', self.remove_same_checkers,
             None),
            ('Remove/Remove checkers with the same owner',
             self.remove_same_player_checkers, None),
            ('Remove/Remove checkers with the same level',
             self.remove_same_level_checkers, None),
            ('Remove/Remove all checkers', self.remove_checkers, None),
            ('Remove/Remove cells', self.remove_cells, None),
            ('Edit/Permute cells', self.permute_cells, None),
            ('Edit/Permute players', self.permute_players, None),
            ('Edit/Permute checkers', self.permute_checkers, None)
            # ('Help/Help', self.help_dialog.open)
        ])
        container.add(self.menus, 0, 0)
        self.menus.rect.w, self.menus.rect.h = menus.resize()
        self.filename_input = gui.Input("")
        container.add(self.filename_input, self.menus.rect.w + spacer, 0)

        # # new ::
        # self.mode = mode = gui.Group(name="brushes", value='player')
        # cell_tool = gui.Tool(self.mode, "Cell", 'cell')
        # empty_tool = gui.Tool(self.mode, "Empty", 'none')
        # player_tool = gui.Tool(self.mode, "Player", 'player')
        # # :: new
        self.mode = mode = gui.Toolbox([('Cell', 'cell'), ('Empty', 'none'),
                                        ('Player', 'player')],
                                       cols=1,
                                       value='player')  # NOTE: DEPERECATED
        self.mode.connect(gui.CHANGE, self.set_brush)
        self.player = request("map_editor.player")
        self.amount = request("map_editor.amount")
        container.add(mode, 0, self.menus.rect.bottom + spacer)
        # # new ::
        # container.add(cell_tool, 0, self.menus.rect.bottom + spacer)
        # container.add(empty_tool, 0, cell_tool.rect.bottom + spacer)
        # container.add(cell_tool, 0, empty_tool.rect.bottom + spacer)
        # # :: new
        mode.rect.x, mode.rect.y = mode.style.x, mode.style.y
        mode.rect.w, mode.rect.h = mode.resize()

        self.player_table = gui.Table()
        self.player_table.td(gui.Label("Holes"))
        self.player_table.tr()
        self.selector = gui.Select(value=request("map_editor.amount"))
        for i in sorted(self.items.keys()):
            self.selector.add(str(i), i)
        self.selector.connect(gui.CHANGE, self.new_amount)
        self.player_table.td(self.selector, style=td_style)
        self.player_table.tr()
        self.player_table.tr()
        self.player_button = gui.Button('Player')
        self.player_table.td(self.player_button, style=td_style)
        self.player_button.connect(gui.CLICK, self.choose_player)
        self.player_table.tr()
        self.player_input = gui.Input(str(self.player), size=5)
        add_event_handler(self.player_input, enter_pressed,
                          lambda e: self.new_player())
        self.player_table.td(self.player_input, style=td_style)
        self.player_table.tr()
        self.checker = ImageWidget(image=self.items[self.amount][self.player],
                                   width=request("map_editor.view_width"),
                                   height=request("map_editor.view_height"))
        self.player_table.td(self.checker, style=td_style)
        self.player_table.tr()
        # self.color = gui.Color("#000000", width=mode.rect.w, height=mode.rect.w)
        # self.color.connect(gui.CLICK, self.choose_player)
        # self.player_table.td(self.color, style=td_style)
        container.add(self.player_table, 0, mode.rect.bottom + spacer)

        self.painter = Painter(
            width=container.rect.w - mode.rect.w - spacer * 2,
            height=container.rect.h - self.menus.rect.h - spacer * 2,
            style={'border': 1})
        container.add(self.painter, mode.rect.w + spacer,
                      self.menus.rect.h + spacer)
        if board:
            self.painter.set_map(board)
        self.painter.rect.w, self.painter.rect.h = self.painter.resize()

        self.widget = container