bricks/docs/ai/popup.md
2025-11-13 18:04:58 +08:00

7.3 KiB
Raw Blame History

Popup

弹窗控件,用于在页面上显示浮动的对话框或内容窗口。属于容器控件,继承自 bricks.VBox

主要方法

  • open():打开弹窗,设置位置、显示样式,并触发 opened 事件。
  • dismiss():关闭弹窗,隐藏其 DOM 元素,并可选择自动销毁。
  • destroy():彻底销毁该弹窗实例,从父容器中移除并清理资源。
  • add_widget(w, i):向弹窗内容区域添加子控件。
  • remove_widget(w):从内容区域移除指定子控件。
  • clear_widgets():清空内容区域的所有子控件。
  • bring_to_top():将当前弹窗置于所有其他弹窗之上(通过提升 z-index
  • positify_tl()根据锚点archor和屏幕尺寸计算并设置弹窗初始位置。
  • popup_from_widget(from_w):相对于某个源控件定位弹窗(常用于下拉菜单等场景)。
  • load_content():异步加载 content 配置中的组件并渲染到内容区。

主要事件

  • opened:弹窗打开后触发。
  • dismissed:弹窗关闭时触发。
  • destroy:弹窗被销毁时触发(仅当 auto_destroy 为 true 时)。

源码例子

{
  "id": "my_popup",
  "widgettype": "Popup",
  "options": {
    "width": "400px",           // 弹窗宽度
    "height": "300px",          // 弹窗高度
    "archor": "cc",             // 居中显示:'cc' 表示 center-center
    "modal": true,              // 是否模态,模态时背景不可点击
    "movable": true,            // 是否允许拖动
    "resizable": true,          // 是否允许调整大小
    "auto_open": false,         // 是否创建后自动打开
    "auto_dismiss": true,       // 点击外部是否自动关闭
    "auto_destroy": true,       // 关闭后是否自动销毁
    "timeout": 5000,            // 自动关闭延时毫秒0 表示不启用
    "content": {                // 要加载的内容(支持嵌套控件)
      "widgettype": "VBox",
      "options": {
        "padding": "20px",
        "css": "popup-content"
      },
      "subwidgets": [
        {
          "widgettype": "Text",
          "options": {
            "text": "这是一个弹窗示例!",
            "i18n": true
          }
        },
        {
          "widgettype": "Button",
          "options": {
            "text": "关闭",
            "css": "primary"
          },
          "binds": [
            {
              "actiontype": "event",
              "wid": "close_btn",
              "event": "click",
              "target": "my_popup",
              "dispatch_event": "dismissed"
            }
          ]
        }
      ]
    }
  },
  "binds": [
    {
      "actiontype": "method",
      "wid": "trigger_button",     // 触发控件 ID
      "event": "click",            // 监听点击事件
      "target": "my_popup",        // 目标是此弹窗
      "method": "open",            // 执行 open 方法
      "params": {}
    },
    {
      "actiontype": "event",
      "wid": "my_popup",
      "event": "dismissed",
      "target": "status_text",
      "dispatch_event": "setValue",
      "params": {
        "value": "弹窗已关闭"
      }
    }
  ]
}

注释说明

  • 此弹窗不会自动打开(auto_open: false),需由按钮触发。
  • 点击“关闭”按钮会派发 dismissed 事件,进而触发状态更新。
  • 使用 content 字段定义内部结构,支持动态构建复杂界面。
  • 支持国际化文本(i18n: true)、拖拽、缩放、模态遮罩等功能。

PopupWindow

带标题栏的可操作窗口型弹窗控件,适用于桌面风格的应用程序窗口管理。属于容器控件,继承自 bricks.Popup

主要方法

  • open():打开窗口,若设置了自动打开则延迟执行。
  • build_title_bar():构建顶部标题栏(含图标、工具按钮等)。
  • win_minimize():最小化窗口(实际是关闭但保留引用供恢复)。
  • set_title(txt):动态设置窗口标题。
  • destroy():销毁窗口,同时从全局管理列表中移除。

主要事件

  • opened:窗口打开时触发。
  • dismissed:窗口关闭(最小化)时触发。
  • destroy:窗口被彻底销毁时触发。

源码例子

{
  "id": "app_window",
  "widgettype": "PopupWindow",
  "options": {
    "title": "我的应用",                    // 窗口标题
    "icon": "/resources/icons/app.png",   // 标题栏左侧图标路径
    "width": "60%",                       // 宽度百分比
    "height": "70%",                      // 高度百分比
    "movable": true,                      // 可拖动标题栏移动
    "resizable": true,                    // 可调整大小
    "modal": false,                       // 非模态,允许后台交互
    "auto_open": true                     // 创建即打开
  },
  "subwidgets": [
    {
      "widgettype": "HtmlView",
      "options": {
        "html": "<div style='padding:20px;'>欢迎使用我的应用程序!</div>"
      }
    }
  ],
  "binds": [
    {
      "actiontype": "urlwidget",
      "wid": "refresh_btn",
      "event": "click",
      "target": "app_window",
      "mode": "replace",
      "options": {
        "url": "/ui/myapp.content.ui",   // 动态加载新内容
        "method": "GET",
        "params": {}
      }
    },
    {
      "actiontype": "script",
      "wid": "log_btn",
      "event": "click",
      "target": "app_window",
      "script": "console.log('用户在窗口中点击了日志按钮');",
      "params": {}
    }
  ]
}

注释说明

  • PopupWindow 提供标准窗口行为:最小化、关闭、全屏。
  • 工具栏按钮由 IconBar 实现,内置 delete/minimize/fullscreen 功能。
  • 最小化后可通过全局 bricks.app.mwins 列表恢复。
  • 支持通过 urlwidget 动态刷新内容,实现模块化加载。
  • 适合构建多窗口 Web 应用,如 IDE、管理系统等。

WindowsPanel

任务栏式窗口管理面板,列出所有最小化的 PopupWindow 并提供恢复功能。属于容器控件,继承自 bricks.Popup

主要方法

  • del_window(event):处理点击某个窗口项时将其恢复并从列表中移除。
  • (构造函数中自动初始化数据源与事件绑定)

主要事件

  • record_click:当用户点击某个窗口记录项时触发(来自 Cols 控件)。

源码例子

{
  "id": "windows_panel",
  "widgettype": "WindowsPanel",
  "options": {
    "archor": "br",               // 锚定在右下角
    "width": "200px",
    "height": "300px",
    "movable": true,
    "resizable": false,
    "modal": false,
    "auto_open": false            // 不自动打开,由快捷键或按钮触发
  },
  "binds": [
    {
      "actiontype": "method",
      "wid": "taskbar_btn",
      "event": "click",
      "target": "windows_panel",
      "method": "open",
      "params": {}
    }
  ]
}

注释说明

  • 此控件用于展示当前已最小化的所有 PopupWindow 实例。
  • 数据来源于 bricks.app.mwins 数组,在构造时自动映射为可视列表。
  • 每一项是一个图标 + 标题,点击即可还原对应窗口。
  • 常用于模拟操作系统任务栏功能。
  • 本身也是弹窗类型,点击外部可自动关闭(auto_dismiss: true)。