annotate mamba/widgets/toollist.py @ 601:915de6c7d342 default tip

Add support for making the editor fullscreen too.
author Simon Cross <hodgestar@gmail.com>
date Sat, 14 Jan 2023 19:34:26 +0100
parents 5f26ba2402cc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
1 from pygame.constants import KEYUP, K_1, K_PAGEDOWN, K_PAGEUP
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
2
265
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
3 from mamba.widgets.base import Container
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
4 from mamba.widgets.text import TextButton
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
5
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
6
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
7 class ToolListWidget(Container):
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
8 """List of other widgets, with some paging trickery"""
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
9
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
10 def __init__(self, rect, widget_list, page_length, start_key=K_1,
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
11 padding=2):
480
90a59251c93b Sort tools in level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 479
diff changeset
12 widget_list.sort(key=lambda w: w.text)
265
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
13 self.widget_list = widget_list
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
14 self.page_length = page_length
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
15 self.padding = padding
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
16 self.page = 0
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
17 self.start_key = start_key
265
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
18 super(ToolListWidget, self).__init__(rect)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
19 self.prev_but = None
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
20 self.next_but = None
265
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
21 self.fill_page()
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
22 # We do this to avoid needing to worry about focus too much
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
23 self.add_callback(KEYUP, self.handle_key)
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
24 self.focussable = True
265
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
25
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
26 def fill_page(self):
324
ffec90bda89d Make sure we clear list before refilling it
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
27 for widget in self.children[:]:
ffec90bda89d Make sure we clear list before refilling it
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
28 self.remove(widget)
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
29 self.hot_keys = {}
265
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
30 start_page = self.page * self.page_length
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
31 end_page = start_page + self.page_length
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
32 button_height = self.rect.top + self.padding
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
33 button_left = self.rect.left + self.padding
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
34 key = self.start_key
265
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
35 for widget in self.widget_list[start_page:end_page]:
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
36 widget.rect.topleft = (button_left, button_height)
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
37 self.add(widget)
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
38 if key:
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
39 self.hot_keys[key] = widget
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
40 key += 1
265
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
41 button_height += widget.rect.height + self.padding
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
42 if not self.prev_but:
513
5f26ba2402cc Pretty unicode arrows
Stefano Rivera <stefano@rivera.za.net>
parents: 480
diff changeset
43 self.prev_but = TextButton((button_left, button_height),
5f26ba2402cc Pretty unicode arrows
Stefano Rivera <stefano@rivera.za.net>
parents: 480
diff changeset
44 u'\N{LEFTWARDS ARROW}')
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
45 self.prev_but.add_callback('clicked', self.change_page, -1)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
46 else:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
47 self.prev_but.rect.top = max(button_height, self.prev_but.rect.top)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
48 if not self.next_but:
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
49 self.next_but = TextButton((button_left + 100, button_height),
513
5f26ba2402cc Pretty unicode arrows
Stefano Rivera <stefano@rivera.za.net>
parents: 480
diff changeset
50 u'\N{RIGHTWARDS ARROW}')
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
51 self.next_but.add_callback('clicked', self.change_page, 1)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
52 else:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
53 self.next_but.rect.top = max(button_height, self.next_but.rect.top)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
54 if start_page > 0:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
55 self.prev_but.enable()
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
56 else:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
57 self.prev_but.disable()
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
58 if end_page < len(self.widget_list):
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
59 self.next_but.enable()
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
60 else:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
61 self.next_but.disable()
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
62 self.add(self.prev_but)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
63 self.add(self.next_but)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
64 for widget in self.children[:]:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
65 if widget in self.widget_list:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
66 # Standardise widdths
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
67 widget.rect.width = self.rect.width - 2
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 351
diff changeset
68 widget.prepare()
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
69
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
70 def handle_key(self, ev, widget):
351
03d0a7dbb724 Respect paused
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
71 if hasattr(self.parent, 'paused') and self.parent.paused:
03d0a7dbb724 Respect paused
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
72 # No hotjets when pasued
03d0a7dbb724 Respect paused
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
73 return False
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
74 if ev.key in self.hot_keys:
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
75 widget = self.hot_keys[ev.key]
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
76 return widget.forced_click()
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
77 elif ev.key == K_PAGEDOWN and self.prev_but:
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 324
diff changeset
78 return self.prev_but.forced_click()
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
79 elif ev.key == K_PAGEUP and self.next_but:
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 324
diff changeset
80 return self.next_but.forced_click()
265
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
81
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
82 def change_page(self, ev, widget, change):
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
83 self.page += change
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
84 self.fill_page()
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
85 return True