Fix stupid error if src is None.
[rox-archive.git] / box.py
blobff8fa3c1a85100cb500f0bf418e1612cfcc889a5
1 import sys
3 import rox
4 from rox import saving, g, TRUE, FALSE
6 import formats
8 class ArchiveBox(saving.SaveBox, saving.Saveable):
9 "A savebox with an operation selector."
10 def __init__(self):
11 saving.SaveBox.__init__(self, self, '', 'text/plain')
12 self.data = None
14 def destroyed(self):
15 self.operation = None
16 if formats.current_command:
17 formats.current_command.kill()
18 self.connect('destroy', destroyed)
20 def set_in_progress(self, busy):
21 if self.operation:
22 self.operation.set_sensitive(not busy)
23 self.set_response_sensitive(g.RESPONSE_OK, not busy)
25 in_progress = property(None, set_in_progress, None)
27 def build_main_area(self):
28 self.vbox.add(self.save_area)
30 self.operation = g.OptionMenu()
31 self.vbox.pack_start(self.operation, FALSE, TRUE, 0)
32 self.operation.show()
33 self.operation.set_border_width(5)
34 self.updating = 0
36 self.ops_menu = g.Menu()
37 self.operation.set_menu(self.ops_menu)
39 def set_data(self, data):
40 assert not self.data
42 self.data = data
43 self.save_mode = data.mode
44 ops = [op for op in formats.operations if op.can_handle(data)]
46 name = data.default_name
47 self.save_area.entry.set_text(name)
48 start = name.rfind('/') + 1
49 #self.save_area.entry.select_region(start, -1)
50 g.Editable.select_region(self.save_area.entry, start, -1)
52 # Add all supported ops to the menu.
53 self.ops = []
54 last = None
55 for op in ops:
56 if last and last != op.__class__:
57 item = g.MenuItem()
58 item.show()
59 self.ops_menu.append(item)
60 self.ops.append(None)
61 last = op.__class__
62 item = g.MenuItem(str(op))
63 item.show()
64 self.ops_menu.append(item)
65 self.ops.append(op)
67 # Select the default
68 try:
69 self.operation.set_history(self.ops.index(data.default))
70 except ValueError:
71 print >>sys.stderr, "Warning: %s not in ops list!" % data.default
73 self.operation.connect('changed', self.op_changed)
74 self.save_area.entry.connect('changed', self.name_changed)
76 self.save_area.set_type(data.default.type)
78 def name_changed(self, entry):
79 if self.updating:
80 return
81 self.updating = 1
83 name = entry.get_text()
84 i = 0
85 for op in self.ops:
86 if op and name.endswith('.' + op.extension):
87 self.operation.set_history(i)
88 break
89 i += 1
91 self.updating = 0
93 def op_changed(self, operation):
94 op = self.ops[operation.get_history()]
95 assert op
96 self.set_type(op.type)
98 if self.updating:
99 return
100 self.updating = 1
102 name = self.save_area.entry.get_text()
103 for op2 in self.ops:
104 if op2 and name.endswith('.' + op2.extension):
105 name = name[:-len(op2.extension)-1]
106 break
107 if op.add_extension:
108 name += '.' + op.extension
109 self.save_area.entry.set_text(name)
110 start = name.rfind('/') + 1
111 #self.save_area.entry.select_region(start, -1)
112 g.Editable.select_region(self.save_area.entry, start, -1)
114 self.updating = 0
116 def save_to_file(self, path):
117 op = self.ops[self.operation.get_history()]
118 if hasattr(op, 'save_to_file'):
119 self.in_progress = 1
120 try:
121 op.save_to_file(self.data, path)
122 finally:
123 self.in_progress = 0
124 else:
125 saving.Saveable.save_to_file(self, path)
127 def save_to_stream(self, stream):
128 self.in_progress = 1
129 try:
130 op = self.ops[self.operation.get_history()]
131 op.save_to_stream(self.data, stream)
132 finally:
133 self.in_progress = 0