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