Merge pull request #2077 from MoritzBrueckner/2.9-UI-ObjectPanel

[Blender 2.9] Object panel UI
This commit is contained in:
Lubos Lenco 2021-01-01 12:58:31 +01:00 committed by GitHub
commit 5838401cd9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 69 additions and 60 deletions

View file

@ -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

View file

@ -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

View file

@ -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'''