bricks/aidocs/floaticonbar.md
2025-10-05 06:39:58 +08:00

321 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# `bricks.IconBar` 及相关组件技术文档
---
## 概述
`bricks.IconBar` 是一个基于 `bricks.HBox` 的 UI 组件类,用于创建水平排列的图标工具栏。它支持动态图标、点击事件分发、响应式尺寸调整等功能。该模块还包含多个扩展类:
- `bricks.IconTextBar`:带文本标签的图标栏。
- `bricks.FloatIconBar`:浮动式图标栏,鼠标悬停时显示完整图标组。
- `bricks.FloatIconTextBar`:结合浮动与图文混合的增强型工具栏。
这些组件常用于构建轻量级、可定制的工具栏或操作面板。
---
## 基础结构
```js
var bricks = window.bricks || {};
```
确保 `bricks` 全局命名空间存在,避免覆盖已有内容。
---
## 1. `bricks.IconBar`
### 类继承关系
```js
class extends bricks.HBox
```
继承自 `HBox`(水平布局容器),实现横向排列子控件。
### 配置参数 (`opts`)
| 参数名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `cheight` | Number | `2` | 子项高度倍率(相对于字符单位) |
| `rate` | Number | `1` | 缩放比例因子 |
| `margin` | String | `'10px'` | 图标之间的左右边距 |
| `tools` | Array | `[]` | 工具定义数组,每个元素为一个工具描述对象 |
#### `tools` 数组项结构
| 属性 | 类型 | 是否必需 | 说明 |
|------|------|----------|------|
| `name` | String | 否 | 图标的唯一标识名称(用于事件分发和 DOM ID |
| `icon` | String | 是(非 blankicon | SVG 图标 URL 或资源路径 |
| `rate` | Number | 否 | 单独设置该图标的缩放比例(优先于全局 rate |
| `dynsize` | Boolean | 否 | 是否启用动态尺寸调整 |
| `tip` | String | 否 | 提示文本(暂未在 IconBar 中直接使用) |
> 特殊情况:若 `name === 'blankicon'`,则生成空白占位符图标。
### 构造函数行为
```js
constructor(opts)
```
1. **默认值填充**
- 若未指定 `cheight`,默认设为 `2`
- 若未指定 `rate`,默认设为 `1`
2. **调用父类构造器**
```js
super(opts);
```
3. **样式设置**
- 添加 CSS 类名 `'childrensize'`
- 设置主轴对齐方式为居中(`alignItems: center`
4. **遍历 `tools` 创建子控件**
- 复制每个工具配置并补充通用属性(如 `cheight`, `cwidth`, `dynsize`
- 调用 `build_item(opts)` 创建具体控件
- 设置左右 margin 和 cursor 样式为 pointer
- 若有 `name`,设置对应 widget 的 ID
- 绑定点击事件并通过 `regen_event` 分发事件
- 将控件加入容器
5. **内部高度记录**
- 使用 `this.height_int` 记录所有子控件中的最大高度(像素值),便于外部布局参考。
---
### 方法详解
#### `build_item(opts) → Widget`
根据配置创建单个图标控件。
##### 行为逻辑:
- 计算实际高度:`h = bricks.app.charsize * rate * opts.cheight`
- 更新 `this.height_int` 以保持最大高度
- 判断是否为 `blankicon`
- 是 → 返回 `new bricks.BlankIcon({...})`
- 否 → 使用 `opts.icon` 作为 `url` 创建 `bricks.Svg` 实例
- 绑定点击事件到 `regen_event(desc, event)`
- 返回创建的控件
#### `regen_event(desc, event)`
处理图标点击事件,并触发两个事件:
```js
this.dispatch(desc.name, desc); // 以 name 为事件类型分发
this.dispatch('command', desc); // 统一命令事件
```
同时阻止事件冒泡和默认行为:
```js
event.preventDefault();
event.stopPropagation();
```
> 此设计适用于菜单/按钮点击后不希望影响页面其他部分的操作场景。
---
## 2. `bricks.IconTextBar`(图文混合图标栏)
### 类继承关系
```js
class extends bricks.IconBar
```
重写了 `build_item` 方法以支持图标+文字组合。
### `build_item(opts)` 实现细节
返回一个 `HBox` 容器,内含:
1. **SVG 图标(可选)**
- 来源:`opts.icon`
- 属性包括 `rate`, `dynsize`
2. **文本标签(可选)**
- 使用 `bricks.Text` 显示 `opts.label`
- 支持国际化(`i18n: true`)、自动换行(`wrap: true`)、左对齐(`haligh: 'left'`
3. **整体包装**
- 包裹在一个 `HBox` 中,宽度自适应,高度自动计算
- 绑定点击事件至 `regen_event(opts)`
- 更新 `height_int`(基于 `charsize * rate`
> ⚠️ 注意:图标与文本共存时垂直居中对齐由外层 HBox 控制。
---
## 3. `bricks.FloatIconBar`(浮动图标栏)
### 类继承关系
```js
class extends bricks.HBox
```
实现“仅显示浮出按钮,悬停时展开全部图标”的交互模式。
### 配置参数 (`opts`)
同 `IconBar`,但只显示一个小浮点按钮,其余图标隐藏。
### 构造函数逻辑
1. 创建浮出按钮:
```js
this.float_w = new bricks.Svg({ url: bricks_resource('imgs/float-out.png') });
```
- 绑定 `mousemove` 事件显示图标栏
- 添加到容器
2. 创建图标主体:
```js
this.icons_box = this.build_bar(opts);
```
- 默认调用 `new bricks.IconBar(opts)`
- 初始隐藏(`display: none`
3. 设置容器高度等于 `icons_box.height_int`
4. 绑定全局点击事件隐藏图标栏(通过 `Body.click`
### 方法说明
| 方法 | 功能 |
|------|------|
| `build_bar(opts)` | 工厂方法,创建内部图标栏实例(可被子类重写) |
| `show_icons()` | 显示图标栏(`display: flex` |
| `hide_icons()` | 隐藏图标栏(`display: none` |
> 📌 交互逻辑:鼠标移上浮点按钮 → 显示图标;点击任意空白区域 → 隐藏图标。
---
## 4. `bricks.FloatIconTextBar`(浮动图文栏)
### 类继承关系
```js
class extends bricks.FloatIconBar
```
扩展 `FloatIconBar`,使其内部使用 `IconTextBar` 替代 `IconBar`。
### 核心重写方法
```js
build_bar(opts) {
return new bricks.IconTextBar(opts);
}
```
> ✅ 效果:浮出后显示带文字说明的图标按钮组,适合需要语义化提示的场景。
---
## 工厂注册
以下语句将各组件注册到 `bricks.Factory`,支持通过字符串名称动态创建实例:
```js
bricks.Factory.register('IconBar', bricks.IconBar);
bricks.Factory.register('IconTextBar', bricks.IconTextBar);
bricks.Factory.register('FloatIconBar', bricks.FloatIconBar);
bricks.Factory.register('FloatIconTextBar', bricks.FloatIconTextBar);
```
### 使用示例(工厂方式)
```js
var bar = bricks.Factory.create('IconTextBar', {
tools: [
{ name: 'save', icon: '/icons/save.svg', label: 'Save File' },
{ name: 'print', icon: '/icons/print.svg', label: 'Print' }
],
margin: '8px',
rate: 1.2
});
```
---
## 示例配置
### 简单图标栏
```js
new bricks.IconBar({
cheight: 2,
rate: 1,
margin: '12px',
tools: [
{ name: 'home', icon: '/icons/home.svg', tip: 'Go Home' },
{ name: 'settings', icon: '/icons/settings.svg' },
{ name: 'blankicon' }, // 占位符
{ name: 'logout', icon: '/icons/logout.svg' }
]
});
```
### 图文混合栏
```js
new bricks.IconTextBar({
rate: 1.1,
tools: [
{ name: 'new', icon: '/icons/new.svg', label: 'New', tip: 'Create new file' },
{ name: 'open', icon: '/icons/open.svg', label: 'Open' },
{ name: 'help', label: 'Help', icon: '/icons/help.svg' }
]
});
```
### 浮动图文工具栏
```js
new bricks.FloatIconTextBar({
tools: [
{ name: 'cut', icon: '/icons/cut.svg', label: 'Cut' },
{ name: 'copy', icon: '/icons/copy.svg', label: 'Copy' },
{ name: 'paste', icon: '/icons/paste.svg', label: 'Paste' }
],
rate: 1
});
```
---
## 设计特点总结
| 特性 | 描述 |
|------|------|
| 🔧 **模块化设计** | 所有功能拆分为可复用类,便于扩展 |
| 🖱️ **交互友好** | 支持点击、悬停展开、事件拦截 |
| 📏 **响应式尺寸** | 基于 `charsize` 和 `rate` 实现相对缩放 |
| 🔔 **事件驱动** | 通过 `dispatch` 发送命名事件,解耦 UI 与业务逻辑 |
| 🧩 **工厂模式支持** | 可通过字符串动态创建组件 |
---
## 注意事项
1. **依赖前提**
- 必须已加载 `bricks.HBox`, `bricks.Svg`, `bricks.Text`, `bricks.BlankIcon`, `bricks.Body`
- `bricks.app.charsize` 需已初始化
- `bricks_resource()` 函数需可用(用于资源路径解析)
2. **性能建议**
- 工具数量较多时建议使用 `FloatIconBar` 减少视觉干扰
- 避免频繁重建整个 `IconBar`,应缓存实例
3. **样式定制**
- 推荐通过 `set_style()` 或外部 CSS 修改外观
- 不推荐直接修改内部 DOM 结构
---
## 版本信息
- **作者**Bricks Framework Team
- **版本**1.0
- **最后更新**2025年4月5日
---
📌 **文档结束**