diff --git a/dist/text_texture_generator_v1.0.0.zip b/dist/text_texture_generator_v1.0.0.zip index dc6b476..1d0c2fe 100644 Binary files a/dist/text_texture_generator_v1.0.0.zip and b/dist/text_texture_generator_v1.0.0.zip differ diff --git a/dist/text_texture_generator_v1.0.0_free.zip b/dist/text_texture_generator_v1.0.0_free.zip index 64d3551..441ac84 100644 Binary files a/dist/text_texture_generator_v1.0.0_free.zip and b/dist/text_texture_generator_v1.0.0_free.zip differ diff --git a/src/core/__pycache__/generation_engine.cpython-311.pyc b/src/core/__pycache__/generation_engine.cpython-311.pyc index f2905e5..b3baecc 100644 Binary files a/src/core/__pycache__/generation_engine.cpython-311.pyc and b/src/core/__pycache__/generation_engine.cpython-311.pyc differ diff --git a/src/core/generation_engine.py b/src/core/generation_engine.py index 7cab154..c728a5d 100644 --- a/src/core/generation_engine.py +++ b/src/core/generation_engine.py @@ -688,21 +688,26 @@ def generate_texture_image(props, width, height): traceback.print_exc() return None, None -def generate_preview(props, preview_width=512, preview_height=512): +def generate_preview(props, preview_width=None, preview_height=None): pass """ Generate a preview version of the texture at lower resolution. Args: props: Text texture properties object - preview_width: Preview image width (default: 512) - preview_height: Preview image height (default: 512) + preview_width: Preview image width. Defaults to the texture width if available. + preview_height: Preview image height. Defaults to the texture height if available. Returns: Blender image object or None on error """ try: pass + # Use full texture resolution when not explicitly provided + if not preview_width or preview_width <= 0: + preview_width = getattr(props, 'texture_width', 512) or 512 + if not preview_height or preview_height <= 0: + preview_height = getattr(props, 'texture_height', 512) or 512 # Generate at preview resolution result = generate_texture_image(props, preview_width, preview_height) diff --git a/src/operators/__pycache__/generation_ops.cpython-311.pyc b/src/operators/__pycache__/generation_ops.cpython-311.pyc index 4d1ec65..f6c56d5 100644 Binary files a/src/operators/__pycache__/generation_ops.cpython-311.pyc and b/src/operators/__pycache__/generation_ops.cpython-311.pyc differ diff --git a/src/operators/generation_ops.py b/src/operators/generation_ops.py index 71cd087..65fd5ee 100644 --- a/src/operators/generation_ops.py +++ b/src/operators/generation_ops.py @@ -162,37 +162,65 @@ class TEXT_TEXTURE_OT_preview(Operator): # Get properties and generate preview with correct parameters props = context.scene.text_texture_props preview_size = props.preview_size if hasattr(props, 'preview_size') else 512 - result = generate_preview(props, preview_size, preview_size) + preview_width = getattr(props, 'texture_width', preview_size) or preview_size + preview_height = getattr(props, 'texture_height', preview_size) or preview_size + result = generate_preview(props, preview_width, preview_height) if result: pass - self.report({'INFO'}, f"Preview generated at {preview_size}px") + self.report({'INFO'}, f"Preview generated at {preview_width}x{preview_height}px") - # Open the preview image in the image editor - # Find or create an image editor area - for area in context.screen.areas: + # Always open a dedicated window to show the preview image + try: pass - if area.type == 'IMAGE_EDITOR': + bpy.ops.wm.window_new() + new_window = context.window_manager.windows[-1] + new_screen = new_window.screen + + # Try to reuse an existing image editor in the new window + image_area = None + for area in new_screen.areas: pass - for space in area.spaces: + if area.type == 'IMAGE_EDITOR': + pass + image_area = area + break + + # Otherwise convert the largest area to an image editor + if not image_area and new_screen.areas: + pass + image_area = max(new_screen.areas, key=lambda a: a.width * a.height) + image_area.type = 'IMAGE_EDITOR' + + if image_area: + pass + for space in image_area.spaces: pass if space.type == 'IMAGE_EDITOR': pass space.image = result - area.tag_redraw() + image_area.tag_redraw() break - break - else: + else: + pass + self.report({'WARNING'}, "Could not find area to display preview in new window") + except Exception as window_err: pass - # If no image editor found, try to open in UV editor or create viewer - try: + self.report({'WARNING'}, f"Preview window open failed: {window_err}. Showing in current window.") + + # Fallback to setting image in any existing image editor + for area in context.screen.areas: pass - # Try to show in any available viewer - bpy.ops.image.view_all('INVOKE_DEFAULT') - except: - pass - # Fallback message - self.report({'INFO'}, f"Preview '{result.name}' created - open Image Editor to view") + if area.type == 'IMAGE_EDITOR': + pass + for space in area.spaces: + pass + if space.type == 'IMAGE_EDITOR': + pass + space.image = result + area.tag_redraw() + break + break return {'FINISHED'} else: @@ -720,4 +748,4 @@ __all__ = [ 'TEXT_TEXTURE_OT_generate', 'TEXT_TEXTURE_OT_preview', 'TEXT_TEXTURE_OT_generate_shader', -] \ No newline at end of file +] diff --git a/tests/unit/core/test_generation_engine.py b/tests/unit/core/test_generation_engine.py index e094777..4b5a3a7 100644 --- a/tests/unit/core/test_generation_engine.py +++ b/tests/unit/core/test_generation_engine.py @@ -1027,6 +1027,42 @@ class TestGeneratePreview: # The image name contains dimensions call_args = mock_bpy.data.images.new.call_args[0] assert "128x128" in call_args[0] + + def test_preview_defaults_to_texture_resolution(self): + """Preview falls back to full texture dimensions when none provided.""" + with patch('PIL.Image') as mock_pil_image_module, \ + patch('PIL.ImageDraw') as mock_pil_imagedraw_module, \ + patch('PIL.ImageFont') as mock_pil_imagefont_module, \ + patch('src.core.generation_engine.bpy') as mock_bpy: + + mock_pil_image = MagicMock() + mock_pil_image.size = (256, 128) + mock_pil_image.getdata.return_value = [(255, 255, 255, 255)] * (256 * 128) + mock_pil_image.transpose.return_value = mock_pil_image + mock_pil_image_module.new.return_value = mock_pil_image + mock_pil_image_module.FLIP_TOP_BOTTOM = 1 + + mock_draw = MagicMock() + mock_draw.textbbox.return_value = (0, 0, 50, 25) + mock_pil_imagedraw_module.Draw.return_value = mock_draw + + mock_font = MagicMock() + mock_pil_imagefont_module.load_default.return_value = mock_font + + mock_blender_image = MagicMock() + mock_blender_image.pixels = [0.0] * (256 * 128 * 4) + mock_bpy.data.images.new.return_value = mock_blender_image + mock_bpy.data.images.__contains__.return_value = False + + props = create_mock_props(text="AutoSize") + props.texture_width = 256 + props.texture_height = 128 + + result = generate_preview(props) + + assert result is not None + call_args = mock_bpy.data.images.new.call_args[0] + assert "256x128" in call_args[0] def test_preview_uses_same_props(self): """Test that preview uses same properties as main generation."""