native_views — 原生视图节点与 Facade

原生渲染视图的类型化节点(NativeViewNode)与 RendererView 门面。

原生视图由 self.views.outline(...)self.views.tree(...) 等类型化入口创建。传输层仍是字典,但插件作者操作的是命名对象与视图门面,roleparentId、补丁修订等渲染协议细节被封装在 SDK 内部。

基础节点

NativeViewNode(dict)

所有类型化渲染数据的基类,可直接序列化为线缆节点。

属性类型说明
idstr节点 ID
parent_idOptional[str]父节点 ID
labelstr节点标签
iconOptional[str]图标名
icon_colorOptional[str]图标颜色
has_childrenbool是否有子节点
children_stateOptional[str]子节点加载状态
roleOptional[str]渲染协议角色

ChildrenState 枚举

unloadedloadingloadederror

IconColor 枚举

primarysecondarytertiarymutederror

icon 参数必须使用 pyrite_sdk.api.icons.IconsMaterialIcon),传入普通字符串会抛出 TypeError

类型化节点

构造参数说明
TreeItem(id, label, parent_id=None, icon=None, has_children=False, children_state=loaded, **metadata)树节点
VirtualListItem(id, label, icon=None, **metadata)虚拟列表项
TableRowItem(id, cells, **metadata)cells 为字典表格行
TableColumn(id, label, width=None, flex=None, frozen=None, sortable=None)表格列
FormField(id, label, value=None, kind="text", options=None)表单字段
MarkdownContent(text, id="content")Markdown 内容
LogEntry(id, message, level="info", timestamp=None)日志条目
OutlineItem(id, label, parent_id=None, icon=None, icon_color=None, has_children=False, children_state=loaded, kind=None, detail=None, line=None, column=None)大纲项
VariableEntry(id, name, type_name="", value="", parent_id=None, icon=None, icon_color=None, has_children=False, children_state=loaded)变量条目
VariableScope(id, name, error=None, has_children=False)变量作用域
LoadMoreEntry(id, parent_id, progress, label="Load more...")加载更多条目
ViewPlaceholder(state, label, icon=info_outline, icon_color=None)空态占位

VariableEntry.update_fields(...)

更新变量条目的显示字段:valueiconicon_colorchildren_state

RendererView 门面

RendererView 是渲染器驱动视图实例的高层门面,公开属性与事件方法如下:

属性/方法说明
.model底层 ViewModel
.view_id视图 ID
.instance_id实例 ID
.visible当前是否可见
.items当前类型化节点列表(副本)
.nodes渲染节点列表(副本)
open(callback=None) / close(callback=None)打开/关闭视图
on_visibility(handler)可见性变化回调
on_select(handler)选中回调,handler 接收节点
on_activate(handler)激活回调
on_request_children(handler)请求子节点回调
on_context_menu(handler)行菜单回调,handler 返回一个 ContextMenu 组件,SDK 会将其转换为 ContextMenu 组件
set_actions(actions)设置 AppBar 操作
set_props(**props)合并视图配置属性
set_items(items)替换节点,要求类型化 NativeViewNode
show_placeholder(label, state="empty", icon=None, icon_color=None)显示空态占位
view = self.views.tree("tree")

def on_select(item):
    print(f"选中: {item.label}")

def menu_for(item):
    return ContextMenu(id=f"menu_{item.id}", items=[
        MenuItem(id="open", label="打开"),
    ], on_select=lambda e: print(e.item_id))

view.on_select(on_select)
view.on_context_menu(menu_for)
view.set_items([
    TreeItem(id="root", label="根节点", has_children=True),
    TreeItem(id="a", label="子节点 A", parent_id="root"),
])
view.open()

视图子类

子类额外方法
TreeViewconfigure(expanded_ids=None, selected_id=None, indent=None, searchable=None, empty_label=None)
VirtualListViewconfigure(item_count=None, item_height=None, selected_id=None, empty_label=None)
TableViewset_columns(columns)configure(row_count=None, row_height=None, show_header=None, selected_id=None, sort_column=None, sort_ascending=None, empty_label=None)
MarkdownViewset_markdown(value)on_link_tap(handler)
LogViewconfigure(item_height=None, empty_label=None)append(entry)extend(entries)clear()

set_columns 要求类型化 TableColumnLogView.append/extend 要求 LogEntryset_items 要求 NativeViewNode;传错类型都会抛出 TypeError

AppBar 操作

说明
ViewAction(id, label, icon, on_trigger)AppBar 操作按钮
ViewMenuAction(id, label, items, icon=more_vert, on_trigger)打开声明式原生菜单的 AppBar 操作
view.set_actions([
    ViewAction(id="refresh", label="刷新", icon=Icons.refresh,
               on_trigger=lambda payload: print("刷新")),
    ViewMenuAction(id="more", label="更多", items=[
        {"type": "item", "id": "about", "label": "关于"},
    ], on_trigger=lambda payload: print("菜单触发")),
])

使用示例

树形视图

from pyrite_sdk.api.icons import Icons

view = self.views.tree("file_tree", searchable=True)
view.on_activate(lambda item: print(f"打开: {item.label}"))
view.set_items([
    TreeItem(id="src", label="src", icon=Icons.folder, has_children=True),
    TreeItem(id="main", label="main.py", parent_id="src",
             icon=Icons.description),
])
view.open()

日志视图

log = self.views.log("console", empty_label="暂无输出")
log.append(LogEntry(id="e1", message="连接成功", level="info"))
log.extend([
    LogEntry(id="e2", message="开始编译", level="info"),
    LogEntry(id="e3", message="编译失败", level="error"),
])
log.clear()

On this page