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 許可證發佈。