def __init__(self, ui: UserInterface.UserInterface, section_title: str, section: UserInterface.Widget, section_id: typing.Optional[str] = None) -> None: section_widget = ui.create_column_widget() super().__init__(section_widget) section_title_row = ui.create_row_widget() twist_down_canvas_item = CanvasItem.TwistDownCanvasItem() twist_down_canvas_widget = ui.create_canvas_widget(properties={ "height": 20, "width": 20 }) twist_down_canvas_widget.canvas_item.add_canvas_item( twist_down_canvas_item) section_title_label = ui.create_label_widget(section_title) section_title_label.text_font = "bold" section_title_row.add(twist_down_canvas_widget) section_title_row.add(section_title_label) section_title_row.add_stretch() section_widget.add(section_title_row) section_content_row = ui.create_row_widget() section_content_column = ui.create_column_widget() section_content_column.add_spacing(4) section_content_column.add(section) section_content_row.add_spacing(20) section_content_row.add(section_content_column) section_widget.add(section_content_row) section_widget.add_spacing(4) def toggle() -> None: twist_down_canvas_item.checked = not twist_down_canvas_item.checked section_content_column.visible = twist_down_canvas_item.checked if section_id: ui.set_persistent_string( section_id, "true" if twist_down_canvas_item.checked else "false") section_open = ui.get_persistent_string( section_id, "true") == "true" if section_id else True twist_down_canvas_item.checked = section_open section_content_column.visible = section_open twist_down_canvas_item.on_button_clicked = toggle self.section_title_row = section_title_row self.__twist_down_canvas_item = twist_down_canvas_item
def pose_get_string_message_box(ui: UserInterface.UserInterface, message_column: UserInterface.BoxWidget, caption: str, text: str, accepted_fn: typing.Callable[[str], None], rejected_fn: typing.Optional[typing.Callable[[], None]] = None, accepted_text: typing.Optional[str] = None, rejected_text: typing.Optional[str] = None) -> UserInterface.BoxWidget: if accepted_text is None: accepted_text = _("OK") if rejected_text is None: rejected_text = _("Cancel") message_box_widget = ui.create_column_widget() # properties={"stylesheet": "background: #FFD"} caption_row = ui.create_row_widget() caption_row.add_spacing(12) caption_row.add(ui.create_label_widget(caption)) caption_row.add_stretch() inside_row = ui.create_row_widget() def reject_button_clicked() -> typing.Any: if callable(rejected_fn): rejected_fn() return False def accept_button_clicked() -> typing.Any: accepted_fn(string_edit_widget.text or str()) return False string_edit_widget = ui.create_line_edit_widget() string_edit_widget.text = text string_edit_widget.on_return_pressed = accept_button_clicked string_edit_widget.on_escape_pressed = reject_button_clicked reject_button = ui.create_push_button_widget(rejected_text) reject_button.on_clicked = reject_button_clicked accepted_button = ui.create_push_button_widget(accepted_text) accepted_button.on_clicked = accept_button_clicked inside_row.add_spacing(12) inside_row.add(string_edit_widget) inside_row.add_spacing(12) inside_row.add(reject_button) inside_row.add_spacing(12) inside_row.add(accepted_button) inside_row.add_stretch() message_box_widget.add_spacing(6) message_box_widget.add(caption_row) message_box_widget.add_spacing(4) message_box_widget.add(inside_row) message_box_widget.add_spacing(4) message_column.add(message_box_widget) string_edit_widget.select_all() string_edit_widget.focused = True return message_box_widget
def __init__(self, ui: UserInterface.UserInterface, label: str, instrument: InstrumentDevice.Instrument, xy_property: str, unit: str = "nm", multiplier: float = 1E9) -> None: row_widget = ui.create_row_widget() super().__init__(row_widget) stage_x_field = ui.create_line_edit_widget() stage_x_field.bind_text( Control2DBinding( instrument, xy_property, "x", Converter.PhysicalValueToStringConverter(unit, multiplier))) stage_y_field = ui.create_line_edit_widget() stage_y_field.bind_text( Control2DBinding( instrument, xy_property, "y", Converter.PhysicalValueToStringConverter(unit, multiplier))) row_widget.add_spacing(8) row_widget.add(ui.create_label_widget(label)) row_widget.add_spacing(8) row_widget.add(ui.create_label_widget(_("X"))) row_widget.add_spacing(8) row_widget.add(stage_x_field) row_widget.add_spacing(8) row_widget.add(ui.create_label_widget(_("Y"))) row_widget.add_spacing(8) row_widget.add(stage_y_field) row_widget.add_spacing(8)
def __init__(self, ui: UserInterface.UserInterface, statistics_model: Model.PropertyModel[typing.Dict[str, str]]) -> None: content_widget = ui.create_column_widget(properties={"min-height": 18 * 3, "max-height": 18 * 3}) super().__init__(content_widget) # create property models for the UI self._stats1_property = Model.PropertyModel[str](str()) self._stats2_property = Model.PropertyModel[str](str()) self.__statistics_model = statistics_model def statistics_changed(key: str) -> None: if key == "value": statistics_data = self.__statistics_model.value or dict() statistic_strings = list() for key in sorted(statistics_data.keys()): value = statistics_data[key] if value is not None: statistic_str = "{0} {1}".format(key, value) else: statistic_str = "{0} {1}".format(key, _("N/A")) statistic_strings.append(statistic_str) self._stats1_property.value = "\n".join(statistic_strings[:(len(statistic_strings) + 1) // 2]) self._stats2_property.value = "\n".join(statistic_strings[(len(statistic_strings) + 1) // 2:]) self.__statistics_property_changed_event_listener = self.__statistics_model.property_changed_event.listen(statistics_changed) statistics_changed("value") stats_column1 = ui.create_column_widget(properties={"min-width": 140, "max-width": 140}) stats_column2 = ui.create_column_widget(properties={"min-width": 140, "max-width": 140}) stats_column1_label = ui.create_label_widget() stats_column2_label = ui.create_label_widget() stats_column1.add(stats_column1_label) stats_column2.add(stats_column2_label) stats_section = ui.create_row_widget() stats_section.add_spacing(13) stats_section.add(stats_column1) stats_section.add_stretch() stats_section.add(stats_column2) stats_section.add_spacing(13) stats_column1_label.bind_text(Binding.PropertyBinding(self._stats1_property, "value")) stats_column2_label.bind_text(Binding.PropertyBinding(self._stats2_property, "value")) content_widget.add(stats_section)
def __init__(self, ui: UserInterface.UserInterface, *, message: str, parent_window: Window.Window): super().__init__(ui, parent_window=parent_window) self._document_window.set_window_style(["tool", "frameless-hint"]) self._document_window.set_palette_color("background", 255, 255, 204, 224) content_column = ui.create_column_widget() content_row = ui.create_row_widget() label = ui.create_label_widget(message, properties={"width": NotificationDialog.width}) label.word_wrap = True content_row.add_spacing(8) content_row.add(label) content_row.add_spacing(8) content_column.add_spacing(8) content_column.add(content_row) content_column.add_stretch() content_column.add_spacing(8) self.__start_time = time.time() self.attach_widget(content_column) parent_window.register_dialog(self)
def pose_confirmation_message_box(ui: UserInterface.UserInterface, message_column: UserInterface.BoxWidget, caption: str, accepted_fn: typing.Callable[[], None], rejected_fn: typing.Optional[typing.Callable[[], None]] = None, accepted_text: typing.Optional[str] = None, rejected_text: typing.Optional[str] = None, display_rejected: bool = True) -> UserInterface.BoxWidget: if accepted_text is None: accepted_text = _("OK") if rejected_text is None: rejected_text = _("Cancel") message_box_widget = ui.create_column_widget() # properties={"stylesheet": "background: #FFD"} def reject_button_clicked() -> typing.Any: if rejected_fn: rejected_fn() return False def accept_button_clicked() -> typing.Any: accepted_fn() return False reject_button = ui.create_push_button_widget(rejected_text) reject_button.on_clicked = reject_button_clicked accepted_button = ui.create_push_button_widget(accepted_text) accepted_button.on_clicked = accept_button_clicked caption_row = ui.create_row_widget() caption_row.add_spacing(12) caption_row.add(ui.create_label_widget(caption)) if display_rejected: caption_row.add_spacing(12) caption_row.add(reject_button) caption_row.add_spacing(12) caption_row.add(accepted_button) caption_row.add_stretch() message_box_widget.add_spacing(6) message_box_widget.add(caption_row) message_box_widget.add_spacing(4) message_column.add(message_box_widget) return message_box_widget
def __init__(self, ui: UserInterface.UserInterface, instrument: InstrumentDevice.Instrument) -> None: column_widget = ui.create_column_widget(properties={ "margin": 6, "spacing": 2 }) super().__init__(column_widget) sample_combo_box = ui.create_combo_box_widget(instrument.sample_titles) sample_combo_box.current_index = instrument.sample_index sample_combo_box.bind_current_index( Binding.PropertyBinding(instrument, "sample_index")) voltage_field = ui.create_line_edit_widget() voltage_field.bind_text( Binding.PropertyBinding( instrument, "voltage", converter=Converter.PhysicalValueToStringConverter( units="keV", multiplier=1E-3))) beam_current_field = ui.create_line_edit_widget() beam_current_field.bind_text( ControlBinding(instrument, "BeamCurrent", converter=Converter.PhysicalValueToStringConverter( units="pA", multiplier=1E12))) stage_position_widget = PositionWidget(ui, _("Stage"), instrument, "stage_position_m") beam_shift_widget = PositionWidget(ui, _("Beam"), instrument, "beam_shift_m") defocus_field = ui.create_line_edit_widget() defocus_field.bind_text( ControlBinding(instrument, "C10", converter=Converter.PhysicalValueToStringConverter( units="nm", multiplier=1E9))) c12_widget = PositionWidget(ui, _("C12"), instrument, "C12") c21_widget = PositionWidget(ui, _("C21"), instrument, "C21") c23_widget = PositionWidget(ui, _("C23"), instrument, "C23") c3_field = ui.create_line_edit_widget() c3_field.bind_text( ControlBinding(instrument, "C30", converter=Converter.PhysicalValueToStringConverter( units="nm", multiplier=1E9))) c32_widget = PositionWidget(ui, _("C32"), instrument, "C32") c34_widget = PositionWidget(ui, _("C34"), instrument, "C34") blanked_checkbox = ui.create_check_box_widget(_("Beam Blanked")) blanked_checkbox.bind_checked( Binding.PropertyBinding(instrument, "is_blanked")) slit_in_checkbox = ui.create_check_box_widget(_("Slit In")) slit_in_checkbox.bind_checked( Binding.PropertyBinding(instrument, "is_slit_in")) voa_in_checkbox = ui.create_check_box_widget(_("VOA In")) voa_in_checkbox.bind_checked(ControlBinding(instrument, "S_VOA")) convergenve_angle_field = ui.create_line_edit_widget() convergenve_angle_field.bind_text( ControlBinding(instrument, "ConvergenceAngle", converter=Converter.PhysicalValueToStringConverter( units="mrad", multiplier=1E3))) c_aperture_widget = PositionWidget(ui, _("CAperture"), instrument, "CAperture", unit="mrad", multiplier=1E3) aperture_round_widget = PositionWidget(ui, _("ApertureRound"), instrument, "ApertureRound", unit="", multiplier=1) energy_offset_field = ui.create_line_edit_widget() energy_offset_field.bind_text( Binding.PropertyBinding( instrument, "energy_offset_eV", converter=Converter.FloatToStringConverter())) energy_dispersion_field = ui.create_line_edit_widget() energy_dispersion_field.bind_text( Binding.PropertyBinding( instrument, "energy_per_channel_eV", converter=Converter.FloatToStringConverter())) beam_row = ui.create_row_widget() beam_row.add_spacing(8) beam_row.add(blanked_checkbox) beam_row.add_spacing(8) beam_row.add(voa_in_checkbox) beam_row.add_stretch() eels_row = ui.create_row_widget() eels_row.add_spacing(8) eels_row.add(slit_in_checkbox) eels_row.add_spacing(8) eels_row.add(ui.create_label_widget("+eV")) eels_row.add_spacing(4) eels_row.add(energy_offset_field) eels_row.add_spacing(8) eels_row.add(ui.create_label_widget("eV/ch")) eels_row.add_spacing(4) eels_row.add(energy_dispersion_field) eels_row.add_stretch() defocus_row = ui.create_row_widget() defocus_row.add_spacing(8) defocus_row.add_spacing(8) defocus_row.add(ui.create_label_widget("Defocus")) defocus_row.add(defocus_field) defocus_row.add_stretch() c3_row = ui.create_row_widget() c3_row.add_spacing(8) c3_row.add_spacing(8) c3_row.add(ui.create_label_widget("Spherical Aberration")) c3_row.add(c3_field) c3_row.add_stretch() sample_row = ui.create_row_widget() sample_row.add_spacing(8) sample_row.add_spacing(8) sample_row.add(sample_combo_box) sample_row.add_stretch() voltage_row = ui.create_row_widget() voltage_row.add_spacing(8) voltage_row.add_spacing(8) voltage_row.add(ui.create_label_widget("Voltage")) voltage_row.add(voltage_field) voltage_row.add_stretch() beam_current_row = ui.create_row_widget() beam_current_row.add_spacing(8) beam_current_row.add_spacing(8) beam_current_row.add(ui.create_label_widget("Beam Current")) beam_current_row.add(beam_current_field) beam_current_row.add_stretch() convergence_angle_row = ui.create_row_widget() convergence_angle_row.add_spacing(8) convergence_angle_row.add_spacing(8) convergence_angle_row.add(ui.create_label_widget("Convergence Angle")) convergence_angle_row.add(convergenve_angle_field) convergence_angle_row.add_stretch() column_widget.add(sample_row) column_widget.add(voltage_row) column_widget.add(beam_current_row) column_widget.add(stage_position_widget) column_widget.add(beam_shift_widget) column_widget.add(defocus_row) column_widget.add(c12_widget) column_widget.add(c21_widget) column_widget.add(c23_widget) column_widget.add(c3_row) column_widget.add(c32_widget) column_widget.add(c34_widget) column_widget.add(beam_row) column_widget.add(convergence_angle_row) column_widget.add(c_aperture_widget) column_widget.add(aperture_round_widget) column_widget.add(eels_row) column_widget.add_stretch()
def __init__(self, ui: UserInterface.UserInterface, app: Application.BaseApplication) -> None: super().__init__(ui, _("Preferences"), app=app) self.ui = ui self.document_controller = self properties = dict() properties["min-height"] = 400 properties["min-width"] = 800 preference_pane_delegates: typing.List[PreferencePaneDelegate] = list() preference_pane_delegate_id_ref: typing.List[typing.Optional[str]] = [None] content_stack = ui.create_stack_widget() def change_selection(indexes: typing.AbstractSet[int]) -> None: index = list(indexes)[0] assert 0 <= index < len(preference_pane_delegates) content_stack.current_index = index preference_pane_delegate_id_ref[0] = preference_pane_delegates[index].identifier selector_list_widget = Widgets.StringListWidget(ui, selection_style=Selection.Style.single_or_none) selector_list_widget.on_selection_changed = change_selection row = self.ui.create_row_widget(properties={"min-width": 640, "min-height": 320}) selector_column = self.ui.create_column_widget(properties={"width": 200}) selector_row = ui.create_row_widget() selector_row.add_spacing(8) selector_row.add(selector_list_widget) selector_row.add_spacing(8) selector_column.add_spacing(8) selector_column.add(selector_row) selector_column.add_spacing(8) content_column = self.ui.create_column_widget() content_column.add(content_stack) row.add(selector_column) row.add(content_column) self.content.add(row) self.add_button(_("Done"), lambda: True) def rebuild() -> None: content_stack.remove_all() preference_pane_delegates.clear() preference_pane_delegate_id = preference_pane_delegate_id_ref[0] items = list() selected_index = 0 delegates = PreferencesManager().preference_pane_delegates if not delegates: delegates.append(EmptyPreferencePanel()) for index, preference_pane_delegate in enumerate(delegates): preference_pane_delegates.append(preference_pane_delegate) content_column_widget = ui.create_column_widget() content_column_widget.add_spacing(12) content_column_widget.add(preference_pane_delegate.build(ui, event_loop=self.event_loop)) content_column_widget.add_spacing(12) content_row_widget = ui.create_row_widget() content_row_widget.add_spacing(12) content_row_widget.add(content_column_widget) content_row_widget.add_spacing(12) content_stack.add(content_row_widget) items.append(preference_pane_delegate.label) if preference_pane_delegate.identifier == preference_pane_delegate_id: selected_index = index change_selection({selected_index}) selector_list_widget.items = items self.__preference_pane_delegates_changed_listener = PreferencesManager().preference_pane_delegates_changed_event.listen(rebuild) rebuild()