Clean up UX to either edit a work schedule attributes or task tree but not both simultaneously

This commit is contained in:
Dion Moult
2021-04-19 11:42:39 +10:00
parent 209eea6a18
commit d2d4112724
4 changed files with 56 additions and 48 deletions
@@ -9,11 +9,11 @@ classes = (
operator.RemoveWorkPlan, operator.RemoveWorkPlan,
operator.EnableEditingWorkPlan, operator.EnableEditingWorkPlan,
operator.DisableEditingWorkPlan, operator.DisableEditingWorkPlan,
operator.DisableWorkScheduleEditingUI,
operator.AddWorkSchedule, operator.AddWorkSchedule,
operator.EditWorkSchedule, operator.EditWorkSchedule,
operator.RemoveWorkSchedule, operator.RemoveWorkSchedule,
operator.EnableEditingWorkSchedule, operator.EnableEditingWorkSchedule,
operator.EnableEditingTasks,
operator.DisableEditingWorkSchedule, operator.DisableEditingWorkSchedule,
operator.LoadTasks, operator.LoadTasks,
operator.DisableTaskEditingUI, operator.DisableTaskEditingUI,
@@ -123,15 +123,6 @@ class DisableEditingWorkPlan(bpy.types.Operator):
return {"FINISHED"} return {"FINISHED"}
class DisableWorkScheduleEditingUI(bpy.types.Operator):
bl_idname = "bim.disable_work_schedule_editing_ui"
bl_label = "Disable WorkSchedule Editing UI"
def execute(self, context):
context.scene.BIMWorkScheduleProperties.is_editing = False
return {"FINISHED"}
class AddWorkSchedule(bpy.types.Operator): class AddWorkSchedule(bpy.types.Operator):
bl_idname = "bim.add_work_schedule" bl_idname = "bim.add_work_schedule"
bl_label = "Add Work Schedule" bl_label = "Add Work Schedule"
@@ -192,7 +183,11 @@ class EnableEditingWorkSchedule(bpy.types.Operator):
self.props.active_work_schedule_id = self.work_schedule self.props.active_work_schedule_id = self.work_schedule
while len(self.props.work_schedule_attributes) > 0: while len(self.props.work_schedule_attributes) > 0:
self.props.work_schedule_attributes.remove(0) self.props.work_schedule_attributes.remove(0)
self.enable_editing_work_schedule()
self.props.is_editing = "WORK_SCHEDULE"
return {"FINISHED"}
def enable_editing_work_schedule(self):
data = Data.work_schedules[self.work_schedule] data = Data.work_schedules[self.work_schedule]
for attribute in IfcStore.get_schema().declaration_by_name("IfcWorkSchedule").all_attributes(): for attribute in IfcStore.get_schema().declaration_by_name("IfcWorkSchedule").all_attributes():
@@ -213,12 +208,22 @@ class EnableEditingWorkSchedule(bpy.types.Operator):
if data[attribute.name()]: if data[attribute.name()]:
new.enum_value = data[attribute.name()] new.enum_value = data[attribute.name()]
class EnableEditingTasks(bpy.types.Operator):
bl_idname = "bim.enable_editing_tasks"
bl_label = "Enable Editing Tasks"
work_schedule: bpy.props.IntProperty()
def execute(self, context):
self.props = context.scene.BIMWorkScheduleProperties
self.props.active_work_schedule_id = self.work_schedule
while len(self.props.tasks) > 0: while len(self.props.tasks) > 0:
self.props.tasks.remove(0) self.props.tasks.remove(0)
self.contracted_tasks = json.loads(self.props.contracted_tasks) self.contracted_tasks = json.loads(self.props.contracted_tasks)
for related_object_id in Data.work_schedules[self.work_schedule]["RelatedObjects"]: for related_object_id in Data.work_schedules[self.work_schedule]["RelatedObjects"]:
self.create_new_task_li(related_object_id, 0) self.create_new_task_li(related_object_id, 0)
self.props.is_editing = "TASKS"
return {"FINISHED"} return {"FINISHED"}
def create_new_task_li(self, related_object_id, level_index): def create_new_task_li(self, related_object_id, level_index):
@@ -400,7 +405,7 @@ class AddTask(bpy.types.Operator):
self.file = IfcStore.get_file() self.file = IfcStore.get_file()
ifcopenshell.api.run("sequence.add_task", self.file, **{"parent_task": self.file.by_id(self.task)}) ifcopenshell.api.run("sequence.add_task", self.file, **{"parent_task": self.file.by_id(self.task)})
Data.load(self.file) Data.load(self.file)
bpy.ops.bim.enable_editing_work_schedule(work_schedule=props.active_work_schedule_id) bpy.ops.bim.enable_editing_tasks(work_schedule=props.active_work_schedule_id)
return {"FINISHED"} return {"FINISHED"}
@@ -414,7 +419,7 @@ class AddSummaryTask(bpy.types.Operator):
self.file = IfcStore.get_file() self.file = IfcStore.get_file()
ifcopenshell.api.run("sequence.add_task", self.file, **{"work_schedule": self.file.by_id(self.work_schedule)}) ifcopenshell.api.run("sequence.add_task", self.file, **{"work_schedule": self.file.by_id(self.work_schedule)})
Data.load(self.file) Data.load(self.file)
bpy.ops.bim.enable_editing_work_schedule(work_schedule=props.active_work_schedule_id) bpy.ops.bim.enable_editing_tasks(work_schedule=props.active_work_schedule_id)
return {"FINISHED"} return {"FINISHED"}
@@ -430,7 +435,7 @@ class ExpandTask(bpy.types.Operator):
contracted_tasks.remove(self.task) contracted_tasks.remove(self.task)
props.contracted_tasks = json.dumps(contracted_tasks) props.contracted_tasks = json.dumps(contracted_tasks)
Data.load(self.file) Data.load(self.file)
bpy.ops.bim.enable_editing_work_schedule(work_schedule=props.active_work_schedule_id) bpy.ops.bim.enable_editing_tasks(work_schedule=props.active_work_schedule_id)
return {"FINISHED"} return {"FINISHED"}
@@ -446,7 +451,7 @@ class ContractTask(bpy.types.Operator):
contracted_tasks.append(self.task) contracted_tasks.append(self.task)
props.contracted_tasks = json.dumps(contracted_tasks) props.contracted_tasks = json.dumps(contracted_tasks)
Data.load(self.file) Data.load(self.file)
bpy.ops.bim.enable_editing_work_schedule(work_schedule=props.active_work_schedule_id) bpy.ops.bim.enable_editing_tasks(work_schedule=props.active_work_schedule_id)
return {"FINISHED"} return {"FINISHED"}
@@ -464,7 +469,7 @@ class RemoveTask(bpy.types.Operator):
task=IfcStore.get_file().by_id(self.task), task=IfcStore.get_file().by_id(self.task),
) )
Data.load(self.file) Data.load(self.file)
bpy.ops.bim.enable_editing_work_schedule(work_schedule=props.active_work_schedule_id) bpy.ops.bim.enable_editing_tasks(work_schedule=props.active_work_schedule_id)
return {"FINISHED"} return {"FINISHED"}
@@ -539,5 +544,5 @@ class EditTask(bpy.types.Operator):
) )
Data.load(IfcStore.get_file()) Data.load(IfcStore.get_file())
bpy.ops.bim.disable_editing_task() bpy.ops.bim.disable_editing_task()
bpy.ops.bim.enable_editing_work_schedule(work_schedule=props.active_work_schedule_id) bpy.ops.bim.enable_editing_tasks(work_schedule=props.active_work_schedule_id)
return {"FINISHED"} return {"FINISHED"}
@@ -72,7 +72,7 @@ class BIMWorkPlanProperties(PropertyGroup):
class BIMWorkScheduleProperties(PropertyGroup): class BIMWorkScheduleProperties(PropertyGroup):
work_schedule_attributes: CollectionProperty(name="Work Schedule Attributes", type=Attribute) work_schedule_attributes: CollectionProperty(name="Work Schedule Attributes", type=Attribute)
is_editing: BoolProperty(name="Is Editing", default=False) is_editing: StringProperty(name="Is Editing")
active_work_schedule_index: IntProperty(name="Active Work Schedules Index") active_work_schedule_index: IntProperty(name="Active Work Schedules Index")
active_work_schedule_id: IntProperty(name="Active Work Schedules Id") active_work_schedule_id: IntProperty(name="Active Work Schedules Id")
tasks: CollectionProperty(name="Tasks", type=Task) tasks: CollectionProperty(name="Tasks", type=Task)
@@ -85,30 +85,35 @@ class BIM_PT_work_schedules(Panel):
if not Data.is_loaded: if not Data.is_loaded:
Data.load(IfcStore.get_file()) Data.load(IfcStore.get_file())
row = self.layout.row(align=True)
row.label(text="{} Work Schedules Found".format(len(Data.work_schedules)), icon="TEXT")
row = self.layout.row() row = self.layout.row()
row.operator("bim.add_work_schedule", icon="ADD") row.operator("bim.add_work_schedule", icon="ADD")
for work_schedule_id, work_schedule in Data.work_schedules.items(): for work_schedule_id, work_schedule in Data.work_schedules.items():
row = self.layout.row(align=True) self.draw_work_schedule_ui(work_schedule_id, work_schedule)
row.label(text=work_schedule["Name"] or "Unnamed", icon="LINENUMBERS_ON")
if self.props.active_work_schedule_id and self.props.active_work_schedule_id == work_schedule_id: def draw_work_schedule_ui(self, work_schedule_id, work_schedule):
row = self.layout.row(align=True)
row.label(text=work_schedule["Name"] or "Unnamed", icon="TEXT")
if self.props.active_work_schedule_id and self.props.active_work_schedule_id == work_schedule_id:
if self.props.is_editing == "WORK_SCHEDULE":
row.operator("bim.edit_work_schedule", text="", icon="CHECKMARK") row.operator("bim.edit_work_schedule", text="", icon="CHECKMARK")
row.operator("bim.disable_editing_work_schedule", text="", icon="X") row.operator("bim.disable_editing_work_schedule", text="", icon="CANCEL")
elif self.props.active_work_schedule_id: elif self.props.active_work_schedule_id:
row.operator("bim.remove_work_schedule", text="", icon="X").work_schedule = work_schedule_id row.operator("bim.remove_work_schedule", text="", icon="X").work_schedule = work_schedule_id
else: else:
row.operator( row.operator("bim.enable_editing_tasks", text="", icon="ACTION").work_schedule = work_schedule_id
"bim.enable_editing_work_schedule", text="", icon="GREASEPENCIL" op = row.operator("bim.enable_editing_work_schedule", text="", icon="GREASEPENCIL")
).work_schedule = work_schedule_id op.work_schedule = work_schedule_id
row.operator("bim.remove_work_schedule", text="", icon="X").work_schedule = work_schedule_id row.operator("bim.remove_work_schedule", text="", icon="X").work_schedule = work_schedule_id
if self.props.active_work_schedule_id == work_schedule_id: if self.props.active_work_schedule_id == work_schedule_id:
self.draw_editable_work_schedule_ui(work_schedule_id, work_schedule) if self.props.is_editing == "WORK_SCHEDULE":
self.draw_editable_work_schedule_ui()
elif self.props.is_editing == "TASKS":
self.draw_editable_task_ui(work_schedule_id)
def draw_editable_work_schedule_ui(self, work_schedule_id, work_schedule): def draw_editable_work_schedule_ui(self):
for attribute in self.props.work_schedule_attributes: for attribute in self.props.work_schedule_attributes:
row = self.layout.row(align=True) row = self.layout.row(align=True)
if attribute.data_type == "string": if attribute.data_type == "string":
@@ -118,6 +123,7 @@ class BIM_PT_work_schedules(Panel):
if attribute.is_optional: if attribute.is_optional:
row.prop(attribute, "is_null", icon="RADIOBUT_OFF" if attribute.is_null else "RADIOBUT_ON", text="") row.prop(attribute, "is_null", icon="RADIOBUT_OFF" if attribute.is_null else "RADIOBUT_ON", text="")
def draw_editable_task_ui(self, work_schedule_id):
row = self.layout.row(align=True) row = self.layout.row(align=True)
row.label(text="X Summary Tasks") row.label(text="X Summary Tasks")
row.operator("bim.add_summary_task", text="", icon="ADD").work_schedule = work_schedule_id row.operator("bim.add_summary_task", text="", icon="ADD").work_schedule = work_schedule_id
@@ -130,21 +136,18 @@ class BIM_PT_work_schedules(Panel):
"active_task_index", "active_task_index",
) )
if self.props.active_task_id: if self.props.active_task_id:
self.draw_editable_task_ui() for attribute in self.props.task_attributes:
row = self.layout.row(align=True)
def draw_editable_task_ui(self): if attribute.data_type == "string":
for attribute in self.props.task_attributes: row.prop(attribute, "string_value", text=attribute.name)
row = self.layout.row(align=True) elif attribute.data_type == "boolean":
if attribute.data_type == "string": row.prop(attribute, "bool_value", text=attribute.name)
row.prop(attribute, "string_value", text=attribute.name) elif attribute.data_type == "integer":
elif attribute.data_type == "boolean": row.prop(attribute, "int_value", text=attribute.name)
row.prop(attribute, "bool_value", text=attribute.name) elif attribute.data_type == "enum":
elif attribute.data_type == "integer": row.prop(attribute, "enum_value", text=attribute.name)
row.prop(attribute, "int_value", text=attribute.name) if attribute.is_optional:
elif attribute.data_type == "enum": row.prop(attribute, "is_null", icon="RADIOBUT_OFF" if attribute.is_null else "RADIOBUT_ON", text="")
row.prop(attribute, "enum_value", text=attribute.name)
if attribute.is_optional:
row.prop(attribute, "is_null", icon="RADIOBUT_OFF" if attribute.is_null else "RADIOBUT_ON", text="")
class BIM_UL_tasks(UIList): class BIM_UL_tasks(UIList):