def enter(self): self.cards = [CardInfo(c, self.client.res) for c in cardprovider.get_all_card_classes() if c not in commonpiles] self.cards.sort(key=lambda c: c.name) self.selected = [] self.cards_draw_offset = 0 self.selected_draw_offset = 0 app = self.client.app x = 15 gui.Label((x, 50), (180, 0), app, text="Decks") self.decklist = gui.ListBox((x, 75), (180, 400), app) self.decklist.onItemSelected = self.__handle_decklist_select gui.Label((x, 500), (0, 0), app, text="Deck Name:") self.txtName = gui.TextBox((x, 525), (180, 0), app) btnSave = gui.Button((x, 560), (180, 0), app, text="Save") btnSave.onClick = self.__handle_save_click btnBack = gui.Button((x, 585), (180, 0), app, text="Back") btnBack.onClick = self.__handle_back_click self.ss_selected = ScrollableSurface((SCREEN_WIDTH - 30, PREV_HEIGHT + 10), (15, 615)) surface_width = 6 * (5 + PREV_WIDTH) + 5 surface_height = 4 * (5 + PREV_HEIGHT) + 5 self.ss_cards = ScrollableSurface((surface_width, surface_height), (260, 50), scroll_speed=10) self.__update_deck_list()
class EditorScene(Scene): def enter(self): self.cards = [CardInfo(c, self.client.res) for c in cardprovider.get_all_card_classes() if c not in commonpiles] self.cards.sort(key=lambda c: c.name) self.selected = [] self.cards_draw_offset = 0 self.selected_draw_offset = 0 app = self.client.app x = 15 gui.Label((x, 50), (180, 0), app, text="Decks") self.decklist = gui.ListBox((x, 75), (180, 400), app) self.decklist.onItemSelected = self.__handle_decklist_select gui.Label((x, 500), (0, 0), app, text="Deck Name:") self.txtName = gui.TextBox((x, 525), (180, 0), app) btnSave = gui.Button((x, 560), (180, 0), app, text="Save") btnSave.onClick = self.__handle_save_click btnBack = gui.Button((x, 585), (180, 0), app, text="Back") btnBack.onClick = self.__handle_back_click self.ss_selected = ScrollableSurface((SCREEN_WIDTH - 30, PREV_HEIGHT + 10), (15, 615)) surface_width = 6 * (5 + PREV_WIDTH) + 5 surface_height = 4 * (5 + PREV_HEIGHT) + 5 self.ss_cards = ScrollableSurface((surface_width, surface_height), (260, 50), scroll_speed=10) self.__update_deck_list() def __update_deck_list(self): del (self.decklist.items)[0:len(self.decklist.items)] for d in [d[:-5] for d in deckprovider.get_all_deck_names()]: self.decklist.items.append(d) self.decklist.selectedIndex = -1 self.decklist.refresh() def __handle_decklist_select(self, *args): if 0 <= self.decklist.selectedIndex < len(self.decklist.items): self.__reset() deck_name = (self.decklist.items)[self.decklist.selectedIndex] self.txtName.text = deck_name.decode('UTF-8') deck = deckprovider.load_deck(deck_name) for c in [c for c in self.cards if c.name in deck]: self.selected.append(c) self.cards.remove(c) self.cards.sort(key=lambda c: c.name) self.selected.sort(key=lambda c: c.name) def __handle_save_click(self, *args): #TODO feedback to UI if len(self.selected) < 10: logging.debug("need 10 cards for a deck") return if not self.txtName.text: logging.debug("need a name for the deck") return if self.txtName.text.lower() == 'random': logging.debug("can't name deck 'random'") return deckprovider.save_deck(self.txtName.text, [c.name for c in self.selected]) self.__update_deck_list() self.__reset() logging.debug("deck saved") def notify(self, event): pass def draw(self, surface): num_cards = len(self.cards) num_in_row = (num_cards + 3) / 4 cards_surface = pygame.Surface(((PREV_WIDTH + 5) * num_in_row + 5, (PREV_HEIGHT + 5) * 4 + 5)) x = 5 y = 5 i = 0 for c in self.cards: i += 1 cards_surface.blit(c.image, (x, y)) c.loc = (x, y) x += 5 + PREV_WIDTH if i == num_in_row: x = 5 y += 5 + PREV_HEIGHT i = 0 self.ss_cards.draw(surface, cards_surface) selected_surface = pygame.Surface(((PREV_WIDTH + 5) * len(self.selected) + 5, PREV_HEIGHT + 10)) x = 5 y = 5 for c in self.selected: selected_surface.blit(c.image, (x, y)) c.loc = (x, y) x += 5 + PREV_WIDTH self.ss_selected.draw(surface, selected_surface) def __get_card_under_mouse(self, ss, card_list): if not ss.get_rect().move(ss.pos).collidepoint(pygame.mouse.get_pos()): return for c in card_list: (x, y) = c.loc rect = pygame.Rect(x + ss.x_offset + (ss.pos)[0], y + ss.y_offset + (ss.pos)[1], PREV_WIDTH, PREV_HEIGHT) if rect.collidepoint(pygame.mouse.get_pos()): return c def __reset(self): for c in self.selected: self.cards.append(c) self.selected = [] self.txtName.text = '' self.cards.sort(key=lambda c: c.name) def handle_event(self, event): if event.type == pygame.MOUSEBUTTONUP and event.button == 1: if len(self.selected) < 10: card = self.__get_card_under_mouse(self.ss_cards, self.cards) if card: self.cards.remove(card) self.selected.append(card) card = self.__get_card_under_mouse(self.ss_selected, self.selected) if card: self.selected.remove(card) self.cards.append(card) self.cards.sort(key=lambda c: c.name) self.selected.sort(key=lambda c: c.name) def leave(self): app = self.client.app app.widgets = [] def __handle_back_click(self, *args): self.client.go_back()