绘图工具
DrawingTools trait 管理任意图表视图上的活动绘图工具和撤销/重做历史。ChartView 实现了此 trait,工具管理和历史记录代码可编写一次用于任意图表视图。
导入
rust
use navi_chart::{ChartView, DrawingTools, DrawingToolId};用法
rust
use navi_chart::{DrawingTools, DrawingToolId};
fn activate_tool<C>(cv: &C, id: DrawingToolId)
where
C: DrawingTools,
{
cv.set_tool(id);
}
fn handle_keyboard_shortcut<C>(cv: &C, key: &str)
where
C: DrawingTools,
{
match key {
"z" => { if cv.can_undo() { cv.undo(); } }
"y" => { if cv.can_redo() { cv.redo(); } }
"Escape" => cv.cancel_drawing(),
_ => {}
}
}工具由 [DrawingToolId] 枚举标识 —— 未知名称在编译期就会被拒绝,对每个合法 变体 set_tool 都返回 true。
方法参考
| 方法 | 说明 |
|---|---|
undo() | 撤销最近一次标注的创建、删除或修改操作。历史为空时为空操作。 |
redo() | 重做最近一次被撤销的操作。无可重做内容时为空操作。 |
can_undo() | 至少有一个可撤销操作时返回 true。 |
can_redo() | 至少有一个可重做操作时返回 true。 |
finalize_pending_drawing() | 强制完成当前进行中的多点绘制(如折线、艾略特波浪)。无进行中绘制时无效果。 |
cancel_drawing() | 取消当前进行中的绘制,不创建标注。除非处于粘性模式,否则重置工具为指针模式。 |
set_tool(id) | 激活指定 [DrawingToolId] 变体。传入 DrawingToolId::Pointer 可返回选择模式。切换排入队列后返回 true。 |
active_tool() | 返回当前激活工具的 [DrawingToolId]。 |
set_sticky_tool(sticky) | 启用或禁用粘性模式。为 true 时,每次绘制完成后工具保持激活状态,方便连续绘制同类标注。 |
is_sticky_tool() | 粘性模式启用时返回 true。 |
工具 ID
DrawingToolId 枚举列出了图表视图支持的全部工具。
| 类别 | 变体 | 说明 |
|---|---|---|
| 模式 | Pointer | 默认平移/缩放/选择模式 |
TextEditing | 内联文本编辑(自动进入,通常不手动指定) | |
| 线条 | Trendline | 趋势线 |
Ray | 射线(从 p1 向外延伸) | |
ExtendedLine | 过两点的无限延伸线 | |
Hline | 固定价格的水平线 | |
Hray | 从 p0 向右的水平射线 | |
Vline | 固定时间的垂直线 | |
Crossline | 水平+垂直十字线 | |
InfoLine | 带价差/%/角度信息的趋势线 | |
TrendAngle | 带角度弧的趋势线 | |
| 形状 | Rect | 轴对齐矩形 |
Circle | 圆形 | |
Ellipse | 椭圆 | |
Triangle | 三点三角形 | |
RotatedRect | 自由角度矩形 | |
Polyline | 多点折线(双击完成) | |
| 箭头 | Arrow | 带箭头的线段 |
ArrowMarkUp | 向上箭头标记 | |
ArrowMarkDown | 向下箭头标记 | |
ArrowMarker | 自由旋转箭头标记 | |
| 通道 | ParallelChannel | 两条平行趋势线 |
FlatTopBottom | 两条水平线 | |
DisjointChannel | 两条独立趋势线 | |
RegressionTrend | 线性回归通道 | |
| 文本与标签 | Text | 可编辑文本标签 |
Note | 文本气泡 | |
Callout | 对话框标注 | |
PriceNote | 带价格轴标签的文本 | |
PriceLabel | PriceNote 的别名,解析器接受 | |
Emoji | 表情符号/字形标记 | |
| 斐波那契 | FibRetracement | 斐波那契回撤 |
FibExtension | 斐波那契延伸 | |
FibChannel | 斐波那契通道 | |
FibTimezone | 斐波那契时区 | |
FibFan | 斐波那契扇形 | |
FibCircles | 斐波那契圆 | |
FibArcs | 斐波那契速度阻力弧 | |
FibTrendBasedExtension | 基于趋势的斐波那契延伸 | |
FibWedge | 斐波那契楔形 | |
FibSpiral | 斐波那契螺旋 | |
| 叉形线 | Pitchfork | 安德鲁斯叉形线 |
SchiffPitchfork | 席夫叉形线 | |
ModifiedSchiffPitchfork | 改良席夫叉形线 | |
InsidePitchfork | 内部叉形线 | |
| 江恩 | GannBox | 江恩方格 |
GannSquare | 江恩正方形 | |
GannSquareFixed | 固定比例江恩正方形 | |
GannFan | 江恩扇形线 | |
| 量度工具 | PriceRange | 价格范围标尺 |
DateRange | 日期范围标尺 | |
DateAndPriceRange | 复合标尺 | |
| 笔刷 | Brush | 自由手绘笔刷 |
Highlighter | 半透明高亮笔刷 | |
| 持仓工具 | LongPosition | 做多风险/收益框 |
ShortPosition | 做空风险/收益框 | |
PositionForecast | 预测锥形 | |
| 周期 | CyclicLines | 等间距垂直线 |
TimeCycles | 半圆弧序列 | |
SineLine | 正弦波 | |
| 形态 | XabcdPattern、CypherPattern、AbcdPattern、HeadAndShoulders、TrianglePattern、ThreeDrivesPattern | 谐波与图表形态 |
| 艾略特波浪 | ElliottImpulseWave、ElliottCorrectiveWave、ElliottTriangleWave、ElliottDoubleCombo、ElliottTripleCombo | 艾略特波浪计数 |
| 成交量分析 | AnchoredVwap、VolumeProfileFixedRange、VolumeProfileAnchored | 成交量分析工具 |
| 曲线 | Path、Arc、Curve、DoubleCurve | 多点曲线(path 双击完成) |
| 其他 | BarPattern、GhostFeed、Sector | 其他杂项工具 |
粘性模式
粘性模式下,每次绘制完成后工具保持激活,方便连续绘制同类标注:
rust
// 在激活工具前启用粘性模式
cv.set_sticky_tool(true);
cv.set_tool(DrawingToolId::Trendline);
// 每条线绘制完成后工具保持为 Trendline。
// 恢复为普通单次模式:
cv.set_sticky_tool(false);撤销/重做接入
将撤销和重做绑定到键盘快捷键和工具栏按钮:
rust
use navi_chart::DrawingTools;
fn build_toolbar_state<C>(cv: &C) -> ToolbarState
where
C: DrawingTools,
{
ToolbarState {
undo_enabled: cv.can_undo(),
redo_enabled: cv.can_redo(),
active_tool: cv.active_tool(),
sticky: cv.is_sticky_tool(),
}
}
fn on_undo_click<C>(cv: &C)
where
C: DrawingTools,
{
cv.undo();
// 重建工具栏状态以反映最新的 can_undo / can_redo
}每次 add_annotation、update_annotation、remove_annotation、clear_annotations 及选择相关的变更操作(如 delete_selected_annotation)均会自动记入撤销历史,无需额外接入。