1use bytes::Bytes;
2use camino::Utf8PathBuf;
3use derive_more::Debug;
4use egui::DroppedFile;
5use emath::{Pos2, Vec2};
6use ftr_parser::types::Transaction;
7use num::BigInt;
8use serde::Deserialize;
9use std::path::PathBuf;
10use std::sync::Arc;
11use surver::SurverStatus;
12
13use crate::async_util::AsyncJob;
14use crate::config::{PrimaryMouseDrag, TransitionValue};
15use crate::displayed_item_tree::{ItemIndex, VisibleItemIndex};
16use crate::graphics::{Graphic, GraphicId};
17use crate::hierarchy::{ParameterDisplayLocation, ScopeExpandType};
18use crate::state::UserState;
19use crate::transaction_container::{
20 StreamScopeRef, TransactionContainer, TransactionRef, TransactionStreamRef,
21};
22use crate::translation::DynTranslator;
23use crate::viewport::ViewportStrategy;
24use crate::wave_data::ScopeType;
25use crate::{
26 MoveDir, VariableNameFilterType, WaveSource,
27 clock_highlighting::ClockHighlightType,
28 config::ArrowKeyBindings,
29 dialog::{OpenSiblingStateFileDialog, ReloadWaveformDialog},
30 displayed_item::{DisplayedFieldRef, DisplayedItemRef},
31 file_dialog::OpenMode,
32 hierarchy::HierarchyStyle,
33 time::{TimeStringFormatting, TimeUnit},
34 variable_filter::VariableIOFilterType,
35 variable_name_type::VariableNameType,
36 wave_container::{AnalogCacheKey, ScopeRef, VariableRef, WaveContainer},
37 wave_source::{CxxrtlKind, LoadOptions, WaveFormat},
38 wellen::{BodyResult, HeaderResult, LoadSignalsResult},
39};
40
41type CommandCount = usize;
42
43#[derive(Debug, Deserialize, Clone)]
45pub enum MessageTarget<T> {
46 Explicit(T),
47 CurrentSelection,
48}
49
50impl<T> From<MessageTarget<T>> for Option<T> {
51 fn from(value: MessageTarget<T>) -> Self {
52 match value {
53 MessageTarget::Explicit(val) => Some(val),
54 MessageTarget::CurrentSelection => None,
55 }
56 }
57}
58
59impl<T> From<Option<T>> for MessageTarget<T> {
60 fn from(value: Option<T>) -> Self {
61 match value {
62 Some(val) => Self::Explicit(val),
63 None => Self::CurrentSelection,
64 }
65 }
66}
67
68impl<T: Copy> Copy for MessageTarget<T> {}
69
70#[derive(Debug, Deserialize)]
71pub enum Message {
73 SetActiveScope(Option<ScopeType>),
75 ExpandScope(ScopeExpandType),
76 AddVariables(Vec<VariableRef>),
78 AddScope(ScopeRef, bool),
80 AddScopeAsGroup(ScopeRef, bool),
82 AddCount(char),
84 AddStreamOrGenerator(TransactionStreamRef),
85 AddStreamOrGeneratorFromName(Option<StreamScopeRef>, String),
86 AddAllFromStreamScope(String),
87 InvalidateCount,
89 RemoveVisibleItems(MessageTarget<VisibleItemIndex>),
90 RemoveItems(Vec<DisplayedItemRef>),
91 FocusItem(VisibleItemIndex),
93 ItemSelectRange(VisibleItemIndex),
94 ItemSelectAll,
96 SetItemSelected(VisibleItemIndex, bool),
97 UnfocusItem,
99 MoveFocus(MoveDir, CommandCount, bool),
100 MoveFocusedItem(MoveDir, CommandCount),
101 FocusTransaction(Option<TransactionRef>, Option<Transaction>),
102 VerticalScroll(MoveDir, CommandCount),
103 ScrollToItem(usize),
105 SetScrollOffset(f32),
106 VariableFormatChange(MessageTarget<DisplayedFieldRef>, String),
108 ItemSelectionClear,
109 ItemColorChange(MessageTarget<VisibleItemIndex>, Option<String>),
111 ItemBackgroundColorChange(MessageTarget<VisibleItemIndex>, Option<String>),
113 ItemNameChange(Option<VisibleItemIndex>, Option<String>),
114 ItemNameReset(MessageTarget<VisibleItemIndex>),
115 ItemHeightScalingFactorChange(MessageTarget<VisibleItemIndex>, f32),
117 ChangeVariableNameType(MessageTarget<VisibleItemIndex>, VariableNameType),
119 ForceVariableNameTypes(VariableNameType),
120 SetNameAlignRight(bool),
122 SetClockHighlightType(ClockHighlightType),
123 SetFillHighValues(bool),
124 SetDinotraceStyle(bool),
125 ResetVariableFormat(DisplayedFieldRef),
128 CanvasScroll {
129 delta: Vec2,
130 viewport_idx: usize,
131 },
132 CanvasZoom {
133 mouse_ptr: Option<BigInt>,
134 delta: f32,
135 viewport_idx: usize,
136 },
137 ZoomToRange {
138 start: BigInt,
139 end: BigInt,
140 viewport_idx: usize,
141 },
142 CursorSet(BigInt),
144 #[serde(skip)]
145 SetSurverStatus(web_time::Instant, String, SurverStatus),
146 LoadFile(Utf8PathBuf, LoadOptions),
148 LoadWaveformFileFromUrl(String, LoadOptions),
150 LoadFromData(Vec<u8>, LoadOptions),
152 #[cfg(feature = "python")]
153 LoadPythonTranslator(Utf8PathBuf),
155 #[cfg(all(not(target_arch = "wasm32"), feature = "wasm_plugins"))]
158 LoadWasmTranslator(Utf8PathBuf),
159 LoadCommandFile(Utf8PathBuf),
161 LoadCommandFromData(Vec<u8>),
163 LoadCommandFileFromUrl(String),
165 SetupCxxrtl(CxxrtlKind),
166 #[serde(skip)]
167 WaveHeaderLoaded(
169 web_time::Instant,
170 WaveSource,
171 LoadOptions,
172 #[debug(skip)] HeaderResult,
173 ),
174 #[serde(skip)]
175 WaveBodyLoaded(web_time::Instant, WaveSource, #[debug(skip)] BodyResult),
177 #[serde(skip)]
178 WavesLoaded(
179 WaveSource,
180 WaveFormat,
181 #[debug(skip)] Box<WaveContainer>,
182 LoadOptions,
183 ),
184 #[serde(skip)]
185 SignalsLoaded(web_time::Instant, #[debug(skip)] LoadSignalsResult),
186 #[serde(skip)]
187 TransactionStreamsLoaded(
188 WaveSource,
189 WaveFormat,
190 #[debug(skip)] TransactionContainer,
191 LoadOptions,
192 ),
193 #[serde(skip)]
194 Error(eyre::Error),
195 #[serde(skip)]
196 TranslatorLoaded(#[debug(skip)] Arc<DynTranslator>),
197 BlacklistTranslator(VariableRef, String),
200 HideCommandPrompt,
201 ShowCommandPrompt(String, Option<String>),
202 FileDropped(DroppedFile),
204 #[serde(skip)]
205 FileDownloaded(String, Bytes, LoadOptions),
207 #[serde(skip)]
208 CommandFileDownloaded(String, Bytes),
210 ReloadConfig,
211 ReloadWaveform(bool),
212 #[serde(skip)]
216 SuggestReloadWaveform,
217 #[serde(skip)]
221 CloseReloadWaveformDialog {
222 reload_file: bool,
223 do_not_show_again: bool,
224 },
225 #[serde(skip)]
227 UpdateReloadWaveformDialog(ReloadWaveformDialog),
228 OpenSiblingStateFile(bool),
230 #[serde(skip)]
231 SuggestOpenSiblingStateFile,
232 #[serde(skip)]
233 CloseOpenSiblingStateFileDialog {
234 load_state: bool,
235 do_not_show_again: bool,
236 },
237 #[serde(skip)]
238 UpdateOpenSiblingStateFileDialog(OpenSiblingStateFileDialog),
239 RemovePlaceholders,
240 ZoomToFit {
241 viewport_idx: usize,
242 },
243 GoToStart {
244 viewport_idx: usize,
245 },
246 GoToEnd {
247 viewport_idx: usize,
248 },
249 GoToTime(Option<BigInt>, usize),
250 SetMenuVisible(bool),
251 ToggleMenu,
252 SetToolbarVisible(bool),
253 SetOverviewVisible(bool),
254 SetStatusbarVisible(bool),
255 SetShowIndices(bool),
256 SetShowVariableDirection(bool),
257 SetShowEmptyScopes(bool),
258 SetShowHierarchyIcons(bool),
259 SetParameterDisplayLocation(ParameterDisplayLocation),
260 SetSidePanelVisible(bool),
261 ToggleItemSelected(Option<VisibleItemIndex>),
262 SetDefaultTimeline(bool),
263 SetTickLines(bool),
264 SetVariableTooltip(bool),
265 SetScopeTooltip(bool),
266 SetSurverFileWindowVisible(bool),
267 LoadSurverFileByIndex(Option<usize>, LoadOptions),
268 LoadSurverFileByName(String, LoadOptions),
269 SetTransitionValue(TransitionValue),
270 ToggleFullscreen,
271 StopProgressTracker,
272 SetTimeUnit(TimeUnit),
274 SetTimeStringFormatting(Option<TimeStringFormatting>),
276 SetHighlightFocused(bool),
277 CommandPromptClear,
278 CommandPromptUpdate {
279 suggestions: Vec<(String, Vec<bool>)>,
280 },
281 CommandPromptPushPrevious(String),
282 SelectPrevCommand,
283 SelectNextCommand,
284 OpenFileDialog(OpenMode),
285 OpenCommandFileDialog,
286 #[cfg(feature = "python")]
287 OpenPythonPluginDialog,
288 #[cfg(feature = "python")]
289 ReloadPythonPlugin,
290 SaveStateFile(Option<PathBuf>),
291 LoadStateFromData(Vec<u8>),
295 LoadStateFile(Option<PathBuf>),
296 LoadState(Box<UserState>, Option<PathBuf>),
297 SetStateFile(PathBuf),
298 SetAboutVisible(bool),
299 SetKeyHelpVisible(bool),
300 SetGestureHelpVisible(bool),
301 SetQuickStartVisible(bool),
302 #[serde(skip)]
303 SetUrlEntryVisible(
304 bool,
305 #[debug(skip)] Option<Box<dyn Fn(String) -> Message + Send + 'static>>,
306 ),
307 SetLicenseVisible(bool),
308 SetLogsVisible(bool),
309 SetFrameBufferVariable(VariableRef),
310 SetFrameBufferVisibleVariable(Option<VisibleItemIndex>),
311 SetFrameBufferArray(ScopeRef),
312 SetMouseGestureDragStart(Option<Pos2>),
313 SetMeasureDragStart(Option<Pos2>),
314 SetFilterFocused(bool),
315 SetTimeEditFocused(bool),
316 SetRequestTimeEditFocus(bool),
317 SetVariableNameFilterType(VariableNameFilterType),
318 SetVariableNameFilterCaseInsensitive(bool),
319 SetVariableIOFilter(VariableIOFilterType, bool),
320 SetVariableGroupByDirection(bool),
321 SetUIZoomFactor(f32),
322 SetPerformanceVisible(bool),
323 SetContinuousRedraw(bool),
324 SetCursorWindowVisible(bool),
325 SetHierarchyStyle(HierarchyStyle),
326 SetArrowKeyBindings(ArrowKeyBindings),
327 SetPrimaryMouseDragBehavior(PrimaryMouseDrag),
328 AddDivider(Option<String>, Option<VisibleItemIndex>),
331 AddTimeLine(Option<VisibleItemIndex>),
334 AddMarker {
335 time: BigInt,
336 name: Option<String>,
337 move_focus: bool,
338 },
339 SetMarker {
341 id: u8,
342 time: BigInt,
343 },
344 RemoveMarker(u8),
346 MoveMarkerToCursor(u8),
348 GoToCursorIfNotInView,
350 GoToMarkerPosition(u8, usize),
351 MoveCursorToTransition {
352 next: bool,
353 variable: Option<VisibleItemIndex>,
354 skip_zero: bool,
355 },
356 MoveTransaction {
357 next: bool,
358 },
359 VariableValueToClipbord(MessageTarget<VisibleItemIndex>),
360 VariableNameToClipboard(MessageTarget<VisibleItemIndex>),
361 VariableFullNameToClipboard(MessageTarget<VisibleItemIndex>),
362 InvalidateDrawCommands,
363 AddGraphic(GraphicId, Graphic),
364 RemoveGraphic(GraphicId),
365
366 VariableDragStarted(VisibleItemIndex),
368 VariableDragTargetChanged(crate::displayed_item_tree::TargetPosition),
369 VariableDragFinished,
370 AddDraggedVariables(Vec<VariableRef>),
371 UnpauseSimulation,
374 PauseSimulation,
377 ExpandDrawnItem {
380 item: DisplayedItemRef,
381 levels: usize,
382 },
383 SetAnalogSettings(
384 MessageTarget<VisibleItemIndex>,
385 Option<crate::displayed_item::AnalogSettings>,
386 ),
387 BuildAnalogCache {
388 display_id: DisplayedItemRef,
389 cache_key: AnalogCacheKey,
390 },
391 #[serde(skip)]
392 AnalogCacheBuilt {
393 #[debug(skip)]
394 entry: Arc<crate::analog_signal_cache::AnalogCacheEntry>,
395 #[debug(skip)]
396 result: Result<crate::analog_signal_cache::AnalogSignalCache, String>,
397 },
398
399 SetViewportStrategy(ViewportStrategy),
400 SetConfigFromString(String),
401 AddCharToPrompt(char),
402
403 Batch(Vec<Message>),
405 AddViewport,
406 RemoveViewport,
407 SelectTheme(Option<String>),
409 EnableAnimations(bool),
411 Undo(usize),
413 Redo(usize),
415 DumpTree,
416 GroupNew {
417 name: Option<String>,
418 before: Option<ItemIndex>,
419 items: Option<Vec<DisplayedItemRef>>,
420 },
421 GroupDissolve(Option<DisplayedItemRef>),
422 GroupFold(Option<DisplayedItemRef>),
423 GroupUnfold(Option<DisplayedItemRef>),
424 GroupFoldRecursive(Option<DisplayedItemRef>),
425 GroupUnfoldRecursive(Option<DisplayedItemRef>),
426 GroupFoldAll,
427 GroupUnfoldAll,
428 StartWcpServer {
430 address: Option<String>,
431 initiate: bool,
432 },
433 StopWcpServer,
434 SetupChannelWCP,
437 Exit,
440 ExpandParameterSection,
442 AsyncDone(AsyncJob),
443}