Improve UX of task tree by shifting buttons and changing column widths

This commit is contained in:
Dion Moult
2021-08-18 18:40:54 +10:00
parent a6b8e40829
commit bbd7264a9b
@@ -1,4 +1,3 @@
# BlenderBIM Add-on - OpenBIM Blender Add-on
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
#
@@ -152,6 +151,37 @@ class BIM_PT_work_schedules(Panel):
elif self.props.editing_type == "TASKS":
self.draw_editable_task_ui(work_schedule_id)
def draw_task_operators(self):
row = self.layout.row(align=True)
row.alignment = "RIGHT"
ifc_definition_id = None
if self.tprops.tasks and self.props.active_task_index < len(self.tprops.tasks):
task = self.tprops.tasks[self.props.active_task_index]
ifc_definition_id = task.ifc_definition_id
if ifc_definition_id:
if self.props.active_task_id == ifc_definition_id:
if self.props.editing_task_type == "TASKTIME":
row.operator("bim.edit_task_time", text="", icon="CHECKMARK")
elif self.props.editing_task_type == "ATTRIBUTES":
row.operator("bim.edit_task", text="", icon="CHECKMARK")
row.operator("bim.disable_editing_task", text="", icon="CANCEL")
elif self.props.active_task_id:
row.operator("bim.add_task", text="", icon="ADD").task = ifc_definition_id
row.operator("bim.remove_task", text="", icon="X").task = ifc_definition_id
else:
row.operator("bim.enable_editing_task_sequence", text="", icon="TRACKING").task = ifc_definition_id
row.operator(
"bim.select_task_related_products", icon="RESTRICT_SELECT_OFF", text=""
).task = ifc_definition_id
row.operator("bim.enable_editing_task_time", text="", icon="TIME").task = ifc_definition_id
row.operator("bim.enable_editing_task_calendar", text="", icon="VIEW_ORTHO").task = ifc_definition_id
row.operator(
"bim.enable_assigning_process_to_resources", text="", icon="COMMUNITY"
).task = ifc_definition_id
row.operator("bim.enable_editing_task", text="", icon="GREASEPENCIL").task = ifc_definition_id
row.operator("bim.add_task", text="", icon="ADD").task = ifc_definition_id
row.operator("bim.remove_task", text="", icon="X").task = ifc_definition_id
def draw_column_ui(self):
row = self.layout.row(align=True)
row.prop(self.props, "column_types", text="")
@@ -205,6 +235,7 @@ class BIM_PT_work_schedules(Panel):
draw_attributes(self.props.work_schedule_attributes, self.layout)
def draw_editable_task_ui(self, work_schedule_id):
self.draw_task_operators()
self.layout.template_list(
"BIM_UL_tasks",
"",
@@ -313,6 +344,7 @@ class BIM_PT_work_schedules(Panel):
op.task = self.props.active_task_id
op.resource = related_obect_id
class BIM_UL_task_columns(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
props = context.scene.BIMWorkScheduleProperties
@@ -327,59 +359,21 @@ class BIM_UL_task_columns(UIList):
class BIM_UL_tasks(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
if item:
props = context.scene.BIMWorkScheduleProperties
self.props = context.scene.BIMWorkScheduleProperties
task = IfcStore.get_file().by_id(item.ifc_definition_id)
row = layout.row(align=True)
for i in range(0, item.level_index):
row.label(text="", icon="BLANK1")
if item.has_children:
if item.is_expanded:
row.operator(
"bim.contract_task", text="", emboss=False, icon="DISCLOSURE_TRI_DOWN"
).task = item.ifc_definition_id
else:
row.operator(
"bim.expand_task", text="", emboss=False, icon="DISCLOSURE_TRI_RIGHT"
).task = item.ifc_definition_id
else:
row.label(text="", icon="DOT")
row.prop(item, "identification", emboss=False, text="")
row.prop(item, "name", emboss=False, text="")
for column in props.columns:
if column.name == "IfcTaskTime.ScheduleStart":
if item.derived_start:
row.label(text=item.derived_start + "*")
else:
row.prop(item, "start", emboss=False, text="")
elif column.name == "IfcTaskTime.ScheduleFinish":
if item.derived_finish:
row.label(text=item.derived_finish + "*")
else:
row.prop(item, "finish", emboss=False, text="")
elif column.name == "IfcTaskTime.ScheduleDuration":
if item.derived_duration:
row.label(text=item.derived_duration + "*")
else:
row.prop(item, "duration", emboss=False, text="")
elif column.name == "Controls.Calendar":
if item.derived_calendar:
row.label(text=item.derived_calendar + "*")
else:
row.label(text=item.calendar or "-")
else:
ifc_class, name = column.name.split(".")
if ifc_class == "IfcTask":
value = getattr(task, name)
elif ifc_class == "IfcTaskTime":
value = getattr(task.TaskTime, name) if task.TaskTime else None
if value is None:
value = "-"
row.label(text=str(value))
self.draw_hierarchy(row, item)
split1 = row.split(factor=0.1)
split1.prop(item, "identification", emboss=False, text="")
split2 = split1.split(factor=0.9 - min(0.5, 0.15 * len(self.props.columns)))
split2.prop(item, "name", emboss=False, text="")
self.draw_custom_columns(split2, item, task)
if context.active_object:
oprops = context.active_object.BIMObjectProperties
row = layout.row(align=True)
if oprops.ifc_definition_id in Data.tasks[item.ifc_definition_id]["OperatesOn"]:
op = row.operator("bim.unassign_process", text="", icon="MARKER_HLT", emboss=False)
@@ -395,7 +389,7 @@ class BIM_UL_tasks(UIList):
op = row.operator("bim.assign_product", text="", icon="KEYFRAME", emboss=False)
op.task = item.ifc_definition_id
if props.active_task_id and props.editing_task_type == "ATTRIBUTES":
if self.props.active_task_id and self.props.editing_task_type == "ATTRIBUTES":
row.prop(
item,
"is_selected",
@@ -404,47 +398,66 @@ class BIM_UL_tasks(UIList):
emboss=False,
)
if props.active_task_id == item.ifc_definition_id:
if props.editing_task_type == "TASKTIME":
row.operator("bim.edit_task_time", text="", icon="CHECKMARK")
elif props.editing_task_type == "ATTRIBUTES":
row.operator("bim.edit_task", text="", icon="CHECKMARK")
row.operator("bim.disable_editing_task", text="", icon="CANCEL")
elif props.active_task_id:
if props.editing_task_type == "SEQUENCE":
if self.props.active_task_id:
if self.props.editing_task_type == "SEQUENCE" and self.props.active_task_id != item.ifc_definition_id:
if item.is_predecessor:
row.operator(
"bim.unassign_predecessor", text="", icon="BACK", emboss=False
).task = item.ifc_definition_id
op = row.operator("bim.unassign_predecessor", text="", icon="BACK", emboss=False)
else:
row.operator(
"bim.assign_predecessor", text="", icon="TRACKING_BACKWARDS", emboss=False
).task = item.ifc_definition_id
op = row.operator("bim.assign_predecessor", text="", icon="TRACKING_BACKWARDS", emboss=False)
op.task = item.ifc_definition_id
if item.is_successor:
row.operator(
"bim.unassign_successor", text="", icon="FORWARD", emboss=False
).task = item.ifc_definition_id
op = row.operator("bim.unassign_successor", text="", icon="FORWARD", emboss=False)
else:
row.operator(
"bim.assign_successor", text="", icon="TRACKING_FORWARDS", emboss=False
).task = item.ifc_definition_id
op = row.operator("bim.assign_successor", text="", icon="TRACKING_FORWARDS", emboss=False)
op.task = item.ifc_definition_id
row.operator("bim.add_task", text="", icon="ADD").task = item.ifc_definition_id
row.operator("bim.remove_task", text="", icon="X").task = item.ifc_definition_id
def draw_hierarchy(self, row, item):
for i in range(0, item.level_index):
row.label(text="", icon="BLANK1")
if item.has_children:
if item.is_expanded:
row.operator(
"bim.contract_task", text="", emboss=False, icon="DISCLOSURE_TRI_DOWN"
).task = item.ifc_definition_id
else:
row.operator("bim.enable_editing_task_sequence", text="", icon="TRACKING").task = item.ifc_definition_id
row.operator(
"bim.select_task_related_products", icon="RESTRICT_SELECT_OFF", text=""
"bim.expand_task", text="", emboss=False, icon="DISCLOSURE_TRI_RIGHT"
).task = item.ifc_definition_id
row.operator("bim.enable_editing_task_time", text="", icon="TIME").task = item.ifc_definition_id
row.operator(
"bim.enable_editing_task_calendar", text="", icon="VIEW_ORTHO"
).task = item.ifc_definition_id
row.operator("bim.enable_assigning_process_to_resources", text="", icon="COMMUNITY").task = item.ifc_definition_id
row.operator("bim.enable_editing_task", text="", icon="GREASEPENCIL").task = item.ifc_definition_id
row.operator("bim.add_task", text="", icon="ADD").task = item.ifc_definition_id
row.operator("bim.remove_task", text="", icon="X").task = item.ifc_definition_id
else:
row.label(text="", icon="DOT")
def draw_custom_columns(self, row, item, task):
for column in self.props.columns:
if column.name == "IfcTaskTime.ScheduleStart":
if item.derived_start:
row.label(text=item.derived_start + "*")
else:
row.prop(item, "start", emboss=False, text="")
elif column.name == "IfcTaskTime.ScheduleFinish":
if item.derived_finish:
row.label(text=item.derived_finish + "*")
else:
row.prop(item, "finish", emboss=False, text="")
elif column.name == "IfcTaskTime.ScheduleDuration":
if item.derived_duration:
row.label(text=item.derived_duration + "*")
else:
row.prop(item, "duration", emboss=False, text="")
elif column.name == "Controls.Calendar":
if item.derived_calendar:
row.label(text=item.derived_calendar + "*")
else:
row.label(text=item.calendar or "-")
else:
ifc_class, name = column.name.split(".")
if ifc_class == "IfcTask":
value = getattr(task, name)
elif ifc_class == "IfcTaskTime":
value = getattr(task.TaskTime, name) if task.TaskTime else None
if value is None:
value = "-"
row.label(text=str(value))
class BIM_PT_work_calendars(Panel):