From 76ba28423116eef9e82fb53487cdee0c350b9548 Mon Sep 17 00:00:00 2001 From: Vollkornaffe Date: Tue, 1 Sep 2026 19:39:32 +0200 Subject: [PATCH 1/3] fix: add missing tooltips --- .../src/tree_clipper_addon/operators_export.py | 1 + .../src/tree_clipper_addon/operators_import.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/packages/tree_clipper_addon/src/tree_clipper_addon/operators_export.py b/packages/tree_clipper_addon/src/tree_clipper_addon/operators_export.py index 4f62822..6a14dd3 100644 --- a/packages/tree_clipper_addon/src/tree_clipper_addon/operators_export.py +++ b/packages/tree_clipper_addon/src/tree_clipper_addon/operators_export.py @@ -21,6 +21,7 @@ class SCENE_OT_Tree_Clipper_Export_Prepare(bpy.types.Operator): bl_idname = "scene.tree_clipper_export_prepare" bl_label = "Export" + bl_description = "Export the node tree as a Tree Clipper string." bl_options: ClassVar[set[str]] = {"REGISTER"} # ty:ignore[invalid-attribute-override] is_material: bpy.props.BoolProperty(name="Top level Material") # type: ignore diff --git a/packages/tree_clipper_addon/src/tree_clipper_addon/operators_import.py b/packages/tree_clipper_addon/src/tree_clipper_addon/operators_import.py index feb8f91..fdd9359 100644 --- a/packages/tree_clipper_addon/src/tree_clipper_addon/operators_import.py +++ b/packages/tree_clipper_addon/src/tree_clipper_addon/operators_import.py @@ -25,6 +25,7 @@ class SCENE_OT_Tree_Clipper_Import_File_Prepare(bpy.types.Operator): bl_idname = "scene.tree_clipper_import_file_prepare" bl_label = "Import File" + bl_description = "Import a Tree Clipper string from a file." bl_options: ClassVar[set[str]] = {"REGISTER"} # ty:ignore[invalid-attribute-override] input_file: bpy.props.StringProperty( @@ -52,6 +53,7 @@ def execute( class SCENE_OT_Tree_Clipper_Import_Clipboard_Prepare(bpy.types.Operator): bl_idname = "scene.tree_clipper_import_clipboard_prepare" bl_label = "Import Clipboard" + bl_description = "Import a Tree Clipper string from the clipboard." bl_options: ClassVar[set[str]] = {"REGISTER"} # ty:ignore[invalid-attribute-override] def execute( From b5c8d30ac4fc3984c914e1548e169a964d3a4ba7 Mon Sep 17 00:00:00 2001 From: Vollkornaffe Date: Tue, 1 Sep 2026 19:40:17 +0200 Subject: [PATCH 2/3] feat: add a preliminary check for clipboard import --- packages/tree_clipper/src/tree_clipper/import_nodes.py | 4 ++++ .../src/tree_clipper_addon/__init__.py | 9 +++++++-- .../src/tree_clipper_addon/operators_import.py | 10 +++++++++- .../tree_clipper_addon/src/tree_clipper_addon/panel.py | 9 ++++++++- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/tree_clipper/src/tree_clipper/import_nodes.py b/packages/tree_clipper/src/tree_clipper/import_nodes.py index e9a2c9d..1ee944b 100644 --- a/packages/tree_clipper/src/tree_clipper/import_nodes.py +++ b/packages/tree_clipper/src/tree_clipper/import_nodes.py @@ -696,3 +696,7 @@ def import_all(self, parameters: ImportParameters) -> ImportReport: while self.step(): pass return self.importer.report + + +def preliminary_check(string: str) -> bool: + return string.startswith(MAGIC_STRING) or string.startswith("{") diff --git a/packages/tree_clipper_addon/src/tree_clipper_addon/__init__.py b/packages/tree_clipper_addon/src/tree_clipper_addon/__init__.py index 521eaba..d7b598e 100644 --- a/packages/tree_clipper_addon/src/tree_clipper_addon/__init__.py +++ b/packages/tree_clipper_addon/src/tree_clipper_addon/__init__.py @@ -56,10 +56,15 @@ def draw_export_active(self, _context): self.layout.operator(SCENE_OT_Tree_Clipper_Export_Active.bl_idname) -def draw_import(self, _context): +def draw_import(self, context): + if not SCENE_OT_Tree_Clipper_Import_Clipboard_Prepare.poll(context): + import_text = "Import Tree Clipper (Invalid Clipboard Content)" + else: + import_text = "Import Tree Clipper" + self.layout.operator( SCENE_OT_Tree_Clipper_Import_Clipboard_Prepare.bl_idname, - text="Import Tree Clipper", + text=import_text, ) diff --git a/packages/tree_clipper_addon/src/tree_clipper_addon/operators_import.py b/packages/tree_clipper_addon/src/tree_clipper_addon/operators_import.py index fdd9359..f18f06b 100644 --- a/packages/tree_clipper_addon/src/tree_clipper_addon/operators_import.py +++ b/packages/tree_clipper_addon/src/tree_clipper_addon/operators_import.py @@ -11,7 +11,11 @@ from ._vendor.tree_clipper.common import DEFAULT_FILE from ._vendor.tree_clipper.dynamic_pointer import add_all_known_pointer_properties -from ._vendor.tree_clipper.import_nodes import ImportIntermediate, ImportParameters +from ._vendor.tree_clipper.import_nodes import ( + ImportIntermediate, + ImportParameters, + preliminary_check, +) from ._vendor.tree_clipper.specific_handlers import ( BUILT_IN_IMPORTER, ) @@ -56,6 +60,10 @@ class SCENE_OT_Tree_Clipper_Import_Clipboard_Prepare(bpy.types.Operator): bl_description = "Import a Tree Clipper string from the clipboard." bl_options: ClassVar[set[str]] = {"REGISTER"} # ty:ignore[invalid-attribute-override] + @classmethod + def poll(cls, context: bpy.types.Context) -> bool: + return preliminary_check(bpy.context.window_manager.clipboard) # ty:ignore[unresolved-attribute] + def execute( self, context: bpy.types.Context ) -> set["rna_enums.OperatorReturnItems"]: diff --git a/packages/tree_clipper_addon/src/tree_clipper_addon/panel.py b/packages/tree_clipper_addon/src/tree_clipper_addon/panel.py index bb6793f..e97c9fa 100644 --- a/packages/tree_clipper_addon/src/tree_clipper_addon/panel.py +++ b/packages/tree_clipper_addon/src/tree_clipper_addon/panel.py @@ -5,6 +5,7 @@ SCENE_OT_Tree_Clipper_Import_Clipboard_Prepare, SCENE_OT_Tree_Clipper_Import_File_Prepare, ) +from ._vendor.tree_clipper.import_nodes import preliminary_check class SCENE_PT_Tree_Clipper_Panel(bpy.types.Panel): @@ -39,5 +40,11 @@ def draw(self, context: bpy.types.Context) -> None: self.layout.separator() # ty:ignore[possibly-missing-attribute] import_col = self.layout.column() # ty:ignore[possibly-missing-attribute] - import_col.operator(SCENE_OT_Tree_Clipper_Import_Clipboard_Prepare.bl_idname) + if SCENE_OT_Tree_Clipper_Import_Clipboard_Prepare.poll(context): + import_text = SCENE_OT_Tree_Clipper_Import_Clipboard_Prepare.bl_label + else: + import_text = "Invalid Clipboard Content" + import_col.operator( + SCENE_OT_Tree_Clipper_Import_Clipboard_Prepare.bl_idname, text=import_text + ) import_col.operator(SCENE_OT_Tree_Clipper_Import_File_Prepare.bl_idname) From cec5ca5cb71b67ca864a5bedad07257e2e666ff8 Mon Sep 17 00:00:00 2001 From: Vollkornaffe Date: Tue, 1 Sep 2026 19:41:51 +0200 Subject: [PATCH 3/3] tidy: ruff --- packages/tree_clipper/src/tree_clipper/import_nodes.py | 2 +- packages/tree_clipper_addon/src/tree_clipper_addon/panel.py | 1 - uv.lock | 3 --- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/tree_clipper/src/tree_clipper/import_nodes.py b/packages/tree_clipper/src/tree_clipper/import_nodes.py index 1ee944b..921d6b4 100644 --- a/packages/tree_clipper/src/tree_clipper/import_nodes.py +++ b/packages/tree_clipper/src/tree_clipper/import_nodes.py @@ -699,4 +699,4 @@ def import_all(self, parameters: ImportParameters) -> ImportReport: def preliminary_check(string: str) -> bool: - return string.startswith(MAGIC_STRING) or string.startswith("{") + return string.startswith((MAGIC_STRING, "{")) diff --git a/packages/tree_clipper_addon/src/tree_clipper_addon/panel.py b/packages/tree_clipper_addon/src/tree_clipper_addon/panel.py index e97c9fa..0de93be 100644 --- a/packages/tree_clipper_addon/src/tree_clipper_addon/panel.py +++ b/packages/tree_clipper_addon/src/tree_clipper_addon/panel.py @@ -5,7 +5,6 @@ SCENE_OT_Tree_Clipper_Import_Clipboard_Prepare, SCENE_OT_Tree_Clipper_Import_File_Prepare, ) -from ._vendor.tree_clipper.import_nodes import preliminary_check class SCENE_PT_Tree_Clipper_Panel(bpy.types.Panel): diff --git a/uv.lock b/uv.lock index 83bff19..acfc513 100644 --- a/uv.lock +++ b/uv.lock @@ -2,9 +2,6 @@ version = 1 revision = 3 requires-python = "==3.13.*" -[options] -prerelease-mode = "allow" - [manifest] members = [ "tree-clipper",