Fix #1344. You can now reorder items in a material layer set

This commit is contained in:
Dion Moult
2021-03-08 14:20:43 +11:00
parent cfaa90b1fb
commit fa23f64e9f
4 changed files with 48 additions and 4 deletions
@@ -10,6 +10,7 @@ classes = (
operator.RemoveConstituent,
operator.AddLayer,
operator.RemoveLayer,
operator.ReorderLayer,
operator.AddListItem,
operator.RemoveListItem,
operator.EnableEditingAssignedMaterial,
@@ -8,6 +8,7 @@ import blenderbim.bim.module.material.remove_constituent as remove_constituent
import blenderbim.bim.module.material.add_layer as add_layer
import blenderbim.bim.module.material.edit_layer as edit_layer
import blenderbim.bim.module.material.remove_layer as remove_layer
import blenderbim.bim.module.material.reorder_layer as reorder_layer
import blenderbim.bim.module.material.add_list_item as add_list_item
import blenderbim.bim.module.material.remove_list_item as remove_list_item
import blenderbim.bim.module.material.edit_assigned_material as edit_assigned_material
@@ -137,6 +138,29 @@ class AddLayer(bpy.types.Operator):
return {"FINISHED"}
class ReorderLayer(bpy.types.Operator):
bl_idname = "bim.reorder_layer"
bl_label = "Reorder Layer"
obj: bpy.props.StringProperty()
old_index: bpy.props.IntProperty()
new_index: bpy.props.IntProperty()
layer_set: bpy.props.IntProperty()
def execute(self, context):
obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object
self.file = IfcStore.get_file()
reorder_layer.Usecase(
self.file,
{
"layer_set": self.file.by_id(self.layer_set),
"old_index": self.old_index,
"new_index": self.new_index,
},
).execute()
Data.load_layers()
return {"FINISHED"}
class RemoveLayer(bpy.types.Operator):
bl_idname = "bim.remove_layer"
bl_label = "Remove Layer"
@@ -0,0 +1,11 @@
class Usecase:
def __init__(self, file, settings=None):
self.file = file
self.settings = {"layer_set": None, "old_index": 0, "new_index": 0}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
layers = list(self.settings["layer_set"].MaterialLayers or [])
layers.insert(self.settings["new_index"], layers.pop(self.settings["old_index"]))
self.settings["layer_set"].MaterialLayers = layers
@@ -145,7 +145,9 @@ class BIM_PT_object_material(Panel):
if self.props.active_material_set_item_id == set_item_id:
self.draw_editable_set_item_ui(set_item_id)
else:
self.draw_read_only_set_item_ui(set_item_id, is_first=index == 0, is_last=index == total_items - 1)
self.draw_read_only_set_item_ui(
set_item_id, index, is_first=index == 0, is_last=index == total_items - 1
)
def draw_editable_set_item_ui(self, set_item_id):
item = self.set_data[set_item_id]
@@ -170,7 +172,7 @@ class BIM_PT_object_material(Panel):
row.prop(attribute, "bool_value", text=attribute.name)
row.prop(attribute, "is_null", icon="RADIOBUT_OFF" if attribute.is_null else "RADIOBUT_ON", text="")
def draw_read_only_set_item_ui(self, set_item_id, is_first=False, is_last=False):
def draw_read_only_set_item_ui(self, set_item_id, index, is_first=False, is_last=False):
if self.product_data["type"] == "IfcMaterialList":
item = Data.materials[set_item_id]
row = self.layout.row(align=True)
@@ -183,9 +185,15 @@ class BIM_PT_object_material(Panel):
row.label(text=Data.materials[item["Material"]]["Name"], icon="MATERIAL")
if not is_first:
row.operator("bim.edit_attributes", icon="TRIA_UP", text="")
op = row.operator(f"bim.reorder_{self.set_item_name}", icon="TRIA_UP", text="")
op.old_index = index
op.new_index = index - 1
setattr(op, f"{self.set_item_name}_set", self.material_set_id)
if not is_last:
row.operator("bim.edit_attributes", icon="TRIA_DOWN", text="")
op = row.operator(f"bim.reorder_{self.set_item_name}", icon="TRIA_DOWN", text="")
op.old_index = index
op.new_index = index + 1
setattr(op, f"{self.set_item_name}_set", self.material_set_id)
if not self.props.active_material_set_item_id and self.product_data["type"] != "IfcMaterialList":
op = row.operator("bim.enable_editing_material_set_item", icon="GREASEPENCIL", text="")
op.material_set_item = set_item_id