Merge pull request #2077 from MoritzBrueckner/2.9-UI-ObjectPanel
[Blender 2.9] Object panel UI
This commit is contained in:
commit
5838401cd9
|
@ -34,24 +34,22 @@ class ArmLodListItem(bpy.types.PropertyGroup):
|
|||
|
||||
class ARM_UL_LodList(bpy.types.UIList):
|
||||
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
|
||||
# We could write some code to decide which icon to use here...
|
||||
custom_icon = 'OBJECT_DATAMODE'
|
||||
layout.use_property_split = False
|
||||
|
||||
# Make sure your code supports all 3 layout types
|
||||
if self.layout_type in {'DEFAULT', 'COMPACT'}:
|
||||
layout.prop(item, "enabled_prop")
|
||||
name = item.name
|
||||
if name == '':
|
||||
name = 'None'
|
||||
row = layout.row()
|
||||
row.label(text=name, icon=custom_icon)
|
||||
row.label(text=name, icon='OBJECT_DATAMODE')
|
||||
col = row.column()
|
||||
col.alignment = 'RIGHT'
|
||||
col.label(text="{:.2f}".format(item.screen_size_prop))
|
||||
|
||||
elif self.layout_type in {'GRID'}:
|
||||
layout.alignment = 'CENTER'
|
||||
layout.label(text="", icon = custom_icon)
|
||||
layout.label(text="", icon='OBJECT_DATAMODE')
|
||||
|
||||
class ArmLodListNewItem(bpy.types.Operator):
|
||||
# Add a new item to the list
|
||||
|
|
|
@ -2,6 +2,7 @@ import json
|
|||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
from typing import Union
|
||||
import webbrowser
|
||||
|
||||
from bpy.types import NodeTree
|
||||
|
@ -82,7 +83,10 @@ class ArmTraitListItem(bpy.types.PropertyGroup):
|
|||
arm_traitpropswarnings: CollectionProperty(type=ArmTraitPropWarning)
|
||||
|
||||
class ARM_UL_TraitList(bpy.types.UIList):
|
||||
"""List of traits."""
|
||||
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
|
||||
layout.use_property_split = False
|
||||
|
||||
custom_icon = "NONE"
|
||||
custom_icon_value = 0
|
||||
if item.type_prop == "Haxe Script":
|
||||
|
@ -96,7 +100,6 @@ class ARM_UL_TraitList(bpy.types.UIList):
|
|||
elif item.type_prop == "Logic Nodes":
|
||||
custom_icon = 'NODETREE'
|
||||
|
||||
# Make sure your code supports all 3 layout types
|
||||
if self.layout_type in {'DEFAULT', 'COMPACT'}:
|
||||
layout.prop(item, "enabled_prop")
|
||||
# Display " " for props without a name to right-align the
|
||||
|
@ -116,13 +119,14 @@ class ArmTraitListNewItem(bpy.types.Operator):
|
|||
|
||||
is_object: BoolProperty(name="Object Trait", description="Whether this is an object or scene trait", default=False)
|
||||
type_prop: EnumProperty(
|
||||
items = [('Haxe Script', 'Haxe', 'Haxe Script'),
|
||||
('WebAssembly', 'Wasm', 'WebAssembly'),
|
||||
('UI Canvas', 'UI', 'UI Canvas'),
|
||||
('Bundled Script', 'Bundled', 'Bundled Script'),
|
||||
('Logic Nodes', 'Nodes', 'Logic Nodes')
|
||||
],
|
||||
name = "Type")
|
||||
name="Type",
|
||||
items=[
|
||||
('Haxe Script', 'Haxe', 'Haxe Script'),
|
||||
('Logic Nodes', 'Nodes', 'Logic Nodes'),
|
||||
('UI Canvas', 'UI', 'UI Canvas'),
|
||||
('Bundled Script', 'Bundled', 'Bundled Script'),
|
||||
('WebAssembly', 'Wasm', 'WebAssembly')
|
||||
])
|
||||
|
||||
def invoke(self, context, event):
|
||||
wm = context.window_manager
|
||||
|
@ -635,7 +639,7 @@ class ARM_PT_TraitPanel(bpy.types.Panel):
|
|||
layout.use_property_split = True
|
||||
layout.use_property_decorate = False
|
||||
obj = bpy.context.object
|
||||
draw_traits(layout, obj, is_object=True)
|
||||
draw_traits_panel(layout, obj, is_object=True)
|
||||
|
||||
class ARM_PT_SceneTraitPanel(bpy.types.Panel):
|
||||
bl_label = "Armory Scene Traits"
|
||||
|
@ -648,7 +652,7 @@ class ARM_PT_SceneTraitPanel(bpy.types.Panel):
|
|||
layout.use_property_split = True
|
||||
layout.use_property_decorate = False
|
||||
obj = bpy.context.scene
|
||||
draw_traits(layout, obj, is_object=False)
|
||||
draw_traits_panel(layout, obj, is_object=False)
|
||||
|
||||
class ARM_OT_CopyTraitsFromActive(bpy.types.Operator):
|
||||
bl_label = 'Copy Traits from Active Object'
|
||||
|
@ -724,21 +728,24 @@ class ARM_OT_CopyTraitsFromActive(bpy.types.Operator):
|
|||
|
||||
return {'INTERFACE'}
|
||||
|
||||
def draw_traits(layout, obj, is_object):
|
||||
rows = 2
|
||||
|
||||
def draw_traits_panel(layout: bpy.types.UILayout, obj: Union[bpy.types.Object, bpy.types.Scene],
|
||||
is_object: bool) -> None:
|
||||
# Make the list bigger when there are a few traits
|
||||
num_rows = 2
|
||||
if len(obj.arm_traitlist) > 1:
|
||||
rows = 4
|
||||
num_rows = 4
|
||||
|
||||
row = layout.row()
|
||||
row.template_list("ARM_UL_TraitList", "The_List", obj, "arm_traitlist", obj, "arm_traitlist_index", rows=rows)
|
||||
row.template_list("ARM_UL_TraitList", "The_List", obj, "arm_traitlist", obj, "arm_traitlist_index", rows=num_rows)
|
||||
|
||||
col = row.column(align=True)
|
||||
op = col.operator("arm_traitlist.new_item", icon='ADD', text="")
|
||||
op.is_object = is_object
|
||||
if is_object:
|
||||
op = col.operator("arm_traitlist.delete_item", icon='REMOVE', text="")#.all = False
|
||||
op = col.operator("arm_traitlist.delete_item", icon='REMOVE', text="")
|
||||
else:
|
||||
op = col.operator("arm_traitlist.delete_item_scene", icon='REMOVE', text="")#.all = False
|
||||
op = col.operator("arm_traitlist.delete_item_scene", icon='REMOVE', text="")
|
||||
op.is_object = is_object
|
||||
|
||||
if len(obj.arm_traitlist) > 1:
|
||||
|
@ -750,35 +757,30 @@ def draw_traits(layout, obj, is_object):
|
|||
op.direction = 'DOWN'
|
||||
op.is_object = is_object
|
||||
|
||||
# Draw trait specific content
|
||||
if obj.arm_traitlist_index >= 0 and len(obj.arm_traitlist) > 0:
|
||||
item = obj.arm_traitlist[obj.arm_traitlist_index]
|
||||
|
||||
if item.type_prop == 'Haxe Script' or item.type_prop == 'Bundled Script':
|
||||
row = layout.row(align=True)
|
||||
row.alignment = 'EXPAND'
|
||||
|
||||
if item.type_prop == 'Haxe Script':
|
||||
row = layout.row(align=True)
|
||||
row.alignment = 'EXPAND'
|
||||
column = row.column(align=True)
|
||||
column.alignment = 'EXPAND'
|
||||
if item.class_name_prop == '':
|
||||
column.enabled = False
|
||||
op = column.operator("arm.edit_script", icon="FILE_SCRIPT")
|
||||
op.is_object = is_object
|
||||
op = row.operator("arm.new_script")
|
||||
op.is_object = is_object
|
||||
op = row.operator("arm.refresh_scripts", text="Refresh")
|
||||
else: # Bundled
|
||||
column.operator("arm.edit_script", icon="FILE_SCRIPT").is_object = is_object
|
||||
row.operator("arm.new_script").is_object = is_object
|
||||
row.operator("arm.refresh_scripts", text="Refresh")
|
||||
|
||||
# Bundled scripts
|
||||
else:
|
||||
if item.class_name_prop == 'NavMesh':
|
||||
row = layout.row(align=True)
|
||||
row.alignment = 'EXPAND'
|
||||
op = layout.operator("arm.generate_navmesh")
|
||||
row = layout.row(align=True)
|
||||
row.alignment = 'EXPAND'
|
||||
column = row.column(align=True)
|
||||
column.alignment = 'EXPAND'
|
||||
if not item.class_name_prop == 'NavMesh':
|
||||
op = column.operator("arm.edit_bundled_script", icon="FILE_SCRIPT")
|
||||
op.is_object = is_object
|
||||
op = row.operator("arm.refresh_scripts", text="Refresh")
|
||||
row.operator("arm.generate_navmesh")
|
||||
else:
|
||||
row.operator("arm.edit_bundled_script", icon="FILE_SCRIPT").is_object = is_object
|
||||
row.operator("arm.refresh_scripts", text="Refresh")
|
||||
|
||||
# Default props
|
||||
item.name = item.class_name_prop
|
||||
|
@ -832,7 +834,7 @@ def draw_traits(layout, obj, is_object):
|
|||
# New
|
||||
column = row.column(align=True)
|
||||
column.alignment = 'EXPAND'
|
||||
op = column.operator("arm.new_treenode", text="New Node Tree", icon="ADD")
|
||||
op = column.operator("arm.new_treenode", text="New Tree", icon="ADD")
|
||||
op.is_object = is_object
|
||||
# At least one check is active Logic Node Editor
|
||||
is_check_logic_node_editor = False
|
||||
|
@ -855,7 +857,7 @@ def draw_traits(layout, obj, is_object):
|
|||
column.enabled = False
|
||||
else:
|
||||
column.enabled = is_check_logic_node_editor
|
||||
op = column.operator("arm.edit_treenode", text="Edit Node Tree", icon="NODETREE")
|
||||
op = column.operator("arm.edit_treenode", text="Edit Tree", icon="NODETREE")
|
||||
op.is_object = is_object
|
||||
# Get from Node Tree Editor
|
||||
column = row.column(align=True)
|
||||
|
@ -864,7 +866,7 @@ def draw_traits(layout, obj, is_object):
|
|||
column.enabled = False
|
||||
else:
|
||||
column.enabled = is_check_logic_node_editor
|
||||
op = column.operator("arm.get_treenode", text="From Node Editor", icon="IMPORT")
|
||||
op = column.operator("arm.get_treenode", text="From Editor", icon="IMPORT")
|
||||
op.is_object = is_object
|
||||
|
||||
# Row for search
|
||||
|
|
|
@ -21,8 +21,9 @@ from arm.lightmapper.utility import icon
|
|||
from arm.lightmapper.properties.denoiser import oidn, optix
|
||||
import importlib
|
||||
|
||||
# Menu in object region
|
||||
|
||||
class ARM_PT_ObjectPropsPanel(bpy.types.Panel):
|
||||
"""Menu in object region."""
|
||||
bl_label = "Armory Props"
|
||||
bl_space_type = "PROPERTIES"
|
||||
bl_region_type = "WINDOW"
|
||||
|
@ -37,12 +38,13 @@ class ARM_PT_ObjectPropsPanel(bpy.types.Panel):
|
|||
if obj == None:
|
||||
return
|
||||
|
||||
layout.prop(obj, 'arm_export')
|
||||
col = layout.column()
|
||||
col.prop(obj, 'arm_export')
|
||||
if not obj.arm_export:
|
||||
return
|
||||
layout.prop(obj, 'arm_spawn')
|
||||
layout.prop(obj, 'arm_mobile')
|
||||
layout.prop(obj, 'arm_animation_enabled')
|
||||
col.prop(obj, 'arm_spawn')
|
||||
col.prop(obj, 'arm_mobile')
|
||||
col.prop(obj, 'arm_animation_enabled')
|
||||
|
||||
if obj.type == 'MESH':
|
||||
layout.prop(obj, 'arm_instanced')
|
||||
|
@ -1848,7 +1850,7 @@ class ARM_PT_BakePanel(bpy.types.Panel):
|
|||
layout.label(text="Warning! Overflow not yet supported")
|
||||
|
||||
class ArmGenLodButton(bpy.types.Operator):
|
||||
'''Automatically generate LoD levels'''
|
||||
"""Automatically generate LoD levels."""
|
||||
bl_idname = 'arm.generate_lod'
|
||||
bl_label = 'Auto Generate'
|
||||
|
||||
|
@ -2112,20 +2114,27 @@ class ARM_PT_ProxyPanel(bpy.types.Panel):
|
|||
layout.use_property_split = True
|
||||
layout.use_property_decorate = False
|
||||
layout.operator("arm.make_proxy")
|
||||
|
||||
obj = bpy.context.object
|
||||
if obj != None and obj.proxy != None:
|
||||
layout.label(text="Sync")
|
||||
layout.prop(obj, "arm_proxy_sync_loc")
|
||||
layout.prop(obj, "arm_proxy_sync_rot")
|
||||
layout.prop(obj, "arm_proxy_sync_scale")
|
||||
layout.prop(obj, "arm_proxy_sync_materials")
|
||||
layout.prop(obj, "arm_proxy_sync_modifiers")
|
||||
layout.prop(obj, "arm_proxy_sync_traits")
|
||||
row = layout.row()
|
||||
if obj is not None and obj.proxy is not None:
|
||||
col = layout.column(heading="Sync")
|
||||
col.prop(obj, "arm_proxy_sync_loc")
|
||||
col.prop(obj, "arm_proxy_sync_rot")
|
||||
col.prop(obj, "arm_proxy_sync_scale")
|
||||
col.separator()
|
||||
|
||||
col.prop(obj, "arm_proxy_sync_materials")
|
||||
col.prop(obj, "arm_proxy_sync_modifiers")
|
||||
col.separator()
|
||||
|
||||
col.prop(obj, "arm_proxy_sync_traits")
|
||||
row = col.row()
|
||||
row.enabled = obj.arm_proxy_sync_traits
|
||||
row.prop(obj, "arm_proxy_sync_trait_props")
|
||||
layout.operator("arm.proxy_toggle_all")
|
||||
layout.operator("arm.proxy_apply_all")
|
||||
|
||||
row = layout.row(align=True)
|
||||
row.operator("arm.proxy_toggle_all")
|
||||
row.operator("arm.proxy_apply_all")
|
||||
|
||||
class ArmMakeProxyButton(bpy.types.Operator):
|
||||
'''Create proxy from linked object'''
|
||||
|
|
Loading…
Reference in a new issue