def test_ui_line_slider_2d_horizontal_top(recording=False): filename = "test_ui_line_slider_2d_horizontal_top" recording_filename = pjoin(DATA_DIR, filename + ".log.gz") expected_events_counts_filename = pjoin(DATA_DIR, filename + ".json") line_slider_2d_test = ui.LineSlider2D(initial_value=-2, min_value=-5, max_value=5, orientation="horizontal", text_alignment='top') line_slider_2d_test.center = (300, 300) # Assign the counter callback to every possible event. event_counter = EventCounter() event_counter.monitor(line_slider_2d_test) current_size = (600, 600) show_manager = window.ShowManager(size=current_size, title="FURY Horizontal Line Slider") show_manager.scene.add(line_slider_2d_test) if recording: show_manager.record_events_to_file(recording_filename) print(list(event_counter.events_counts.items())) event_counter.save(expected_events_counts_filename) else: show_manager.play_events_from_file(recording_filename) expected = EventCounter.load(expected_events_counts_filename) event_counter.check_counts(expected)
def test_ui_ring_slider_2d(recording=False): filename = "test_ui_ring_slider_2d" recording_filename = pjoin(DATA_DIR, filename + ".log.gz") expected_events_counts_filename = pjoin(DATA_DIR, filename + ".json") ring_slider_2d_test = ui.RingSlider2D() ring_slider_2d_test.center = (300, 300) ring_slider_2d_test.value = 90 # Assign the counter callback to every possible event. event_counter = EventCounter() event_counter.monitor(ring_slider_2d_test) current_size = (600, 600) show_manager = window.ShowManager(size=current_size, title="FURY Ring Slider") show_manager.scene.add(ring_slider_2d_test) if recording: # Record the following events # 1. Left Click on the handle and hold it # 2. Move to the left the handle and make 1.5 tour # 3. Release the handle # 4. Left Click on the handle and hold it # 5. Move to the right the handle and make 1 tour # 6. Release the handle show_manager.record_events_to_file(recording_filename) print(list(event_counter.events_counts.items())) event_counter.save(expected_events_counts_filename) else: show_manager.play_events_from_file(recording_filename) expected = EventCounter.load(expected_events_counts_filename) event_counter.check_counts(expected)
def test_ui_textbox(recording=False): filename = "test_ui_textbox" recording_filename = pjoin(DATA_DIR, filename + ".log.gz") expected_events_counts_filename = pjoin(DATA_DIR, filename + ".json") # TextBox textbox_test = ui.TextBox2D(height=3, width=10, text="Text") another_textbox_test = ui.TextBox2D(height=3, width=10, text="Enter Text") another_textbox_test.set_message("Enter Text") # Assign the counter callback to every possible event. event_counter = EventCounter() event_counter.monitor(textbox_test) current_size = (600, 600) show_manager = window.ShowManager(size=current_size, title="FURY TextBox") show_manager.scene.add(textbox_test) if recording: show_manager.record_events_to_file(recording_filename) print(list(event_counter.events_counts.items())) event_counter.save(expected_events_counts_filename) else: show_manager.play_events_from_file(recording_filename) expected = EventCounter.load(expected_events_counts_filename) event_counter.check_counts(expected)
def test_ui_radio_button_initial_state(recording=False): filename = "test_ui_radio_button_initial" recording_filename = pjoin(DATA_DIR, filename + ".log.gz") expected_events_counts_filename = pjoin(DATA_DIR, filename + ".json") radio_button_test = ui.RadioButton( labels=["option 1", "option 2\nOption 2", "option 3", "option 4"], position=(100, 100), checked_labels=['option 4']) selected_option = [] def _on_change(radio_button): selected_option.append(radio_button.checked_labels) # Set up a callback when selection changes radio_button_test.on_change = _on_change event_counter = EventCounter() event_counter.monitor(radio_button_test) # Create a show manager and record/play events. show_manager = window.ShowManager(size=(600, 600), title="FURY Checkbox") show_manager.scene.add(radio_button_test) if recording: show_manager.record_events_to_file(recording_filename) print(list(event_counter.events_counts.items())) event_counter.save(expected_events_counts_filename) else: # Recorded events: # 1. Click on button of option 1. # 2. Click on button of option 2. # 3. Click on button of option 2. # 4. Click on text of option 2. # 5. Click on button of option 1. # 6. Click on text of option 3. # 7. Click on button of option 4. # 8. Click on text of option 4. show_manager.play_events_from_file(recording_filename) expected = EventCounter.load(expected_events_counts_filename) event_counter.check_counts(expected) # Check if the right options were selected. expected = [['option 1'], ['option 2\nOption 2'], ['option 2\nOption 2'], ['option 2\nOption 2'], ['option 1'], ['option 3'], ['option 4'], ['option 4']] npt.assert_equal(len(selected_option), len(expected)) assert_arrays_equal(selected_option, expected)
def test_ui_tab_ui(interactive=False): filename = "test_ui_tab_ui" recording_filename = pjoin(DATA_DIR, filename + ".log.gz") expected_events_counts_filename = pjoin(DATA_DIR, filename + ".json") tab_ui = ui.TabUI(position=(50, 50), size=(300, 300), nb_tabs=3, draggable=True) tab_ui.tabs[0].title = "Tab 1" tab_ui.tabs[1].title = "Tab 2" tab_ui.tabs[2].title = "Tab 3" tab_ui.add_element(0, ui.Checkbox(["Option 1", "Option 2"]), (0.5, 0.5)) tab_ui.add_element(1, ui.LineSlider2D(), (0.0, 0.5)) tab_ui.add_element(2, ui.TextBlock2D(), (0.5, 0.5)) with npt.assert_raises(IndexError): tab_ui.add_element(3, ui.TextBlock2D(), (0.5, 0.5, 0.5)) with npt.assert_raises(IndexError): tab_ui.remove_element(3, ui.TextBlock2D()) with npt.assert_raises(IndexError): tab_ui.update_element(3, ui.TextBlock2D(), (0.5, 0.5, 0.5)) npt.assert_equal("Tab 1", tab_ui.tabs[0].title) npt.assert_equal("Tab 2", tab_ui.tabs[1].title) npt.assert_equal("Tab 3", tab_ui.tabs[2].title) npt.assert_equal(3, tab_ui.nb_tabs) collapses = itertools.count() changes = itertools.count() def collapse(tab_ui): if tab_ui.collapsed: next(collapses) def tab_change(tab_ui): next(changes) tab_ui.on_change = tab_change tab_ui.on_collapse = collapse event_counter = EventCounter() event_counter.monitor(tab_ui) current_size = (800, 800) show_manager = window.ShowManager(size=current_size, title="Tab UI Test") show_manager.scene.add(tab_ui) if interactive: show_manager.record_events_to_file(recording_filename) print(list(event_counter.events_counts.items())) event_counter.save(expected_events_counts_filename) else: show_manager.play_events_from_file(recording_filename) expected = EventCounter.load(expected_events_counts_filename) event_counter.check_counts(expected) npt.assert_equal(0, tab_ui.active_tab_idx) npt.assert_equal(11, next(changes)) npt.assert_equal(5, next(collapses))
def test_grid_ui2(interactive=False): vol1 = np.zeros((100, 100, 100)) vol1[25:75, 25:75, 25:75] = 100 colors = distinguishable_colormap(nb_colors=3) contour_actor1 = actor.contour_from_roi(vol1, np.eye(4), colors[0], 1.) vol2 = np.zeros((100, 100, 100)) vol2[25:75, 25:75, 25:75] = 100 contour_actor2 = actor.contour_from_roi(vol2, np.eye(4), colors[1], 1.) vol3 = np.zeros((100, 100, 100)) vol3[25:75, 25:75, 25:75] = 100 contour_actor3 = actor.contour_from_roi(vol3, np.eye(4), colors[2], 1.) scene = window.Scene() actors = [] texts = [] actors.append(contour_actor1) text_actor1 = actor.text_3d('cube 1', justification='center') texts.append(text_actor1) actors.append(contour_actor2) text_actor2 = actor.text_3d('cube 2', justification='center') texts.append(text_actor2) actors.append(contour_actor3) text_actor3 = actor.text_3d('cube 3', justification='center') texts.append(text_actor3) actors.append(shallow_copy(contour_actor1)) text_actor1 = actor.text_3d('cube 4', justification='center') texts.append(text_actor1) actors.append(shallow_copy(contour_actor2)) text_actor2 = actor.text_3d('cube 5', justification='center') texts.append(text_actor2) actors.append(shallow_copy(contour_actor3)) text_actor3 = actor.text_3d('cube 6', justification='center') texts.append(text_actor3) actors.append(shallow_copy(contour_actor1)) text_actor1 = actor.text_3d('cube 7', justification='center') texts.append(text_actor1) actors.append(shallow_copy(contour_actor2)) text_actor2 = actor.text_3d('cube 8', justification='center') texts.append(text_actor2) actors.append(shallow_copy(contour_actor3)) text_actor3 = actor.text_3d('cube 9', justification='center') texts.append(text_actor3) # this needs to happen automatically when start() ends. # for act in actors: # act.RemoveAllObservers() filename = "test_grid_ui" recording_filename = pjoin(DATA_DIR, filename + ".log.gz") expected_events_counts_filename = pjoin(DATA_DIR, filename + ".json") current_size = (900, 600) scene = window.Scene() show_manager = window.ShowManager(scene, size=current_size, title="FURY GridUI") show_manager.initialize() grid_ui2 = ui.GridUI(actors=actors, captions=texts, caption_offset=(0, -50, 0), cell_padding=(60, 60), dim=(3, 3), rotation_axis=None) scene.add(grid_ui2) event_counter = EventCounter() event_counter.monitor(grid_ui2) if interactive: show_manager.start() recording = False if recording: # Record the following events # 1. Left click on top left box (will rotate the box) show_manager.record_events_to_file(recording_filename) # print(list(event_counter.events_counts.items())) event_counter.save(expected_events_counts_filename) else: show_manager.play_events_from_file(recording_filename) expected = EventCounter.load(expected_events_counts_filename) event_counter.check_counts(expected)
def test_ui_combobox_2d(interactive=False): filename = "test_ui_combobox_2d" recording_filename = pjoin(DATA_DIR, filename + ".log.gz") expected_events_counts_filename = pjoin(DATA_DIR, filename + ".json") values = ["An Item" + str(i) for i in range(0, 5)] new_values = ["An Item5", "An Item6"] combobox = ui.ComboBox2D( items=values, position=(400, 400), size=(300, 200)) # Assign the counter callback to every possible event. event_counter = EventCounter() event_counter.monitor(combobox) current_size = (800, 800) show_manager = window.ShowManager( size=current_size, title="ComboBox UI Example") show_manager.scene.add(combobox) values.extend(new_values) combobox.append_item(*new_values) npt.assert_equal(values, combobox.items) values.append("An Item7") combobox.append_item("An Item7") npt.assert_equal(values, combobox.items) values.append("An Item8") values.append("An Item9") combobox.append_item("An Item8", "An Item9") npt.assert_equal(values, combobox.items) complex_list = [[0], (1, [[2, 3], 4], 5)] combobox.append_item(*complex_list) values.extend([str(i) for i in range(6)]) npt.assert_equal(values, combobox.items) invalid_item = {"Hello": 1, "World": 2} npt.assert_raises(TypeError, combobox.append_item, invalid_item) npt.assert_equal(values, combobox.items) npt.assert_equal((60, 60), combobox.drop_button_size) npt.assert_equal([300, 140], combobox.drop_menu_size) npt.assert_equal([300, 200], combobox.size) ui.ComboBox2D(items=values, draggable=False) if interactive: show_manager.record_events_to_file(recording_filename) print(list(event_counter.events_counts.items())) event_counter.save(expected_events_counts_filename) else: show_manager.play_events_from_file(recording_filename) expected = EventCounter.load(expected_events_counts_filename) event_counter.check_counts(expected) npt.assert_equal("An Item1", combobox.selected_text) npt.assert_equal(1, combobox.selected_text_index) combobox.resize((450, 300)) npt.assert_equal((360, 90), combobox.text_block_size) npt.assert_equal((90, 90), combobox.drop_button_size) npt.assert_equal((450, 210), combobox.drop_menu_size)
def test_ui_button_panel(recording=False): filename = "test_ui_button_panel" recording_filename = pjoin(DATA_DIR, filename + ".log.gz") expected_events_counts_filename = pjoin(DATA_DIR, filename + ".json") # Rectangle rectangle_test = ui.Rectangle2D(size=(10, 10)) another_rectangle_test = ui.Rectangle2D(size=(1, 1)) # Button fetch_viz_icons() icon_files = [] icon_files.append(('stop', read_viz_icons(fname='stop2.png'))) icon_files.append(('play', read_viz_icons(fname='play3.png'))) button_test = ui.Button2D(icon_fnames=icon_files) button_test.center = (20, 20) def make_invisible(i_ren, _obj, button): # i_ren: CustomInteractorStyle # obj: vtkActor picked # button: Button2D button.set_visibility(False) i_ren.force_render() i_ren.event.abort() def modify_button_callback(i_ren, _obj, button): # i_ren: CustomInteractorStyle # obj: vtkActor picked # button: Button2D button.next_icon() i_ren.force_render() button_test.on_right_mouse_button_pressed = make_invisible button_test.on_left_mouse_button_pressed = modify_button_callback button_test.scale((2, 2)) button_color = button_test.color button_test.color = button_color # TextBlock text_block_test = ui.TextBlock2D() text_block_test.message = 'TextBlock' text_block_test.color = (0, 0, 0) # Panel panel = ui.Panel2D(size=(300, 150), position=(290, 15), color=(1, 1, 1), align="right") panel.add_element(rectangle_test, (290, 135)) panel.add_element(button_test, (0.1, 0.1)) panel.add_element(text_block_test, (0.7, 0.7)) npt.assert_raises(ValueError, panel.add_element, another_rectangle_test, (10., 0.5)) npt.assert_raises(ValueError, panel.add_element, another_rectangle_test, (-0.5, 0.5)) # Assign the counter callback to every possible event. event_counter = EventCounter() event_counter.monitor(button_test) event_counter.monitor(panel.background) current_size = (600, 600) show_manager = window.ShowManager(size=current_size, title="FURY Button") show_manager.scene.add(panel) if recording: show_manager.record_events_to_file(recording_filename) print(list(event_counter.events_counts.items())) event_counter.save(expected_events_counts_filename) else: show_manager.play_events_from_file(recording_filename) expected = EventCounter.load(expected_events_counts_filename) event_counter.check_counts(expected)
def test_grid_ui(interactive=False): vol1 = np.zeros((100, 100, 100)) vol1[25:75, 25:75, 25:75] = 100 colors = distinguishable_colormap(nb_colors=3) contour_actor1 = actor.contour_from_roi(vol1, np.eye(4), colors[0], 1.) vol2 = np.zeros((100, 100, 100)) vol2[25:75, 25:75, 25:75] = 100 contour_actor2 = actor.contour_from_roi(vol2, np.eye(4), colors[1], 1.) vol3 = np.zeros((100, 100, 100)) vol3[25:75, 25:75, 25:75] = 100 contour_actor3 = actor.contour_from_roi(vol3, np.eye(4), colors[2], 1.) scene = window.Scene() actors = [] texts = [] actors.append(contour_actor1) text_actor1 = actor.text_3d('cube 1', justification='center') texts.append(text_actor1) actors.append(contour_actor2) text_actor2 = actor.text_3d('cube 2', justification='center') texts.append(text_actor2) actors.append(contour_actor3) text_actor3 = actor.text_3d('cube 3', justification='center') texts.append(text_actor3) actors.append(shallow_copy(contour_actor1)) text_actor1 = actor.text_3d('cube 4', justification='center') texts.append(text_actor1) actors.append(shallow_copy(contour_actor2)) text_actor2 = actor.text_3d('cube 5', justification='center') texts.append(text_actor2) actors.append(shallow_copy(contour_actor3)) text_actor3 = actor.text_3d('cube 6', justification='center') texts.append(text_actor3) actors.append(shallow_copy(contour_actor1)) text_actor1 = actor.text_3d('cube 7', justification='center') texts.append(text_actor1) actors.append(shallow_copy(contour_actor2)) text_actor2 = actor.text_3d('cube 8', justification='center') texts.append(text_actor2) actors.append(shallow_copy(contour_actor3)) text_actor3 = actor.text_3d('cube 9', justification='center') texts.append(text_actor3) counter = itertools.count() show_m = window.ShowManager(scene) show_m.initialize() def timer_callback(_obj, _event): cnt = next(counter) show_m.scene.zoom(1) show_m.render() if cnt == 10: show_m.exit() show_m.destroy_timers() # show the grid with the captions grid_ui = ui.GridUI(actors=actors, captions=texts, caption_offset=(0, -50, 0), cell_padding=(60, 60), dim=(3, 3), rotation_axis=(1, 0, 0)) scene.add(grid_ui) show_m.add_timer_callback(True, 200, timer_callback) show_m.start() arr = window.snapshot(scene) report = window.analyze_snapshot(arr) npt.assert_equal(report.objects > 9, True) # this needs to happen automatically when start() ends. for act in actors: act.RemoveAllObservers() filename = "test_grid_ui" recording_filename = pjoin(DATA_DIR, filename + ".log.gz") expected_events_counts_filename = pjoin(DATA_DIR, filename + ".json") current_size = (900, 600) scene = window.Scene() show_manager = window.ShowManager(scene, size=current_size, title="FURY GridUI") show_manager.initialize() grid_ui2 = ui.GridUI(actors=actors, captions=texts, caption_offset=(0, -50, 0), cell_padding=(60, 60), dim=(3, 3), rotation_axis=None) scene.add(grid_ui2) event_counter = EventCounter() event_counter.monitor(grid_ui2) if interactive: show_manager.start() recording = False if recording: # Record the following events # 1. Left click on top left box (will rotate the box) show_manager.record_events_to_file(recording_filename) # print(list(event_counter.events_counts.items())) event_counter.save(expected_events_counts_filename) else: show_manager.play_events_from_file(recording_filename) expected = EventCounter.load(expected_events_counts_filename) event_counter.check_counts(expected)
def test_ui_checkbox_default(recording=False): filename = "test_ui_checkbox_initial_state" recording_filename = pjoin(DATA_DIR, filename + ".log.gz") expected_events_counts_filename = pjoin(DATA_DIR, filename + ".json") checkbox_test = ui.Checkbox(labels=["option 1", "option 2\nOption 2", "option 3", "option 4"], position=(10, 10), checked_labels=[]) old_positions = [] for option in checkbox_test.options.values(): old_positions.append(option.position) old_positions = np.asarray(old_positions) checkbox_test.position = (100, 100) new_positions = [] for option in checkbox_test.options.values(): new_positions.append(option.position) new_positions = np.asarray(new_positions) npt.assert_allclose(new_positions - old_positions, 90.0 * np.ones((4, 2))) # Collect the sequence of options that have been checked in this list. selected_options = [] def _on_change(checkbox): selected_options.append(list(checkbox.checked_labels)) # Set up a callback when selection changes checkbox_test.on_change = _on_change event_counter = EventCounter() event_counter.monitor(checkbox_test) # Create a show manager and record/play events. show_manager = window.ShowManager(size=(600, 600), title="FURY Checkbox") show_manager.scene.add(checkbox_test) if recording: show_manager.record_events_to_file(recording_filename) print(list(event_counter.events_counts.items())) event_counter.save(expected_events_counts_filename) else: # Recorded events: # 1. Click on button of option 1. # 2. Click on button of option 2. # 3. Click on button of option 1. # 4. Click on text of option 3. # 5. Click on text of option 1. # 6. Click on button of option 4. # 7. Click on text of option 1. # 8. Click on text of option 2. # 9. Click on text of option 4. # 10. Click on button of option 3. show_manager.play_events_from_file(recording_filename) expected = EventCounter.load(expected_events_counts_filename) event_counter.check_counts(expected) # Check if the right options were selected. expected = [['option 1'], ['option 1', 'option 2\nOption 2'], ['option 2\nOption 2'], ['option 2\nOption 2', 'option 3'], ['option 2\nOption 2', 'option 3', 'option 1'], ['option 2\nOption 2', 'option 3', 'option 1', 'option 4'], ['option 2\nOption 2', 'option 3', 'option 4'], ['option 3', 'option 4'], ['option 3'], []] npt.assert_equal(len(selected_options), len(expected)) assert_arrays_equal(selected_options, expected)