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 surver::Status;
11
12use crate::async_util::AsyncJob;
13use crate::config::PrimaryMouseDrag;
14use crate::displayed_item_tree::{ItemIndex, VisibleItemIndex};
15use crate::graphics::{Graphic, GraphicId};
16use crate::state::UserState;
17use crate::transaction_container::{
18 StreamScopeRef, TransactionContainer, TransactionRef, TransactionStreamRef,
19};
20use crate::translation::DynTranslator;
21use crate::viewport::ViewportStrategy;
22use crate::wave_data::ScopeType;
23use crate::{
24 clock_highlighting::ClockHighlightType,
25 config::ArrowKeyBindings,
26 dialog::{OpenSiblingStateFileDialog, ReloadWaveformDialog},
27 displayed_item::{DisplayedFieldRef, DisplayedItemRef},
28 file_dialog::OpenMode,
29 hierarchy::HierarchyStyle,
30 time::{TimeStringFormatting, TimeUnit},
31 variable_filter::VariableIOFilterType,
32 variable_name_type::VariableNameType,
33 wave_container::{ScopeRef, VariableRef, WaveContainer},
34 wave_source::{CxxrtlKind, LoadOptions, WaveFormat},
35 wellen::{BodyResult, HeaderResult, LoadSignalsResult},
36 MoveDir, VariableNameFilterType, WaveSource,
37};
38
39type CommandCount = usize;
40
41#[derive(Debug, Deserialize, Clone)]
43pub enum MessageTarget<T> {
44 Explicit(T),
45 CurrentSelection,
46}
47
48impl<T> From<MessageTarget<T>> for Option<T> {
49 fn from(value: MessageTarget<T>) -> Self {
50 match value {
51 MessageTarget::Explicit(val) => Some(val),
52 MessageTarget::CurrentSelection => None,
53 }
54 }
55}
56
57impl<T> From<Option<T>> for MessageTarget<T> {
58 fn from(value: Option<T>) -> Self {
59 match value {
60 Some(val) => Self::Explicit(val),
61 None => Self::CurrentSelection,
62 }
63 }
64}
65
66impl<T: Copy> Copy for MessageTarget<T> {}
67
68#[derive(Debug, Deserialize)]
69pub enum Message {
71 SetActiveScope(ScopeType),
73 ExpandScope(ScopeRef),
74 AddVariables(Vec<VariableRef>),
76 AddScope(ScopeRef, bool),
78 AddScopeAsGroup(ScopeRef, bool),
80 AddCount(char),
82 AddStreamOrGenerator(TransactionStreamRef),
83 AddStreamOrGeneratorFromName(Option<StreamScopeRef>, String),
84 AddAllFromStreamScope(String),
85 InvalidateCount,
87 RemoveItemByIndex(VisibleItemIndex),
88 RemoveItems(Vec<DisplayedItemRef>),
89 FocusItem(VisibleItemIndex),
91 ItemSelectRange(VisibleItemIndex),
92 ItemSelectAll,
94 SetItemSelected(VisibleItemIndex, bool),
95 UnfocusItem,
97 RenameItem(Option<VisibleItemIndex>),
98 MoveFocus(MoveDir, CommandCount, bool),
99 MoveFocusedItem(MoveDir, CommandCount),
100 FocusTransaction(Option<TransactionRef>, Option<Transaction>),
101 VerticalScroll(MoveDir, CommandCount),
102 ScrollToItem(usize),
104 SetScrollOffset(f32),
105 VariableFormatChange(MessageTarget<DisplayedFieldRef>, String),
107 ItemSelectionClear,
108 ItemColorChange(MessageTarget<VisibleItemIndex>, Option<String>),
110 ItemBackgroundColorChange(MessageTarget<VisibleItemIndex>, Option<String>),
112 ItemNameChange(Option<VisibleItemIndex>, Option<String>),
113 ItemHeightScalingFactorChange(MessageTarget<VisibleItemIndex>, f32),
115 ChangeVariableNameType(MessageTarget<VisibleItemIndex>, VariableNameType),
117 ForceVariableNameTypes(VariableNameType),
118 SetNameAlignRight(bool),
120 SetClockHighlightType(ClockHighlightType),
121 SetFillHighValues(bool),
122 ResetVariableFormat(DisplayedFieldRef),
125 CanvasScroll {
126 delta: Vec2,
127 viewport_idx: usize,
128 },
129 CanvasZoom {
130 mouse_ptr: Option<BigInt>,
131 delta: f32,
132 viewport_idx: usize,
133 },
134 ZoomToRange {
135 start: BigInt,
136 end: BigInt,
137 viewport_idx: usize,
138 },
139 CursorSet(BigInt),
141 #[serde(skip)]
142 SurferServerStatus(web_time::Instant, String, Status),
143 LoadFile(Utf8PathBuf, LoadOptions),
145 LoadWaveformFileFromUrl(String, LoadOptions),
147 LoadFromData(Vec<u8>, LoadOptions),
149 #[cfg(feature = "python")]
150 LoadPythonTranslator(Utf8PathBuf),
152 #[cfg(all(not(target_arch = "wasm32"), feature = "wasm_plugins"))]
155 LoadWasmTranslator(Utf8PathBuf),
156 LoadCommandFile(Utf8PathBuf),
158 LoadCommandFromData(Vec<u8>),
160 LoadCommandFileFromUrl(String),
162 SetupCxxrtl(CxxrtlKind),
163 #[serde(skip)]
164 WaveHeaderLoaded(
166 web_time::Instant,
167 WaveSource,
168 LoadOptions,
169 #[debug(skip)] HeaderResult,
170 ),
171 #[serde(skip)]
172 WaveBodyLoaded(web_time::Instant, WaveSource, #[debug(skip)] BodyResult),
174 #[serde(skip)]
175 WavesLoaded(
176 WaveSource,
177 WaveFormat,
178 #[debug(skip)] Box<WaveContainer>,
179 LoadOptions,
180 ),
181 #[serde(skip)]
182 SignalsLoaded(web_time::Instant, #[debug(skip)] LoadSignalsResult),
183 #[serde(skip)]
184 TransactionStreamsLoaded(
185 WaveSource,
186 WaveFormat,
187 #[debug(skip)] TransactionContainer,
188 LoadOptions,
189 ),
190 #[serde(skip)]
191 Error(eyre::Error),
192 #[serde(skip)]
193 TranslatorLoaded(#[debug(skip)] Box<DynTranslator>),
194 BlacklistTranslator(VariableRef, String),
197 ShowCommandPrompt(Option<String>),
198 FileDropped(DroppedFile),
200 #[serde(skip)]
201 FileDownloaded(String, Bytes, LoadOptions),
203 #[serde(skip)]
204 CommandFileDownloaded(String, Bytes),
206 ReloadConfig,
207 ReloadWaveform(bool),
208 #[serde(skip)]
212 SuggestReloadWaveform,
213 #[serde(skip)]
217 CloseReloadWaveformDialog {
218 reload_file: bool,
219 do_not_show_again: bool,
220 },
221 #[serde(skip)]
223 UpdateReloadWaveformDialog(ReloadWaveformDialog),
224 OpenSiblingStateFile(bool),
226 #[serde(skip)]
227 SuggestOpenSiblingStateFile,
228 #[serde(skip)]
229 CloseOpenSiblingStateFileDialog {
230 load_state: bool,
231 do_not_show_again: bool,
232 },
233 #[serde(skip)]
234 UpdateOpenSiblingStateFileDialog(OpenSiblingStateFileDialog),
235 RemovePlaceholders,
236 ZoomToFit {
237 viewport_idx: usize,
238 },
239 GoToStart {
240 viewport_idx: usize,
241 },
242 GoToEnd {
243 viewport_idx: usize,
244 },
245 GoToTime(Option<BigInt>, usize),
246 ToggleMenu,
247 ToggleToolbar,
248 ToggleOverview,
249 ToggleStatusbar,
250 ToggleIndices,
251 ToggleDirection,
252 ToggleEmptyScopes,
253 ToggleParametersInScopes,
254 ToggleSidePanel,
255 ToggleItemSelected(Option<VisibleItemIndex>),
256 ToggleDefaultTimeline,
257 ToggleTickLines,
258 ToggleVariableTooltip,
259 ToggleScopeTooltip,
260 ToggleFullscreen,
261 SetTimeUnit(TimeUnit),
263 SetTimeStringFormatting(Option<TimeStringFormatting>),
265 SetHighlightFocused(bool),
266 CommandPromptClear,
267 CommandPromptUpdate {
268 suggestions: Vec<(String, Vec<bool>)>,
269 },
270 CommandPromptPushPrevious(String),
271 SelectPrevCommand,
272 SelectNextCommand,
273 OpenFileDialog(OpenMode),
274 OpenCommandFileDialog,
275 #[cfg(feature = "python")]
276 OpenPythonPluginDialog,
277 #[cfg(feature = "python")]
278 ReloadPythonPlugin,
279 SaveStateFile(Option<PathBuf>),
280 LoadStateFile(Option<PathBuf>),
281 LoadState(Box<UserState>, Option<PathBuf>),
282 SetStateFile(PathBuf),
283 SetAboutVisible(bool),
284 SetKeyHelpVisible(bool),
285 SetGestureHelpVisible(bool),
286 SetQuickStartVisible(bool),
287 #[serde(skip)]
288 SetUrlEntryVisible(
289 bool,
290 #[debug(skip)] Option<Box<dyn Fn(String) -> Message + Send + 'static>>,
291 ),
292 SetLicenseVisible(bool),
293 SetRenameItemVisible(bool),
294 SetLogsVisible(bool),
295 SetMouseGestureDragStart(Option<Pos2>),
296 SetMeasureDragStart(Option<Pos2>),
297 SetFilterFocused(bool),
298 SetVariableNameFilterType(VariableNameFilterType),
299 SetVariableNameFilterCaseInsensitive(bool),
300 SetVariableIOFilter(VariableIOFilterType, bool),
301 SetVariableGroupByDirection(bool),
302 SetUIZoomFactor(f32),
303 SetPerformanceVisible(bool),
304 SetContinuousRedraw(bool),
305 SetCursorWindowVisible(bool),
306 SetHierarchyStyle(HierarchyStyle),
307 SetArrowKeyBindings(ArrowKeyBindings),
308 SetPrimaryMouseDragBehavior(PrimaryMouseDrag),
309 AddDivider(Option<String>, Option<VisibleItemIndex>),
312 AddTimeLine(Option<VisibleItemIndex>),
315 AddMarker {
316 time: BigInt,
317 name: Option<String>,
318 move_focus: bool,
319 },
320 SetMarker {
322 id: u8,
323 time: BigInt,
324 },
325 RemoveMarker(u8),
327 MoveMarkerToCursor(u8),
329 GoToCursorIfNotInView,
331 GoToMarkerPosition(u8, usize),
332 MoveCursorToTransition {
333 next: bool,
334 variable: Option<VisibleItemIndex>,
335 skip_zero: bool,
336 },
337 MoveTransaction {
338 next: bool,
339 },
340 VariableValueToClipbord(MessageTarget<VisibleItemIndex>),
341 VariableNameToClipboard(MessageTarget<VisibleItemIndex>),
342 VariableFullNameToClipboard(MessageTarget<VisibleItemIndex>),
343 InvalidateDrawCommands,
344 AddGraphic(GraphicId, Graphic),
345 RemoveGraphic(GraphicId),
346
347 VariableDragStarted(VisibleItemIndex),
349 VariableDragTargetChanged(crate::displayed_item_tree::TargetPosition),
350 VariableDragFinished,
351 AddDraggedVariables(Vec<VariableRef>),
352 UnpauseSimulation,
355 PauseSimulation,
358 ExpandDrawnItem {
361 item: DisplayedItemRef,
362 levels: usize,
363 },
364
365 SetViewportStrategy(ViewportStrategy),
366 SetConfigFromString(String),
367 AddCharToPrompt(char),
368
369 Batch(Vec<Message>),
371 AddViewport,
372 RemoveViewport,
373 SelectTheme(Option<String>),
375 Undo(usize),
377 Redo(usize),
379 DumpTree,
380 GroupNew {
381 name: Option<String>,
382 before: Option<ItemIndex>,
383 items: Option<Vec<DisplayedItemRef>>,
384 },
385 GroupDissolve(Option<DisplayedItemRef>),
386 GroupFold(Option<DisplayedItemRef>),
387 GroupUnfold(Option<DisplayedItemRef>),
388 GroupFoldRecursive(Option<DisplayedItemRef>),
389 GroupUnfoldRecursive(Option<DisplayedItemRef>),
390 GroupFoldAll,
391 GroupUnfoldAll,
392 StartWcpServer {
394 address: Option<String>,
395 initiate: bool,
396 },
397 StopWcpServer,
398 SetupChannelWCP,
401 Exit,
404 ExpandParameterSection,
406 AsyncDone(AsyncJob),
407}