Added missing import
[memo.git] / EditBox.py
blobb22ea300cd155e60db6c41d60c14a7b961b27254
1 import rox
2 from rox import g, FALSE, TRUE
3 import time
5 from Arrow import Arrow
6 from Memo import Memo
7 from main import memo_list
9 from pretty_time import str_time
11 DELETE = 1
12 HIDE = 2
14 refleak_bug_workaround = []
16 class EditBox(g.Dialog):
17 def __init__(self, memo = None):
18 g.Dialog.__init__(self)
19 self.set_has_separator(FALSE)
21 self.add_button(g.STOCK_HELP, g.RESPONSE_HELP)
23 if memo:
24 self.add_button(g.STOCK_DELETE, DELETE)
26 button = rox.ButtonMixed(g.STOCK_ZOOM_OUT, _('_Hide'))
27 button.set_flags(g.CAN_DEFAULT)
28 self.add_action_widget(button, HIDE)
30 self.add_button(g.STOCK_CANCEL, g.RESPONSE_CANCEL)
32 button = rox.ButtonMixed(g.STOCK_YES, _('_Set'))
33 button.set_flags(g.CAN_DEFAULT)
34 self.add_action_widget(button, g.RESPONSE_YES)
36 self.memo = memo
37 if memo:
38 self.set_title(_("Edit memo:"))
39 t = time.localtime(memo.time)
40 else:
41 self.set_title(_("Create memo:"))
42 t = time.localtime(time.time() + 5 * 60)
44 year, month, day, hour, minute, second, weekday, julian, dst = t
45 self.hour = hour
46 self.min = minute
48 self.cal = g.Calendar()
49 self.cal.select_month(month - 1, year)
50 self.cal.select_day(day)
52 at_box = self.make_at_box()
53 self.advanced_box = self.make_advanced_box()
55 text_frame = self.make_text_view()
57 # Time/Date on the left, Text on the right
58 hbox = g.HBox(FALSE, 0)
59 self.vbox.pack_start(hbox, TRUE, TRUE, 0)
61 self.vbox.pack_start(self.advanced_box, FALSE, TRUE, 0)
63 # Date above time
64 vbox = g.VBox(FALSE, 0)
65 hbox.pack_start(vbox, FALSE, TRUE, 0)
66 vbox.set_border_width(4)
67 vbox.pack_start(self.cal, FALSE, TRUE, 0)
69 spacer = g.Alignment()
70 vbox.pack_start(spacer, FALSE, TRUE, 2)
72 vbox.pack_start(at_box, FALSE, TRUE, 0)
74 hbox.pack_start(text_frame, TRUE, TRUE, 0)
76 self.vbox.show_all()
78 if memo:
79 buffer = self.text.get_buffer()
80 try:
81 buffer.insert_at_cursor(memo.message)
82 except TypeError:
83 buffer.insert_at_cursor(memo.message, -1)
84 if memo and memo.at:
85 self.at.set_active(TRUE)
86 self.at.set_label( _('At') )
87 self.advanced_box.set_sensitive(TRUE)
88 if memo == None or memo.at == 0:
89 self.at_box.hide()
90 self.at.set_label( _('At') + "..." )
91 self.advanced_box.set_sensitive(FALSE)
92 if memo:
93 if memo.nosound:
94 self.sound_choice.set_active(2)
95 elif memo.soundfile is not None and memo.soundfile != "":
96 self.sound_choice.set_active(1)
97 self.sound_entry.set_filename( memo.soundfile )
98 self.sound_entry.set_sensitive(TRUE)
99 else:
100 self.sound_choice.set_active(0)
102 self.connect('response', self.response)
103 self.text.grab_focus()
104 self.set_default_response(g.RESPONSE_YES)
106 self.connect('destroy', lambda w: refleak_bug_workaround.remove(self))
107 refleak_bug_workaround.append(self)
109 def make_text_view(self):
110 # The TextView / time of day settings
111 vbox = g.VBox(FALSE, 0)
112 l = g.Label(_('Message:'))
113 l.set_alignment(0, 1)
114 l.set_padding(0, 4)
115 vbox.pack_start(l, FALSE, TRUE, 0)
117 frame = g.Frame()
118 vbox.pack_start(frame, TRUE, TRUE, 0)
119 frame.set_shadow_type(g.SHADOW_IN)
121 hbox = g.HBox(FALSE, 0)
122 frame.add(hbox)
124 text = g.TextView()
125 hbox.pack_start(text, TRUE, TRUE, 0)
126 text.set_wrap_mode(g.WRAP_WORD)
128 scrollbar = g.VScrollbar()
129 adj = scrollbar.get_adjustment()
130 text.set_scroll_adjustments(None, adj)
131 hbox.pack_start(scrollbar, FALSE, TRUE, 0)
133 text.set_size_request(200, 200)
135 self.text = text
137 return vbox
139 def make_at_box(self):
140 # The time of day setting
141 hbox = g.HBox(FALSE, 0)
143 self.at = g.CheckButton(_('At'))
144 hbox.pack_start(self.at, FALSE, TRUE, 4)
145 self.at.connect('toggled', self.at_toggled)
147 at_box = g.HBox(FALSE, 0)
148 self.at_box = at_box
149 hbox.pack_start(at_box, FALSE, TRUE, 0)
151 arrow = Arrow(g.ARROW_LEFT, self.adj_time, -60)
152 at_box.pack_start(arrow, FALSE, TRUE, 0)
153 arrow = Arrow(g.ARROW_RIGHT, self.adj_time, 60)
154 at_box.pack_start(arrow, FALSE, TRUE, 0)
156 self.time_display = g.Label(str_time(self.hour, self.min))
157 self.time_display.set_padding(4, 0)
158 frame = g.Frame()
159 frame.add(self.time_display)
160 at_box.pack_start(frame, FALSE, TRUE, 0)
162 arrow = Arrow(g.ARROW_LEFT, self.adj_time, -1)
163 at_box.pack_start(arrow, FALSE, TRUE, 0)
164 arrow = Arrow(g.ARROW_RIGHT, self.adj_time, 1)
165 at_box.pack_start(arrow, FALSE, TRUE, 0)
167 return hbox
169 def make_advanced_box(self):
170 # The advanced settings
171 expander = g.Expander(_('Advanced Options'))
172 expandvbox = g.VBox(FALSE, 4)
173 expander.add( expandvbox )
175 sound_frame = g.Frame(_('Sound'))
176 #sound_frame.set_shadow_type(g.SHADOW_NONE)
177 label_widget = sound_frame.get_label_widget()
178 label_widget.set_markup('<b>' + _('Sound') + '</b>')
180 expandvbox.pack_start( sound_frame, FALSE, TRUE, 0 )
182 sound_box = g.HBox(FALSE, 4)
183 sound_box.set_border_width(8)
184 sound_frame.add(sound_box)
186 sound_choice = g.combo_box_new_text()
187 self.sound_choice = sound_choice
188 sound_choice.append_text( _('Use default sound') )
189 sound_choice.append_text( _('Use custom sound') )
190 sound_choice.append_text( _('Disabled') )
191 sound_choice.set_active(0)
192 sound_box.pack_start( sound_choice, FALSE, FALSE, 0 )
194 #sound_entry = g.Entry()
195 sound_entry = g.FileChooserButton('Sound File')
196 self.sound_entry = sound_entry
197 sound_entry.set_sensitive( False )
198 sound_box.pack_start( sound_entry, TRUE, TRUE, 0 )
200 sound_choice.connect('changed', self.sound_choice_changed)
202 # TODO: More advanced options can be added to the 'expandbox' vbox, each
203 # in its own frame.
205 return expander
207 def response(self, widget, response):
208 try:
209 if response == DELETE:
210 memo_list.delete(self.memo)
211 elif response == HIDE:
212 self.add(hide = 1)
213 elif response == int(g.RESPONSE_YES):
214 self.add()
215 elif response == int(g.RESPONSE_HELP):
216 from rox import filer
217 filer.open_dir(rox.app_dir + '/Help')
218 return
219 elif response == int(g.RESPONSE_CANCEL):
220 pass
221 elif response == int(g.RESPONSE_DELETE_EVENT):
222 return
223 else:
224 raise Exception("Unknown response: %d" % response)
225 except:
226 rox.report_exception()
227 self.destroy()
229 def add(self, hide = 0):
230 (y, m, d) = self.cal.get_date()
231 t = time.mktime((y, m + 1, d, self.hour, self.min,
232 0, -1, -1, -1))
233 at = self.at_box.flags() & g.VISIBLE
234 buffer = self.text.get_buffer()
235 start = buffer.get_start_iter()
236 end = buffer.get_end_iter()
237 message = buffer.get_text(start, end, TRUE)
238 soundval = self.sound_choice.get_active()
239 if soundval == 2: # Sound disabled
240 sfile = None
241 senabled = True
242 elif soundval == 1: # Custom sound
243 sfile = self.sound_entry.get_filename()
244 senabled = False
245 else: # Default sound
246 sfile = None
247 senabled = False
248 memo = Memo(t, message, at = at != 0, hidden = hide, \
249 soundfile = sfile, nosound = senabled )
250 if self.memo:
251 memo_list.delete(self.memo, update = 0)
252 memo_list.add(memo)
253 memo_list.warn_if_not_visible(memo)
255 def adj_time(self, increment):
256 min = self.min + increment
257 if min < 0 and self.hour == 0:
258 return
259 if min > 59 and self.hour == 23:
260 return
261 if min < 0:
262 min = min + 60
263 self.hour = self.hour - 1
264 if min > 59:
265 min = min - 60
266 self.hour = self.hour + 1
267 self.min = min
268 self.time_display.set_text(str_time(self.hour, self.min))
270 def at_toggled(self, at):
271 if at.get_active():
272 self.at_box.show()
273 self.at.set_label( _('At'))
274 self.advanced_box.set_sensitive(TRUE)
275 else:
276 self.at_box.hide()
277 self.at.set_label( _('At') + "..." )
278 self.advanced_box.set_sensitive(FALSE)
280 def sound_choice_changed(self, choice):
281 value = choice.get_active()
282 self.sound_entry.set_sensitive( value == 1 )