diff --git a/src/blenderbim/blenderbim/bim/module/sequence/ui.py b/src/blenderbim/blenderbim/bim/module/sequence/ui.py index bbdc8c20c0..a8bcc7d291 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/ui.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/ui.py @@ -1,4 +1,3 @@ - # BlenderBIM Add-on - OpenBIM Blender Add-on # Copyright (C) 2020, 2021 Dion Moult # @@ -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):