# HG changeset patch # User Stefano Rivera # Date 1328962429 -7200 # Node ID 65e36149b273302195e06b058291af5ce7637050 # Parent a4f28da12720bcba6194c8851fe5074fa0c87bf0 Remove useless widgets modules diff -r a4f28da12720 -r 65e36149b273 pyntnclick/widgets/editlevel.py --- a/pyntnclick/widgets/editlevel.py Sat Feb 11 14:12:11 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -from mamba.data import get_tileset_list, get_track_list -from mamba.widgets.base import Box -from mamba.widgets.text import TextWidget, TextButton, EntryTextWidget -from mamba.widgets.listbox import ListBox - - -class EditLevelBox(Box): - """Edit details for a level map""" - - button_padding = 2 - - def __init__(self, rect, level, post_callback=None): - super(EditLevelBox, self).__init__(rect) - self.level = level - self.level_tileset = self.level.tileset.name - self.level_track = self.level.background_track - self.post_callback = post_callback - self.prepare() - self.modal = True - - def add_widget(self, cls, *args, **kw): - clicked = kw.pop('clicked', None) - offset = kw.pop('offset', (0, 0)) - pos = (self.widget_left + offset[0], - self.widget_top + offset[1]) - widget = cls(pos, *args, **kw) - if clicked: - widget.add_callback('clicked', *clicked) - self.add(widget) - self.widget_top += widget.rect.height + self.button_padding - return widget - - def prepare(self): - self.widget_left = self.rect.left - self.widget_top = self.rect.top - - self.add_widget(TextWidget, "Specify Level Details") - - self.filename = self.add_widget( - EntryTextWidget, self.level.level_name, prompt="File:") - - self.levelname = self.add_widget( - EntryTextWidget, self.level.name, prompt='Level Title:') - - self.authorname = self.add_widget( - EntryTextWidget, self.level.author, prompt='Author:') - - # self.tileset = self.add_widget( - # TextButton, 'Tileset: %s' % self.level_tileset, - # color='white', clicked=(self.list_tilesets,)) - - self.trackname = self.add_widget( - TextButton, 'Music: %s' % self.level_track, - color='white', clicked=(self.list_tracks,)) - - self.ok_button = self.add_widget( - TextButton, 'OK', offset=(10, 0), clicked=(self.close, True)) - - self.cancel_button = self.add_widget( - TextButton, 'Cancel', offset=(10, 0), clicked=(self.close, False)) - - self.rect.width = max(self.rect.width, 400) - self.rect.height += 5 - - def change_tileset(self, ev, widget, name): - self.level_tileset = name - self.tileset.text = 'Tileset: %s' % name - self.tileset.prepare() - - def change_track(self, ev, widget, name): - self.level_track = name - self.trackname.text = 'Music: %s' % name - self.trackname.prepare() - - def mk_loadlist(self, title, items, callback): - load_list = [] - for name in items: - load_button = TextButton((0, 0), name) - load_button.add_callback('clicked', callback, name) - load_list.append(load_button) - lb = ListBox((200, 200), title, load_list, 6) - lb.parent_modal = self.modal - self.modal = False - self.parent.add(lb) - lb.grab_focus() - - def list_tilesets(self, ev, widget): - tilesets = [i for i in get_tileset_list() if i != 'common'] - self.mk_loadlist('Select Tileset', tilesets, self.change_tileset) - - def list_tracks(self, ev, widget): - tracks = get_track_list() - self.mk_loadlist('Select Music', tracks, self.change_track) - - def close(self, ev, widget, do_update): - self.modal = False - self.parent.remove(self) - if do_update: - self.post_callback( - self.filename.value, - self.levelname.value, - self.authorname.value, - self.level_tileset, - self.level_track) - return True - - def grab_focus(self): - return self.ok_button.grab_focus() diff -r a4f28da12720 -r 65e36149b273 pyntnclick/widgets/editsprite.py --- a/pyntnclick/widgets/editsprite.py Sat Feb 11 14:12:11 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,148 +0,0 @@ -from mamba.widgets.base import Box -from mamba.widgets.text import TextWidget, TextButton, EntryTextWidget - - -class EditSpriteBox(Box): - """Edit details for a special sprite on the level map""" - - def __init__(self, rect, sprite_pos, sprite_info, post_callback=None): - super(EditSpriteBox, self).__init__(rect) - self.sprite_pos = sprite_pos - sprite_cls_name, sprite_cls, sprite_id, args = sprite_info - self.sprite_cls_name = sprite_cls_name - self.sprite_cls = sprite_cls - if sprite_id: - self.sprite_id = sprite_id - else: - self.sprite_id = '' - self.sprite_parameters = args - self.new_sprite_parameters = [] - self.post_callback = post_callback - self.parameter_widgets = [] - self.prepare() - self.modal = True - - def prepare(self): - title = TextWidget(self.rect, "Specify Sprite Details") - self.add(title) - height = self.rect.top + title.rect.height + 2 - self.edit_sprite_name = TextWidget((self.rect.left, height), - 'Sprite Class: %s' % self.sprite_cls.name) - self.add(self.edit_sprite_name) - height += self.edit_sprite_name.rect.height + 2 - self.edit_sprite_id = EntryTextWidget((self.rect.left + 20, height), - self.sprite_id, prompt='Sprite Id (required):') - self.add(self.edit_sprite_id) - height += self.edit_sprite_id.rect.height + 2 - poss_params = self.sprite_cls.get_sprite_args() - if not poss_params: - self.sprite_param = TextWidget((self.rect.left, height), - 'No Parameters') - self.add(self.sprite_param) - height += self.sprite_param.rect.height + 2 - else: - self.sprite_param = TextWidget((self.rect.left, height), - 'Parameters') - self.add(self.sprite_param) - height += self.sprite_param.rect.height + 2 - for i, param_tuple in enumerate(poss_params): - if len(self.sprite_parameters) > i: - value = self.sprite_parameters[i] - else: - value = None - if param_tuple[1] is None: - # Text Entry Parameter - if value is None: - value = '' - edit_widget = EntryTextWidget( - (self.rect.left + 20, height), - value, prompt=param_tuple[0]) - self.parameter_widgets.append(edit_widget) - self.add(edit_widget) - height += edit_widget.rect.height - elif isinstance(param_tuple[1], tuple): - # We have a list of possible values - if value is None: - value = param_tuple[1][0] # Take the first - mylist = [] - list_width = 0 - list_height = 0 - for choice in param_tuple[1]: - list_parameter = TextWidget( - (self.rect.left + 20, height), - '%s: %s' % (param_tuple[0], choice)) - # So we can pull it out of this later - list_parameter.choice = choice - list_width = max(list_width, list_parameter.rect.width) - change_list = TextButton( - (list_parameter.rect.right + 5, height), - 'Next Option') - change_list.add_callback('clicked', self.change_list, - choice, param_tuple[1], mylist) - mylist.append((list_parameter, change_list)) - list_height = max(list_height, change_list.rect.height, - list_parameter.rect.height) - if choice == value: - self.add(list_parameter) - self.add(change_list) - for x in mylist: - x[1].rect.left = self.rect.left + list_width + 25 - if x[0].rect.height < list_height: - x[0].rect.top += (list_height - - x[0].rect.height) / 2 - height += max(list_parameter.rect.height, - change_list.rect.height) - self.parameter_widgets.append(mylist) - # FIXME: Other cases - height += 20 - self.ok_button = TextButton((self.rect.left + 10, height), 'OK') - self.ok_button.add_callback('clicked', self.close, True) - self.add(self.ok_button) - cancel_button = TextButton((self.ok_button.rect.right + 10, height), - 'Cancel') - cancel_button.add_callback('clicked', self.close, False) - self.add(cancel_button) - self.rect.width = max(self.rect.width, 400) - self.rect.height += 5 - - def change_list(self, ev, widget, cur_choice, all_choices, widget_list): - pos = all_choices.index(cur_choice) - if pos == len(all_choices) - 1: - next_pos = 0 - else: - next_pos = pos + 1 - self.remove(widget_list[pos][0]) - self.remove(widget_list[pos][1]) - self.add(widget_list[next_pos][0]) - self.add(widget_list[next_pos][1]) - - def close(self, ev, widget, do_update): - if do_update: - self.new_sprite_parameters = [] - for param in self.parameter_widgets: - if hasattr(param, 'value'): - self.new_sprite_parameters.append(param.value) - elif isinstance(param, list): - # Find the selected one - for choice, _ in param: - if choice in self.children: - # Is selected, so we grab this choice - self.new_sprite_parameters.append(choice.choice) - break - self.sprite_id = self.edit_sprite_id.value - sprite = self.make_sprite() - if not self.post_callback(sprite): - return # Call-back failed, so don't remove - self.parent.paused = False - self.parent.remove(self) - return True - - def make_sprite(self): - """Convert values to a sprite line""" - pos = "%s, %s" % self.sprite_pos - sprite_string = "%s: %s %s %s" % (pos, self.sprite_cls_name, - self.sprite_id, " ".join(self.new_sprite_parameters)) - return sprite_string - - def grab_focus(self): - return self.ok_button.grab_focus() diff -r a4f28da12720 -r 65e36149b273 pyntnclick/widgets/entrybox.py --- a/pyntnclick/widgets/entrybox.py Sat Feb 11 14:12:11 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -from pygame.constants import K_ESCAPE, K_RETURN, K_KP_ENTER, KEYDOWN - -from mamba.widgets.base import Box -from mamba.widgets.text import TextWidget, TextButton, EntryTextWidget - - -class EntryBox(Box): - - def __init__(self, rect, text, init_value, accept_callback=None, - color='white', entry_color='red'): - super(EntryBox, self).__init__(rect) - self.text = text - self.accept_callback = accept_callback - self.color = color - self.entry_color = entry_color - self.value = init_value - self.prepare() - self.modal = True - - def prepare(self): - message = TextWidget((self.rect.left + 50, self.rect.top + 2), - self.text, color=self.color) - self.rect.width = message.rect.width + 100 - self.add(message) - self.entry_text = EntryTextWidget((self.rect.left + 5, - self.rect.top + message.rect.height + 5), self.value, - focus_color=self.entry_color) - self.add_callback(KEYDOWN, self.edit) - self.add(self.entry_text) - ok_button = TextButton((self.rect.left + 50, - self.entry_text.rect.bottom), 'Accept') - ok_button.add_callback('clicked', self.close, True) - self.add(ok_button) - cancel_button = ok_button = TextButton( - (ok_button.rect.right + 10, self.entry_text.rect.bottom), - 'Cancel') - cancel_button.add_callback('clicked', self.close, False) - self.add(cancel_button) - self.rect.height += 5 - - def close(self, ev, widget, ok): - if self.accept_callback and ok: - self.value = self.entry_text.value - if self.accept_callback(self.value): - if self.parent: - if hasattr(self.parent, 'paused'): - self.parent.paused = False - self.parent.remove(self) - # Don't remove if the accept callback failed - return - if hasattr(self.parent, 'paused'): - self.parent.paused = False - self.parent.remove(self) - return True - - def edit(self, ev, widget): - if ev.key == K_ESCAPE: - self.close(ev, widget, False) - return True - elif ev.key in (K_RETURN, K_KP_ENTER): - self.close(ev, widget, True) - return True - return False # pass this up to parent - - def grab_focus(self): - self.entry_text.grab_focus() diff -r a4f28da12720 -r 65e36149b273 pyntnclick/widgets/imagebutton.py --- a/pyntnclick/widgets/imagebutton.py Sat Feb 11 14:12:11 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -import pygame -from pygame.locals import SRCALPHA - -from mamba.constants import COLOR, FONT_SIZE, FOCUS_COLOR -from mamba.widgets.base import Button -from mamba.widgets.text import TextWidget - - -class ImageButtonWidget(Button, TextWidget): - """Text label with image on the left""" - - def __init__(self, rect, image, text, fontsize=FONT_SIZE, color=COLOR): - self.image = image - self.focus_color = pygame.Color(FOCUS_COLOR) - self.padding = 5 - self.border = 3 - super(ImageButtonWidget, self).__init__(rect, text, fontsize, color) - self.focussable = True - - def prepare(self): - super(ImageButtonWidget, self).prepare() - text_surface = self.surface - # Image is already a surface - self._focussed = self.focussed - color = self.focus_color if self.focussed else self.color - - width = (text_surface.get_width() + self.image.get_width() - + 5 + self.padding * 2) - height = max(text_surface.get_height(), - self.image.get_height()) + self.padding * 2 - self.rect.width = max(self.rect.width, width) - self.rect.height = max(self.rect.height, height) - self.surface = pygame.Surface(self.rect.size, SRCALPHA) - self.surface.fill(0) - self.surface.blit(self.image, (self.padding, self.padding)) - self.surface.blit(text_surface, - (self.image.get_width() + 5 + self.padding, self.padding)) - pygame.draw.rect(self.surface, color, self.surface.get_rect(), - self.border) - - def draw(self, surface): - if self._focussed != self.focussed: - self.prepare() - super(ImageButtonWidget, self).draw(surface) diff -r a4f28da12720 -r 65e36149b273 pyntnclick/widgets/level.py --- a/pyntnclick/widgets/level.py Sat Feb 11 14:12:11 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,144 +0,0 @@ -from pygame.rect import Rect -from pygame.locals import MOUSEBUTTONDOWN, MOUSEBUTTONUP, MOUSEMOTION -from pygame.key import set_repeat - -from mamba.widgets.base import Widget -from mamba.constants import TILE_SIZE -from mamba.snake import Snake -from mamba.engine import FlipArrowsEvent, ReplayEvent - - -class EditLevelWidget(Widget): - def __init__(self, level, offset=(0, 0)): - self.level = level - level_rect = Rect(offset, level.get_size()) - self.main_tool = None - self.tool = None - self.drawing = False - self.last_click_pos = None - self.tile_mode = True # Flag for sprite interactions - super(EditLevelWidget, self).__init__(level_rect) - self.add_callback(MOUSEBUTTONDOWN, self.place_tile) - self.add_callback(MOUSEBUTTONUP, self.end_draw) - self.add_callback(MOUSEMOTION, self.draw_tiles) - self.add_callback(FlipArrowsEvent, self.flip_arrows) - self.add_callback(ReplayEvent, self.handle_replay) - self.snake = None - self.snake_alive = False - self.replay_data = [] - self.last_run = [] - self.replay_pos = 0 - - def get_replay(self): - return self.replay_data[:] - - def replay(self, run=None): - if run is None: - # We exclude the last couple of steps, so we don't redo - # the final crash in this run - run = self.last_run[:-4] - if len(run) > 0: - self.start_test() - ReplayEvent.post(run, 0) - - def handle_replay(self, ev, widget): - self.apply_action(ev.run[ev.replay_pos]) - if ev.replay_pos < len(ev.run) - 1: - ReplayEvent.post(ev.run, ev.replay_pos + 1) - - def start_test(self): - self.level.update_tiles_ascii() - self.last_run = self.replay_data - self.replay_data = [] - self.level.restart() - tile_pos, orientation = self.level.get_entry() - self.snake = Snake(tile_pos, orientation) - set_repeat(40, 100) - self.snake_alive = True - - def stop_test(self): - self.snake = None - self.snake_alive = False - self.level.restart() - set_repeat(0, 0) - - def draw(self, surface): - self.level.draw(surface) - if self.snake: - self.snake.draw(surface) - - def kill_snake(self): - """Prevent user interaction while snake is dead""" - self.snake_alive = False - - def restart(self): - self.start_test() - - def interact(self, segment): - if not self.snake or not self.snake_alive: - return - tiles = segment.filter_collisions(self.level.sprites) - for tile in tiles: - tile.interact(self, segment) - - def get_sprite(self, sprite_id): - return self.level.extra_sprites[sprite_id] - - def apply_action(self, orientation): - self.replay_data.append(orientation) - if not self.snake or not self.snake_alive: - return - # We choose numbers that are close to, but not exactly, move 0.5 tiles - # to avoid a couple of rounding corner cases in the snake code - if orientation is None or orientation == self.snake.orientation: - self.snake.update(9.99 / self.snake.speed, self) - else: - self.snake.send_new_direction(orientation) - self.snake.update(9.99 / self.snake.speed, self) - - def set_tool(self, new_tool): - self.main_tool = new_tool - self.tool = new_tool - - def end_draw(self, event, widget): - self.drawing = False - - def draw_tiles(self, event, widget): - if self.drawing and self.tool: - # FIXME: Need to consider leaving and re-entering the widget - self.update_tile(self.convert_pos(event.pos)) - - def flip_arrows(self, ev, widget): - self.level.flip_arrows() - - def place_tile(self, event, widget): - if self.tile_mode: - if event.button == 1: # Left button - self.tool = self.main_tool - else: - self.tool = '.' - self.drawing = True - if self.tool: - self.update_tile(self.convert_pos(event.pos)) - else: - self.last_click_pos = self.convert_pos(event.pos) - self.drawing = False - - def convert_pos(self, pos): - return (pos[0] / TILE_SIZE[0], pos[1] / TILE_SIZE[1]) - - def update_tile(self, tile_pos): - """Update the tile at the current mouse position""" - if self.check_paused(): - return # Do nothing if dialogs showing - # We convert our current position into a tile position - # and replace the tile with the current tool - old_tile = self.level.get_tile(tile_pos) - if self.tool == '.' and old_tile is None: - return - elif old_tile is not None and old_tile.tile_char == self.tool: - return - self.level.replace_tile(tile_pos, self.tool) - - def check_paused(self): - return hasattr(self.parent, 'paused') and self.parent.paused diff -r a4f28da12720 -r 65e36149b273 pyntnclick/widgets/levelbutton.py --- a/pyntnclick/widgets/levelbutton.py Sat Feb 11 14:12:11 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -import pygame -from pygame.locals import SRCALPHA - -from mamba.constants import FOCUS_COLOR -from mamba.data import load_image -from mamba.widgets.base import Button -from mamba.widgets.text import TextWidget - - -class LevelButton(Button): - - def __init__(self, rect, level, done=False): - super(LevelButton, self).__init__(rect) - self.level = level - self.text = level.name - self.done = done - self.focussable = True - self.border = 2 - self.rect.width = 100 - self.rect.height = 120 - self.prepare() - - def make_thumbnail(self, dest_rect): - level_surface = pygame.Surface(self.level.get_size(), SRCALPHA) - self.level.draw(level_surface) - size = level_surface.get_rect().fit(dest_rect).size - level_thumbnail = pygame.transform.scale(level_surface, size) - return level_thumbnail - - def prepare(self): - self.surface = pygame.Surface(self.rect.size, SRCALPHA) - self.surface.fill(0) - - dest_rect = pygame.Rect((self.border, self.border), - (self.rect.width - self.border, - self.rect.height - self.border)) - if not hasattr(self.level, 'button_thumbnail'): - self.level.button_thumbnail = self.make_thumbnail(dest_rect) - self.surface.blit(self.level.button_thumbnail, dest_rect) - - if self.done: - image = load_image('menus/tick.png') - self.surface.blit(image, image.get_rect()) - - # We only have space for two lines - self._text_lines = self.wrap_text(self.text)[:2] - - text_height = sum(line.rect.height for line in self._text_lines) - text_pos = self.level.button_thumbnail.get_rect().height - text_pos += (self.rect.height - text_height - text_pos) // 2 - for line in self._text_lines: - text_rect = pygame.Rect(((self.rect.width - line.rect.width) // 2, - text_pos), - line.rect.size) - text_pos = text_rect.bottom - self.surface.blit(line.surface, text_rect) - - color = pygame.Color(FOCUS_COLOR if self.focussed else '#444444') - pygame.draw.rect(self.surface, color, self.surface.get_rect(), - self.border + 1) - self._state = (self.done, self.focussed) - - def wrap_text(self, text): - args = {'rect': (0, 0), - 'text': text, - 'fontsize': 12, - 'color': 'white', - } - w = TextWidget(**args) - w.prepare() - splitpoint = len(text) - max_width = self.rect.width - (self.border * 3) - while w.rect.width > max_width and ' ' in text[:splitpoint]: - splitpoint = text.rfind(' ', 0, splitpoint) - args['text'] = text[:splitpoint] - w = TextWidget(**args) - w.prepare() - if splitpoint < len(text): - return [w] + self.wrap_text(text[splitpoint + 1:]) - else: - return [w] - - def draw(self, surface): - if self._state != (self.done, self.focussed): - self.prepare() - surface.blit(self.surface, self.rect)