Skip to main content

egui_charts/drawings/
categories.rs

1//! Toolbar groupings for drawing tools.
2//!
3//! [`CATEGORY_ORDER`] and [`get_category_sections`] define the toolbar's grouped
4//! menus. [`DrawingToolType::categories`] and [`DrawingToolType::by_category`]
5//! provide finer groups for command lists. They group the same tools differently,
6//! and [`DrawingToolType::Measure`] is a standalone toolbar button outside the
7//! toolbar groups.
8
9use crate::drawings::DrawingToolType;
10
11/// Category display order in the toolbar
12pub const CATEGORY_ORDER: &[&str] = &[
13    "Cursors",
14    "Lines",
15    "Fibonacci",
16    "Patterns",
17    "Projection",
18    "Brushes/Shapes",
19    "Text/Annotations",
20    "Icons/Emojis",
21];
22
23/// Get the category that a tool belongs to
24///
25/// Returns the main category name, not the sub-section.
26/// [`DrawingToolType::Measure`] is a standalone toolbar button and returns `None`.
27pub fn get_tool_category(tool: DrawingToolType) -> Option<&'static str> {
28    for &category in CATEGORY_ORDER {
29        let sections = get_category_sections(category);
30        for (_, tools) in sections {
31            if tools.contains(&tool) {
32                return Some(category);
33            }
34        }
35    }
36    None
37}
38
39/// Get sections and tools for a category
40///
41/// Returns a vector of (section_name, tools) tuples for the given category,
42/// or an empty vector for an unknown name. Names are case-sensitive.
43pub fn get_category_sections(category: &str) -> Vec<(&'static str, Vec<DrawingToolType>)> {
44    match category {
45        "Cursors" => vec![(
46            "CURSORS",
47            vec![
48                DrawingToolType::CrossCursor,
49                DrawingToolType::DotCursor,
50                DrawingToolType::ArrowCursor,
51                DrawingToolType::Eraser,
52            ],
53        )],
54        "Lines" => vec![
55            (
56                "LINES",
57                vec![
58                    DrawingToolType::TrendLine,
59                    DrawingToolType::Ray,
60                    DrawingToolType::InfoLine,
61                    DrawingToolType::ExtendedLine,
62                    DrawingToolType::TrendAngle,
63                    DrawingToolType::HorizontalLine,
64                    DrawingToolType::HorizontalRay,
65                    DrawingToolType::VerticalLine,
66                    DrawingToolType::CrossLine,
67                ],
68            ),
69            (
70                "CHANNELS",
71                vec![
72                    DrawingToolType::ParallelChannel,
73                    DrawingToolType::RegressionTrend,
74                    DrawingToolType::FlatTopBottom,
75                    DrawingToolType::DisjointChannel,
76                ],
77            ),
78            (
79                "PITCHFORKS",
80                vec![
81                    DrawingToolType::Pitchfork,
82                    DrawingToolType::SchiffPitchfork,
83                    DrawingToolType::ModifiedSchiffPitchfork,
84                    DrawingToolType::InsidePitchfork,
85                ],
86            ),
87        ],
88        "Fibonacci" => vec![
89            (
90                "FIBONACCI",
91                vec![
92                    DrawingToolType::FibonacciRetracement,
93                    DrawingToolType::FibonacciExtension,
94                    DrawingToolType::FibonacciChannel,
95                    DrawingToolType::FibonacciTimeZones,
96                    DrawingToolType::FibonacciSpeedFan,
97                    DrawingToolType::TrendBasedFibTime,
98                    DrawingToolType::FibonacciCircles,
99                    DrawingToolType::FibonacciSpiral,
100                    DrawingToolType::FibonacciSpeedResistanceArcs,
101                    DrawingToolType::FibonacciWedge,
102                    DrawingToolType::Pitchfan,
103                ],
104            ),
105            (
106                "GANN",
107                vec![
108                    DrawingToolType::GannBox,
109                    DrawingToolType::GannFixed,
110                    DrawingToolType::GannSquare,
111                    DrawingToolType::GannFan,
112                ],
113            ),
114        ],
115        "Patterns" => vec![
116            (
117                "PATTERNS",
118                vec![
119                    DrawingToolType::XABCDPattern,
120                    DrawingToolType::CypherPattern,
121                    DrawingToolType::HeadAndShoulders,
122                    DrawingToolType::ABCDPattern,
123                    DrawingToolType::TrianglePattern,
124                    DrawingToolType::ThreeDrivesPattern,
125                ],
126            ),
127            (
128                "ELLIOTT WAVES",
129                vec![
130                    DrawingToolType::ElliottImpulse,
131                    DrawingToolType::ElliottCorrection,
132                    DrawingToolType::ElliottTriangle,
133                    DrawingToolType::ElliottDoubleCombo,
134                    DrawingToolType::ElliottTripleCombo,
135                ],
136            ),
137            (
138                "CYCLES",
139                vec![
140                    DrawingToolType::CyclicLines,
141                    DrawingToolType::TimeCycles,
142                    DrawingToolType::SineLine,
143                ],
144            ),
145        ],
146        "Projection" => vec![
147            (
148                "PROJECTION",
149                vec![
150                    DrawingToolType::LongPos,
151                    DrawingToolType::ShortPos,
152                    DrawingToolType::Forecast,
153                    DrawingToolType::BarsPattern,
154                    DrawingToolType::GhostFeed,
155                    DrawingToolType::ProjectionTool,
156                ],
157            ),
158            (
159                "VOLUME-BASED",
160                vec![
161                    DrawingToolType::AnchoredVWAP,
162                    DrawingToolType::FixedRangeVolumeProfile,
163                    DrawingToolType::AnchoredVolumeProfile,
164                ],
165            ),
166            (
167                "MEASURER",
168                vec![
169                    DrawingToolType::PriceRange,
170                    DrawingToolType::DateRange,
171                    DrawingToolType::DateAndPriceRange,
172                ],
173            ),
174        ],
175        "Brushes/Shapes" => vec![
176            (
177                "BRUSHES",
178                vec![DrawingToolType::Brush, DrawingToolType::Highlighter],
179            ),
180            (
181                "ARROWS",
182                vec![
183                    DrawingToolType::ArrowMarker,
184                    DrawingToolType::Arrow,
185                    DrawingToolType::ArrowMarkUp,
186                    DrawingToolType::ArrowMarkDown,
187                    DrawingToolType::ArrowMarkLeft,
188                    DrawingToolType::ArrowMarkRight,
189                ],
190            ),
191            (
192                "SHAPES",
193                vec![
194                    DrawingToolType::Rect,
195                    DrawingToolType::RotatedRect,
196                    DrawingToolType::Path,
197                    DrawingToolType::Circle,
198                    DrawingToolType::Ellipse,
199                    DrawingToolType::Polyline,
200                    DrawingToolType::Triangle,
201                    DrawingToolType::Arc,
202                    DrawingToolType::Sector,
203                    DrawingToolType::Curve,
204                    DrawingToolType::DoubleCurve,
205                ],
206            ),
207        ],
208        "Text/Annotations" => vec![
209            (
210                "TEXT & NOTES",
211                vec![
212                    DrawingToolType::TextLabel,
213                    DrawingToolType::AnchoredText,
214                    DrawingToolType::Note,
215                    DrawingToolType::PriceNote,
216                    DrawingToolType::AnchoredNote,
217                    DrawingToolType::Table,
218                    DrawingToolType::Callout,
219                    DrawingToolType::Comment,
220                    DrawingToolType::PriceLabel,
221                    DrawingToolType::Signpost,
222                    DrawingToolType::FlagNote,
223                ],
224            ),
225            (
226                "CONTENT",
227                vec![
228                    DrawingToolType::Image,
229                    DrawingToolType::Tweet,
230                    DrawingToolType::Idea,
231                ],
232            ),
233        ],
234        "Icons/Emojis" => vec![(
235            "ICONS",
236            vec![DrawingToolType::FontIcon, DrawingToolType::Sticker],
237        )],
238        _ => vec![],
239    }
240}
241
242/// Get the default tool for a category
243///
244/// Returns `None` for an unknown name. Names are case-sensitive.
245pub fn get_category_default_tool(category: &str) -> Option<DrawingToolType> {
246    Some(match category {
247        "Cursors" => DrawingToolType::CrossCursor,
248        "Lines" => DrawingToolType::TrendLine,
249        "Fibonacci" => DrawingToolType::FibonacciRetracement,
250        "Patterns" => DrawingToolType::XABCDPattern,
251        "Projection" => DrawingToolType::LongPos,
252        "Brushes/Shapes" => DrawingToolType::Brush,
253        "Text/Annotations" => DrawingToolType::TextLabel,
254        "Icons/Emojis" => DrawingToolType::FontIcon,
255        _ => return None,
256    })
257}
258
259/// Get all tools in a flat list
260pub fn get_all_tools() -> Vec<DrawingToolType> {
261    DrawingToolType::all().to_vec()
262}
263
264/// Count of all tools
265pub fn tool_cnt() -> usize {
266    DrawingToolType::all().len()
267}