File size: 3,605 Bytes
193db9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e1ce295
193db9d
 
 
 
e1ce295
 
 
193db9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e1ce295
193db9d
 
 
 
e1ce295
 
 
193db9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import gradio as gr
from gradio.components import FormComponent


class ButtonGroup:
    """Base class for button groups with common functionality."""

    def __init__(self, events: list[str], *args, **kwargs):
        self.buttons = {event: None for event in events}
        self.click_args = {event: None for event in events}
        self.render()

    def render(self):
        """Render the buttons and set up their event handlers."""
        for event, button in self.buttons.items():
            if self.click_args[event]:
                button.click(*self.click_args[event])

    def _setup_button(self, event, fn, inputs, outputs):
        """Set up a button's click event handler."""
        self.click_args[event] = fn, inputs, outputs
        if self.buttons[event]:
            self.buttons[event].click(fn, inputs, outputs)

    def api_info(self):
        return {
            "name": self.__class__.__name__,
            "events": self.EVENTS,
            "inputs": [],
            "outputs": [],
        }

    def example_payload(self):
        """Return None since this component doesn't have direct input values."""
        return None

    def example_value(self):
        """Return None since this component doesn't have direct output values."""
        return None


class InputRowButtonGroup(ButtonGroup):
    """Button group for input rows with delete and add buttons."""

    EVENTS = ["delete", "add"]

    def __init__(self, *args, **kwargs):
        self.disable_delete = kwargs.pop("disable_delete", False)
        super().__init__(self.EVENTS, *args, **kwargs)

    def render(self):
        with gr.Column(scale=0, min_width=40, elem_classes="button-column"):
            self.buttons["delete"] = gr.Button(
                "❌", elem_classes="icon-button delete-button", scale=0, interactive=not self.disable_delete
            )
            self.buttons["add"] = gr.Button("➕", elem_classes="icon-button add-field-button", scale=0)
        super().render()

    def delete(self, fn, inputs, outputs):
        self._setup_button("delete", fn, inputs, outputs)

    def add(self, fn, inputs, outputs):
        self._setup_button("add", fn, inputs, outputs)


class OutputRowButtonGroup(ButtonGroup):
    """Button group for output rows with delete, add, up, and down buttons."""

    EVENTS = ["delete", "add", "up", "down"]

    def __init__(self, *args, **kwargs):
        self.disable_delete = kwargs.pop("disable_delete", False)
        super().__init__(self.EVENTS, *args, **kwargs)

    def render(self):
        with gr.Column(scale=0, elem_classes="button-column", min_width=40):
            self.buttons["delete"] = gr.Button(
                "❌", elem_classes="icon-button delete-button", scale=0, interactive=not self.disable_delete
            )
            self.buttons["add"] = gr.Button("➕", elem_classes="icon-button add-field-button", scale=0)

        with gr.Column(scale=0, elem_classes="button-column", min_width=40):
            self.buttons["up"] = gr.Button("⬆️", elem_classes="icon-button up-button", scale=0)
            self.buttons["down"] = gr.Button("⬇️", elem_classes="icon-button down-button", scale=0)
        return super().render()

    def delete(self, fn, inputs, outputs):
        self._setup_button("delete", fn, inputs, outputs)

    def add(self, fn, inputs, outputs):
        self._setup_button("add", fn, inputs, outputs)

    def up(self, fn, inputs, outputs):
        self._setup_button("up", fn, inputs, outputs)

    def down(self, fn, inputs, outputs):
        self._setup_button("down", fn, inputs, outputs)