2 from rox
import g
, FALSE
, TRUE
5 from Arrow
import Arrow
7 from main
import memo_list
9 from pretty_time
import str_time
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
)
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
)
38 self
.set_title(_("Edit memo:"))
39 t
= time
.localtime(memo
.time
)
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
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)
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)
79 buffer = self
.text
.get_buffer()
81 buffer.insert_at_cursor(memo
.message
)
83 buffer.insert_at_cursor(memo
.message
, -1)
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:
90 self
.at
.set_label( _('At') + "..." )
91 self
.advanced_box
.set_sensitive(FALSE
)
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
)
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)
115 vbox
.pack_start(l
, FALSE
, TRUE
, 0)
118 vbox
.pack_start(frame
, TRUE
, TRUE
, 0)
119 frame
.set_shadow_type(g
.SHADOW_IN
)
121 hbox
= g
.HBox(FALSE
, 0)
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)
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)
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)
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)
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
207 def response(self
, widget
, response
):
209 if response
== DELETE
:
210 memo_list
.delete(self
.memo
)
211 elif response
== HIDE
:
213 elif response
== int(g
.RESPONSE_YES
):
215 elif response
== int(g
.RESPONSE_HELP
):
216 from rox
import filer
217 filer
.open_dir(rox
.app_dir
+ '/Help')
219 elif response
== int(g
.RESPONSE_CANCEL
):
221 elif response
== int(g
.RESPONSE_DELETE_EVENT
):
224 raise Exception("Unknown response: %d" % response
)
226 rox
.report_exception()
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,
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
242 elif soundval
== 1: # Custom sound
243 sfile
= self
.sound_entry
.get_filename()
245 else: # Default sound
248 memo
= Memo(t
, message
, at
= at
!= 0, hidden
= hide
, \
249 soundfile
= sfile
, nosound
= senabled
)
251 memo_list
.delete(self
.memo
, update
= 0)
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:
259 if min > 59 and self
.hour
== 23:
263 self
.hour
= self
.hour
- 1
266 self
.hour
= self
.hour
+ 1
268 self
.time_display
.set_text(str_time(self
.hour
, self
.min))
270 def at_toggled(self
, at
):
273 self
.at
.set_label( _('At'))
274 self
.advanced_box
.set_sensitive(TRUE
)
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 )