OpenCPN Partial API docs
Loading...
Searching...
No Matches
ocpn_frame.h
Go to the documentation of this file.
1/**************************************************************************
2 * Copyright (C) 2010 by David S. Register *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, see <https://www.gnu.org/licenses/>. *
16 **************************************************************************/
17
24#ifndef _OFRAME_H
25#define _OFRAME_H
26
27#include <wx/print.h>
28#include <wx/power.h>
29#include <wx/artprov.h>
30#include <wx/socket.h>
31#include <wx/html/htmlwin.h>
32#include <wx/aui/aui.h>
33#include <wx/aui/dockart.h>
34
35#include <memory>
36#ifdef __WXMSW__
37#include <wx/msw/private.h>
38#endif
39
40#include "ocpn_plugin.h"
41
42#include "observable/evtvar.h"
43
45#include "model/gui.h"
46#include "model/idents.h"
47#include "model/ocpn_types.h"
48#include "model/track.h"
50#include "model/rest_server.h"
51
52#include "bbox.h"
53#include "canvas_menu.h"
54#include "chartbase.h"
55#include "chartdbs.h"
56#include "chcanv.h"
57#include "color_handler.h"
58#include "connections_dlg.h"
59#include "data_monitor.h"
60#include "displays.h"
61#include "gui_lib.h"
62#include "load_errors_dlg.h"
63#include "options.h"
64#include "pluginmanager.h"
65#include "s52_plib_utils.h"
66#include "s52s57.h"
67#include "s57registrar_mgr.h"
68#include "senc_manager.h"
69#include "toolbar.h"
70#include "top_frame.h"
71#include "undo_defs.h"
72
73//----------------------------------------------------------------------------
74// constants
75//----------------------------------------------------------------------------
76
77#define TIMER_GFRAME_1 999
78
79// Command identifiers for wxCommandEvents coming from the outside world.
80// Removed from enum to facilitate constant definition
81//
82// NOLINTBEGIN
83#define ID_CMD_APPLY_SETTINGS 300
84#define ID_CMD_NULL_REFRESH 301
85#define ID_CMD_TRIGGER_RESIZE 302
86#define ID_CMD_SETVP 303
87#define ID_CMD_POST_JSON_TO_PLUGINS 304
88#define ID_CMD_SOUND_FINISHED 306
89// NOLINTEND
90
91using OpenFileFunc = std::function<bool(const std::string& path)>;
92//----------------------------------------------------------------------------
93// fwd class declarations
94//----------------------------------------------------------------------------
95
96class MyFrame; // forward
97extern MyFrame* gFrame;
99// FIXME (leamas) to have utility functions in top window is a really bad idea.
100bool ShowNavWarning();
101
102void ApplyLocale(void);
103
109class MyFrame : public AbstractTopFrame, public S52PlibUtils {
110public:
111 MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size,
112 RestServer& rest_server, wxAuiDefaultDockArt* pauidockart,
113 OpenFileFunc open_gpx_file);
114
115 ~MyFrame();
116
117 void SetGPSCompassScale() override;
118 void FastClose() override;
119 void RefreshAllCanvas(bool bErase = true) override;
120 void UpdateStatusBar() override;
121 void ToggleFullScreen() override;
122 Track* TrackOff(bool do_add_point = false) override;
123 void TrackOn(void) override;
124 void ProcessOptionsDialog(int resultFlags) override {
125 ProcessOptionsDialog(resultFlags, nullptr);
126 }
127
128 void SetAlertString(wxString msg) override {
129 GetPrimaryCanvas()->SetAlertString(msg);
130 }
131
132 void JumpToPosition(double lat, double lon) override {
133 if (!GetFocusCanvas()) return;
134 JumpToPosition(GetFocusCanvas(), lat, lon, GetFocusCanvas()->GetVPScale());
135 }
136
137 void JumpToPosition(double lat, double lon, double scale) override {
138 if (!GetFocusCanvas()) return;
139 JumpToPosition(GetFocusCanvas(), lat, lon, scale);
140 }
141
142 void JumpToPosition(AbstractChartCanvas* acc, double lat, double lon,
143 double scale) override {
144 if (!acc) return;
145 auto cc = dynamic_cast<ChartCanvas*>(acc);
146 assert(cc);
147 JumpToPosition(cc, lat, lon, scale);
148 }
149 void JumpToPosition(AbstractChartCanvas* acc, double lat,
150 double lon) override {
151 if (!acc) return;
152 auto cc = dynamic_cast<ChartCanvas*>(acc);
153 assert(cc);
154 JumpToPosition(cc, lat, lon, GetFocusCanvas()->GetVPScale());
155 }
156
157 AbstractChartCanvas* GetAbstractPrimaryCanvas() override {
158 return GetPrimaryCanvas();
159 }
160
161 AbstractChartCanvas* GetAbstractFocusCanvas() override {
162 return GetFocusCanvas();
163 }
164
165 void SwitchKBFocus(AbstractChartCanvas* acc) override {
166 return SwitchKBFocusCanvas(dynamic_cast<ChartCanvas*>(acc));
167 }
168
169 double GetCanvasTrueScale() override {
170 return GetPrimaryCanvas()->GetCanvasTrueScale();
171 }
172
173 double GetPixPerMM() override { return GetPrimaryCanvas()->GetPixPerMM(); }
174
175 double GetContentScaleFactor() override {
176 if (GetPrimaryCanvas())
177 return GetPrimaryCanvas()->GetContentScaleFactor();
178 else
179 return 1.0;
180 }
181
182 void RequestNewToolbars(bool bforcenew = false) override;
183
184 bool GetCanvasPointPix(double rlat, double rlon, wxPoint* r) override {
185 return GetFocusCanvas()->GetCanvasPointPix(rlat, rlon, r);
186 }
187
188 virtual wxSize GetFocusCanvasSize() override {
189 return GetFocusCanvas() ? GetFocusCanvas()->GetSize() : wxSize(0, 0);
190 }
191
192 void CancelAllMouseRoute() override;
193 void InvalidateAllCanvasUndo() override;
194 void PositionConsole() override;
195 void InvalidateAllGL() override;
196 double GetBestVPScale(AbstractChart* arg) override {
197 auto chart = dynamic_cast<ChartBase*>(arg);
198 assert(chart);
199 return GetPrimaryCanvas()->GetBestVPScale(chart);
200 }
201
202 void DoStackUp(AbstractChartCanvas* cc) override;
203 void DoStackDown(AbstractChartCanvas* cc) override;
204 void LoadHarmonics() override;
205
206 bool DropMarker(bool atOwnShip = true) override;
207 double GetMag(double a, double lat, double lon) override;
208 void SetMasterToolbarItemState(int tool_id, bool state) override;
209 bool DoChartUpdate() override;
210 void ProcessCanvasResize() override;
211 bool SetGlobalToolbarViz(bool viz) override;
212 void ToggleQuiltMode(AbstractChartCanvas* acc) override {
213 auto cc = dynamic_cast<ChartCanvas*>(acc);
214 ToggleQuiltMode(cc);
215 }
216 void UpdateGlobalMenuItems(AbstractChartCanvas* acc) override {
217 UpdateGlobalMenuItems(dynamic_cast<ChartCanvas*>(acc));
218 }
219 void UpdateGlobalMenuItems() override;
220 void RefreshCanvasOther(AbstractChartCanvas* ccThis) override {
221 RefreshCanvasOther(dynamic_cast<ChartCanvas*>(ccThis));
222 }
223 virtual double* GetCOGTable() override { return COGTable; }
224 virtual void StartCogTimer() override {
225 FrameCOGTimer.Start(100, wxTIMER_CONTINUOUS);
226 }
227
228 wxWindow* GetPrimaryCanvasWindow() override { return GetPrimaryCanvas(); }
229 void ApplyGlobalSettings(bool bnewtoolbar) override;
230 void SetMenubarItemState(int item_id, bool state) override;
231 void ToggleColorScheme() override;
232 void ActivateMOB() override;
233 void ToggleTestPause() override;
234
235 void ToggleChartBar(AbstractChartCanvas* acc) override {
236 ToggleChartBar(dynamic_cast<ChartCanvas*>(acc));
237 }
238 void DoSettings() override;
239
240 void UpdateRotationState(double rotation) override;
241 void SetChartUpdatePeriod() override;
242 wxStatusBar* GetStatusBar() override { return wxFrame::GetStatusBar(); }
243 wxStatusBar* GetFrameStatusBar() const override { return m_pStatusBar; }
244 void SetENCDisplayCategory(AbstractChartCanvas* acc,
245 enum _DisCat nset) override {
246 SetENCDisplayCategory(dynamic_cast<ChartCanvas*>(acc), nset);
247 }
248 int GetCanvasIndexUnderMouse() override;
249
250 double GetCanvasRefScale() override {
251 return GetPrimaryCanvas()->GetVP().ref_scale;
252 ;
253 }
254
255#ifdef ocpnUSE_GL
256 void SendGlJsonConfigMsg() override {
257 if (GetPrimaryCanvas() && GetPrimaryCanvas()->GetglCanvas())
258 GetPrimaryCanvas()->GetglCanvas()->SendJSONConfigMessage();
259 }
260 bool CanAccelerateGlPanning() override {
261 return GetPrimaryCanvas()->GetglCanvas()->CanAcceleratePanning();
262 }
263 void SetupGlCompression() override {
264 GetPrimaryCanvas()->GetglCanvas()->SetupCompression();
265 }
266 wxString GetGlVersionString() override {
267 return GetPrimaryCanvas()->GetglCanvas()->GetVersionString();
268 }
269 wxGLCanvas* GetWxGlCanvas() override {
270 return GetPrimaryCanvas()->GetglCanvas();
271 }
272
273#else
274 void SendGlJsonConfigMsg() override {}
275 bool CanAccelerateGlPanning() override { return false; }
276 void SetupGlCompression() override {}
277 wxString GetGlVersionString() override { return ""; }
278 wxGLCanvas* GetWxGlCanvas() override { return nullptr; }
279#endif
280 void SwitchKBFocusCanvas(ChartCanvas* pCanvas);
281 int GetNextToolbarToolId() override {
282 return m_next_available_plugin_tool_id;
283 }
284 void SetToolbarItemBitmaps(int tool_id, wxBitmap* bitmap,
285 wxBitmap* bmpDisabled) override;
286 void SetToolbarItemSVG(int tool_id, wxString normalSVGfile,
287 wxString rolloverSVGfile,
288 wxString toggledSVGfile) override;
289 void UpdateAllFonts() override;
290 void ScheduleReconfigAndSettingsReload(bool reload, bool new_dialog) override;
291 void ScheduleReloadCharts() override;
292 void ChartsRefresh() override;
293 void FreezeCharts() override;
294 void ThawCharts() override;
295
296 void ScheduleDeleteSettingsDialog() override;
297
298 void BeforeUndoableAction(UndoType undo_type, RoutePoint* point,
299 UndoBeforePointerType pointer_type,
300 UndoItemPointer pointer) override {
301 if (!GetPrimaryCanvas()) return;
302 GetPrimaryCanvas()->undo->BeforeUndoableAction(undo_type, point,
303 pointer_type, pointer);
304 }
305
306 virtual void AfterUndoableAction(UndoItemPointer pointer) override {
307 GetPrimaryCanvas()->undo->AfterUndoableAction(pointer);
308 }
309 virtual void TouchAISActive() override;
310 virtual void UpdateAISMOBRoute(const AisTargetData* ptarget) override;
311 virtual void ActivateAISMOBRoute(const AisTargetData* ptarget) override;
312 void EnableSettingsTool(bool _enable) override {
313 if (g_MainToolbar) {
314 g_MainToolbar->EnableTool(ID_SETTINGS, _enable);
315 g_MainToolbar->GetToolbar()->SetDirty(true);
316 g_MainToolbar->RefreshToolbar();
317 }
318 }
319 void OnToolLeftClick(wxCommandEvent& event) override;
320
321 bool DisableTbarTooltips();
322 void EnableTbarTooltips();
323 void HideTbarTooltip();
324
325 void SetENCDisplayCategory(ChartCanvas* cc, enum _DisCat nset);
326 void ToggleQuiltMode(ChartCanvas* cc);
327
328 wxFont* GetFont(wxFont* font, double scale) override;
329 wxFont* GetDefaultFont(wxString label, int Ptsize) override;
330 wxFont* GetScaledFont(int pointSize, wxFontFamily family, wxFontStyle style,
331 wxFontWeight weight, const wxString faceName,
332 double scale) override;
333
334 int GetApplicationMemoryUse(void);
335
336 void OnEraseBackground(wxEraseEvent& event);
337 void OnMaximize(wxMaximizeEvent& event);
338 void OnCloseWindow(wxCloseEvent& event);
339 void OnExit(wxCommandEvent& event);
340 void OnSize(wxSizeEvent& event);
341 void OnMove(wxMoveEvent& event);
342 void OnInitTimer(wxTimerEvent& event);
343
352 void OnFrameTimer1(wxTimerEvent& event);
353
354 void OnEvtPlugInMessage(OCPN_MsgEvent& event);
355 void OnMemFootTimer(wxTimerEvent& event);
356 void OnRecaptureTimer(wxTimerEvent& event);
357 void OnSENCEvtThread(OCPN_BUILDSENC_ThreadEvent& event);
358 void OnIconize(wxIconizeEvent& event);
359 void OnBellsFinished(wxCommandEvent& event);
360
372 void OnFrameTenHzTimer(wxTimerEvent& event);
373
374#ifdef wxHAS_POWER_EVENTS
375 void OnSuspending(wxPowerEvent& event);
376 void OnSuspended(wxPowerEvent& event);
377 void OnSuspendCancel(wxPowerEvent& event);
378 void OnResume(wxPowerEvent& event);
379#endif // wxHAS_POWER_EVENTS
380
381 void RefreshCanvasOther(ChartCanvas* ccThis);
382 void selectChartDisplay(int type, int family);
383 void applySettingsString(wxString settings);
384 void setStringVP(wxString VPS);
385 void InvalidateAllQuilts();
386
387 void SetUpMode(ChartCanvas* cc, int mode);
388
389 ChartCanvas* GetPrimaryCanvas();
390 ChartCanvas* GetFocusCanvas();
391 void DoStackUp(ChartCanvas* cc);
392 void DoStackDown(ChartCanvas* cc);
393 void NotifyChildrenResize();
394
395 void DoStackDelta(ChartCanvas* cc, int direction);
396 void DoSettingsNew(void);
397 ChartCanvas* GetCanvasUnderMouse();
398
399 void TriggerRecaptureTimer();
400
401 void MouseEvent(wxMouseEvent& event);
402 void CenterView(ChartCanvas* cc, const LLBBox& bbox);
403
404 void JumpToPosition(ChartCanvas* cc, double lat, double lon, double scale);
405
406 void BuildMenuBar(void);
407 void RegisterGlobalMenuItems();
408 void UpdateGlobalMenuItems(ChartCanvas* cc);
409 void DoOptionsDialog();
410 void ProcessOptionsDialog(int resultFlags, ArrayOfCDI* pNewDirArray);
411 void PrepareOptionsClose(options* settings, int settings_return_value);
412
413 void DoPrint(void);
414 void ToggleDataQuality(ChartCanvas* cc);
415 void TogglebFollow(ChartCanvas* cc);
416 void ToggleChartBar(ChartCanvas* cc);
417 void SetbFollow(ChartCanvas* cc);
418 void ClearbFollow(ChartCanvas* cc);
419 void ToggleChartOutlines(ChartCanvas* cc);
420 void ToggleENCText(ChartCanvas* cc);
421 void ToggleSoundings(ChartCanvas* cc);
422#if 0
423 void ToggleRocks(void);
424#endif
425 bool ToggleLights(ChartCanvas* cc);
426 void ToggleAnchor(ChartCanvas* cc);
427 void ToggleAISDisplay(ChartCanvas* cc);
428 void ToggleAISMinimizeTargets(ChartCanvas* cc);
429
430 void ToggleNavobjects(ChartCanvas* cc);
431
432 void TrackDailyRestart(void);
433 bool ShouldRestartTrack();
434 void InitializeTrackRestart();
435
436 void UpdateControlBar(ChartCanvas* cc);
437
438 void SubmergeAllCanvasToolbars(void);
439 void SurfaceAllCanvasToolbars(void);
440 void SetAllToolbarScale(void);
441
442 void RefreshGroupIndices(void);
443
444 double GetBestVPScale(ChartBase* pchart);
445
446 DataMonitor* GetDataMonitor() const { return m_data_monitor; }
447
448 void SetAndApplyColorScheme(ColorScheme cs);
449
450 void OnFrameTCTimer(wxTimerEvent& event);
451 void OnFrameCOGTimer(wxTimerEvent& event);
452
453 void HandleBasicNavMsg(std::shared_ptr<const BasicNavDataMsg> msg);
454 void HandleGPSWatchdogMsg(std::shared_ptr<const GPSWatchdogMsg> msg);
455
456 bool CheckGroup(int igroup);
457 bool SendJSON_WMM_Var_Request(double lat, double lon, wxDateTime date);
458
459 void DestroyPersistentDialogs();
460 void UpdateAISTool(void);
461 wxMenuBar* m_pMenuBar;
462 bool m_bTimeIsSet;
463
464 wxTimer InitTimer;
465 int m_iInitCount;
466 bool m_initializing;
467
468 wxTimer FrameTCTimer;
469 wxTimer FrameTimer1;
470 wxTimer FrameCOGTimer;
471 wxTimer MemFootTimer;
472 wxTimer m_resizeTimer;
473 wxTimer FrameTenHzTimer;
474
475 int m_BellsToPlay;
476 wxTimer BellsTimer;
477
478 wxGenericProgressDialog* Updateprog = nullptr;
479
480 // PlugIn support
481 void RequestNewToolbarArgEvent(wxCommandEvent& WXUNUSED(event)) {
482 return RequestNewMasterToolbar();
483 }
484
485 void UpdateGPSCompassStatusBoxes(bool b_force_new = false);
486
487 bool UpdateChartDatabaseInplace(ArrayOfCDI& DirArray, bool b_force,
488 bool b_prog,
489 const wxString& ChartListFileName);
490 void FinalizeChartDBUpdate();
491
492 bool m_bdefer_resize;
493 wxSize m_defer_size;
494 double COGTable[kMaxCogAverageSeconds];
495
496 void CreateCanvasLayout(bool b_useStoredSize = false);
497 void ReloadAllVP();
498 void SetCanvasSizes(wxSize frameSize);
499
500 ocpnToolBarSimple* CreateMasterToolbar();
501 void RequestNewMasterToolbar(bool bforcenew = true);
502 bool CheckAndAddPlugInTool();
503 bool AddDefaultPositionPlugInTools();
504
505 void UpdateCanvasConfigDescriptors();
506 void ScheduleSettingsDialog();
507 void ScheduleSettingsDialogNew();
508 static void StartRebuildChartDatabase();
509 void PositionIENCToolbar();
510
511 void InitAppMsgBusListener();
512 void InitApiListeners();
513 void ReleaseApiListeners();
514 void ConfigureStatusBar();
515
516private:
517 void ProcessUnitTest();
518 bool ProcessQuitFlag();
519 void ProcessDeferredTrackOn();
520 void SendFixToPlugins();
521 void ProcessAnchorWatch();
522 void ProcessLogAndBells();
523 void CalculateCOGAverage();
524 void CheckToolbarPosition();
525
526 void ODoSetSize(void);
527 void DoCOGSet(void);
528
529 void UpdateAllToolbars(ColorScheme cs);
530
531 void FilterCogSog(void);
532
533 void ApplyGlobalColorSchemetoStatusBar(void);
534
535 bool ScrubGroupArray();
536
537 void OnToolbarAnimateTimer(wxTimerEvent& event);
538 bool CollapseGlobalToolbar();
539
540 int m_StatusBarFieldCount;
541
542 wxDateTime m_MMEAeventTime;
543 unsigned long m_ulLastNMEATicktime;
544 int m_tick_idx;
545 wxDateTime m_fix_start_time;
546
547 wxString m_last_reported_chart_name;
548 wxString m_last_reported_chart_pubdate;
549
550 wxString m_lastAISiconName;
551
552 // Plugin Support
553 int m_next_available_plugin_tool_id;
554
555 double COGFilterTable[kMaxCogsogFilterSeconds];
556 double SOGFilterTable[kMaxCogsogFilterSeconds];
557
558 int m_ChartUpdatePeriod;
559 bool m_last_bGPSValid;
560 bool m_last_bVelocityValid;
561 double m_last_hdt;
562
563 wxString prev_locale;
564
572 time_t m_fixtime;
573 bool b_autofind;
574
575 wxDateTime m_target_rotate_time;
576
577 wxTimer ToolbarAnimateTimer;
578 int m_nMasterToolCountShown;
579 wxTimer m_recaptureTimer;
580
581 std::unique_ptr<LoadErrorsDlgCtrl> m_load_errors_dlg_ctrl;
582 wxString m_gshhg_chart_loc;
583
584private:
585 ObservableListener listener_basic_navdata;
586 ObservableListener listener_gps_watchdog;
587 obs::Listener m_on_raise_listener;
588 obs::Listener m_on_quit_listener;
589 obs::Listener m_routes_update_listener;
590 obs::Listener m_evt_drv_msg_listener;
591 obs::Listener m_update_statusbar_listener;
592 obs::Listener m_center_aistarget_listener;
593 obs::Listener m_reload_charts_listener;
594 ToolbarDlgCallbacks m_toolbar_callbacks;
595
596 wxStatusBar* m_pStatusBar;
597 ConnectionsDlg* m_connections_dlg;
598 bool m_need_new_options;
599 wxArrayString pathArray;
600 double restoreScale[4];
601 unsigned int last_canvasConfig;
602 DataMonitor* m_data_monitor;
603 wxAuiDefaultDockArt* m_pauidockart;
604 RestServer& m_rest_server;
605 OpenFileFunc m_open_gpx_file;
606
607 void CenterAisTarget(const std::shared_ptr<const AisTargetData>& ais_target);
608
609 DECLARE_EVENT_TABLE()
610};
611
612#endif // _OFRAME_H
AIS target definitions.
Canvas context (right click) menu handler.
General chart base definitions.
Basic chart info storage.
Generic Chart canvas base.
Minimal ChartCAnvas interface with very little dependencies.
Minimal Chart interface, for now just an anonymous pointer.
Base class for all chart types.
Definition chartbase.h:126
ChartCanvas - Main chart display and interaction component.
Definition chcanv.h:174
bool GetCanvasPointPix(double rlat, double rlon, wxPoint *r)
Convert latitude/longitude to canvas pixel coordinates (physical pixels) rounded to nearest integer.
Definition chcanv.cpp:4604
double GetPixPerMM()
Get the number of logical pixels per millimeter on the screen.
Definition chcanv.h:543
Options | Connections tab implementation, basically a UI for maintaining the list of connections.
Overall logging handler, outputs to screen and log file.
Main application frame.
Definition ocpn_frame.h:109
void OnFrameTimer1(wxTimerEvent &event)
Main application timer handler called approximately once per second.
void InitApiListeners()
Setup handling of events from the local ipc/dbus API.
void OnFrameTenHzTimer(wxTimerEvent &event)
High-frequency timer handler running at 10Hz for smooth navigation updates.
AbstractRestServer implementation and interface to underlying IO thread.
Represents a waypoint or mark within the navigation system.
Definition route_point.h:71
Represents a track, which is a series of connected track points.
Definition track.h:117
double ref_scale
The nominal scale of the "reference chart" for this view.
Definition viewport.h:221
Generic toolbar implementation in pure wxWidgets adapted from wxToolBarSimple (deprecated).
Definition toolbar.h:109
Global color handling by name.
Decoded messages send/receive support.
Options | Connections GUI tab managing connections
New NMEA Debugger successor main window.
Display utilities.
Hooks into gui available in model.
General purpose GUI support.
GUI constant definitions.
MyFrame * gFrame
Global instance.
PlugIn Object Definition/API.
Navigation data types.
Options dialog.
PlugInManager and helper classes – Mostly gui parts (dialogs) and plugin API stuff.
REST API server.
S57 Chart Object.
ocpnFloatingToolbarDialog * g_MainToolbar
Global instance.
Definition toolbar.cpp:66
OpenCPN Toolbar.
Abstract gFrame/MyFrame interface.
Recorded track abstraction.
Undo features argument definitions.