Mercurial > boomslang
annotate pyntnclick/widgets/filechooser.py @ 712:f33dd2093f77 pyntnclick
Hook up image drawing code again
author | Neil Muller <neil@dip.sun.ac.za> |
---|---|
date | Sun, 05 Aug 2012 14:55:48 +0200 |
parents | d4f97c8e0dbe |
children | ab489f7e87f8 |
rev | line source |
---|---|
707 | 1 # Display a paged lsit of files and directories |
2 # Allow moving up and down directory trees | |
3 | |
4 import os | |
5 | |
6 from pyntnclick.widgets.base import Box | |
7 from pyntnclick.widgets.text import TextButton, LabelWidget | |
8 | |
9 | |
10 class FileChooser(Box): | |
11 | |
712
f33dd2093f77
Hook up image drawing code again
Neil Muller <neil@dip.sun.ac.za>
parents:
710
diff
changeset
|
12 def __init__(self, rect, gd, curdir, ok_callback, |
f33dd2093f77
Hook up image drawing code again
Neil Muller <neil@dip.sun.ac.za>
parents:
710
diff
changeset
|
13 page_length=12, padding=2): |
707 | 14 super(FileChooser, self).__init__(rect, gd) |
15 self.page_length = page_length | |
16 self.page = 0 | |
712
f33dd2093f77
Hook up image drawing code again
Neil Muller <neil@dip.sun.ac.za>
parents:
710
diff
changeset
|
17 self.ok_callback = ok_callback |
707 | 18 self.curdir = os.path.realpath(os.path.normpath(curdir)) |
19 self.selected = None | |
20 self.padding = padding | |
21 self.dirs = [] | |
22 self.files = [] | |
23 self.modal = True | |
24 self.prev_but = None | |
25 self.next_but = None | |
26 self.get_lists() | |
27 self.fill_page() | |
28 | |
29 def get_lists(self): | |
30 self.dirs = [] | |
31 self.files = [] | |
32 for entry in sorted(os.listdir(self.curdir)): | |
33 path = os.path.join(self.curdir, entry) | |
34 if os.path.isdir(path): | |
35 self.dirs.append(entry) | |
36 else: | |
37 self.files.append(entry) | |
38 | |
39 def _dir_button(self, entry): | |
40 widget = TextButton((0, 0), self.gd, entry + '/', | |
41 fontname=self.gd.constants.bold_font, | |
42 fontsize=10) | |
43 widget.add_callback('clicked', self.change_dir, entry) | |
44 return widget | |
45 | |
46 def _file_button(self, entry): | |
47 if entry == self.selected: | |
48 # highlight | |
49 widget = TextButton((0, 0), self.gd, entry, | |
710 | 50 fontsize=10, border=2, color='yellow') |
707 | 51 else: |
710 | 52 widget = TextButton((0, 0), self.gd, entry, border=0, |
53 fontsize=10) | |
54 widget.add_callback('clicked', self.change_selection, entry) | |
707 | 55 return widget |
56 | |
57 def fill_page(self): | |
58 for widget in self.children[:]: | |
59 self.remove(widget) | |
60 start_page = self.page * self.page_length | |
61 end_page = start_page + self.page_length | |
62 entries = self.dirs + self.files | |
63 top = self.rect.top + self.padding | |
64 left = self.rect.left + self.padding | |
65 # Add current directory at the top | |
66 widget = LabelWidget((0, 0), self.gd, self.curdir[-30:], color='black') | |
67 widget.rect.topleft = (left, top) | |
68 self.add(widget) | |
709
d279a7dd166a
Fix paging bug. Better widget spacing
Neil Muller <neil@dip.sun.ac.za>
parents:
707
diff
changeset
|
69 upbut = TextButton((left + 2 * self.padding + widget.rect.width, top), |
707 | 70 self.gd, u'\N{LEFTWARDS ARROW WITH HOOK}Back one level') |
71 upbut.add_callback('clicked', self.change_dir, os.pardir) | |
72 self.add(upbut) | |
73 top += max(widget.rect.height, upbut.rect.height) + 4 * self.padding | |
74 page_top = top | |
75 page_left = left | |
709
d279a7dd166a
Fix paging bug. Better widget spacing
Neil Muller <neil@dip.sun.ac.za>
parents:
707
diff
changeset
|
76 top += self.padding |
707 | 77 for entry in entries[start_page:end_page]: |
78 if entry in self.dirs: | |
79 widget = self._dir_button(entry) | |
80 else: | |
81 widget = self._file_button(entry) | |
82 widget.rect.topleft = (left, top) | |
83 self.add(widget) | |
84 top += widget.rect.height + self.padding | |
709
d279a7dd166a
Fix paging bug. Better widget spacing
Neil Muller <neil@dip.sun.ac.za>
parents:
707
diff
changeset
|
85 page_left = max(page_left, left + widget.rect.width + self.padding) |
707 | 86 # Add page list buttons |
87 if not self.prev_but: | |
88 self.prev_but = TextButton((0, 0), self.gd, u'\N{UPWARDS ARROW}') | |
89 self.prev_but.add_callback('clicked', self.change_page, -1) | |
90 self.prev_but.rect.topleft = (page_left, page_top) | |
91 if not self.next_but: | |
92 self.next_but = TextButton((0, 0), self.gd, u'\N{DOWNWARDS ARROW}') | |
709
d279a7dd166a
Fix paging bug. Better widget spacing
Neil Muller <neil@dip.sun.ac.za>
parents:
707
diff
changeset
|
93 self.next_but.add_callback('clicked', self.change_page, +1) |
707 | 94 page_top = max(top - self.next_but.rect.height, |
95 self.prev_but.rect.bottom + self.padding) | |
96 self.next_but.rect.topleft = (page_left, page_top) | |
97 if self.page > 0: | |
98 self.prev_but.enable() | |
99 else: | |
100 self.prev_but.disable() | |
709
d279a7dd166a
Fix paging bug. Better widget spacing
Neil Muller <neil@dip.sun.ac.za>
parents:
707
diff
changeset
|
101 if end_page + 1 < len(entries): |
707 | 102 self.next_but.enable() |
103 else: | |
104 self.next_but.disable() | |
105 self.add(self.next_but) | |
106 self.add(self.prev_but) | |
107 # Add OK and Cancel buttons | |
709
d279a7dd166a
Fix paging bug. Better widget spacing
Neil Muller <neil@dip.sun.ac.za>
parents:
707
diff
changeset
|
108 top = max(self.prev_but.rect.bottom + self.padding, |
d279a7dd166a
Fix paging bug. Better widget spacing
Neil Muller <neil@dip.sun.ac.za>
parents:
707
diff
changeset
|
109 top + 2 * self.padding) |
707 | 110 ok_but = TextButton((left, top), self.gd, 'OK') |
111 ok_but.add_callback('clicked', self.ok) | |
112 self.add(ok_but) | |
113 cancel_but = TextButton( | |
114 (left + ok_but.rect.width + 4 * self.padding, top), | |
115 self.gd, 'Cancel') | |
116 cancel_but.add_callback('clicked', self.cancel) | |
117 self.add(cancel_but) | |
118 | |
119 def change_page(self, ev, widget, change): | |
120 self.page += change | |
121 self.fill_page() | |
122 return True | |
123 | |
124 def change_dir(self, ev, widget, newdir): | |
125 """Change directory and refresh the widget.""" | |
126 self.curdir = os.path.normpath(os.path.join(self.curdir, newdir)) | |
127 self.page = 0 | |
128 self.selected = None | |
129 self.get_lists() | |
130 self.fill_page() | |
131 | |
132 def change_selection(self, ev, widget, entry): | |
133 """Update selection""" | |
134 self.selected = entry | |
710 | 135 self.fill_page() |
707 | 136 |
137 def cancel(self, ev, widget): | |
138 if hasattr(self.parent, 'paused'): | |
139 self.parent.paused = False | |
140 self.parent.remove(self) | |
141 return True | |
142 | |
143 def ok(self, ev, widget): | |
144 if hasattr(self.parent, 'paused'): | |
145 self.parent.paused = False | |
146 self.parent.remove(self) | |
712
f33dd2093f77
Hook up image drawing code again
Neil Muller <neil@dip.sun.ac.za>
parents:
710
diff
changeset
|
147 if self.selected: |
f33dd2093f77
Hook up image drawing code again
Neil Muller <neil@dip.sun.ac.za>
parents:
710
diff
changeset
|
148 self.ok_callback(os.path.normpath(os.path.join(self.curdir, |
f33dd2093f77
Hook up image drawing code again
Neil Muller <neil@dip.sun.ac.za>
parents:
710
diff
changeset
|
149 self.selected))) |
707 | 150 return True |