griptape-nodes 0.60.4__py3-none-any.whl → 0.61.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py +0 -1
- griptape_nodes/common/macro_parser/__init__.py +16 -1
- griptape_nodes/common/macro_parser/core.py +15 -3
- griptape_nodes/common/macro_parser/exceptions.py +99 -0
- griptape_nodes/common/macro_parser/formats.py +13 -4
- griptape_nodes/common/macro_parser/matching.py +5 -2
- griptape_nodes/common/macro_parser/parsing.py +48 -8
- griptape_nodes/common/macro_parser/resolution.py +23 -5
- griptape_nodes/common/project_templates/__init__.py +49 -0
- griptape_nodes/common/project_templates/default_project_template.py +92 -0
- griptape_nodes/common/project_templates/defaults/README.md +36 -0
- griptape_nodes/common/project_templates/defaults/project_template.yml +89 -0
- griptape_nodes/common/project_templates/directory.py +67 -0
- griptape_nodes/common/project_templates/loader.py +341 -0
- griptape_nodes/common/project_templates/project.py +252 -0
- griptape_nodes/common/project_templates/situation.py +155 -0
- griptape_nodes/common/project_templates/validation.py +140 -0
- griptape_nodes/exe_types/core_types.py +36 -3
- griptape_nodes/exe_types/node_types.py +4 -2
- griptape_nodes/exe_types/param_components/progress_bar_component.py +57 -0
- griptape_nodes/exe_types/param_types/parameter_audio.py +243 -0
- griptape_nodes/exe_types/param_types/parameter_image.py +243 -0
- griptape_nodes/exe_types/param_types/parameter_three_d.py +215 -0
- griptape_nodes/exe_types/param_types/parameter_video.py +243 -0
- griptape_nodes/node_library/workflow_registry.py +1 -1
- griptape_nodes/retained_mode/events/execution_events.py +41 -0
- griptape_nodes/retained_mode/events/node_events.py +90 -1
- griptape_nodes/retained_mode/events/os_events.py +108 -0
- griptape_nodes/retained_mode/events/parameter_events.py +1 -1
- griptape_nodes/retained_mode/events/project_events.py +413 -0
- griptape_nodes/retained_mode/events/workflow_events.py +19 -1
- griptape_nodes/retained_mode/griptape_nodes.py +9 -1
- griptape_nodes/retained_mode/managers/agent_manager.py +18 -24
- griptape_nodes/retained_mode/managers/event_manager.py +6 -9
- griptape_nodes/retained_mode/managers/flow_manager.py +63 -0
- griptape_nodes/retained_mode/managers/library_manager.py +55 -42
- griptape_nodes/retained_mode/managers/mcp_manager.py +14 -6
- griptape_nodes/retained_mode/managers/node_manager.py +232 -0
- griptape_nodes/retained_mode/managers/os_manager.py +345 -0
- griptape_nodes/retained_mode/managers/project_manager.py +617 -0
- griptape_nodes/retained_mode/managers/settings.py +6 -0
- griptape_nodes/retained_mode/managers/workflow_manager.py +6 -69
- griptape_nodes/traits/button.py +18 -0
- {griptape_nodes-0.60.4.dist-info → griptape_nodes-0.61.0.dist-info}/METADATA +5 -3
- {griptape_nodes-0.60.4.dist-info → griptape_nodes-0.61.0.dist-info}/RECORD +47 -31
- {griptape_nodes-0.60.4.dist-info → griptape_nodes-0.61.0.dist-info}/WHEEL +1 -1
- {griptape_nodes-0.60.4.dist-info → griptape_nodes-0.61.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"""ParameterAudio component for audio inputs with enhanced UI options."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from griptape_nodes.exe_types.core_types import Parameter, ParameterMode, Trait
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ParameterAudio(Parameter):
|
|
10
|
+
"""A specialized Parameter class for audio inputs with enhanced UI options.
|
|
11
|
+
|
|
12
|
+
This class provides a convenient way to create audio parameters with common
|
|
13
|
+
UI customizations like file browser, microphone capture, and audio editing.
|
|
14
|
+
It exposes these UI options as direct properties for easy runtime modification.
|
|
15
|
+
|
|
16
|
+
Example:
|
|
17
|
+
param = ParameterAudio(
|
|
18
|
+
name="input_audio",
|
|
19
|
+
tooltip="Select an audio file",
|
|
20
|
+
clickable_file_browser=True,
|
|
21
|
+
microphone_capture_audio=True,
|
|
22
|
+
edit_audio=True
|
|
23
|
+
)
|
|
24
|
+
param.pulse_on_run = True # Change UI options at runtime
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__( # noqa: PLR0913
|
|
28
|
+
self,
|
|
29
|
+
name: str,
|
|
30
|
+
tooltip: str | None = None,
|
|
31
|
+
*,
|
|
32
|
+
type: str = "AudioUrlArtifact", # noqa: A002, ARG002
|
|
33
|
+
input_types: list[str] | None = None, # noqa: ARG002
|
|
34
|
+
output_type: str = "AudioUrlArtifact", # noqa: ARG002
|
|
35
|
+
default_value: Any = None,
|
|
36
|
+
tooltip_as_input: str | None = None,
|
|
37
|
+
tooltip_as_property: str | None = None,
|
|
38
|
+
tooltip_as_output: str | None = None,
|
|
39
|
+
allowed_modes: set[ParameterMode] | None = None,
|
|
40
|
+
traits: set[type[Trait] | Trait] | None = None,
|
|
41
|
+
converters: list[Callable[[Any], Any]] | None = None,
|
|
42
|
+
validators: list[Callable[[Parameter, Any], None]] | None = None,
|
|
43
|
+
ui_options: dict | None = None,
|
|
44
|
+
pulse_on_run: bool = False,
|
|
45
|
+
clickable_file_browser: bool = True,
|
|
46
|
+
microphone_capture_audio: bool = False,
|
|
47
|
+
edit_audio: bool = False,
|
|
48
|
+
accept_any: bool = True,
|
|
49
|
+
hide: bool = False,
|
|
50
|
+
hide_label: bool = False,
|
|
51
|
+
hide_property: bool = False,
|
|
52
|
+
allow_input: bool = True,
|
|
53
|
+
allow_property: bool = True,
|
|
54
|
+
allow_output: bool = True,
|
|
55
|
+
settable: bool = True,
|
|
56
|
+
serializable: bool = True,
|
|
57
|
+
user_defined: bool = False,
|
|
58
|
+
element_id: str | None = None,
|
|
59
|
+
element_type: str | None = None,
|
|
60
|
+
parent_container_name: str | None = None,
|
|
61
|
+
) -> None:
|
|
62
|
+
"""Initialize an audio parameter with enhanced UI options.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
name: Parameter name
|
|
66
|
+
tooltip: Parameter tooltip
|
|
67
|
+
type: Parameter type (ignored, always "AudioUrlArtifact" for ParameterAudio)
|
|
68
|
+
input_types: Allowed input types (ignored, set based on accept_any)
|
|
69
|
+
output_type: Output type (ignored, always "AudioUrlArtifact" for ParameterAudio)
|
|
70
|
+
default_value: Default parameter value
|
|
71
|
+
tooltip_as_input: Tooltip for input mode
|
|
72
|
+
tooltip_as_property: Tooltip for property mode
|
|
73
|
+
tooltip_as_output: Tooltip for output mode
|
|
74
|
+
allowed_modes: Allowed parameter modes
|
|
75
|
+
traits: Parameter traits
|
|
76
|
+
converters: Parameter converters
|
|
77
|
+
validators: Parameter validators
|
|
78
|
+
ui_options: Dictionary of UI options
|
|
79
|
+
pulse_on_run: Whether to pulse the parameter on run
|
|
80
|
+
clickable_file_browser: Whether to show clickable file browser
|
|
81
|
+
microphone_capture_audio: Whether to enable microphone capture
|
|
82
|
+
edit_audio: Whether to enable audio editing functionality
|
|
83
|
+
accept_any: Whether to accept any input type and convert to audio (default: True)
|
|
84
|
+
hide: Whether to hide the entire parameter
|
|
85
|
+
hide_label: Whether to hide the parameter label
|
|
86
|
+
hide_property: Whether to hide the parameter in property mode
|
|
87
|
+
allow_input: Whether to allow input mode
|
|
88
|
+
allow_property: Whether to allow property mode
|
|
89
|
+
allow_output: Whether to allow output mode
|
|
90
|
+
settable: Whether the parameter is settable
|
|
91
|
+
serializable: Whether the parameter is serializable
|
|
92
|
+
user_defined: Whether the parameter is user-defined
|
|
93
|
+
element_id: Element ID
|
|
94
|
+
element_type: Element type
|
|
95
|
+
parent_container_name: Name of parent container
|
|
96
|
+
"""
|
|
97
|
+
# Build ui_options dictionary from the provided UI-specific parameters
|
|
98
|
+
if ui_options is None:
|
|
99
|
+
ui_options = {}
|
|
100
|
+
else:
|
|
101
|
+
ui_options = ui_options.copy()
|
|
102
|
+
|
|
103
|
+
# Add audio-specific UI options if they have values
|
|
104
|
+
if pulse_on_run:
|
|
105
|
+
ui_options["pulse_on_run"] = pulse_on_run
|
|
106
|
+
if clickable_file_browser:
|
|
107
|
+
ui_options["clickable_file_browser"] = clickable_file_browser
|
|
108
|
+
if microphone_capture_audio:
|
|
109
|
+
ui_options["microphone_capture_audio"] = microphone_capture_audio
|
|
110
|
+
if edit_audio:
|
|
111
|
+
ui_options["edit_audio"] = edit_audio
|
|
112
|
+
|
|
113
|
+
# Auto-disable clickable_file_browser if neither input nor property modes are allowed
|
|
114
|
+
if not allow_input and not allow_property and clickable_file_browser:
|
|
115
|
+
ui_options.pop("clickable_file_browser", None)
|
|
116
|
+
|
|
117
|
+
# Set up input types based on accept_any setting
|
|
118
|
+
if accept_any:
|
|
119
|
+
final_input_types = ["any"]
|
|
120
|
+
else:
|
|
121
|
+
final_input_types = ["AudioUrlArtifact"]
|
|
122
|
+
|
|
123
|
+
# Call parent with explicit parameters, following ControlParameter pattern
|
|
124
|
+
super().__init__(
|
|
125
|
+
name=name,
|
|
126
|
+
tooltip=tooltip,
|
|
127
|
+
type="AudioUrlArtifact", # Always an AudioUrlArtifact type for ParameterAudio
|
|
128
|
+
input_types=final_input_types,
|
|
129
|
+
output_type="AudioUrlArtifact", # Always output as AudioUrlArtifact
|
|
130
|
+
default_value=default_value,
|
|
131
|
+
tooltip_as_input=tooltip_as_input,
|
|
132
|
+
tooltip_as_property=tooltip_as_property,
|
|
133
|
+
tooltip_as_output=tooltip_as_output,
|
|
134
|
+
allowed_modes=allowed_modes,
|
|
135
|
+
traits=traits,
|
|
136
|
+
converters=converters,
|
|
137
|
+
validators=validators,
|
|
138
|
+
ui_options=ui_options,
|
|
139
|
+
hide=hide,
|
|
140
|
+
hide_label=hide_label,
|
|
141
|
+
hide_property=hide_property,
|
|
142
|
+
allow_input=allow_input,
|
|
143
|
+
allow_property=allow_property,
|
|
144
|
+
allow_output=allow_output,
|
|
145
|
+
settable=settable,
|
|
146
|
+
serializable=serializable,
|
|
147
|
+
user_defined=user_defined,
|
|
148
|
+
element_id=element_id,
|
|
149
|
+
element_type=element_type,
|
|
150
|
+
parent_container_name=parent_container_name,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
@property
|
|
154
|
+
def pulse_on_run(self) -> bool:
|
|
155
|
+
"""Get whether pulse on run is enabled.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
True if pulse on run is enabled, False otherwise
|
|
159
|
+
"""
|
|
160
|
+
return self.ui_options.get("pulse_on_run", False)
|
|
161
|
+
|
|
162
|
+
@pulse_on_run.setter
|
|
163
|
+
def pulse_on_run(self, value: bool) -> None:
|
|
164
|
+
"""Set whether pulse on run is enabled.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
value: Whether to enable pulse on run
|
|
168
|
+
"""
|
|
169
|
+
if value:
|
|
170
|
+
self.update_ui_options_key("pulse_on_run", value)
|
|
171
|
+
else:
|
|
172
|
+
ui_options = self.ui_options.copy()
|
|
173
|
+
ui_options.pop("pulse_on_run", None)
|
|
174
|
+
self.ui_options = ui_options
|
|
175
|
+
|
|
176
|
+
@property
|
|
177
|
+
def clickable_file_browser(self) -> bool:
|
|
178
|
+
"""Get whether clickable file browser is enabled.
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
True if clickable file browser is enabled, False otherwise
|
|
182
|
+
"""
|
|
183
|
+
return self.ui_options.get("clickable_file_browser", False)
|
|
184
|
+
|
|
185
|
+
@clickable_file_browser.setter
|
|
186
|
+
def clickable_file_browser(self, value: bool) -> None:
|
|
187
|
+
"""Set whether clickable file browser is enabled.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
value: Whether to enable clickable file browser
|
|
191
|
+
"""
|
|
192
|
+
if value:
|
|
193
|
+
self.update_ui_options_key("clickable_file_browser", value)
|
|
194
|
+
else:
|
|
195
|
+
ui_options = self.ui_options.copy()
|
|
196
|
+
ui_options.pop("clickable_file_browser", None)
|
|
197
|
+
self.ui_options = ui_options
|
|
198
|
+
|
|
199
|
+
@property
|
|
200
|
+
def microphone_capture_audio(self) -> bool:
|
|
201
|
+
"""Get whether microphone capture audio is enabled.
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
True if microphone capture audio is enabled, False otherwise
|
|
205
|
+
"""
|
|
206
|
+
return self.ui_options.get("microphone_capture_audio", False)
|
|
207
|
+
|
|
208
|
+
@microphone_capture_audio.setter
|
|
209
|
+
def microphone_capture_audio(self, value: bool) -> None:
|
|
210
|
+
"""Set whether microphone capture audio is enabled.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
value: Whether to enable microphone capture audio
|
|
214
|
+
"""
|
|
215
|
+
if value:
|
|
216
|
+
self.update_ui_options_key("microphone_capture_audio", value)
|
|
217
|
+
else:
|
|
218
|
+
ui_options = self.ui_options.copy()
|
|
219
|
+
ui_options.pop("microphone_capture_audio", None)
|
|
220
|
+
self.ui_options = ui_options
|
|
221
|
+
|
|
222
|
+
@property
|
|
223
|
+
def edit_audio(self) -> bool:
|
|
224
|
+
"""Get whether edit audio is enabled.
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
True if edit audio is enabled, False otherwise
|
|
228
|
+
"""
|
|
229
|
+
return self.ui_options.get("edit_audio", False)
|
|
230
|
+
|
|
231
|
+
@edit_audio.setter
|
|
232
|
+
def edit_audio(self, value: bool) -> None:
|
|
233
|
+
"""Set whether edit audio is enabled.
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
value: Whether to enable edit audio
|
|
237
|
+
"""
|
|
238
|
+
if value:
|
|
239
|
+
self.update_ui_options_key("edit_audio", value)
|
|
240
|
+
else:
|
|
241
|
+
ui_options = self.ui_options.copy()
|
|
242
|
+
ui_options.pop("edit_audio", None)
|
|
243
|
+
self.ui_options = ui_options
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"""ParameterImage component for image inputs with enhanced UI options."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from griptape_nodes.exe_types.core_types import Parameter, ParameterMode, Trait
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ParameterImage(Parameter):
|
|
10
|
+
"""A specialized Parameter class for image inputs with enhanced UI options.
|
|
11
|
+
|
|
12
|
+
This class provides a convenient way to create image parameters with common
|
|
13
|
+
UI customizations like file browser, webcam capture, and edit mask.
|
|
14
|
+
It exposes these UI options as direct properties for easy runtime modification.
|
|
15
|
+
|
|
16
|
+
Example:
|
|
17
|
+
param = ParameterImage(
|
|
18
|
+
name="input_image",
|
|
19
|
+
tooltip="Select an image",
|
|
20
|
+
clickable_file_browser=True,
|
|
21
|
+
webcam_capture_image=True,
|
|
22
|
+
edit_mask=True
|
|
23
|
+
)
|
|
24
|
+
param.pulse_on_run = True # Change UI options at runtime
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__( # noqa: PLR0913
|
|
28
|
+
self,
|
|
29
|
+
name: str,
|
|
30
|
+
tooltip: str | None = None,
|
|
31
|
+
*,
|
|
32
|
+
type: str = "ImageUrlArtifact", # noqa: A002, ARG002
|
|
33
|
+
input_types: list[str] | None = None, # noqa: ARG002
|
|
34
|
+
output_type: str = "ImageUrlArtifact", # noqa: ARG002
|
|
35
|
+
default_value: Any = None,
|
|
36
|
+
tooltip_as_input: str | None = None,
|
|
37
|
+
tooltip_as_property: str | None = None,
|
|
38
|
+
tooltip_as_output: str | None = None,
|
|
39
|
+
allowed_modes: set[ParameterMode] | None = None,
|
|
40
|
+
traits: set[type[Trait] | Trait] | None = None,
|
|
41
|
+
converters: list[Callable[[Any], Any]] | None = None,
|
|
42
|
+
validators: list[Callable[[Parameter, Any], None]] | None = None,
|
|
43
|
+
ui_options: dict | None = None,
|
|
44
|
+
pulse_on_run: bool = False,
|
|
45
|
+
clickable_file_browser: bool = True,
|
|
46
|
+
webcam_capture_image: bool = False,
|
|
47
|
+
edit_mask: bool = False,
|
|
48
|
+
accept_any: bool = True,
|
|
49
|
+
hide: bool = False,
|
|
50
|
+
hide_label: bool = False,
|
|
51
|
+
hide_property: bool = False,
|
|
52
|
+
allow_input: bool = True,
|
|
53
|
+
allow_property: bool = True,
|
|
54
|
+
allow_output: bool = True,
|
|
55
|
+
settable: bool = True,
|
|
56
|
+
serializable: bool = True,
|
|
57
|
+
user_defined: bool = False,
|
|
58
|
+
element_id: str | None = None,
|
|
59
|
+
element_type: str | None = None,
|
|
60
|
+
parent_container_name: str | None = None,
|
|
61
|
+
) -> None:
|
|
62
|
+
"""Initialize an image parameter with enhanced UI options.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
name: Parameter name
|
|
66
|
+
tooltip: Parameter tooltip
|
|
67
|
+
type: Parameter type (ignored, always "ImageUrlArtifact" for ParameterImage)
|
|
68
|
+
input_types: Allowed input types (ignored, set based on accept_any)
|
|
69
|
+
output_type: Output type (ignored, always "ImageUrlArtifact" for ParameterImage)
|
|
70
|
+
default_value: Default parameter value
|
|
71
|
+
tooltip_as_input: Tooltip for input mode
|
|
72
|
+
tooltip_as_property: Tooltip for property mode
|
|
73
|
+
tooltip_as_output: Tooltip for output mode
|
|
74
|
+
allowed_modes: Allowed parameter modes
|
|
75
|
+
traits: Parameter traits
|
|
76
|
+
converters: Parameter converters
|
|
77
|
+
validators: Parameter validators
|
|
78
|
+
ui_options: Dictionary of UI options
|
|
79
|
+
pulse_on_run: Whether to pulse the parameter on run
|
|
80
|
+
clickable_file_browser: Whether to show clickable file browser
|
|
81
|
+
webcam_capture_image: Whether to enable webcam capture
|
|
82
|
+
edit_mask: Whether to enable edit mask functionality
|
|
83
|
+
accept_any: Whether to accept any input type and convert to image (default: True)
|
|
84
|
+
hide: Whether to hide the entire parameter
|
|
85
|
+
hide_label: Whether to hide the parameter label
|
|
86
|
+
hide_property: Whether to hide the parameter in property mode
|
|
87
|
+
allow_input: Whether to allow input mode
|
|
88
|
+
allow_property: Whether to allow property mode
|
|
89
|
+
allow_output: Whether to allow output mode
|
|
90
|
+
settable: Whether the parameter is settable
|
|
91
|
+
serializable: Whether the parameter is serializable
|
|
92
|
+
user_defined: Whether the parameter is user-defined
|
|
93
|
+
element_id: Element ID
|
|
94
|
+
element_type: Element type
|
|
95
|
+
parent_container_name: Name of parent container
|
|
96
|
+
"""
|
|
97
|
+
# Build ui_options dictionary from the provided UI-specific parameters
|
|
98
|
+
if ui_options is None:
|
|
99
|
+
ui_options = {}
|
|
100
|
+
else:
|
|
101
|
+
ui_options = ui_options.copy()
|
|
102
|
+
|
|
103
|
+
# Add image-specific UI options if they have values
|
|
104
|
+
if pulse_on_run:
|
|
105
|
+
ui_options["pulse_on_run"] = pulse_on_run
|
|
106
|
+
if clickable_file_browser:
|
|
107
|
+
ui_options["clickable_file_browser"] = clickable_file_browser
|
|
108
|
+
if webcam_capture_image:
|
|
109
|
+
ui_options["webcam_capture_image"] = webcam_capture_image
|
|
110
|
+
if edit_mask:
|
|
111
|
+
ui_options["edit_mask"] = edit_mask
|
|
112
|
+
|
|
113
|
+
# Auto-disable clickable_file_browser if neither input nor property modes are allowed
|
|
114
|
+
if not allow_input and not allow_property and clickable_file_browser:
|
|
115
|
+
ui_options.pop("clickable_file_browser", None)
|
|
116
|
+
|
|
117
|
+
# Set up input types based on accept_any setting
|
|
118
|
+
if accept_any:
|
|
119
|
+
final_input_types = ["any"]
|
|
120
|
+
else:
|
|
121
|
+
final_input_types = ["ImageUrlArtifact"]
|
|
122
|
+
|
|
123
|
+
# Call parent with explicit parameters, following ControlParameter pattern
|
|
124
|
+
super().__init__(
|
|
125
|
+
name=name,
|
|
126
|
+
tooltip=tooltip,
|
|
127
|
+
type="ImageUrlArtifact", # Always an ImageUrlArtifact type for ParameterImage
|
|
128
|
+
input_types=final_input_types,
|
|
129
|
+
output_type="ImageUrlArtifact", # Always output as ImageUrlArtifact
|
|
130
|
+
default_value=default_value,
|
|
131
|
+
tooltip_as_input=tooltip_as_input,
|
|
132
|
+
tooltip_as_property=tooltip_as_property,
|
|
133
|
+
tooltip_as_output=tooltip_as_output,
|
|
134
|
+
allowed_modes=allowed_modes,
|
|
135
|
+
traits=traits,
|
|
136
|
+
converters=converters,
|
|
137
|
+
validators=validators,
|
|
138
|
+
ui_options=ui_options,
|
|
139
|
+
hide=hide,
|
|
140
|
+
hide_label=hide_label,
|
|
141
|
+
hide_property=hide_property,
|
|
142
|
+
allow_input=allow_input,
|
|
143
|
+
allow_property=allow_property,
|
|
144
|
+
allow_output=allow_output,
|
|
145
|
+
settable=settable,
|
|
146
|
+
serializable=serializable,
|
|
147
|
+
user_defined=user_defined,
|
|
148
|
+
element_id=element_id,
|
|
149
|
+
element_type=element_type,
|
|
150
|
+
parent_container_name=parent_container_name,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
@property
|
|
154
|
+
def pulse_on_run(self) -> bool:
|
|
155
|
+
"""Get whether pulse on run is enabled.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
True if pulse on run is enabled, False otherwise
|
|
159
|
+
"""
|
|
160
|
+
return self.ui_options.get("pulse_on_run", False)
|
|
161
|
+
|
|
162
|
+
@pulse_on_run.setter
|
|
163
|
+
def pulse_on_run(self, value: bool) -> None:
|
|
164
|
+
"""Set whether pulse on run is enabled.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
value: Whether to enable pulse on run
|
|
168
|
+
"""
|
|
169
|
+
if value:
|
|
170
|
+
self.update_ui_options_key("pulse_on_run", value)
|
|
171
|
+
else:
|
|
172
|
+
ui_options = self.ui_options.copy()
|
|
173
|
+
ui_options.pop("pulse_on_run", None)
|
|
174
|
+
self.ui_options = ui_options
|
|
175
|
+
|
|
176
|
+
@property
|
|
177
|
+
def clickable_file_browser(self) -> bool:
|
|
178
|
+
"""Get whether clickable file browser is enabled.
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
True if clickable file browser is enabled, False otherwise
|
|
182
|
+
"""
|
|
183
|
+
return self.ui_options.get("clickable_file_browser", False)
|
|
184
|
+
|
|
185
|
+
@clickable_file_browser.setter
|
|
186
|
+
def clickable_file_browser(self, value: bool) -> None:
|
|
187
|
+
"""Set whether clickable file browser is enabled.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
value: Whether to enable clickable file browser
|
|
191
|
+
"""
|
|
192
|
+
if value:
|
|
193
|
+
self.update_ui_options_key("clickable_file_browser", value)
|
|
194
|
+
else:
|
|
195
|
+
ui_options = self.ui_options.copy()
|
|
196
|
+
ui_options.pop("clickable_file_browser", None)
|
|
197
|
+
self.ui_options = ui_options
|
|
198
|
+
|
|
199
|
+
@property
|
|
200
|
+
def webcam_capture_image(self) -> bool:
|
|
201
|
+
"""Get whether webcam capture image is enabled.
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
True if webcam capture image is enabled, False otherwise
|
|
205
|
+
"""
|
|
206
|
+
return self.ui_options.get("webcam_capture_image", False)
|
|
207
|
+
|
|
208
|
+
@webcam_capture_image.setter
|
|
209
|
+
def webcam_capture_image(self, value: bool) -> None:
|
|
210
|
+
"""Set whether webcam capture image is enabled.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
value: Whether to enable webcam capture image
|
|
214
|
+
"""
|
|
215
|
+
if value:
|
|
216
|
+
self.update_ui_options_key("webcam_capture_image", value)
|
|
217
|
+
else:
|
|
218
|
+
ui_options = self.ui_options.copy()
|
|
219
|
+
ui_options.pop("webcam_capture_image", None)
|
|
220
|
+
self.ui_options = ui_options
|
|
221
|
+
|
|
222
|
+
@property
|
|
223
|
+
def edit_mask(self) -> bool:
|
|
224
|
+
"""Get whether edit mask is enabled.
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
True if edit mask is enabled, False otherwise
|
|
228
|
+
"""
|
|
229
|
+
return self.ui_options.get("edit_mask", False)
|
|
230
|
+
|
|
231
|
+
@edit_mask.setter
|
|
232
|
+
def edit_mask(self, value: bool) -> None:
|
|
233
|
+
"""Set whether edit mask is enabled.
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
value: Whether to enable edit mask
|
|
237
|
+
"""
|
|
238
|
+
if value:
|
|
239
|
+
self.update_ui_options_key("edit_mask", value)
|
|
240
|
+
else:
|
|
241
|
+
ui_options = self.ui_options.copy()
|
|
242
|
+
ui_options.pop("edit_mask", None)
|
|
243
|
+
self.ui_options = ui_options
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"""Parameter3D component for 3D model inputs with enhanced UI options."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from griptape_nodes.exe_types.core_types import Parameter, ParameterMode, Trait
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Parameter3D(Parameter):
|
|
10
|
+
"""A specialized Parameter class for 3D model inputs with enhanced UI options.
|
|
11
|
+
|
|
12
|
+
This class provides a convenient way to create 3D model parameters with common
|
|
13
|
+
UI customizations like file browser and expander functionality.
|
|
14
|
+
It exposes these UI options as direct properties for easy runtime modification.
|
|
15
|
+
|
|
16
|
+
Example:
|
|
17
|
+
param = Parameter3D(
|
|
18
|
+
name="input_3d",
|
|
19
|
+
tooltip="Select a 3D model",
|
|
20
|
+
clickable_file_browser=True,
|
|
21
|
+
expander=True
|
|
22
|
+
)
|
|
23
|
+
param.pulse_on_run = True # Change UI options at runtime
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def __init__( # noqa: PLR0913
|
|
27
|
+
self,
|
|
28
|
+
name: str,
|
|
29
|
+
tooltip: str | None = None,
|
|
30
|
+
*,
|
|
31
|
+
type: str = "ThreeDUrlArtifact", # noqa: A002, ARG002
|
|
32
|
+
input_types: list[str] | None = None, # noqa: ARG002
|
|
33
|
+
output_type: str = "ThreeDUrlArtifact", # noqa: ARG002
|
|
34
|
+
default_value: Any = None,
|
|
35
|
+
tooltip_as_input: str | None = None,
|
|
36
|
+
tooltip_as_property: str | None = None,
|
|
37
|
+
tooltip_as_output: str | None = None,
|
|
38
|
+
allowed_modes: set[ParameterMode] | None = None,
|
|
39
|
+
traits: set[type[Trait] | Trait] | None = None,
|
|
40
|
+
converters: list[Callable[[Any], Any]] | None = None,
|
|
41
|
+
validators: list[Callable[[Parameter, Any], None]] | None = None,
|
|
42
|
+
ui_options: dict | None = None,
|
|
43
|
+
pulse_on_run: bool = False,
|
|
44
|
+
clickable_file_browser: bool = True,
|
|
45
|
+
expander: bool = False,
|
|
46
|
+
accept_any: bool = True,
|
|
47
|
+
hide: bool = False,
|
|
48
|
+
hide_label: bool = False,
|
|
49
|
+
hide_property: bool = False,
|
|
50
|
+
allow_input: bool = True,
|
|
51
|
+
allow_property: bool = True,
|
|
52
|
+
allow_output: bool = True,
|
|
53
|
+
settable: bool = True,
|
|
54
|
+
serializable: bool = True,
|
|
55
|
+
user_defined: bool = False,
|
|
56
|
+
element_id: str | None = None,
|
|
57
|
+
element_type: str | None = None,
|
|
58
|
+
parent_container_name: str | None = None,
|
|
59
|
+
) -> None:
|
|
60
|
+
"""Initialize a 3D model parameter with enhanced UI options.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
name: Parameter name
|
|
64
|
+
tooltip: Parameter tooltip
|
|
65
|
+
type: Parameter type (ignored, always "ThreeDUrlArtifact" for Parameter3D)
|
|
66
|
+
input_types: Allowed input types (ignored, set based on accept_any)
|
|
67
|
+
output_type: Output type (ignored, always "ThreeDUrlArtifact" for Parameter3D)
|
|
68
|
+
default_value: Default parameter value
|
|
69
|
+
tooltip_as_input: Tooltip for input mode
|
|
70
|
+
tooltip_as_property: Tooltip for property mode
|
|
71
|
+
tooltip_as_output: Tooltip for output mode
|
|
72
|
+
allowed_modes: Allowed parameter modes
|
|
73
|
+
traits: Parameter traits
|
|
74
|
+
converters: Parameter converters
|
|
75
|
+
validators: Parameter validators
|
|
76
|
+
ui_options: Dictionary of UI options
|
|
77
|
+
pulse_on_run: Whether to pulse the parameter on run
|
|
78
|
+
clickable_file_browser: Whether to show clickable file browser
|
|
79
|
+
expander: Whether to enable expander functionality
|
|
80
|
+
accept_any: Whether to accept any input type and convert to 3D (default: True)
|
|
81
|
+
hide: Whether to hide the entire parameter
|
|
82
|
+
hide_label: Whether to hide the parameter label
|
|
83
|
+
hide_property: Whether to hide the parameter in property mode
|
|
84
|
+
allow_input: Whether to allow input mode
|
|
85
|
+
allow_property: Whether to allow property mode
|
|
86
|
+
allow_output: Whether to allow output mode
|
|
87
|
+
settable: Whether the parameter is settable
|
|
88
|
+
serializable: Whether the parameter is serializable
|
|
89
|
+
user_defined: Whether the parameter is user-defined
|
|
90
|
+
element_id: Element ID
|
|
91
|
+
element_type: Element type
|
|
92
|
+
parent_container_name: Name of parent container
|
|
93
|
+
"""
|
|
94
|
+
# Build ui_options dictionary from the provided UI-specific parameters
|
|
95
|
+
if ui_options is None:
|
|
96
|
+
ui_options = {}
|
|
97
|
+
else:
|
|
98
|
+
ui_options = ui_options.copy()
|
|
99
|
+
|
|
100
|
+
# Add 3D-specific UI options if they have values
|
|
101
|
+
if pulse_on_run:
|
|
102
|
+
ui_options["pulse_on_run"] = pulse_on_run
|
|
103
|
+
if clickable_file_browser:
|
|
104
|
+
ui_options["clickable_file_browser"] = clickable_file_browser
|
|
105
|
+
if expander:
|
|
106
|
+
ui_options["expander"] = expander
|
|
107
|
+
|
|
108
|
+
# Auto-disable clickable_file_browser if neither input nor property modes are allowed
|
|
109
|
+
if not allow_input and not allow_property and clickable_file_browser:
|
|
110
|
+
ui_options.pop("clickable_file_browser", None)
|
|
111
|
+
|
|
112
|
+
# Set up input types based on accept_any setting
|
|
113
|
+
if accept_any:
|
|
114
|
+
final_input_types = ["any"]
|
|
115
|
+
else:
|
|
116
|
+
final_input_types = ["ThreeDUrlArtifact"]
|
|
117
|
+
|
|
118
|
+
# Call parent with explicit parameters, following ControlParameter pattern
|
|
119
|
+
super().__init__(
|
|
120
|
+
name=name,
|
|
121
|
+
tooltip=tooltip,
|
|
122
|
+
type="ThreeDUrlArtifact", # Always a ThreeDUrlArtifact type for Parameter3D
|
|
123
|
+
input_types=final_input_types,
|
|
124
|
+
output_type="ThreeDUrlArtifact", # Always output as ThreeDUrlArtifact
|
|
125
|
+
default_value=default_value,
|
|
126
|
+
tooltip_as_input=tooltip_as_input,
|
|
127
|
+
tooltip_as_property=tooltip_as_property,
|
|
128
|
+
tooltip_as_output=tooltip_as_output,
|
|
129
|
+
allowed_modes=allowed_modes,
|
|
130
|
+
traits=traits,
|
|
131
|
+
converters=converters,
|
|
132
|
+
validators=validators,
|
|
133
|
+
ui_options=ui_options,
|
|
134
|
+
hide=hide,
|
|
135
|
+
hide_label=hide_label,
|
|
136
|
+
hide_property=hide_property,
|
|
137
|
+
allow_input=allow_input,
|
|
138
|
+
allow_property=allow_property,
|
|
139
|
+
allow_output=allow_output,
|
|
140
|
+
settable=settable,
|
|
141
|
+
serializable=serializable,
|
|
142
|
+
user_defined=user_defined,
|
|
143
|
+
element_id=element_id,
|
|
144
|
+
element_type=element_type,
|
|
145
|
+
parent_container_name=parent_container_name,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
@property
|
|
149
|
+
def pulse_on_run(self) -> bool:
|
|
150
|
+
"""Get whether pulse on run is enabled.
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
True if pulse on run is enabled, False otherwise
|
|
154
|
+
"""
|
|
155
|
+
return self.ui_options.get("pulse_on_run", False)
|
|
156
|
+
|
|
157
|
+
@pulse_on_run.setter
|
|
158
|
+
def pulse_on_run(self, value: bool) -> None:
|
|
159
|
+
"""Set whether pulse on run is enabled.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
value: Whether to enable pulse on run
|
|
163
|
+
"""
|
|
164
|
+
if value:
|
|
165
|
+
self.update_ui_options_key("pulse_on_run", value)
|
|
166
|
+
else:
|
|
167
|
+
ui_options = self.ui_options.copy()
|
|
168
|
+
ui_options.pop("pulse_on_run", None)
|
|
169
|
+
self.ui_options = ui_options
|
|
170
|
+
|
|
171
|
+
@property
|
|
172
|
+
def clickable_file_browser(self) -> bool:
|
|
173
|
+
"""Get whether clickable file browser is enabled.
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
True if clickable file browser is enabled, False otherwise
|
|
177
|
+
"""
|
|
178
|
+
return self.ui_options.get("clickable_file_browser", False)
|
|
179
|
+
|
|
180
|
+
@clickable_file_browser.setter
|
|
181
|
+
def clickable_file_browser(self, value: bool) -> None:
|
|
182
|
+
"""Set whether clickable file browser is enabled.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
value: Whether to enable clickable file browser
|
|
186
|
+
"""
|
|
187
|
+
if value:
|
|
188
|
+
self.update_ui_options_key("clickable_file_browser", value)
|
|
189
|
+
else:
|
|
190
|
+
ui_options = self.ui_options.copy()
|
|
191
|
+
ui_options.pop("clickable_file_browser", None)
|
|
192
|
+
self.ui_options = ui_options
|
|
193
|
+
|
|
194
|
+
@property
|
|
195
|
+
def expander(self) -> bool:
|
|
196
|
+
"""Get whether expander is enabled.
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
True if expander is enabled, False otherwise
|
|
200
|
+
"""
|
|
201
|
+
return self.ui_options.get("expander", False)
|
|
202
|
+
|
|
203
|
+
@expander.setter
|
|
204
|
+
def expander(self, value: bool) -> None:
|
|
205
|
+
"""Set whether expander is enabled.
|
|
206
|
+
|
|
207
|
+
Args:
|
|
208
|
+
value: Whether to enable expander
|
|
209
|
+
"""
|
|
210
|
+
if value:
|
|
211
|
+
self.update_ui_options_key("expander", value)
|
|
212
|
+
else:
|
|
213
|
+
ui_options = self.ui_options.copy()
|
|
214
|
+
ui_options.pop("expander", None)
|
|
215
|
+
self.ui_options = ui_options
|