예제 #1
0
    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()
예제 #2
0
    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")
예제 #3
0
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]