Mercurial > pyntnclick
annotate pyntnclick/widgets/filechooser.py @ 718:ab489f7e87f8 pyntnclick
Make filechooser widget presistent, to avoid constantly descending directory trees
author | Neil Muller <neil@dip.sun.ac.za> |
---|---|
date | Mon, 06 Aug 2012 11:17:27 +0200 |
parents | f33dd2093f77 |
children | f5e381e819a1 |
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 | |
718
ab489f7e87f8
Make filechooser widget presistent, to avoid constantly descending directory trees
Neil Muller <neil@dip.sun.ac.za>
parents:
712
diff
changeset
|
39 def refresh(self): |
ab489f7e87f8
Make filechooser widget presistent, to avoid constantly descending directory trees
Neil Muller <neil@dip.sun.ac.za>
parents:
712
diff
changeset
|
40 self.page = 0 |
ab489f7e87f8
Make filechooser widget presistent, to avoid constantly descending directory trees
Neil Muller <neil@dip.sun.ac.za>
parents:
712
diff
changeset
|
41 self.selected = None |
ab489f7e87f8
Make filechooser widget presistent, to avoid constantly descending directory trees
Neil Muller <neil@dip.sun.ac.za>
parents:
712
diff
changeset
|
42 self.get_lists() |
ab489f7e87f8
Make filechooser widget presistent, to avoid constantly descending directory trees
Neil Muller <neil@dip.sun.ac.za>
parents:
712
diff
changeset
|
43 self.fill_page() |
ab489f7e87f8
Make filechooser widget presistent, to avoid constantly descending directory trees
Neil Muller <neil@dip.sun.ac.za>
parents:
712
diff
changeset
|
44 |
707 | 45 def _dir_button(self, entry): |
46 widget = TextButton((0, 0), self.gd, entry + '/', | |
47 fontname=self.gd.constants.bold_font, | |
48 fontsize=10) | |
49 widget.add_callback('clicked', self.change_dir, entry) | |
50 return widget | |
51 | |
52 def _file_button(self, entry): | |
53 if entry == self.selected: | |
54 # highlight | |
55 widget = TextButton((0, 0), self.gd, entry, | |
710 | 56 fontsize=10, border=2, color='yellow') |
707 | 57 else: |
710 | 58 widget = TextButton((0, 0), self.gd, entry, border=0, |
59 fontsize=10) | |
60 widget.add_callback('clicked', self.change_selection, entry) | |
707 | 61 return widget |
62 | |
63 def fill_page(self): | |
64 for widget in self.children[:]: | |
65 self.remove(widget) | |
66 start_page = self.page * self.page_length | |
67 end_page = start_page + self.page_length | |
68 entries = self.dirs + self.files | |
69 top = self.rect.top + self.padding | |
70 left = self.rect.left + self.padding | |
71 # Add current directory at the top | |
72 widget = LabelWidget((0, 0), self.gd, self.curdir[-30:], color='black') | |
73 widget.rect.topleft = (left, top) | |
74 self.add(widget) | |
709
d279a7dd166a
Fix paging bug. Better widget spacing
Neil Muller <neil@dip.sun.ac.za>
parents:
707
diff
changeset
|
75 upbut = TextButton((left + 2 * self.padding + widget.rect.width, top), |
707 | 76 self.gd, u'\N{LEFTWARDS ARROW WITH HOOK}Back one level') |
77 upbut.add_callback('clicked', self.change_dir, os.pardir) | |
78 self.add(upbut) | |
79 top += max(widget.rect.height, upbut.rect.height) + 4 * self.padding | |
80 page_top = top | |
81 page_left = left | |
709
d279a7dd166a
Fix paging bug. Better widget spacing
Neil Muller <neil@dip.sun.ac.za>
parents:
707
diff
changeset
|
82 top += self.padding |
707 | 83 for entry in entries[start_page:end_page]: |
84 if entry in self.dirs: | |
85 widget = self._dir_button(entry) | |
86 else: | |
87 widget = self._file_button(entry) | |
88 widget.rect.topleft = (left, top) | |
89 self.add(widget) | |
90 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
|
91 page_left = max(page_left, left + widget.rect.width + self.padding) |
707 | 92 # Add page list buttons |
93 if not self.prev_but: | |
94 self.prev_but = TextButton((0, 0), self.gd, u'\N{UPWARDS ARROW}') | |
95 self.prev_but.add_callback('clicked', self.change_page, -1) | |
96 self.prev_but.rect.topleft = (page_left, page_top) | |
97 if not self.next_but: | |
98 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
|
99 self.next_but.add_callback('clicked', self.change_page, +1) |
707 | 100 page_top = max(top - self.next_but.rect.height, |
101 self.prev_but.rect.bottom + self.padding) | |
102 self.next_but.rect.topleft = (page_left, page_top) | |
103 if self.page > 0: | |
104 self.prev_but.enable() | |
105 else: | |
106 self.prev_but.disable() | |
709
d279a7dd166a
Fix paging bug. Better widget spacing
Neil Muller <neil@dip.sun.ac.za>
parents:
707
diff
changeset
|
107 if end_page + 1 < len(entries): |
707 | 108 self.next_but.enable() |
109 else: | |
110 self.next_but.disable() | |
111 self.add(self.next_but) | |
112 self.add(self.prev_but) | |
113 # Add OK and Cancel buttons | |
709
d279a7dd166a
Fix paging bug. Better widget spacing
Neil Muller <neil@dip.sun.ac.za>
parents:
707
diff
changeset
|
114 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
|
115 top + 2 * self.padding) |
707 | 116 ok_but = TextButton((left, top), self.gd, 'OK') |
117 ok_but.add_callback('clicked', self.ok) | |
118 self.add(ok_but) | |
119 cancel_but = TextButton( | |
120 (left + ok_but.rect.width + 4 * self.padding, top), | |
121 self.gd, 'Cancel') | |
122 cancel_but.add_callback('clicked', self.cancel) | |
123 self.add(cancel_but) | |
124 | |
125 def change_page(self, ev, widget, change): | |
126 self.page += change | |
127 self.fill_page() | |
128 return True | |
129 | |
130 def change_dir(self, ev, widget, newdir): | |
131 """Change directory and refresh the widget.""" | |
132 self.curdir = os.path.normpath(os.path.join(self.curdir, newdir)) | |
133 self.page = 0 | |
134 self.selected = None | |
135 self.get_lists() | |
136 self.fill_page() | |
137 | |
138 def change_selection(self, ev, widget, entry): | |
139 """Update selection""" | |
140 self.selected = entry | |
710 | 141 self.fill_page() |
707 | 142 |
143 def cancel(self, ev, widget): | |
144 if hasattr(self.parent, 'paused'): | |
145 self.parent.paused = False | |
146 self.parent.remove(self) | |
147 return True | |
148 | |
149 def ok(self, ev, widget): | |
150 if hasattr(self.parent, 'paused'): | |
151 self.parent.paused = False | |
152 self.parent.remove(self) | |
712
f33dd2093f77
Hook up image drawing code again
Neil Muller <neil@dip.sun.ac.za>
parents:
710
diff
changeset
|
153 if self.selected: |
f33dd2093f77
Hook up image drawing code again
Neil Muller <neil@dip.sun.ac.za>
parents:
710
diff
changeset
|
154 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
|
155 self.selected))) |
707 | 156 return True |