繪圖工具
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)均會自動記入撤銷歷史,無需額外接入。