Don't let the default name be the same as the original file. Try it without
[rox-archive.git] / box.py
bloba6d8489fb09efea29e3bcdb7db4bfb682c7d0e85
1 import sys, os
3 import rox
4 from rox import saving, g
6 import formats
8 use_combo_box=hasattr(g, 'ComboBox')
10 class ArchiveBox(saving.SaveBox, saving.Saveable):
11 "A savebox with an operation selector."
12 def __init__(self):
13 self.data = None
14 self.operation = None
15 self.ops = None
16 saving.SaveBox.__init__(self, self, '', 'text/plain')
18 def save_cancelled(self):
19 assert formats.current_command
20 formats.current_command.kill()
22 def set_save_in_progress(self, busy):
23 if self.operation:
24 self.operation.set_sensitive(not busy)
25 saving.SaveBox.set_save_in_progress(self, busy)
27 def build_main_area(self):
28 self.vbox.add(self.save_area)
30 if use_combo_box:
31 self.operation = g.combo_box_new_text()
32 else:
33 self.operation = g.OptionMenu()
34 self.vbox.pack_start(self.operation, False, True, 0)
35 self.operation.show()
36 self.operation.set_border_width(5)
37 self.updating = 0
39 self.delete_choice = g.CheckButton(_('Delete file afterwards?'))
40 self.vbox.pack_start(self.delete_choice, True, True, 0)
42 if not use_combo_box:
43 self.ops_menu = g.Menu()
44 self.operation.set_menu(self.ops_menu)
45 else:
46 self.ops_menu = None
48 def set_data(self, data):
49 assert not self.data
51 self.data = data
52 self.save_mode = data.mode
53 ops = [op for op in formats.operations if op.can_handle(data)]
55 name = data.default_name
56 self.save_area.entry.set_text(name)
57 start = name.rfind('/') + 1
58 #self.save_area.entry.select_region(start, -1)
59 g.Editable.select_region(self.save_area.entry, start, -1)
61 # Add all supported ops to the menu.
62 self.ops = []
63 if use_combo_box:
64 for op in ops:
65 self.operation.append_text(str(op))
66 self.ops.append(op)
67 try:
68 self.operation.set_active(self.ops.index(data.default))
69 except ValueError:
70 print >>sys.stderr, "Warning: %s not in ops list!" % data.default
72 else:
73 last = None
74 for op in ops:
75 if last and last != op.__class__:
76 item = g.MenuItem()
77 item.show()
78 self.ops_menu.append(item)
79 self.ops.append(None)
80 last = op.__class__
81 item = g.MenuItem(str(op))
82 item.show()
83 self.ops_menu.append(item)
84 self.ops.append(op)
86 # Select the default
87 try:
88 self.operation.set_history(self.ops.index(data.default))
89 except ValueError:
90 print >>sys.stderr, "Warning: %s not in ops list!" % data.default
92 self.operation.connect('changed', self.op_changed)
93 self.save_area.entry.connect('changed', self.name_changed)
95 self.save_area.set_type(data.default.type)
97 if isinstance(data, formats.FileData) and data.path != '-':
98 self.delete_choice.show()
100 def name_changed(self, entry):
101 if self.updating:
102 return
103 self.updating = 1
105 name = entry.get_text()
106 i = 0
107 for op in self.ops:
108 if op and name.endswith('.' + op.extension):
109 self.operation.set_history(i)
110 break
111 i += 1
113 self.updating = 0
115 def get_selected_op(self):
116 if use_combo_box:
117 return self.ops[self.operation.get_active()]
118 else:
119 return self.ops[self.operation.get_history()]
121 def op_changed(self, operation):
122 op = self.get_selected_op()
123 assert op
124 self.set_type(op.type)
126 if self.updating:
127 return
128 self.updating = 1
130 name = self.save_area.entry.get_text()
131 for op2 in self.ops:
132 if op2 and name.endswith('.' + op2.extension):
133 name = name[:-len(op2.extension)-1]
134 break
135 if op.add_extension:
136 name += '.' + op.extension
137 self.save_area.entry.set_text(name)
138 start = name.rfind('/') + 1
139 #self.save_area.entry.select_region(start, -1)
140 g.Editable.select_region(self.save_area.entry, start, -1)
142 self.updating = 0
144 def save_to_file(self, path):
145 op = self.get_selected_op()
146 if hasattr(op, 'save_to_file'):
147 op.save_to_file(self.data, path)
148 else:
149 saving.Saveable.save_to_file(self, path)
151 #If the delete_choice is set, try to remove the file
152 if self.delete_choice.get_active():
153 try:
154 os.remove(sys.argv[1])
155 except:
156 rox.report_exception()
158 def can_save_to_selection(self):
159 if self.ops:
160 op = self.get_selected_op()
162 if op.type == 'inode/directory':
163 return False
164 return saving.Saveable.can_save_to_selection(self)
166 def save_to_stream(self, stream):
167 op = self.get_selected_op()
168 op.save_to_stream(self.data, stream)