annotate pyntnclick/widgets/filechooser.py @ 707:6b8fa2248ee1 pyntnclick

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