1 from gi.repository
import Gtk
as gtk
22 self.
window = gtk.Window(gtk.WindowType.TOPLEVEL)
23 self.window.set_title(
'Reliability Testing')
25 self.window.set_border_width(10)
26 self.window.set_default_size(900, 500)
35 self.controls.set(self.
check2)
36 self.controls.hookup(self.
check2)
38 vbox.pack_start(grid,
True,
True, 0)
40 vbox.pack_start(button_box,
False,
False, 0)
43 self.window.show_all()
46 button_box = gtk.HButtonBox()
47 button_box.set_layout(gtk.ButtonBoxStyle.EDGE)
49 back_button = gtk.Button(stock=gtk.STOCK_GO_BACK)
50 button_box.add(back_button)
51 save_button = UIUtils.create_button(
'Save & Exit', UIUtils.BUTTON_ICONS.SAVE, UIUtils.BUTTON_ICON_SIZES.PX32)
52 button_box.add(save_button)
53 next_button = gtk.Button(stock=gtk.STOCK_GO_FORWARD)
54 button_box.add(next_button)
56 next_handler =
lambda w: self.
next_test2(back_button, next_button)
58 if self.check2.test2_index >= len(self.check2.test2s) - 1:
59 next_button.set_label(gtk.STOCK_OK)
62 self.handler_man.add_handler(next_button,
'clicked', next_handler)
63 self.handler_man.add_handler(back_button,
'clicked',
lambda w: self.
back_test2(back_button, next_button))
64 self.handler_man.add_handler(save_button,
'clicked',
lambda w: self.window.destroy())
66 back_button.set_sensitive(self.check2.test2_index > 0)
67 next_button.set_sensitive(self.check2.test2_index < len(self.check2.test2s))
75 if self.controls.scale.get_fill_level() != 300:
76 msgs.append(
'- The segment has not been fully played.')
78 start_iter = self.controls.trans_entry.get_buffer().get_start_iter()
79 end_iter = self.controls.trans_entry.get_buffer().get_end_iter()
80 if not self.controls.trans_entry.get_buffer().get_text(start_iter, end_iter).strip():
81 msgs.append(
'- The transcription box is empty.')
83 if not self.controls.child_voc_spinner.get_value_as_int():
84 msgs.append(
'- No child vocs have been recorded.')
87 dialog_text =
'The following issues have been detected:\n'
88 dialog_text +=
'\n'.join(msgs)
89 dialog_text +=
'\n\nProceed anyway?'
91 complete = UIUtils.show_confirm_dialog(dialog_text)
97 self.check2.test2s[self.check2.test2_index].ui_save_data = self.
_get_ui_save_data()
98 self.check2.test2s[self.check2.test2_index].transcription = self.controls.trans_entry.get_buffer().get_text(self.controls.trans_entry.get_buffer().get_start_iter(),
99 self.controls.trans_entry.get_buffer().get_end_iter())
100 self.check2.test2s[self.check2.test2_index].child_vocs = self.controls.child_voc_spinner.get_value_as_int()
103 if self.check2.test2_index > 0:
106 self.check2.test2_index -= 1
107 self.controls.update_progress_labels(self.
check2)
108 self.controls.unhook()
109 self.controls.set(self.
check2)
110 self.controls.hookup(self.
check2)
112 if self.check2.test2_index == len(self.check2.test2s) - 2:
113 next_button.set_label(gtk.STOCK_GO_FORWARD)
114 self.handler_man.remove_handlers(next_button, [
'clicked'])
115 self.handler_man.add_handler(next_button,
'clicked',
lambda w: self.
next_test2(back_button, next_button))
117 back_button.set_sensitive(self.check2.test2_index > 0)
118 next_button.set_sensitive(self.check2.test2_index < len(self.check2.test2s))
127 num_tests = len(self.check2.test2s)
128 if self.check2.test2_index < num_tests - 1:
129 self.check2.test2_index += 1
130 self.controls.update_progress_labels(self.
check2)
131 self.controls.unhook()
132 self.controls.set(self.
check2)
133 self.controls.hookup(self.
check2)
135 back_button.set_sensitive(self.check2.test2_index > 0)
136 next_button.set_sensitive(self.check2.test2_index < num_tests)
139 if self.check2.test2_index == num_tests - 1:
140 next_button.set_label(gtk.STOCK_OK)
141 self.handler_man.remove_handlers(next_button, [
'clicked'])
142 self.handler_man.add_handler(next_button,
'clicked',
lambda w: self.
save_and_export())
145 def save(self, completed, progress_dialog=None):
149 for i
in range(len(self.check2.test2s)):
150 test2 = self.check2.test2s[i]
151 if test2.db_id !=
None:
156 progress_dialog.set_fraction(float(i + 1) / float(len(self.check2.test2s)))
158 self.check2.update_test2_index(db)
161 self.check2.update_modified(db)
164 if completed
and self.check2.completed ==
None:
165 self.check2.update_completed(db)
169 progress_dialog =
ProgressDialog(title=
'Saving...', phases=[
'Saving records to DB'])
170 progress_dialog.show()
171 self.
save(
False, progress_dialog)
172 progress_dialog.ensure_finish()
173 self.window.destroy()
178 include_trans_check = gtk.CheckButton(
'Include Transcription')
179 checkbuttons.append(include_trans_check)
180 open_now_check = gtk.CheckButton(
'Open Immediately')
181 open_now_check.set_active(
True)
182 checkbuttons.append(open_now_check)
184 filename, results = UIUtils.show_file_dialog_with_checks(
'Save File', [UIUtils.CSV_FILE_FILTER, UIUtils.ALL_FILE_FILTER], gtk.FileChooserAction.SAVE, gtk.STOCK_SAVE, checkbuttons, save_last_location=
True)
187 progress_dialog =
ProgressDialog(title=
'Saving...', phases=[
'Saving records to DB',
'Matching DB records to rows',
'Writing rows to file'])
188 progress_dialog.show()
190 self.
save(
True, progress_dialog)
191 progress_dialog.next_phase()
193 if not filename.lower().endswith(
'.csv'):
197 exporter.export(results[0], progress_update_fcn=progress_dialog.set_fraction, progress_next_fcn=progress_dialog.next_phase)
199 progress_dialog.ensure_finish()
201 self.handler_man.block_handler(self.
window,
'destroy')
202 self.window.destroy()
207 subprocess.Popen([
'%s' % DBConstants.SETTINGS.SPREADSHEET_PATH, filename])
209 UIUtils.show_message_dialog(
'Results exported successfully!')
216 grid.attach(controls.status_grid, 9, 0, 1, 1)
219 grid.attach(controls.scale, 0, 1, 10, 1)
221 snd_ctrl_hbox = gtk.HBox()
222 snd_ctrl_hbox.pack_start(controls.prev_button,
True,
True, 0)
223 snd_ctrl_hbox.pack_start(controls.play_button,
True,
True, 0)
224 snd_ctrl_hbox.pack_start(controls.next_button,
True,
True, 0)
226 grid.attach(snd_ctrl_hbox, 4, 2, 2, 1)
228 clip_len_hbox = gtk.HBox()
229 clip_label = gtk.Label(
'Clip Length:')
230 clip_label.set_justify(gtk.JUSTIFY_RIGHT)
231 clip_len_hbox.pack_start(clip_label,
True,
True, 0)
232 clip_len_hbox.pack_start(controls.clip_spinner,
True,
True, 0)
234 grid.attach(clip_len_hbox, 6, 2, 1, 1)
236 child_voc_hbox = gtk.HBox()
237 child_voc_label = gtk.Label(
'Child Vocs:')
238 child_voc_label.set_justify(gtk.JUSTIFY_RIGHT)
239 child_voc_hbox.pack_start(child_voc_label,
True,
True, 0)
240 child_voc_hbox.pack_start(controls.child_voc_spinner,
True,
True, 0)
242 grid.attach(child_voc_hbox, 7, 2, 1, 1)
244 trans_label = gtk.Label(
'Transcription:')
245 trans_label.set_justify(gtk.JUSTIFY_LEFT)
247 grid.attach(trans_label, 0, 3, 1, 1)
249 scrolled_win = gtk.ScrolledWindow()
250 scrolled_win.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
251 scrolled_win.add(controls.trans_entry)
253 grid.attach(scrolled_win, 0, 4, 10, 5)
255 word_count_hbox = gtk.HBox()
256 words_label = gtk.Label(
'Word Count:')
257 words_label.set_justify(gtk.JUSTIFY_RIGHT)
258 word_count_hbox.pack_start(words_label,
True,
True, 0)
259 word_count_hbox.pack_end(controls.words_entry,
True,
True, 0)
261 grid.attach(word_count_hbox, 0, 9, 1, 1)
266 save_data = self.controls.get_ui_save_data()
278 name_label = gtk.Label(
'Environment: ')
279 name_label.set_justify(gtk.JUSTIFY_RIGHT)
281 self.status_grid.attach(name_label, 0, 0, 1, 1)
283 self.env_label.set_justify(gtk.JUSTIFY_LEFT)
285 self.status_grid.attach(self.
env_label, 1, 0, 1, 1)
287 name_label = gtk.Label(
'Activity: ')
288 name_label.set_justify(gtk.JUSTIFY_RIGHT)
290 self.status_grid.attach(name_label, 0, 1, 1, 1)
292 self.act_label.set_justify(gtk.JUSTIFY_LEFT)
294 self.status_grid.attach(self.
act_label, 1, 1, 1, 1)
296 name_label = gtk.Label(
'Block: ')
297 name_label.set_justify(gtk.JUSTIFY_RIGHT)
299 self.status_grid.attach(name_label, 0, 2, 1, 1)
301 self.block_label.set_justify(gtk.JUSTIFY_LEFT)
303 self.status_grid.attach(self.
block_label, 1, 2, 1, 1)
308 self.next_button.set_use_stock(
True)
310 scale_adj = gtk.Adjustment(value=0, lower=0, upper=300, step_incr=10, page_incr=10, page_size=0)
312 self.scale.set_show_fill_level(
True)
313 self.scale.set_restrict_to_fill_level(
True)
314 self.scale.set_fill_level(0)
315 self.scale.set_draw_value(
False)
316 self.scale.set_update_policy(gtk.UPDATE_DISCONTINUOUS)
318 clip_adj = gtk.Adjustment(value=10, lower=1, upper=300, step_incr=1, page_incr=10)
321 child_voc_adj = gtk.Adjustment(value=0, lower=0, upper=1000000, step_incr=1, page_incr=10)
325 self.trans_entry.set_wrap_mode(gtk.WRAP_WORD)
328 self.words_entry.set_sensitive(
False)
329 self.words_entry.set_width_chars(4)
330 self.words_entry.set_text(
'0')
333 text_buf = self.trans_entry.get_buffer()
334 text = text_buf.get_text( text_buf.get_start_iter(), text_buf.get_end_iter() )
335 num_words = BackendUtils.get_word_count(text)
336 self.words_entry.set_text(str(num_words))
339 adj.set_value(self.sm.markers[self.sm.marker_index])
342 env_index = check2.test2_index / (len(check2.activities) * check2.blocks_per_activity)
343 act_index = (check2.test2_index / check2.blocks_per_activity) % len(check2.activities)
344 block_index = check2.test2_index % check2.blocks_per_activity
346 self.env_label.set_text(
'%d of %d (%s)' % (env_index + 1, len(check2.environments), check2.environments[env_index]))
347 self.act_label.set_text(
'%d of %d (%s)' % (act_index + 1, len(check2.activities), check2.activities[act_index]))
348 self.block_label.set_text(
'%d of %d' % (block_index + 1, check2.blocks_per_activity))
351 test2 = check2.test2s[check2.test2_index]
353 self.scale.clear_marks()
361 if test2.ui_save_data:
362 scale_val = test2.ui_save_data[
'markers'][test2.ui_save_data[
'marker_index']]
363 fill_lev = test2.ui_save_data[
'fill_lev']
364 clip_len_val = test2.ui_save_data[
'markers'][test2.ui_save_data[
'marker_index'] + 1] - test2.ui_save_data[
'markers'][test2.ui_save_data[
'marker_index']]
365 trans = test2.transcription
366 child_vocs = test2.child_vocs
367 markers = test2.ui_save_data[
'markers']
369 self.scale.set_fill_level(fill_lev)
370 self.scale.set_value(scale_val)
371 self.clip_spinner.set_value(clip_len_val)
372 self.trans_entry.get_buffer().set_text(trans)
375 self.child_voc_spinner.set_value(child_vocs)
377 self.scale.add_mark(pos, gtk.POS_BOTTOM, BackendUtils.get_time_str(pos, pad_hour_min=
False, show_hours=
False, show_decimals=
False))
382 test2 = check2.test2s[check2.test2_index]
386 self.handler_man.add_handler(self.
next_button,
'clicked',
lambda w: self.sm.drive(TestWindow.TestStateMachine.ACTIONS.NEXT))
387 self.handler_man.add_handler(self.
prev_button,
'clicked',
lambda w: self.sm.drive(TestWindow.TestStateMachine.ACTIONS.PREV))
388 self.handler_man.add_handler(self.
play_button,
'clicked',
lambda w: self.sm.drive(TestWindow.TestStateMachine.ACTIONS.PLAY))
390 self.handler_man.add_handler(self.
clip_spinner,
'value-changed',
lambda w: self.sm.drive(TestWindow.TestStateMachine.ACTIONS.ADJUST))
391 self.handler_man.add_handler(self.scale.get_adjustment(),
'value-changed', self.
_snap_scale)
393 self.handler_man.add_handler(self.trans_entry.get_buffer(),
'changed',
lambda w: self.
_update_word_count())
395 self.handler_man.add_handler(self.
child_voc_spinner,
'value-changed',
lambda w: self.trans_entry.grab_focus())
398 self.handler_man.remove_handlers(self.
next_button, [
'clicked'])
399 self.handler_man.remove_handlers(self.
prev_button, [
'clicked'])
400 self.handler_man.remove_handlers(self.
play_button, [
'clicked'])
402 self.handler_man.remove_handlers(self.
clip_spinner, [
'value-changed'])
403 self.handler_man.remove_handlers(self.scale.get_adjustment(), [
'value-changed'])
405 self.handler_man.remove_handlers(self.trans_entry.get_buffer(), [
'changed'])
412 save_data = self.sm.get_ui_save_data()
if self.
sm else {}
418 STATES =
Enum(
'INITIAL MARKER_UNPLAYED MARKER_PLAYED'.split())
419 ACTIONS =
Enum(
'NEXT PREV PLAY ADJUST'.split())
425 self.
seg_len = self.controls.scale.get_adjustment().get_upper()
428 TestWindow.TestStateMachine.STATES.INITIAL:
lambda action: self.
_initial(),
430 TestWindow.TestStateMachine.STATES.MARKER_PLAYED: self.
_marker_played,
433 if self.test2.ui_save_data:
434 self.
markers = self.test2.ui_save_data[
'markers']
436 self.
state = self.test2.ui_save_data[
'sm_state']
440 self.
state = TestWindow.TestStateMachine.STATES.INITIAL
444 self.controls.handler_man.block_handler(self.controls.clip_spinner,
'value-changed')
447 self.controls.clip_spinner.set_sensitive(enabled)
450 self.controls.clip_spinner.set_value(val)
452 self.controls.handler_man.unblock_handler(self.controls.clip_spinner,
'value-changed')
456 self.markers.append(pos)
457 self.controls.scale.add_mark(pos, gtk.POS_BOTTOM, BackendUtils.get_time_str(pos, pad_hour_min=
False, show_hours=
False, show_decimals=
False))
460 self.controls.handler_man.block_handler(self.controls.scale.get_adjustment(),
'value-changed')
462 self.controls.handler_man.unblock_handler(self.controls.scale.get_adjustment(),
'value-changed')
465 if self.controls.scale.get_fill_level() < lev:
466 self.controls.scale.set_fill_level(lev)
471 self.controls.trans_entry.grab_focus()
480 'sm_state': self.
state,
481 'fill_lev': self.controls.scale.get_fill_level(),
485 wav_parser =
WavParser(self.test2.wav_filename)
486 wav_parser.play_clip(start, end)
492 next_pos = self.controls.clip_spinner.get_value_as_int()
494 max_pos = self.controls.scale.get_adjustment().get_upper()
495 if next_pos >= max_pos:
499 self.
state = TestWindow.TestStateMachine.STATES.MARKER_UNPLAYED
502 if action == TestWindow.TestStateMachine.ACTIONS.NEXT:
505 elif action == TestWindow.TestStateMachine.ACTIONS.PREV:
510 self.
state = TestWindow.TestStateMachine.STATES.MARKER_PLAYED
513 elif action == TestWindow.TestStateMachine.ACTIONS.PLAY:
515 if self.controls.scale.get_fill_level() < fill_lev:
516 self.controls.scale.set_fill_level(fill_lev)
517 self.
state = TestWindow.TestStateMachine.STATES.MARKER_PLAYED
519 wav_offset_sec = self.test2.get_start_time_offset()
522 t = threading.Thread(target=self.
_play_clip, args=(start, end))
525 elif action == TestWindow.TestStateMachine.ACTIONS.ADJUST:
527 max_pos = self.controls.scale.get_adjustment().get_upper()
528 fill_lev = self.controls.scale.get_fill_level()
530 if new_pos > max_pos:
533 self.controls.scale.clear_marks()
539 self.controls.scale.set_fill_level(fill_lev)
543 if action == TestWindow.TestStateMachine.ACTIONS.NEXT:
544 max_pos = self.controls.scale.get_adjustment().get_upper()
552 if next_pos > max_pos:
559 self.
state = TestWindow.TestStateMachine.STATES.MARKER_UNPLAYED
561 elif action == TestWindow.TestStateMachine.ACTIONS.PREV:
568 elif action == TestWindow.TestStateMachine.ACTIONS.PLAY:
569 self.controls.trans_entry.grab_focus()
570 wav_offset_sec = self.test2.get_start_time_offset()
573 t = threading.Thread(target=self.
_play_clip, args=(start, end))
576 elif action == TestWindow.TestStateMachine.ACTIONS.ADJUST:
578 max_pos = self.controls.scale.get_adjustment().get_upper()
580 if new_pos > max_pos:
583 self.controls.scale.clear_marks()
589 self.controls.scale.set_fill_level(self.
markers[-2])
593 self.
state = TestWindow.TestStateMachine.STATES.MARKER_UNPLAYED