2025-12-01

This commit is contained in:
2026-03-17 14:58:51 -06:00
parent 183e865f8b
commit 4b82b57113
6846 changed files with 954887 additions and 162606 deletions
@@ -1,4 +1,6 @@
import os
import logging
from typing import Optional
import blf
import bpy
@@ -6,9 +8,14 @@ import gpu
from .. import image_utils, ui_bgl
from .bl_ui_widget import BL_UI_Widget
from .bl_ui_image import BL_UI_Image
bk_logger = logging.getLogger(__name__)
class BL_UI_Button(BL_UI_Widget):
"""Image Button for assets in asset bar."""
def __init__(self, x, y, width, height):
super().__init__(x, y, width, height)
self._text_color = (1.0, 1.0, 1.0, 1.0)
@@ -89,7 +96,7 @@ class BL_UI_Button(BL_UI_Widget):
except Exception as e:
self.__image = None
def set_image_colorspace(self, colorspace):
def set_image_colorspace(self, colorspace: str = ""):
image_utils.set_colorspace(self.__image, colorspace)
def set_image(self, rel_filepath):
@@ -98,22 +105,10 @@ class BL_UI_Button(BL_UI_Widget):
try:
if self.__image is None or self.__image.filepath != rel_filepath:
imgname = f".{os.path.basename(rel_filepath)}"
img = bpy.data.images.get(imgname)
if img is not None:
self.__image = img
else:
self.__image = bpy.data.images.load(
rel_filepath, check_existing=True
)
self.__image.name = imgname
self.__image = image_utils.IMG(name=imgname, filepath=rel_filepath)
self.__image.gl_load()
if self.__image and len(self.__image.pixels) == 0:
self.__image.reload()
self.__image.gl_load()
except Exception as e:
print(f"BL_UI_BUTTON set_image() error: {e}")
except Exception:
bk_logger.exception("BL_UI_BUTTON set_image() error:")
self.__image = None
def get_image_path(self):
@@ -185,7 +180,7 @@ class BL_UI_Button(BL_UI_Widget):
y_screen_flip = self.get_area_height() - self.y_screen
off_x, off_y = self.__image_position
sx, sy = self.__image_size
ui_bgl.draw_image(
ui_bgl.draw_image_runtime(
self.x_screen + off_x,
y_screen_flip - off_y - sy,
sx,
@@ -206,10 +201,22 @@ class BL_UI_Button(BL_UI_Widget):
self.__state = 1
try:
self.mouse_down_func(self)
except Exception as e:
import traceback
except Exception:
bk_logger.exception("BL_UI_BUTTON mouse_down() error:")
traceback.print_exc()
return True
return False
def set_mouse_down_right(self, mouse_down_right_func):
self.mouse_down_right_func = mouse_down_right_func
def mouse_down_right(self, x, y):
if self.is_in_rect(x, y):
try:
self.mouse_down_right_func(self)
except Exception:
bk_logger.exception("BL_UI_BUTTON mouse_down_right() error:")
return True
@@ -1,7 +1,11 @@
import traceback
import logging
from typing import Optional
import bpy
from bpy.types import Operator
bk_logger = logging.getLogger(__name__)
class BL_UI_OT_draw_operator(Operator):
bl_idname = "object.bl_ui_ot_draw_operator"
@@ -23,7 +27,7 @@ class BL_UI_OT_draw_operator(Operator):
for widget in self.widgets:
widget.init(context)
def on_invoke(self, context, event):
def on_invoke(self, context, event) -> Optional[bool]:
pass
def on_finish(self, context):
@@ -105,7 +109,7 @@ class BL_UI_OT_draw_operator(Operator):
def draw_callback_px_separated(self, op, context):
# separated only for puprpose of profiling
# separated only for purpose of profiling
try:
# hide during animation playback, to improve performance
if context.screen.is_animation_playing:
@@ -113,5 +117,5 @@ def draw_callback_px_separated(self, op, context):
if context.area.as_pointer() == self.active_area_pointer:
for widget in self.widgets:
widget.draw()
except Exception as e:
traceback.print_exc()
except Exception:
bk_logger.exception("Error in draw_callback_px_separated: ")
@@ -1,12 +1,21 @@
import os
import logging
import bpy
import gpu
from .. import image_utils, ui_bgl
from .bl_ui_widget import BL_UI_Widget
bk_logger = logging.getLogger(__name__)
class BL_UI_Image(BL_UI_Widget):
"""A simple image widget.
Used to display bigger thumbnail with additional info,
while hover over a button.
"""
def __init__(self, x, y, width, height):
super().__init__(x, y, width, height)
@@ -36,25 +45,12 @@ class BL_UI_Image(BL_UI_Widget):
try:
if self.__image is None or self.__image.filepath != rel_filepath:
imgname = f".{os.path.basename(rel_filepath)}"
img = bpy.data.images.get(imgname)
if img is not None:
self.__image = img
else:
self.__image = bpy.data.images.load(
rel_filepath, check_existing=True
)
self.__image.name = imgname
self.__image.gl_load()
if self.__image and len(self.__image.pixels) == 0:
self.__image.reload()
self.__image.gl_load()
self.__image = image_utils.IMG(name=imgname, filepath=rel_filepath)
except Exception as e:
print(f"BL_UI_BUTTON: exception in set_image(): {e}")
bk_logger.exception("BL_UI_BUTTON: exception in set_image(): %s", e)
self.__image = None
def set_image_colorspace(self, colorspace):
def set_image_colorspace(self, colorspace: str = ""):
image_utils.set_colorspace(self.__image, colorspace)
def get_image_path(self):
@@ -69,9 +65,9 @@ class BL_UI_Image(BL_UI_Widget):
def draw(self):
if not self._is_visible:
return
gpu.state.blend_set("ALPHA")
self.shader.bind()
self.batch_panel.draw(self.shader)
self.draw_image()
@@ -81,7 +77,7 @@ class BL_UI_Image(BL_UI_Widget):
y_screen_flip = self.get_area_height() - self.y_screen
off_x, off_y = self.__image_position
sx, sy = self.__image_size
ui_bgl.draw_image(
ui_bgl.draw_image_runtime(
self.x_screen + off_x,
y_screen_flip - off_y - sy,
sx,
@@ -20,6 +20,11 @@ class BL_UI_Widget:
self._is_visible = True
self._is_active = True # if the widget needs to be disabled
if bpy.app.version < (4, 0, 0):
self.shader = gpu.shader.from_builtin("2D_UNIFORM_COLOR")
else:
self.shader = gpu.shader.from_builtin("UNIFORM_COLOR")
def set_location(self, x, y):
# if self.x != x or self.y != y or self.x_screen != x or self.y_screen != y:
# bpy.context.region.tag_redraw()
@@ -35,9 +40,9 @@ class BL_UI_Widget:
@bg_color.setter
def bg_color(self, value):
if value != self._bg_color:
bpy.context.region.tag_redraw()
self._bg_color = value
if bpy.context.region is not None:
bpy.context.region.tag_redraw()
@property
def visible(self):
@@ -71,6 +76,8 @@ class BL_UI_Widget:
if not self._is_visible:
return
gpu.state.blend_set("ALPHA")
self.shader.bind()
self.shader.uniform_float("color", self._bg_color)
@@ -97,11 +104,6 @@ class BL_UI_Widget:
(self.x_screen + self.width, y_screen_flip),
)
if bpy.app.version < (4, 0, 0):
self.shader = gpu.shader.from_builtin("2D_UNIFORM_COLOR")
else:
self.shader = gpu.shader.from_builtin("UNIFORM_COLOR")
self.batch_panel = batch_for_shader(
self.shader, "TRIS", {"pos": vertices}, indices=indices
)
@@ -187,8 +189,8 @@ class BL_UI_Widget:
):
# print('is in rect!?')
# print('area height', area_height)
# print ('x sceen ',self.x_screen,'x ', x, 'width', self.width)
# print ('widghet y', widget_y,'y', y, 'height',self.height)
# print ('x screen ',self.x_screen,'x ', x, 'width', self.width)
# print ('widget y', widget_y,'y', y, 'height',self.height)
return True
return False