from lnx.logicnode.lnx_nodes import *


class DrawImageSequenceNode(LnxLogicTreeNode):
    """Draws a sequence of image (images changing over time). The file names
    of images used in a sequence need to follow a certain pattern:
    `<prefix><frame-index>.<extension>`, `<prefix>` is an arbitrary filename
    that must be constant for the entire sequence, `<frame-index>`
    corresponds to the frame number of the image in the sequence.
    `<extension>` is the file extension (without a period ".").

    Image file names for a valid 2-frame sequence would for example
    look like this:

    ```
    myImage1.png
    myImage2.png
    ```

    @input Start: Evaluate the image filenames and start the sequence.
        If the sequence is currently running, nothing happens. If the
        sequence has finished and `Loop` is false, this input restarts
        the sequence.
    @input Stop: Stops the sequence and its drawing.
    @input Image File Prefix: See `<prefix>` above.
    @input Image File Extension: See `<extension>` above.
    @input Color: The color that the pixels of the images are multiplied with.
    @input X/Y: Position of the images, in pixels from the top left corner.
    @input Width/Height: Size of the images in pixels. The images
        grow towards the bottom right corner.
    @input Start Index: The first `<frame-index>` of the sequence (inclusive).
    @input End Index: The last `<frame-index>` of the sequence (inclusive).
    @input Frame Duration: Duration of a frame in seconds.
    @input Loop: Whether the sequence starts again from the first frame after the last frame.
    @input Wait For Load: If true, start the sequence only after all
        image files have been loaded. If false, the sequence starts immediately,
        but images that are not yet loaded are not rendered.

    @output On Start: Activated after the sequence has started. This output
        is influenced by the `Wait For Load` input.
    @output On Stop: Activated if the sequence ends or the `Stop` input
        is activated. This is not activated when the sequence restarts
        due to looping.
    """
    bl_idname = 'LNDrawImageSequenceNode'
    bl_label = 'Draw Image Sequence'
    lnx_section = 'draw'
    lnx_version = 1

    def lnx_init(self, context):
        self.add_input('LnxNodeSocketAction', 'Start')
        self.add_input('LnxNodeSocketAction', 'Stop')
        self.add_input('LnxStringSocket', 'Image File Prefix')
        self.add_input('LnxStringSocket', 'Image File Extension')
        self.add_input('LnxColorSocket', 'Color', default_value=[1.0, 1.0, 1.0, 1.0])
        self.add_input('LnxFloatSocket', 'X')
        self.add_input('LnxFloatSocket', 'Y')
        self.add_input('LnxFloatSocket', 'Width')
        self.add_input('LnxFloatSocket', 'Height')
        self.add_input('LnxIntSocket', 'Start Index')
        self.add_input('LnxIntSocket', 'End Index', default_value=1)
        self.add_input('LnxFloatSocket', 'Frame Duration', default_value=1.0)
        self.add_input('LnxBoolSocket', 'Loop', default_value=True)
        self.add_input('LnxBoolSocket', 'Wait For Load', default_value=True)

        self.add_output('LnxNodeSocketAction', 'On Start')
        self.add_output('LnxNodeSocketAction', 'On Stop')