ui.py (69 lines of code) (raw):
import bpy
from .backend import Backend
EVENT_LABELS = {
"THINKING": "Thinking...",
"STEP": "Step",
"ERROR": "Error",
"CANCELED": "Canceled",
"SUCCESS": "Finished",
"LOADING": "Loading...",
"LOADING_SUCCESS": "Loaded model",
"LOADING_ERROR": "Failed to load model",
}
EVENT_ICONS = {
"THINKING": "SORTTIME",
"STEP": "LIGHT",
"ERROR": "ERROR",
"CANCELED": "X",
"SUCCESS": "CHECKMARK",
"LOADING": "SORTTIME",
"LOADING_SUCCESS": "CHECKMARK",
"LOADING_ERROR": "ERROR",
}
class MESHGEN_PT_Panel(bpy.types.Panel):
bl_label = "Chat"
bl_space_type = "VIEW_3D"
bl_region_type = "UI"
bl_category = "MeshGen"
def draw(self, context):
layout = self.layout
props = context.scene.meshgen_props
backend = Backend.instance()
if not backend.is_valid():
setup_box = layout.box()
setup_box.label(text="Finish setup in preferences.", icon="INFO")
preferences_row = layout.row()
preferences_row.scale_y = 1.2
preferences_row.operator(
"preferences.addon_show", text="Open Preferences", icon="SETTINGS"
).module = __package__
return
# User
user_box = layout.box()
user_box.label(text="You", icon="USER")
if props.state == "READY":
user_box.prop(props, "prompt", text="")
else:
user_box.label(text=props.prompt)
action_row = user_box.row(align=True)
action_row.scale_y = 1.2
main_button_col = action_row.column(align=True)
if props.state == "READY":
main_button_col.operator("meshgen.chat", text="Submit", icon="PLAY")
elif props.state == "LOADING" or props.state == "RUNNING":
main_button_col.operator("meshgen.cancel_chat", text="Cancel", icon="X")
log_button_col = action_row.column(align=True)
log_button_col.operator("meshgen.open_log", text="", icon="TEXT")
# Agent
if not props.history:
return
layout.separator()
agent_box = layout.box()
agent_box.label(text="Agent", icon="LIGHT")
for event in props.history:
event_box = agent_box.box()
event_box.label(text=EVENT_LABELS[event.type], icon=EVENT_ICONS[event.type])
if event.content:
event_box.label(text=event.content)
def register():
bpy.utils.register_class(MESHGEN_PT_Panel)
def unregister():
bpy.utils.unregister_class(MESHGEN_PT_Panel)