def test_no_shared_state(): """ See issue #11. """ grid_1 = drawing.Grid() grid_2 = drawing.Grid() i, j = 0, 0 grid_1.set_row_height(i, 1) grid_2.set_row_height(i, 2) assert grid_1.get_requested_row_height(i) == 1 assert grid_2.get_requested_row_height(i) == 2 grid_1.set_col_width(j, 1) grid_2.set_col_width(j, 2) assert grid_1.get_requested_col_width(j) == 1 assert grid_2.get_requested_col_width(j) == 2 rect_1, rect_2 = Rect.from_size(1, 1), Rect.from_size(2, 2) assert rect_1 is not rect_2 grid_1.set_min_cell_rect(i, j, rect_1) grid_2.set_min_cell_rect(i, j, rect_2) assert grid_1.get_min_cell_rect(i, j) is rect_1 assert grid_2.get_min_cell_rect(i, j) is rect_2
def test_bounding_rect_too_small(): # Just big enough, should not raise. drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=1, default_row_height=10, default_col_width=10, ) # Too narrow. with pytest.raises(UsageError): drawing.make_grid( Rect.from_size(9, 10), num_rows=1, num_cols=1, default_row_height=10, default_col_width=10, ) # Too short. with pytest.raises(UsageError): drawing.make_grid( Rect.from_size(10, 9), num_rows=1, num_cols=1, default_row_height=10, default_col_width=10, )
def test_inner_padding(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=1, inner_padding=1, ) assert cells == { (0,0): Rect(0, 0, 10, 10), } cells = drawing.make_grid( Rect.from_size(10, 11), num_rows=2, num_cols=1, inner_padding=1, ) assert cells == { (0,0): Rect(0, 6, 10, 5), (1,0): Rect(0, 0, 10, 5), } cells = drawing.make_grid( Rect.from_size(11, 10), num_rows=1, num_cols=2, inner_padding=1 ) assert cells == { (0,0): Rect(0, 0, 5, 10), (0,1): Rect(6, 0, 5, 10), }
def test_padding(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=1, padding=1, ) assert cells == { (0,0): Rect(1, 1, 8, 8), } cells = drawing.make_grid( Rect.from_size(10, 11), num_rows=2, num_cols=1, padding=1, ) assert cells == { (0,0): Rect(1, 6, 8, 4), (1,0): Rect(1, 1, 8, 4), } cells = drawing.make_grid( Rect.from_size(11, 10), num_rows=1, num_cols=2, padding=1 ) assert cells == { (0,0): Rect(1, 1, 4, 8), (0,1): Rect(6, 1, 4, 8), }
def do_draw_hands(self): # We're hard-coding the radii of the hands here. Probably it would be # better to make separate attributes for these, but I think that would # start to detract from the clarity of the example. rects = { 'hour': Rect.from_size(self.custom_hour_hand_width, self.radius/2), 'min': Rect.from_size(self.custom_minute_hand_width, self.radius), 'sec': Rect.from_size(self.custom_second_hand_width, self.radius), } # The clock hands all start pointing towards 12:00, and the rotations # are clockwise, so 90° is 3:00, 180° is 6:00, 270° is 9:00, etc. now = datetime.datetime.now() angles = { 'hour': 360 * now.hour / 12, 'min': 360 * now.minute / 60, 'sec': 360 * now.second / 60, } for k in self._hands: rects[k].bottom = 0 rects[k].center_x = 0 self._hands[k].rect = rects[k] self._hands[k].group.angle = angles[k] self._hands[k].color = self._color self._hands[k].show()
def do_draw_hands(self): # We're hard-coding the radii of the hands here. Probably it would be # better to make separate attributes for these, but I think that would # start to detract from the clarity of the example. rects = { 'hour': Rect.from_size(self.custom_hour_hand_width, self.radius / 2), 'min': Rect.from_size(self.custom_minute_hand_width, self.radius), 'sec': Rect.from_size(self.custom_second_hand_width, self.radius), } # The clock hands all start pointing towards 12:00, and the rotations # are clockwise, so 90° is 3:00, 180° is 6:00, 270° is 9:00, etc. now = datetime.datetime.now() angles = { 'hour': 360 * now.hour / 12, 'min': 360 * now.minute / 60, 'sec': 360 * now.second / 60, } for k in self._hands: rects[k].bottom = 0 rects[k].center_x = 0 self._hands[k].rect = rects[k] self._hands[k].group.angle = angles[k] self._hands[k].color = self._color self._hands[k].show()
def test_parent_changed(): child, parent = Rect.null(), Rect.null() def change_parent(child_rect, parent_rect): parent_rect.left += 1 with pytest.raises(RuntimeError, match='change_parent'): glooey.drawing.align(change_parent, child, parent)
def test_one_cell(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=1, ) assert cells == { (0, 0): Rect(0, 0, 10, 10), }
def test_not_enough_cols(): with pytest.raises(UsageError): drawing.make_grid( Rect.null(), cells={ (0, 1): Rect.null(), }, num_rows=1, num_cols=1, )
def test_not_enough_cols(): with pytest.raises(UsageError): drawing.make_grid( Rect.null(), cells={ (0,1): Rect.null(), }, num_rows=1, num_cols=1, )
def test_negative_sizes(): # Initially I thought this should be an error, but then I decided that it # probably just works as you'd expect it to, and it might be a useful way # to create an overlapping effect or to get rid of padding in certain # places. # row_heights can be negative. cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=2, num_cols=1, row_heights={0: -2}, ) assert cells == { (0,0): Rect(0, 12, 10, -2), (1,0): Rect(0, 0, 10, 12), } # default_row_height can be negative. cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=2, num_cols=1, row_heights={1: 'expand'}, default_row_height=-2, ) assert cells == { (0,0): Rect(0, 12, 10, -2), (1,0): Rect(0, 0, 10, 12), } # col_widths can be negative. cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=2, col_widths={0: -2}, ) assert cells == { (0,0): Rect(0, 0, -2, 10), (0,1): Rect(-2, 0, 12, 10), } # default_col_width can be negative. cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=2, col_widths={1: 'expand'}, default_col_width=-2, ) assert cells == { (0,0): Rect(0, 0, -2, 10), (0,1): Rect(-2, 0, 12, 10), }
def test_child_outside_parent(): child = Rect.from_square(5) parent = Rect.from_square(6) def move_1px_right(child_rect, parent_rect): child_rect.left += 1 # This should be fine the first time... glooey.drawing.align(move_1px_right, child, parent) # ...but out-of-bounds the second time. with pytest.raises(RuntimeError, match='move_1px_right'): glooey.drawing.align(move_1px_right, child, parent)
def test_padding(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=1, padding=1, ) assert cells == { (0, 0): Rect(1, 1, 8, 8), } cells = drawing.make_grid( Rect.from_size(10, 11), num_rows=2, num_cols=1, padding=1, ) assert cells == { (0, 0): Rect(1, 6, 8, 4), (1, 0): Rect(1, 1, 8, 4), } cells = drawing.make_grid(Rect.from_size(11, 10), num_rows=1, num_cols=2, padding=1) assert cells == { (0, 0): Rect(1, 1, 4, 8), (0, 1): Rect(6, 1, 4, 8), }
def test_inner_padding(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=1, inner_padding=1, ) assert cells == { (0, 0): Rect(0, 0, 10, 10), } cells = drawing.make_grid( Rect.from_size(10, 11), num_rows=2, num_cols=1, inner_padding=1, ) assert cells == { (0, 0): Rect(0, 6, 10, 5), (1, 0): Rect(0, 0, 10, 5), } cells = drawing.make_grid(Rect.from_size(11, 10), num_rows=1, num_cols=2, inner_padding=1) assert cells == { (0, 0): Rect(0, 0, 5, 10), (0, 1): Rect(6, 0, 5, 10), }
def set_images(self, *, color=None, center=None, top=None, bottom=None, left=None, right=None, top_left=None, top_right=None, bottom_left=None, bottom_right=None, vtile=None, htile=None): self._color = color self._tile_images = { ij: img for ij, img in { (0,0): top_left, (0,1): top, (0,2): top_right, (1,0): left, (1,1): center, (1,2): right, (2,0): bottom_left, (2,1): bottom, (2,2): bottom_right, }.items() if img is not None} self._grid.min_cell_rects={ ij: Rect.from_size(img.width, img.height) for ij, img in self._tile_images.items()} if vtile is not None: self._vtile = vtile if htile is not None: self._htile = htile self._update_tiles()
def test_child_outside_parent(): child = Rect.from_square(4.5) parent = Rect.from_square(6) def move_1px_right(child_rect, parent_rect): child_rect.left += 1 # This should be fine the first time... glooey.drawing.align(move_1px_right, child, parent) # ...and also fine the second time, because the child is allowed to exceed # its parent by 1 px to account for rounding errors... glooey.drawing.align(move_1px_right, child, parent) # ...but out-of-bounds the third time. with pytest.raises(RuntimeError, match='move_1px_right'): glooey.drawing.align(move_1px_right, child, parent)
def __init__(self, rect=None, color='green', *, batch=None, group=None, usage='static', hidden=False): self._rect = rect or Rect.null() self._color = Color.from_anything(color) data = 'v2f/' + usage, 'c4B/' + usage super().__init__(batch, group, 4, GL_QUADS, data, hidden)
def test_one_cell(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=1, ) assert cells == { (0,0): Rect(0, 0, 10, 10), }
def __init__(self, *, bounding_rect=None, min_cell_rects=None, num_rows=0, num_cols=0, padding=None, inner_padding=None, outer_padding=None, row_heights=None, col_widths=None, default_row_height='expand', default_col_width='expand'): # Attributes that the user can set to affect the shape of the grid. self._bounding_rect = bounding_rect or Rect.null() self._min_cell_rects = min_cell_rects or {} self._requested_num_rows = num_rows self._requested_num_cols = num_cols self._inner_padding = first_not_none((inner_padding, padding, 0)) self._outer_padding = first_not_none((outer_padding, padding, 0)) self._requested_row_heights = row_heights or {} self._requested_col_widths = col_widths or {} self._default_row_height = default_row_height self._default_col_width = default_col_width # Read-only attributes that reflect the current state of the grid. self._num_rows = 0 self._num_cols = 0 self._max_cell_heights = {} self._max_cell_widths = {} self._fixed_rows = set() self._expandable_rows = set() self._fixed_cols = set() self._expandable_cols = set() self._fixed_row_heights = {} self._fixed_col_widths = {} self._min_expandable_row_heights = {} self._min_expandable_col_widths = {} self._padding_height = 0 self._padding_width = 0 self._min_height = 0 self._min_width = 0 self._row_heights = {} self._col_widths = {} self._width = 0 self._height = 0 self._row_tops = {} self._col_lefts = {} self._cell_rects = {} # Attributes that manage the cache. self._is_shape_stale = True self._is_claim_stale = True self._are_cells_stale = True
def test_setters(): grid = drawing.Grid() assert grid.make_claim() == (0, 0) grid.num_rows = 1 grid.default_row_height = 10 assert grid.make_claim() == (0, 10) grid.num_cols = 1 grid.default_col_width = 10 assert grid.make_claim() == (10, 10) grid.padding = 1 assert grid.make_claim() == (12, 12) grid.num_rows = 2 grid.num_cols = 2 assert grid.make_claim() == (23, 23) grid.set_min_cell_rects({(0, 0): Rect.from_size(20, 20)}) assert grid.make_claim() == (33, 33) grid.del_min_cell_rects() assert grid.make_claim() == (23, 23) grid.set_min_cell_rect(0, 0, Rect.from_size(20, 20)) assert grid.make_claim() == (33, 33) grid.del_min_cell_rect(0, 0) assert grid.make_claim() == (23, 23) grid.set_row_height(0, 20) assert grid.make_claim() == (23, 33) grid.del_row_height(0) assert grid.make_claim() == (23, 23) grid.set_col_width(0, 20) assert grid.make_claim() == (33, 23) grid.del_col_width(0) assert grid.make_claim() == (23, 23)
def test_setters(): grid = drawing.Grid() assert grid.make_claim() == (0, 0) grid.num_rows = 1 grid.default_row_height = 10 assert grid.make_claim() == (0, 10) grid.num_cols = 1 grid.default_col_width = 10 assert grid.make_claim() == (10, 10) grid.padding = 1 assert grid.make_claim() == (12, 12) grid.num_rows = 2 grid.num_cols = 2 assert grid.make_claim() == (23, 23) grid.set_min_cell_rects({(0,0): Rect.from_size(20, 20)}) assert grid.make_claim() == (33, 33) grid.del_min_cell_rects() assert grid.make_claim() == (23, 23) grid.set_min_cell_rect(0, 0, Rect.from_size(20, 20)) assert grid.make_claim() == (33, 33) grid.del_min_cell_rect(0, 0) assert grid.make_claim() == (23, 23) grid.set_row_height(0, 20) assert grid.make_claim() == (23, 33) grid.del_row_height(0) assert grid.make_claim() == (23, 23) grid.set_col_width(0, 20) assert grid.make_claim() == (33, 23) grid.del_col_width(0) assert grid.make_claim() == (23, 23)
def test_no_expandable_cells(): # If the grid can't fill all the space made available to it, it will pack # against the top-left corner. I chose this corner arbitrarily (although # other corners would've been slightly harder to implement). I decided # against adding the ability to control how the grid fits in its bounding # box for two reasons. First, you can get the same effect by simply adding # expandable rows or columns. Second, you can just change the bounding # box. Still, it's possible I'll change my mind about this behavior. cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=1, row_heights={0: 2}, col_widths={0: 2}, ) assert cells == { (0,0): Rect(0, 8, 2, 2), } cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=1, default_row_height=2, default_col_width=2, ) assert cells == { (0,0): Rect(0, 8, 2, 2), } cells = drawing.make_grid( Rect.from_size(10, 10), cells={ (0,0): Rect.from_size(2, 2), }, default_row_height=0, default_col_width=0, ) assert cells == { (0,0): Rect(0, 8, 2, 2), }
def test_two_cells(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=2, num_cols=1, ) assert cells == { (0,0): Rect(0, 5, 10, 5), (1,0): Rect(0, 0, 10, 5), } cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=2, ) assert cells == { (0,0): Rect(0, 0, 5, 10), (0,1): Rect(5, 0, 5, 10), }
def test_make_claim(): grid = drawing.Grid() cells = { (0,0): Rect.from_size(1, 2), (1,1): Rect.from_size(3, 4), } assert grid.make_claim(cells) == (6, 8) assert grid.make_claim() == (6, 8) assert grid.min_width == 6 assert grid.min_height == 8 assert grid.min_bounding_rect == Rect(0, 0, 6, 8) grid.default_row_height = 0 grid.default_col_width = 0 assert grid.make_claim(cells) == (4, 6) assert grid.make_claim() == (4, 6) assert grid.min_width == 4 assert grid.min_height == 6 assert grid.min_bounding_rect == Rect(0, 0, 4, 6)
def test_make_claim(): grid = drawing.Grid() cells = { (0, 0): Rect.from_size(1, 2), (1, 1): Rect.from_size(3, 4), } assert grid.make_claim(cells) == (6, 8) assert grid.make_claim() == (6, 8) assert grid.min_width == 6 assert grid.min_height == 8 assert grid.min_bounding_rect == Rect(0, 0, 6, 8) grid.default_row_height = 0 grid.default_col_width = 0 assert grid.make_claim(cells) == (4, 6) assert grid.make_claim() == (4, 6) assert grid.min_width == 4 assert grid.min_height == 6 assert grid.min_bounding_rect == Rect(0, 0, 4, 6)
def test_real_examples(): cells = drawing.make_grid( Rect.from_size(640, 480), cells={ (0, 0): Rect(0, 0, 10, 10), (0, 1): Rect(0, 0, 310, 10), (0, 2): Rect(0, 0, 10, 10), (0, 3): Rect(0, 0, 10, 10), }, col_widths={1: 0}, ) assert cells == { (0, 0): Rect(0, 0, 110, 480), (0, 1): Rect(110, 0, 310, 480), (0, 2): Rect(420, 0, 110, 480), (0, 3): Rect(530, 0, 110, 480), }
def set_appearance(self, *, color=None, outline=None, image=None, center=None, top=None, bottom=None, left=None, right=None, top_left=None, top_right=None, bottom_left=None, bottom_right=None, vtile='auto', htile='auto'): if image and center: raise UsageError("""\ specifying both 'image' and 'center' is ambiguous. Both of these options specify an image that should go in the middle of the frame. The only difference is that, if 'htile' or 'vtile' are set to 'auto' (the default value), 'center' enables tiling and 'image' doesn't.""") # Decide whether the background should tile in either dimension. auto_vtile = False auto_htile = False if top or bottom: auto_vtile = True if left or right: auto_htile = True if center and not (top or left or bottom or right): auto_vtile = True auto_htile = True self._vtile = auto_vtile if vtile == 'auto' else vtile self._htile = auto_htile if htile == 'auto' else htile # Store the images in a grid-like data structure. self._color = color self._outline = outline self._tile_images = { ij: img for ij, img in { (0,0): top_left, (0,1): top, (0,2): top_right, (1,0): left, (1,1): center or image, (1,2): right, (2,0): bottom_left, (2,1): bottom, (2,2): bottom_right, }.items() if img is not None} self._grid.min_cell_rects = { ij: Rect.from_size(img.width, img.height) for ij, img in self._tile_images.items()} self._update_tiles()
def do_resize_children(self): grip_width, grip_height = self.grip.claimed_size if self.bar.scale_grip: scaled_width, scaled_height = self.bar._get_scaled_grip_size() grip_width = clamp(scaled_width, grip_width, self.width) grip_height = clamp(scaled_height, grip_height, self.height) # Copied from `Mover.do_resize_children()`; refer there for # details. Maybe should be more DRY... child_rect = Rect.from_size(grip_width, grip_height) self.child._resize(child_rect) self._keep_child_in_rect()
def test_request_col_width(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=2, col_widths={0: 2}, ) assert cells == { (0,0): Rect(0, 0, 2, 10), (0,1): Rect(2, 0, 8, 10), } cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=2, col_widths={1: 2}, ) assert cells == { (0,0): Rect(0, 0, 8, 10), (0,1): Rect(8, 0, 2, 10), }
def test_request_row_height(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=2, num_cols=1, row_heights={0: 2}, ) assert cells == { (0,0): Rect(0, 8, 10, 2), (1,0): Rect(0, 0, 10, 8), } cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=2, num_cols=1, row_heights={1: 2}, ) assert cells == { (0,0): Rect(0, 2, 10, 8), (1,0): Rect(0, 0, 10, 2), }
def test_make_cells(): grid = drawing.Grid() grid.num_rows = 2 grid.num_cols = 2 expected_results = [( Rect.from_size(10, 10), { (0, 0): Rect(0, 5, 5, 5), (0, 1): Rect(5, 5, 5, 5), (1, 0): Rect(0, 0, 5, 5), (1, 1): Rect(5, 0, 5, 5), }),( Rect.from_size(20, 20), { (0, 0): Rect(0, 10, 10, 10), (0, 1): Rect(10, 10, 10, 10), (1, 0): Rect(0, 0, 10, 10), (1, 1): Rect(10, 0, 10, 10), }), ] for bbox, cells in expected_results: assert grid.make_cells(bbox) == cells assert grid.make_cells() == cells assert grid.cell_rects == cells assert grid.bounding_rect == bbox
def test_min_cell_rect_vs_row_height(): # If there is a cell larger than the specified row height, make the row big # enough to fit that cell. cells = drawing.make_grid( Rect.from_size(10, 10), cells={ (0,0): Rect.from_size(2,2), }, num_rows=2, num_cols=1, row_heights={0: 0}, ) assert cells == { (0,0): Rect(0, 8, 10, 2), (1,0): Rect(0, 0, 10, 8), } # If the specified row height is larger than any of the cells in the row, # make the row the specified height. cells = drawing.make_grid( Rect.from_size(10, 10), cells={ (0,0): Rect.from_size(2,2), }, num_rows=2, num_cols=1, row_heights={0: 4}, ) assert cells == { (0,0): Rect(0, 6, 10, 4), (1,0): Rect(0, 0, 10, 6), } # If there are multiple cells in the row, the row should be big enough for # all of them. cells = drawing.make_grid( Rect.from_size(10, 10), cells={ (0,0): Rect.from_size(2,2), (0,1): Rect.from_size(4,4), }, num_rows=2, num_cols=2, row_heights={0: 0}, ) assert cells == { (0,0): Rect(0, 6, 5, 4), (0,1): Rect(5, 6, 5, 4), (1,0): Rect(0, 0, 5, 6), (1,1): Rect(5, 0, 5, 6), }
def test_make_cells(): grid = drawing.Grid() grid.num_rows = 2 grid.num_cols = 2 expected_results = [ (Rect.from_size(10, 10), { (0, 0): Rect(0, 5, 5, 5), (0, 1): Rect(5, 5, 5, 5), (1, 0): Rect(0, 0, 5, 5), (1, 1): Rect(5, 0, 5, 5), }), (Rect.from_size(20, 20), { (0, 0): Rect(0, 10, 10, 10), (0, 1): Rect(10, 10, 10, 10), (1, 0): Rect(0, 0, 10, 10), (1, 1): Rect(10, 0, 10, 10), }), ] for bbox, cells in expected_results: assert grid.make_cells(bbox) == cells assert grid.make_cells() == cells assert grid.cell_rects == cells assert grid.bounding_rect == bbox
def do_resize_children(self): grip_width, grip_height = self.grip.claimed_size # Don't try to calculate a scaled grip size if the scroll pane # doesn't have a child yet. See #36. if self.bar.scale_grip and self.pane.child: scaled_width, scaled_height = self.bar._get_scaled_grip_size() grip_width = clamp(scaled_width, grip_width, self.width) grip_height = clamp(scaled_height, grip_height, self.height) # Copied from `Mover.do_resize_children()`; refer there for # details. Maybe should be more DRY... child_rect = Rect.from_size(grip_width, grip_height) self.child._resize(child_rect) self._keep_child_in_rect()
def test_default_col_width(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=2, col_widths={0: 'expand'}, default_col_width=2, ) assert cells == { (0,0): Rect(0, 0, 8, 10), (0,1): Rect(8, 0, 2, 10), } cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=2, col_widths={1: 'expand'}, default_col_width=2, ) assert cells == { (0,0): Rect(0, 0, 2, 10), (0,1): Rect(2, 0, 8, 10), }
def test_default_row_height(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=2, num_cols=1, row_heights={0: 'expand'}, default_row_height=2, ) assert cells == { (0,0): Rect(0, 2, 10, 8), (1,0): Rect(0, 0, 10, 2), } cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=2, num_cols=1, row_heights={1: 'expand'}, default_row_height=2, ) assert cells == { (0,0): Rect(0, 8, 10, 2), (1,0): Rect(0, 0, 10, 8), }
def __init__(self): super().__init__() self.field = Rect.from_size(*self.field_size) self.cards = {} # do not remove items self.starter_card = None self.pegging_stack = [] self.players = [] self.dealer = None self.pone = None self.active_player = None self.phase = None self.phase = None
def test_real_examples(): cells = drawing.make_grid( Rect.from_size(640, 480), cells={ (0,0): Rect(0, 0, 10, 10), (0,1): Rect(0, 0, 310, 10), (0,2): Rect(0, 0, 10, 10), (0,3): Rect(0, 0, 10, 10), }, col_widths={1: 0}, ) assert cells == { (0,0): Rect( 0, 0, 110, 480), (0,1): Rect(110, 0, 310, 480), (0,2): Rect(420, 0, 110, 480), (0,3): Rect(530, 0, 110, 480), }
def __init__(self): super().__init__() # Initialize the game objects. self.field = Rect.from_size(*self.field_size) self.players = [] self.bullets = [] self.targets = [] self.final_target = None self.obstacles = [] self.winner = None # Initialize the 2D physics simulator. self.space = pymunk.Space() self.space.gravity = 0, 0 self.make_boundary()
def _find_cell_rects(self): self._cell_rects = {} top_cursor = self._bounding_rect.top for i in range(self._num_rows): top_cursor -= self._padding row_height = self._row_heights[i] left_cursor = self._bounding_rect.left for j in range(self._num_cols): left_cursor += self._padding col_width = self._col_widths[j] self._cell_rects[i,j] = Rect.from_size(col_width, row_height) self._cell_rects[i,j].top_left = left_cursor, top_cursor left_cursor += col_width top_cursor -= row_height
def test_min_cell_rect_vs_col_width(): cells = drawing.make_grid( Rect.from_size(10, 10), cells={ (0,0): Rect.from_size(2,2), }, num_rows=1, num_cols=2, col_widths={0: 0}, ) assert cells == { (0,0): Rect(0, 0, 2, 10), (0,1): Rect(2, 0, 8, 10), } cells = drawing.make_grid( Rect.from_size(10, 10), cells={ (0,0): Rect.from_size(2,2), }, num_rows=1, num_cols=2, col_widths={0: 4}, ) assert cells == { (0,0): Rect(0, 0, 4, 10), (0,1): Rect(4, 0, 6, 10), } # If there are multiple cells in the column, the column should be big # enough for all of them. cells = drawing.make_grid( Rect.from_size(10, 10), cells={ (0,0): Rect.from_size(2,2), (1,0): Rect.from_size(4,4), }, num_rows=2, num_cols=2, col_widths={0: 0}, ) assert cells == { (0,0): Rect(0, 5, 4, 5), (1,0): Rect(0, 0, 4, 5), (0,1): Rect(4, 5, 6, 5), (1,1): Rect(4, 0, 6, 5), }
def test_no_expandable_cells(): # If the grid can't fill all the space made available to it, it will pack # against the top-left corner. I chose this corner arbitrarily (although # other corners would've been slightly harder to implement). I decided # against adding the ability to control how the grid fits in its bounding # box for two reasons. First, you can get the same effect by simply adding # expandable rows or columns. Second, you can just change the bounding # box. Still, it's possible I'll change my mind about this behavior. cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=1, row_heights={0: 2}, col_widths={0: 2}, ) assert cells == { (0, 0): Rect(0, 8, 2, 2), } cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=1, default_row_height=2, default_col_width=2, ) assert cells == { (0, 0): Rect(0, 8, 2, 2), } cells = drawing.make_grid( Rect.from_size(10, 10), cells={ (0, 0): Rect.from_size(2, 2), }, default_row_height=0, default_col_width=0, ) assert cells == { (0, 0): Rect(0, 8, 2, 2), }
def _find_cell_rects(self): self._row_tops = {} self._col_lefts = {} self._cell_rects = {} top_cursor = self._bounding_rect.top for i in range(self._num_rows): top_cursor -= self._get_row_padding(i) left_cursor = self._bounding_rect.left row_height = self._row_heights[i] self._row_tops[i] = top_cursor for j in range(self._num_cols): left_cursor += self._get_col_padding(j) col_width = self._col_widths[j] self._cell_rects[i, j] = Rect.from_size(col_width, row_height) self._cell_rects[i, j].top_left = left_cursor, top_cursor self._col_lefts[j] = left_cursor left_cursor += col_width top_cursor -= row_height
def do_resize_children(self): # Consult the ``expand_horz`` and ``expand_vert`` member variables to # decide how much space to give the child. If expansion is enabled, # the child can occupy the whole mover depending on its alignment. The # advantage of this is that the child can control its initial position # using alignment. The downside is that widgets with the default # "fill" alignment can't move, which is a gotcha. If expansion is # disabled, the child is made as small as possible. if self.expand_horz: child_width = self.rect.width else: child_width = self.child.claimed_width if self.expand_vert: child_height = self.rect.height else: child_height = self.child.claimed_height # Put the bottom left corner of the child's rectangle at the origin. # This simplifies the offset calculations, relative to having the # child's rectangle where the parent's is. child_rect = Rect.from_size(child_width, child_height) self.child._resize(child_rect) self._keep_child_in_rect()
def test_find_cell_under_mouse(): grid = drawing.Grid() grid.num_rows = 2 grid.num_cols = 2 grid.padding = 1 grid.make_cells(Rect.from_size(5, 5)) expected_results = { (0, 0): None, (0, 1): None, (0, 2): None, (0, 3): None, (0, 4): None, (1, 0): None, (1, 1): (1, 0), (1, 2): (1, 0), (1, 3): (0, 0), (1, 4): (0, 0), (2, 0): None, (2, 1): (1, 0), (2, 2): (1, 0), (2, 3): (0, 0), (2, 4): (0, 0), (3, 0): None, (3, 1): (1, 1), (3, 2): (1, 1), (3, 3): (0, 1), (3, 4): (0, 1), (4, 0): None, (4, 1): (1, 1), (4, 2): (1, 1), (4, 3): (0, 1), (4, 4): (0, 1), } for mouse, cell in expected_results.items(): assert grid.find_cell_under_mouse(*mouse) == cell
def test_two_cells(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=2, num_cols=1, ) assert cells == { (0, 0): Rect(0, 5, 10, 5), (1, 0): Rect(0, 0, 10, 5), } cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=2, ) assert cells == { (0, 0): Rect(0, 0, 5, 10), (0, 1): Rect(5, 0, 5, 10), }
def test_request_row_height(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=2, num_cols=1, row_heights={0: 2}, ) assert cells == { (0, 0): Rect(0, 8, 10, 2), (1, 0): Rect(0, 0, 10, 8), } cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=2, num_cols=1, row_heights={1: 2}, ) assert cells == { (0, 0): Rect(0, 2, 10, 8), (1, 0): Rect(0, 0, 10, 2), }
def test_request_col_width(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=2, col_widths={0: 2}, ) assert cells == { (0, 0): Rect(0, 0, 2, 10), (0, 1): Rect(2, 0, 8, 10), } cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=2, col_widths={1: 2}, ) assert cells == { (0, 0): Rect(0, 0, 8, 10), (0, 1): Rect(8, 0, 2, 10), }
def test_default_row_height(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=2, num_cols=1, row_heights={0: 'expand'}, default_row_height=2, ) assert cells == { (0, 0): Rect(0, 2, 10, 8), (1, 0): Rect(0, 0, 10, 2), } cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=2, num_cols=1, row_heights={1: 'expand'}, default_row_height=2, ) assert cells == { (0, 0): Rect(0, 8, 10, 2), (1, 0): Rect(0, 0, 10, 8), }
def test_default_col_width(): cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=2, col_widths={0: 'expand'}, default_col_width=2, ) assert cells == { (0, 0): Rect(0, 0, 8, 10), (0, 1): Rect(8, 0, 2, 10), } cells = drawing.make_grid( Rect.from_size(10, 10), num_rows=1, num_cols=2, col_widths={1: 'expand'}, default_col_width=2, ) assert cells == { (0, 0): Rect(0, 0, 2, 10), (0, 1): Rect(2, 0, 8, 10), }
def set_appearance(self, *, color=None, outline=None, image=None, center=None, top=None, bottom=None, left=None, right=None, top_left=None, top_right=None, bottom_left=None, bottom_right=None, vtile='auto', htile='auto'): if image and center: raise UsageError("""\ specifying both 'image' and 'center' is ambiguous. Both of these options specify an image that should go in the middle of the frame. The only difference is that, if 'htile' or 'vtile' are set to 'auto' (the default value), 'center' enables tiling and 'image' doesn't.""") # Decide whether the background should tile in either dimension. auto_vtile = False auto_htile = False if top or bottom: auto_vtile = True if left or right: auto_htile = True if center and not (top or left or bottom or right): auto_vtile = True auto_htile = True self._vtile = auto_vtile if vtile == 'auto' else vtile self._htile = auto_htile if htile == 'auto' else htile # Store the images in a grid-like data structure. self._color = color self._outline = outline self._tile_images = { ij: img for ij, img in { (0, 0): top_left, (0, 1): top, (0, 2): top_right, (1, 0): left, (1, 1): center or image, (1, 2): right, (2, 0): bottom_left, (2, 1): bottom, (2, 2): bottom_right, }.items() if img is not None } self._grid.min_cell_rects = { ij: Rect.from_size(img.width, img.height) for ij, img in self._tile_images.items() } self._update_tiles()
#!/usr/bin/env python3 import pyglet import glooey import run_demos from vecrec import Vector, Rect window = pyglet.window.Window() batch = pyglet.graphics.Batch() rects = { # 'big': Rect.from_size(64*8, 64*6), 'small': Rect.from_size(64*4, 64*3), } images = { # 'green': pyglet.image.load('assets/64x64/green.png'), 'orange': pyglet.image.load('assets/64x64/orange.png'), } window_rect = Rect.from_pyglet_window(window) for rect in rects.values(): rect.center = window_rect.center artist = glooey.drawing.Tile(rects['big'], images['green'], vtile=True, htile=True, batch=batch) @run_demos.on_space(window, batch)
#!/usr/bin/env python3 import pyglet import glooey import run_demos from vecrec import Rect from pyglet.image import load window = pyglet.window.Window() batch = pyglet.graphics.Batch() rect = Rect.from_size(64 * 8, 64 * 6) rect.center = Rect.from_pyglet_window(window).center bg = glooey.drawing.Background(rect=rect, batch=batch) @run_demos.on_space(window, batch) def test_background(): # Make sure colors can be set, updated, and removed. bg.set_appearance(color='green') yield "Show a solid green background." bg.set_appearance(color='orange') yield "Change to a solid orange background." # Make sure outlines can be set, updated, and removed. bg.set_appearance(outline='green') yield "Show a solid green outline." bg.set_appearance(outline='orange') yield "Change to a solid orange outline."
#!/usr/bin/env python3 import pyglet import glooey import run_demos from vecrec import Vector, Rect window = pyglet.window.Window() batch = pyglet.graphics.Batch() full = Rect.from_pyglet_window(window) left = Rect(full.left, full.bottom, full.width/2, full.height) right = Rect(full.left, full.bottom, full.width/2, full.height) right.left = left.right left.shrink(50) right.shrink(50) @run_demos.on_space(window, batch) def test_outline(): a = glooey.drawing.Outline(left, batch=batch) b = glooey.drawing.Outline(right, batch=batch) yield "Show two unconnected outlines." a.hide() b.hide() c = glooey.drawing.Outline(full, batch=batch) yield "Put an outline just inside the window." c.hide() @window.event