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

207 lines
7.3 KiB
Python

# SPDX-FileCopyrightText: 2025 Blender Studio Tools Authors
#
# SPDX-License-Identifier: GPL-3.0-or-later
from pathlib import Path
import bpy
from bpy.app.handlers import persistent
from . import utils
@persistent
def init_on_load(dummy):
if not bpy.data.is_saved:
return
context = bpy.context
meta_settings = getattr(context.scene, 'LOR_Settings')
if not meta_settings:
return
settings = utils.get_settings(meta_settings)
filepath = Path(bpy.context.blend_data.filepath)
sequence_name, shot_name, file_name = filepath.parts[-3:]
meta_settings.sequence_settings.name = sequence_name
meta_settings.shot_settings.name = shot_name
if file_name.endswith('.lighting.blend'):
meta_settings.enabled = True
if not meta_settings.enabled:
return
if not meta_settings.execution_script:
execution_script = bpy.data.texts.get('lighting_overrider_execution.py')
if not execution_script:
pass
meta_settings.execution_script = execution_script
if not bpy.context.blend_data.filepath:
return
sequence_settings_db, shot_settings_db = utils.find_settings(bpy.context)
if not meta_settings.sequence_settings.text_datablock:
meta_settings.sequence_settings.text_datablock = sequence_settings_db
if not meta_settings.shot_settings.text_datablock:
meta_settings.shot_settings.text_datablock = shot_settings_db
#utils.reload_settings(context) #TODO: Fix loading settings on file load
return
@persistent
def store_ref_on_save(dummy):
meta_settings = getattr(bpy.context.scene, 'LOR_Settings')
bpy.context.scene['LOR_sequence_settings'] = meta_settings.sequence_settings.text_datablock
bpy.context.scene['LOR_shot_settings'] = meta_settings.shot_settings.text_datablock
return
class LOR_OT_toggle_enabled(bpy.types.Operator):
"""
"""
bl_idname = "lighting_overrider.toggle_enabled"
bl_label = "Toggle Lighting Overrider Addon"
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
meta_settings = context.scene.LOR_Settings
meta_settings.enabled = not meta_settings.enabled
return {'FINISHED'}
class LOR_OT_text_db_add(bpy.types.Operator):
"""
"""
bl_idname = "lighting_overrider.text_db_add"
bl_label = "Add Text Datablock"
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
meta_settings = context.scene.LOR_Settings
settings = utils.get_settings(meta_settings)
name = f'{settings.name}.settings.json' if settings.name else f'{meta_settings.settings_toggle.lower()}_settings.json'
text_db = bpy.data.texts.new(name)
settings.text_datablock = text_db
return {'FINISHED'}
class LOR_PT_lighting_overrider_panel(bpy.types.Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_label = "Lighting Overrider"
bl_category = 'Overrides'
def draw_header(self, context):
self.layout.label(text='', icon='LIBRARY_DATA_OVERRIDE')
return
def draw(self, context):
layout = self.layout
meta_settings = context.scene.LOR_Settings
settings = utils.get_settings(meta_settings)
enabled = meta_settings.enabled
text = 'Lighting Overrider Active' if enabled else 'Lighting Overrider Inactive'
icon = 'CHECKBOX_HLT' if enabled else 'CHECKBOX_DEHLT'
layout.operator('lighting_overrider.toggle_enabled', text=text, icon=icon, depress=enabled)
col_main = layout.column()
if not meta_settings.enabled:
col_main.enabled = False
col = col_main.column()
box = col.box()
row = box.row(align=True)
row.prop(meta_settings, 'execution_script')
if not meta_settings.execution_script:
row.operator('lighting_overrider.generate_execution_script', icon='FILE_CACHE', text='')
#row.operator('lighting_overrider.reload_libraries', icon='FILE_REFRESH', text='')#TODO reload libraries accurately (bug?)
row.operator('lighting_overrider.run_execution_script', icon='PLAY', text='')
#row = box.row()
#row.operator('lighting_overrider.reload_run_execution_script', icon='CHECKMARK')
if not meta_settings.execution_script:
col_warn = box.column()
col_warn.alert = True
row = col_warn.row()
row.label(text=f'No execution script referenced!', icon='ERROR')
row = col_warn.row()
row.label(text=f'Without the execution script overrides will not be applied on file-load!', icon='BLANK1')
col.separator(factor=2.0)
row = col.row()
row.prop(meta_settings, 'settings_toggle', expand=True)
col.alignment = 'CENTER'
col.label(text=f"{meta_settings.settings_toggle.capitalize()} Name: {settings.name if settings.name else 'UNKNOWN'}")
col = col_main.column()
col.label(text=settings.bl_rna.properties['text_datablock'].name)
row = col.row(align=True)
try:
linked_settings = context.scene[f'LOR_{meta_settings.settings_toggle.lower()}_settings']
except:
linked_settings = None
if settings.text_datablock not in [linked_settings, None]:
row.alert = True
row.prop(settings, 'text_datablock', text='', expand=True)
if not settings.text_datablock or row.alert:
row.operator('lighting_overrider.find_settings', text='', icon='VIEWZOOM')
if not settings.text_datablock:
row.operator('lighting_overrider.text_db_add', text='', icon='FILE_NEW')
else:
# mark whether JSON file is internal or external
row.label(text='', icon = 'FILE_ARCHIVE' if settings.text_datablock.is_in_memory else 'FILE')
row = col.row(align=True)
flag1 = False
flag2 = False
if settings.text_datablock:
if settings.text_datablock.is_dirty:
flag1 = True
if settings.text_datablock.is_modified:
flag2 = True
flag = (flag1 or flag2) and not settings.text_datablock.is_in_memory
row.alert = flag or settings.is_dirty
icon = 'FILE_TICK'if flag else 'IMPORT'
text = 'Write and Save JSON' if flag else 'Write JSON'
row.operator('lighting_overrider.write_settings', icon=icon, text=text)
icon = 'FILE_REFRESH'if flag else 'EXPORT'
text = 'Reload and Read JSON' if flag else 'Read JSON'
row.operator('lighting_overrider.read_settings', icon=icon, text=text)
row = col.row(align=True)
row.alert = settings.is_dirty
operator = 'lighting_overrider.write_apply_json' if settings.is_dirty else 'lighting_overrider.apply_json'
icon = 'TEMP' if settings.is_dirty else 'PLAY'
row.operator(operator, icon=icon)
return
classes = [
LOR_OT_text_db_add,
LOR_OT_toggle_enabled,
LOR_PT_lighting_overrider_panel,
]
def register():
for c in classes:
bpy.utils.register_class(c)
bpy.app.handlers.load_post.append(init_on_load)
bpy.app.handlers.save_pre.append(store_ref_on_save)
def unregister():
for c in classes:
bpy.utils.unregister_class(c)
bpy.app.handlers.load_post.remove(init_on_load)
bpy.app.handlers.save_pre.remove(store_ref_on_save)
#if __name__ == "__main__":
# register()