# 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()