MujicaUI

Chat Sessions · #244

ProjectList 浅色主题渲染快照
浅色 · 渲染快照
ProjectList 深色主题渲染快照
深色 · 渲染快照

244 ProjectList · 项目列表

用途

按文件夹列出项目,展开项目可见其中的会话;把会话拖到项目上或用“移动”菜单即可改变归属。

最小示例

var state chat.ProjectListState
projects := []chat.ChatProject{{ID: "p1", Name: "Coronation", Folder: "Court"}}
convs := func(id string) []chat.ChatConversation {
	return []chat.ChatConversation{{ID: "1", Title: "Menu"}}
}
view := func(c *ui.Context) {
	core.Use(c, core.Settings{})
	if v := chat.ProjectList(c, &state, projects, convs, chat.ProjectListOptions{}); v.Moved {
		log.Println("move", v.MoveID, "to", v.MoveTo)
	}
}
ui.Render(view, 400, 300, 1)

参数

func ProjectList(c *ui.Context, s *ProjectListState, projects []ChatProject, conversations func(projectID string) []ChatConversation, opts ProjectListOptions) ProjectListView。

ChatProject:ID、Name、Folder(文件夹名,空表示不在文件夹中)。

字段类型默认值含义
Labelstring""树的无障碍名称。
Disabledboolfalse禁用选择、展开与移动。

状态

文件夹(展开/收起)、项目行(悬停、选中:Selection 底 + 菱形)、拖入目标(角饰边框)、会话行(拖动时半透明)、禁用。

事件

ProjectListView:Changed(选中项目,ID 在 State.Selected)、Opened(打开的会话 ID)、Moved 与 MoveID/MoveTo(把会话移入项目,由调用方更新数据)。

键盘操作

  • Tab:进入树;↑/↓ 在文件夹、项目、会话间移动。
  • 项目行上 →/← 展开/收起会话;Enter 选择项目。
  • 文件夹上 Enter/Space 展开或收起。
  • 会话行的菜单按钮:选择“移入项目”下的目标完成移动(拖放的键盘替代)。

限制

  • 项目行通过 Description 读出“已展开/已收起”;MyGo 不向自定义元素公开 expanded 状态(ui/element.go:282),文件夹使用 CollapsibleBase,其展开状态可被辅助技术读到。
  • 列表未虚拟化,适合数百个项目以内。