Files
blender-portable-repo/scripts/addons/blender_kitsu/lookdev/ops.py
T
2026-03-17 14:58:51 -06:00

107 lines
2.9 KiB
Python

# SPDX-FileCopyrightText: 2021 Blender Studio Tools Authors
#
# SPDX-License-Identifier: GPL-3.0-or-later
import importlib.util
from pathlib import Path
from typing import Dict, List, Set, Optional, Tuple, Any
import bpy
from ..logger import LoggerFactory
from .. import prefs, util
from . import opsdata
logger = LoggerFactory.getLogger()
class KITSU_OT_lookdev_set_preset(bpy.types.Operator):
bl_idname = "kitsu.lookdev_set_preset"
bl_label = "Render Preset"
bl_property = "files"
bl_description = "Sets active render settings preset that can be applied"
files: bpy.props.EnumProperty(items=opsdata.get_rd_settings_enum_list, name="Files")
@classmethod
def poll(cls, context: bpy.types.Context) -> bool:
addon_prefs = prefs.addon_prefs_get(context)
return addon_prefs.lookdev.is_presets_dir_valid
def execute(self, context: bpy.types.Context) -> Set[str]:
file = self.files
if not file:
return {"CANCELLED"}
if context.scene.lookdev.preset_file == file:
return {"CANCELLED"}
# Update global scene cache version prop.
context.scene.lookdev.preset_file = file
logger.info("Set render preset file to %s", file)
# Redraw ui.
util.ui_redraw()
return {"FINISHED"}
def invoke(self, context: bpy.types.Context, event: bpy.types.Event) -> Set[str]:
context.window_manager.invoke_search_popup(self) # type: ignore
return {"FINISHED"}
class KITSU_OT_lookdev_apply_preset(bpy.types.Operator):
bl_idname = "kitsu.lookdev_apply_preset"
bl_label = "Apply Preset"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Applies active render settings preset"
@classmethod
def poll(cls, context: bpy.types.Context) -> bool:
return bool(context.scene.lookdev.preset_file)
def execute(self, context: bpy.types.Context) -> Set[str]:
preset_file = context.scene.lookdev.preset_file
preset_path = Path(preset_file).absolute()
if not preset_file:
return {"CANCELLED"}
# Load module.
spec = importlib.util.spec_from_file_location(
preset_path.name, preset_path.as_posix()
)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# Exec module main function.
if "main" not in dir(module):
self.report(
{"ERROR"}, f"{preset_path.name} does not contain a 'main' function"
)
return {"CANCELLED"}
module.main()
self.report({"INFO"}, f"Applied: {preset_path.name}")
return {"FINISHED"}
# ---------REGISTER ----------.
classes = [KITSU_OT_lookdev_set_preset, KITSU_OT_lookdev_apply_preset]
def register():
for cls in classes:
bpy.utils.register_class(cls)
def unregister():
for cls in reversed(classes):
bpy.utils.unregister_class(cls)