diff --git a/StaticPrimitives.json b/StaticPrimitives.json new file mode 100644 index 0000000..a06f9e0 --- /dev/null +++ b/StaticPrimitives.json @@ -0,0 +1,4 @@ +{ + "name": "StaticPrimitives", + "logging": false +} diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..164de62 --- /dev/null +++ b/__init__.py @@ -0,0 +1,24 @@ +from .static_primitives import * +import os, shutil +import folder_paths + +module_js_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)), "js") +application_root_directory = os.path.dirname(folder_paths.__file__) +application_web_extensions_directory = os.path.join(application_root_directory, "web", "extensions", "StaticPrimitives") + +shutil.copytree(module_js_directory, application_web_extensions_directory, dirs_exist_ok=True) + +NODE_CLASS_MAPPINGS = { + "StringStaticPrimitive": StringStaticPrimitive, + "StringMlStaticPrimitive": StringMlStaticPrimitive, + "IntStaticPrimitive": IntStaticPrimitive, + "FloatStaticPrimitive": FloatStaticPrimitive, +} + +# A dictionary that contains the friendly/humanly readable titles for the nodes +NODE_DISPLAY_NAME_MAPPINGS = { + "StringStaticPrimitive": "Primitive (STRING)", + "StringMlStaticPrimitive": "Primitive (STRING MULTI-LINE)", + "IntStaticPrimitive": "Primitive (INT)", + "FloatStaticPrimitive": "Primitive (FLOAT)", +} diff --git a/js/static_primitives.js b/js/static_primitives.js new file mode 100644 index 0000000..8ec2738 --- /dev/null +++ b/js/static_primitives.js @@ -0,0 +1,14 @@ +import { app } from "../../../scripts/app.js"; +import { addValueControlWidget } from "../../../scripts/widgets.js"; + +app.registerExtension({ + name: "StaticPrimitives", + async nodeCreated(node) { + const staticPrimitiveWidgetIndex = node.widgets?.findIndex((w) => w.name === 'Input_FLOAT' || w.name == 'Input_INT'); + if (staticPrimitiveWidgetIndex > -1) { + const staticPrimitiveWidget = node.widgets[staticPrimitiveWidgetIndex]; + const staticPrimitiveValueControl = addValueControlWidget(node, staticPrimitiveWidget, "fixed"); + node.widgets.splice(staticPrimitiveWidgetIndex+1,0,node.widgets.pop()); + } + } +}); \ No newline at end of file diff --git a/static_primitives.py b/static_primitives.py new file mode 100644 index 0000000..41e3e5d --- /dev/null +++ b/static_primitives.py @@ -0,0 +1,56 @@ +class BaseStaticPrimitive: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + input_field_config = {} + if s.INPUT_FIELD_CONFIG_ID: + input_field_config = s.INPUT_FIELD_CONFIGS[s.INPUT_FIELD_CONFIG_ID] + + return { + "required": { + f"Input_{s.RETURN_TYPES[0]}": (s.RETURN_TYPES[0], input_field_config), + }, + } + + INPUT_FIELD_CONFIGS = { + "int_field": { + "display": "number" + }, + "float_field": { + "display": "number"}, + "string_field": { + "multiline": False, + }, + "string_field_ml": { + "multiline": True, + }, + } + + RETURN_TYPES = ("STRING",) + INPUT_FIELD_CONFIG_ID = None + + FUNCTION = "output" + + CATEGORY = "primitives" + + def output(self, **kwargs): + return (kwargs[f"Input_{self.RETURN_TYPES[0]}"],) + +class StringStaticPrimitive(BaseStaticPrimitive): + RETURN_TYPES = ("STRING",) + INPUT_FIELD_CONFIG_ID = "string_field" + +class StringMlStaticPrimitive(BaseStaticPrimitive): + RETURN_TYPES = ("STRING",) + INPUT_FIELD_CONFIG_ID = "string_field_ml" + +class IntStaticPrimitive(BaseStaticPrimitive): + RETURN_TYPES = ("INT",) + INPUT_FIELD_CONFIG_ID = "int_field" + +class FloatStaticPrimitive(BaseStaticPrimitive): + RETURN_TYPES = ("FLOAT",) + INPUT_FIELD_CONFIG_ID = None + INPUT_FIELD_CONFIG_ID = "float_field" \ No newline at end of file