Skip to content

绘图工具

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带价格轴标签的文本
PriceLabelPriceNote 的别名,解析器接受
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正弦波
形态XabcdPatternCypherPatternAbcdPatternHeadAndShouldersTrianglePatternThreeDrivesPattern谐波与图表形态
艾略特波浪ElliottImpulseWaveElliottCorrectiveWaveElliottTriangleWaveElliottDoubleComboElliottTripleCombo艾略特波浪计数
成交量分析AnchoredVwapVolumeProfileFixedRangeVolumeProfileAnchored成交量分析工具
曲线PathArcCurveDoubleCurve多点曲线(path 双击完成)
其他BarPatternGhostFeedSector其他杂项工具

粘性模式

粘性模式下,每次绘制完成后工具保持激活,方便连续绘制同类标注:

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_annotationupdate_annotationremove_annotationclear_annotations 及选择相关的变更操作(如 delete_selected_annotation)均会自动记入撤销历史,无需额外接入。

基于 MIT 许可证发布。