def __init__(self, document_controller, hardware_source): super().__init__(document_controller.ui.create_column_widget(properties={"margin": 0, "spacing": 2})) self.document_controller = document_controller self.__state_controller = VideoSourceStateController(hardware_source, document_controller.queue_task, document_controller.document_model) ui = document_controller.ui # top row, source selection, play button hardware_source_display_name_label = ui.create_label_widget(hardware_source.display_name) top_row = ui.create_row_widget(properties={"spacing": 8, "margin-left": 8, "margin-top": 4}) top_row.add(hardware_source_display_name_label) top_row.add_stretch() # next row, prev and next buttons and status text next_row = ui.create_row_widget(properties={"spacing": 8, "margin-left": 8, "margin-top": 0}) play_pause_button = ui.create_push_button_widget("Play") next_row.add(play_pause_button) next_row.add_stretch() document_model = self.document_controller.document_model data_item_reference = document_model.get_data_item_reference(hardware_source.hardware_source_id) data_item_thumbnail_source = DataItemThumbnailWidget.DataItemReferenceThumbnailSource(ui, data_item_reference) thumbnail_widget = DataItemThumbnailWidget.ThumbnailWidget(ui, data_item_thumbnail_source, Geometry.IntSize(width=36, height=36)) next_row.add(thumbnail_widget) next_row.add_spacing(12) # build the main column column = self.content_widget column.add(top_row) column.add(next_row) def play_button_state_changed(enabled, play_button_state): play_button_text = { "play": _("Play"), "pause": _("Pause") } play_pause_button.enabled = enabled play_pause_button.text = play_button_text[play_button_state] def thumbnail_widget_drag(mime_data, thumbnail, hot_spot_x, hot_spot_y): self.drag(mime_data, thumbnail, hot_spot_x, hot_spot_y) def display_name_changed(display_name): hardware_source_display_name_label.text = display_name thumbnail_widget.on_drag = thumbnail_widget_drag # connections play_pause_button.on_clicked = self.__state_controller.handle_play_clicked self.__state_controller.on_display_name_changed = display_name_changed self.__state_controller.on_play_button_state_changed = play_button_state_changed self.__state_controller.initialize_state()
def __init__(self, document_controller: DocumentController.DocumentController, data_item: DataItem.DataItem) -> None: ui = document_controller.ui super().__init__(ui, _("Recorder"), parent_window=document_controller, persistent_id="Recorder" + str(data_item.uuid)) self.__recorder = Recorder(document_controller, data_item) self.ui = ui self.document_controller = document_controller self.__data_item = data_item self.__record_button = ui.create_push_button_widget(_("Record")) def thumbnail_widget_drag(mime_data: UserInterface.MimeData, thumbnail: typing.Optional[ DrawingContext.RGBA32Type], hot_spot_x: int, hot_spot_y: int) -> None: # use this convoluted base object for drag so that it doesn't disappear after the drag. self.content.drag(mime_data, thumbnail, hot_spot_x, hot_spot_y) display_item = document_controller.document_model.get_display_item_for_data_item( data_item) data_item_thumbnail_source = DataItemThumbnailWidget.DataItemThumbnailSource( ui, display_item=display_item) data_item_chooser_widget = DataItemThumbnailWidget.ThumbnailWidget( ui, data_item_thumbnail_source, Geometry.IntSize(48, 48)) data_item_chooser_widget.on_drag = thumbnail_widget_drag self.__recording_interval_property = Model.PropertyModel(1000) self.__recording_count_property = Model.PropertyModel(20) recording_period_widget = ui.create_line_edit_widget( properties={"width": 60}) recording_period_widget.bind_text( Binding.PropertyBinding( self.__recording_interval_property, "value", converter=Converter.IntegerToStringConverter())) recording_count_widget = ui.create_line_edit_widget( properties={"width": 60}) recording_count_widget.bind_text( Binding.PropertyBinding( self.__recording_count_property, "value", converter=Converter.IntegerToStringConverter())) row0 = ui.create_row_widget() row0.add_stretch() row0.add_spacing(8) row0.add(self.__record_button) row0.add_spacing(8) row1 = ui.create_row_widget() row1.add(ui.create_label_widget(_("Interval"))) row1.add_spacing(8) row1.add(recording_period_widget) row1.add_spacing(4) row1.add(ui.create_label_widget(_("msec"))) row1.add_spacing(8) row1.add_stretch() row2 = ui.create_row_widget() row2.add(ui.create_label_widget(_("Frames"))) row2.add_spacing(8) row2.add(recording_count_widget) row2.add_spacing(8) row2.add_stretch() column1 = ui.create_column_widget() column1.add(row1) column1.add_spacing(4) column1.add(row2) column1.add_spacing(4) column1.add(row0) button_row = ui.create_row_widget() button_row.add_spacing(8) button_row.add(data_item_chooser_widget) button_row.add_spacing(8) button_row.add_stretch() button_row.add_spacing(8) button_row.add(column1) button_row.add_spacing(8) def record_pressed() -> None: if self.__recorder.recording_state == "recording": self.__recorder.stop_recording() else: recording_interval = self.__recording_interval_property.value or 0.0 recording_count = self.__recording_count_property.value or 1 self.__recorder.start_recording(time.time(), recording_interval / 1000, recording_count) self.__record_button.on_clicked = record_pressed column = self.content column.add_spacing(6) column.add(button_row) column.add_spacing(6) def live_state_changed(is_live: bool) -> None: self.__record_button.enabled = is_live def recording_state_changed(recording_state: str) -> None: if recording_state == "recording": self.__record_button.text = _("Stop") else: self.__record_button.text = _("Record") def data_item_removed() -> None: self.request_close() self.__recorder.on_live_state_changed = live_state_changed self.__recorder.on_recording_state_changed = recording_state_changed self.__recorder.on_data_item_removed = data_item_removed live_state_changed(data_item.is_live) recording_state_changed("stopped")
def make_image_chooser(document_controller, computation, variable): ui = document_controller.ui document_model = document_controller.document_model column = ui.create_column_widget() row = ui.create_row_widget() label_column = ui.create_column_widget() label_widget = ui.create_label_widget(variable.display_label, properties={"width": 80}) label_widget.bind_text(Binding.PropertyBinding(variable, "display_label")) label_column.add(label_widget) label_column.add_stretch() row.add(label_column) row.add_spacing(8) def drop_mime_data(mime_data, x, y): if mime_data.has_format(MimeTypes.DISPLAY_ITEM_MIME_TYPE): display_item_uuid = uuid.UUID( mime_data.data_as_string(MimeTypes.DISPLAY_ITEM_MIME_TYPE)) display_item = document_model.get_display_item_by_uuid( display_item_uuid) data_item = display_item.data_item if display_item else None if data_item: variable_specifier = document_model.get_object_specifier( display_item.display_data_channel) if variable.objects_model.items: variable.objects_model.remove_item(0) variable.objects_model.append_item(variable_specifier) return "copy" return None def data_item_delete(): if variable.objects_model.items: variable.objects_model.remove_item(0) display_item = None if variable.object_specifiers: base_variable_specifier = copy.copy(variable.object_specifiers[0]) bound_data_source = document_model.resolve_object_specifier( base_variable_specifier) data_item = bound_data_source.value.data_item if bound_data_source else None display_item = document_model.get_display_item_for_data_item(data_item) data_item_thumbnail_source = DataItemThumbnailWidget.DataItemThumbnailSource( ui, display_item=display_item) data_item_chooser_widget = DataItemThumbnailWidget.ThumbnailWidget( ui, data_item_thumbnail_source, Geometry.IntSize(80, 80)) def thumbnail_widget_drag(mime_data, thumbnail, hot_spot_x, hot_spot_y): # use this convoluted base object for drag so that it doesn't disappear after the drag. try: column.drag(mime_data, thumbnail, hot_spot_x, hot_spot_y) except Exception as e: print(e) import traceback traceback.print_exc() data_item_chooser_widget.on_drag = thumbnail_widget_drag data_item_chooser_widget.on_drop_mime_data = drop_mime_data data_item_chooser_widget.on_delete = data_item_delete def property_changed(key): if key == "object_specifiers": if variable.object_specifiers: base_variable_specifier = copy.copy( variable.object_specifiers[0]) bound_data_item = document_model.resolve_object_specifier( base_variable_specifier) data_item = bound_data_item.value.data_item if bound_data_item else None display_item = document_model.get_display_item_for_data_item( data_item) data_item_thumbnail_source.set_display_item(display_item) else: data_item_thumbnail_source.set_display_item(None) property_changed_listener = variable.property_changed_event.listen( property_changed) row.add(data_item_chooser_widget) row.add_stretch() column.add(row) column.add_spacing(4) return column, [property_changed_listener]