OpenCPN Partial API docs
Loading...
Searching...
No Matches
idents.h
1/***************************************************************************
2 *
3 * Project: OpenCPN
4 * Purpose:
5 * Author: David Register
6 *
7 ***************************************************************************
8 * Copyright (C) 2010 by David S. Register *
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
19 * *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
24 **************************************************************************/
25
26#ifndef _IDENTS_H__
27#define _IDENTS_H__
28
29#include <wx/event.h>
30#include <wx/toolbar.h>
31
32#include "gui_lib.h"
33#include "ocpn_print.h"
34
35#define TIMER_GFRAME_1 999
36
37#define ID_QUIT 101
38#define ID_CM93ZOOMG 102
39
40// ToolBar Constants
41const int ID_TOOLBAR = 500;
42
43enum {
44 // The following constants represent the toolbar items (some are also used in
45 // menus). They MUST be in the SAME ORDER as on the toolbar and new items MUST
46 // NOT be added amongst them, due to the way the toolbar button visibility is
47 // saved and calculated.
48 ID_ZOOMIN = 1550,
49 ID_ZOOMOUT,
50 ID_STKUP,
51 ID_STKDN,
52 ID_ROUTE,
53 ID_FOLLOW,
54 ID_SETTINGS,
55 ID_AIS,
56 ID_ENC_TEXT,
57 ID_CURRENT,
58 ID_TIDE,
59 ID_PRINT,
60 ID_ROUTEMANAGER,
61 ID_TRACK,
62 ID_COLSCHEME,
63 ID_ABOUT,
64 ID_MOB,
65 ID_TBEXIT,
66 ID_TBSTAT,
67 ID_TBSTATBOX,
68 ID_MASTERTOGGLE,
69
70 ID_PLUGIN_BASE // This MUST be the last item in the enum
71};
72
73static const long TOOLBAR_STYLE = wxTB_FLAT | wxTB_DOCKABLE | wxTB_TEXT;
74
75enum {
76 IDM_TOOLBAR_TOGGLETOOLBARSIZE = 200,
77 IDM_TOOLBAR_TOGGLETOOLBARORIENT,
78 IDM_TOOLBAR_TOGGLETOOLBARROWS,
79 IDM_TOOLBAR_ENABLEPRINT,
80 IDM_TOOLBAR_DELETEPRINT,
81 IDM_TOOLBAR_INSERTPRINT,
82 IDM_TOOLBAR_TOGGLEHELP,
83 IDM_TOOLBAR_TOGGLE_TOOLBAR,
84 IDM_TOOLBAR_TOGGLE_ANOTHER_TOOLBAR,
85 IDM_TOOLBAR_CHANGE_TOOLTIP,
86 IDM_TOOLBAR_SHOW_TEXT,
87 IDM_TOOLBAR_SHOW_ICONS,
88 IDM_TOOLBAR_SHOW_BOTH,
89
90 ID_COMBO = 1000
91};
92
93// Menu item IDs for the main menu bar
94enum {
95 ID_MENU_ZOOM_IN = 2000,
96 ID_MENU_ZOOM_OUT,
97 ID_MENU_SCALE_IN,
98 ID_MENU_SCALE_OUT,
99
100 ID_MENU_NAV_FOLLOW,
101 ID_MENU_NAV_TRACK,
102
103 ID_MENU_CHART_NORTHUP,
104 ID_MENU_CHART_COGUP,
105 ID_MENU_CHART_HEADUP,
106 ID_MENU_CHART_QUILTING,
107 ID_MENU_CHART_OUTLINES,
108
109 ID_MENU_UI_CHARTBAR,
110 ID_MENU_UI_COLSCHEME,
111 ID_MENU_UI_FULLSCREEN,
112
113 ID_MENU_ENC_TEXT,
114 ID_MENU_ENC_LIGHTS,
115 ID_MENU_ENC_SOUNDINGS,
116 ID_MENU_ENC_ANCHOR,
117 ID_MENU_ENC_DATA_QUALITY,
118
119 ID_MENU_SHOW_TIDES,
120 ID_MENU_SHOW_CURRENTS,
121
122 ID_MENU_TOOL_MEASURE,
123 ID_MENU_ROUTE_MANAGER,
124 ID_MENU_ROUTE_NEW,
125 ID_MENU_MARK_BOAT,
126 ID_MENU_MARK_CURSOR,
127 ID_MENU_MARK_MOB,
128
129 ID_MENU_AIS_TARGETS,
130 ID_MENU_AIS_MOORED_TARGETS,
131 ID_MENU_AIS_SCALED_TARGETS,
132 ID_MENU_AIS_TRACKS,
133 ID_MENU_AIS_CPADIALOG,
134 ID_MENU_AIS_CPASOUND,
135 ID_MENU_AIS_TARGETLIST,
136 ID_MENU_AIS_CPAWARNING,
137
138 ID_MENU_SETTINGS_BASIC,
139
140 ID_MENU_OQUIT,
141
142 ID_CMD_SELECT_CHART_TYPE,
143 ID_CMD_SELECT_CHART_FAMILY,
144 ID_CMD_INVALIDATE,
145 ID_CMD_CLOSE_ALL_DIALOGS,
146
147 ID_MENU_SHOW_NAVOBJECTS,
148};
149
150// A global definition for window, timer and other ID's as needed.
151enum {
152 ID_NMEA_WINDOW = wxID_HIGHEST,
153 ID_AIS_WINDOW,
154 INIT_TIMER,
155 FRAME_TIMER_1,
156 FRAME_TIMER_2,
157 TIMER_AIS1,
158 TIMER_DSC,
159 TIMER_AISAUDIO,
160 AIS_SOCKET_Isa,
161 FRAME_TIMER_DOG,
162 FRAME_TC_TIMER,
163 FRAME_COG_TIMER,
164 MEMORY_FOOTPRINT_TIMER,
165 BELLS_TIMER,
166 ID_NMEA_THREADMSG,
167 RESIZE_TIMER,
168 TOOLBAR_ANIMATE_TIMER,
169 RECAPTURE_TIMER,
170 WATCHDOG_TIMER
171
172};
173
174
175enum { TIME_TYPE_UTC = 1, TIME_TYPE_LMT, TIME_TYPE_COMPUTER };
176
177#define DS_SOCKET_ID 5001
178#define DS_SERVERSOCKET_ID 5002
179#define DS_ACTIVESERVERSOCKET_ID 5003
180
181
182#if 0
183// Command identifiers for wxCommandEvents coming from the outside world.
184// Removed from enum to facilitate constant definition
185#define ID_CMD_APPLY_SETTINGS 300
186#define ID_CMD_NULL_REFRESH 301
187#define ID_CMD_TRIGGER_RESIZE 302
188#define ID_CMD_SETVP 303
189#define ID_CMD_POST_JSON_TO_PLUGINS 304
190#define ID_CMD_SET_LOCALE 305
191#define ID_CMD_SOUND_FINISHED 306
192
193#define N_STATUS_BAR_FIELDS_MAX 20
194
195#ifdef __OCPN__ANDROID__
196#define STAT_FIELD_COUNT 2
197#define STAT_FIELD_TICK -1
198#define STAT_FIELD_SOGCOG 0
199#define STAT_FIELD_CURSOR_LL -1
200#define STAT_FIELD_CURSOR_BRGRNG -1
201#define STAT_FIELD_SCALE 1
202#else
203#define STAT_FIELD_COUNT 5
204#define STAT_FIELD_TICK 0
205#define STAT_FIELD_SOGCOG 1
206#define STAT_FIELD_CURSOR_LL 2
207#define STAT_FIELD_CURSOR_BRGRNG 3
208#define STAT_FIELD_SCALE 4
209#endif
210
211// Define a constant GPS signal watchdog timeout value
212#define GPS_TIMEOUT_SECONDS 6
213
214// Define a timer value for Tide/Current updates
215// Note that the underlying data algorithms produce fresh data only every 15
216// minutes So maybe 5 minute updates should provide sufficient oversampling
217#define TIMER_TC_VALUE_SECONDS 300
218
219#define MAX_COG_AVERAGE_SECONDS 60
220#define MAX_COGSOG_FILTER_SECONDS 60
221//----------------------------------------------------------------------------
222// fwd class declarations
223//----------------------------------------------------------------------------
224class ChartBase;
225class wxSocketEvent;
227class OCPN_DataStreamEvent;
228class OCPN_SignalKEvent;
229class DataStream;
230class AisTargetData;
231
232bool isSingleChart(ChartBase *chart);
233
234#if 0
235// A class to contain NMEA messages, their receipt time, and their source
236// priority
237class NMEA_Msg_Container {
238public:
239 wxDateTime receipt_time;
240 int current_priority;
241 wxString stream_name;
242};
243#endif
244
245class OCPN_ThreadMessageEvent : public wxEvent {
246public:
247 OCPN_ThreadMessageEvent(wxEventType commandType = wxEVT_NULL, int id = 0);
249
250 // accessors
251 void SetSString(std::string string) { m_string = string; }
252 std::string GetSString() { return m_string; }
253
254 // required for sending with wxPostEvent()
255 wxEvent *Clone() const;
256
257private:
258 std::string m_string;
259};
260
261class MyApp : public wxApp {
262public:
263 bool OnInit();
264 int OnExit();
265 void OnInitCmdLine(wxCmdLineParser &parser);
266 bool OnCmdLineParsed(wxCmdLineParser &parser);
267 void OnActivateApp(wxActivateEvent &event);
268
269#ifdef LINUX_CRASHRPT
271 void OnFatalException();
272#endif
273
274#ifdef __WXMSW__
275 // Catch malloc/new fail exceptions
276 // All the rest will be caught be CrashRpt
277 bool OnExceptionInMainLoop();
278#endif
279
280 Track* TrackOff(void);
281
282 wxSingleInstanceChecker *m_checker;
283
284 DECLARE_EVENT_TABLE()
285};
286
287#if 0
288class MyFrame : public wxFrame {
289 friend class SignalKEventHandler;
290
291public:
292 MyFrame(wxFrame *frame, const wxString &title, const wxPoint &pos,
293 const wxSize &size, long style);
294
295 ~MyFrame();
296
297 int GetApplicationMemoryUse(void);
298
299 void OnEraseBackground(wxEraseEvent &event);
300 void OnMaximize(wxMaximizeEvent &event);
301 void OnCloseWindow(wxCloseEvent &event);
302 void OnExit(wxCommandEvent &event);
303 void OnSize(wxSizeEvent &event);
304 void OnMove(wxMoveEvent &event);
305 void OnInitTimer(wxTimerEvent &event);
306 void OnFrameTimer1(wxTimerEvent &event);
307 bool DoChartUpdate(void);
308 void OnEvtTHREADMSG(OCPN_ThreadMessageEvent &event);
309 void OnEvtOCPN_NMEA(OCPN_DataStreamEvent &event);
310 void OnEvtOCPN_SignalK(OCPN_SignalKEvent &event);
311 void OnEvtOCPN_SIGNALK_Test(OCPN_SignalKEvent &event);
312 void OnEvtPlugInMessage(OCPN_MsgEvent &event);
313 void OnMemFootTimer(wxTimerEvent &event);
314 void OnRecaptureTimer(wxTimerEvent &event);
315 void OnSENCEvtThread(OCPN_BUILDSENC_ThreadEvent &event);
316 void OnIconize(wxIconizeEvent &event);
317 void OnBellsFinished(wxCommandEvent &event);
318
319#ifdef wxHAS_POWER_EVENTS
320 void OnSuspending(wxPowerEvent &event);
321 void OnSuspended(wxPowerEvent &event);
322 void OnSuspendCancel(wxPowerEvent &event);
323 void OnResume(wxPowerEvent &event);
324#endif // wxHAS_POWER_EVENTS
325
326 void RefreshCanvasOther(ChartCanvas *ccThis);
327 void UpdateAllFonts(void);
328 void PositionConsole(void);
329 void OnToolLeftClick(wxCommandEvent &event);
330 void ClearRouteTool();
331 void DoStackUp(ChartCanvas *cc);
332 void DoStackDown(ChartCanvas *cc);
333 void selectChartDisplay(int type, int family);
334 void applySettingsString(wxString settings);
335 void setStringVP(wxString VPS);
336 void InvalidateAllGL();
337 void RefreshAllCanvas(bool bErase = true);
338 void CancelAllMouseRoute();
339 void InvalidateAllQuilts();
340
341 void SetUpMode(ChartCanvas *cc, int mode);
342
343 wxMenuBar *GetMainMenuBar() { return m_pMenuBar; }
344
345 ChartCanvas *GetPrimaryCanvas();
346 ChartCanvas *GetFocusCanvas();
347
348 void DoStackDelta(ChartCanvas *cc, int direction);
349 void DoSettings(void);
350 void SwitchKBFocus(ChartCanvas *pCanvas);
351 ChartCanvas *GetCanvasUnderMouse();
352 int GetCanvasIndexUnderMouse();
353
354 bool DropMarker(bool atOwnShip = true);
355
356 void TriggerResize(wxSize sz);
357 void OnResizeTimer(wxTimerEvent &event);
358
359 void TriggerRecaptureTimer();
360 bool SetGlobalToolbarViz(bool viz);
361
362 void MouseEvent(wxMouseEvent &event);
363 // void SelectChartFromStack(int index, bool bDir = false, ChartTypeEnum
364 // New_Type = CHART_TYPE_DONTCARE, ChartFamilyEnum New_Family =
365 // CHART_FAMILY_DONTCARE); void SelectdbChart(int dbindex); void
366 // SelectQuiltRefChart(int selected_index); void SelectQuiltRefdbChart(int
367 // db_index, bool b_autoscale = true);
368 void CenterView(ChartCanvas *cc, const LLBBox &bbox);
369
370 void JumpToPosition(ChartCanvas *cc, double lat, double lon, double scale);
371
372 void ProcessCanvasResize(void);
373
374 void BuildMenuBar(void);
375 void ApplyGlobalSettings(bool bnewtoolbar);
376 void RegisterGlobalMenuItems();
377 void UpdateGlobalMenuItems();
378 void UpdateGlobalMenuItems(ChartCanvas *cc);
379 int DoOptionsDialog();
380 bool ProcessOptionsDialog(int resultFlags, ArrayOfCDI *pNewDirArray);
381 void DoPrint(void);
382 void StopSockets(void);
383 void ResumeSockets(void);
384 void ToggleDataQuality(ChartCanvas *cc);
385 void TogglebFollow(ChartCanvas *cc);
386 void ToggleFullScreen();
387 void ToggleChartBar(ChartCanvas *cc);
388 void SetbFollow(ChartCanvas *cc);
389 void ClearbFollow(ChartCanvas *cc);
390 void ToggleChartOutlines(ChartCanvas *cc);
391 void ToggleENCText(ChartCanvas *cc);
392 void ToggleSoundings(ChartCanvas *cc);
393 void ToggleRocks(void);
394 bool ToggleLights(ChartCanvas *cc);
395 void ToggleAnchor(ChartCanvas *cc);
396 void ToggleAISDisplay(ChartCanvas *cc);
397 void ToggleAISMinimizeTargets(ChartCanvas *cc);
398
399 void ToggleTestPause(void);
400 void TrackOn(void);
401 void SetENCDisplayCategory(ChartCanvas *cc, enum _DisCat nset);
402 void ToggleNavobjects(ChartCanvas *cc);
403
404 Track *TrackOff(bool do_add_point = false);
405 void TrackDailyRestart(void);
406 bool ShouldRestartTrack();
407 void ToggleColorScheme();
408 void SetMenubarItemState(int item_id, bool state);
409 void SetMasterToolbarItemState(int tool_id, bool state);
410
411 void SetToolbarItemBitmaps(int tool_id, wxBitmap *bitmap,
412 wxBitmap *bmpDisabled);
413 void SetToolbarItemSVG(int tool_id, wxString normalSVGfile,
414 wxString rolloverSVGfile, wxString toggledSVGfile);
415 void ToggleQuiltMode(ChartCanvas *cc);
416 void UpdateControlBar(ChartCanvas *cc);
417
418 void ShowTides(bool bShow);
419 void ShowCurrents(bool bShow);
420
421 void SubmergeAllCanvasToolbars(void);
422 void SurfaceAllCanvasToolbars(void);
423 void ToggleAllToolbars(bool b_smooth = false);
424 void SetAllToolbarScale(void);
425 void SetGPSCompassScale(void);
426 void InvalidateAllCanvasUndo();
427
428 void RefreshGroupIndices(void);
429
430 double GetBestVPScale(ChartBase *pchart);
431
432 ColorScheme GetColorScheme();
433 void SetAndApplyColorScheme(ColorScheme cs);
434
435 void OnFrameTCTimer(wxTimerEvent &event);
436 void OnFrameCOGTimer(wxTimerEvent &event);
437
438 void ChartsRefresh();
439
440 bool CheckGroup(int igroup);
441 double GetMag(double a);
442 double GetMag(double a, double lat, double lon);
443 bool SendJSON_WMM_Var_Request(double lat, double lon, wxDateTime date);
444
445 void DestroyPersistentDialogs();
446 void TouchAISActive(void);
447 void UpdateAISTool(void);
448
449 void ActivateAISMOBRoute(AisTargetData *ptarget);
450 void UpdateAISMOBRoute(AisTargetData *ptarget);
451
452 wxStatusBar *m_pStatusBar;
453 wxMenuBar *m_pMenuBar;
454 int nBlinkerTick;
455 bool m_bTimeIsSet;
456 bool m_bDateIsSet;
457
458 wxTimer InitTimer;
459 int m_iInitCount;
460 bool m_initializing;
461
462 wxTimer FrameTCTimer;
463 wxTimer FrameTimer1;
464 wxTimer FrameCOGTimer;
465 wxTimer MemFootTimer;
466 wxTimer m_resizeTimer;
467
468 int m_BellsToPlay;
469 wxTimer BellsTimer;
470
471 // PlugIn support
472 int GetNextToolbarToolId() { return m_next_available_plugin_tool_id; }
473 void RequestNewToolbarArgEvent(wxCommandEvent &WXUNUSED(event)) {
474 return RequestNewMasterToolbar();
475 }
476 void RequestNewToolbars(bool bforcenew = false);
477
478 void ActivateMOB(void);
479 void UpdateGPSCompassStatusBoxes(bool b_force_new = false);
480 void UpdateRotationState(double rotation);
481
482 bool UpdateChartDatabaseInplace(ArrayOfCDI &DirArray, bool b_force,
483 bool b_prog,
484 const wxString &ChartListFileName);
485
486 bool m_bdefer_resize;
487 wxSize m_defer_size;
488 wxSize m_newsize;
489 double COGTable[MAX_COG_AVERAGE_SECONDS];
490
491 void FastClose();
492 void SetChartUpdatePeriod();
493 void CreateCanvasLayout(bool b_useStoredSize = false);
494 void LoadHarmonics();
495 void ReloadAllVP();
496 void SetCanvasSizes(wxSize frameSize);
497
498 ocpnToolBarSimple *CreateMasterToolbar();
499 void RequestNewMasterToolbar(bool bforcenew = true);
500 bool CheckAndAddPlugInTool();
501 bool AddDefaultPositionPlugInTools();
502
503 void NotifyChildrenResize(void);
504 void UpdateCanvasConfigDescriptors();
505 void ScheduleSettingsDialog();
506 static void RebuildChartDatabase();
507 void PositionIENCToolbar();
508
509 bool ParsePosition(const LATLONG &Position);
510 void setSatelitesInView(int no);
511 void setPosition(double lat, double lon);
512 void setSpeedOverGround(double sog);
513 void setCourseOverGround(double cog);
514 void setHeadingTrue(double heading);
515 void setHeadingMagnetic(double heading);
516 void setMagneticVariation(double var);
517
518 void InitCommListeners();
519
520 bool HandleN2K_129029( std::shared_ptr <const Nmea2000Msg> n2k_msg );
521 bool HandleN2K_129026( std::shared_ptr <const Nmea2000Msg> n2k_msg );
522
523 bool HandleN0183_RMC( std::shared_ptr <const Nmea0183Msg> n0183_msg );
524 bool HandleN0183_HDT( std::shared_ptr <const Nmea0183Msg> n0183_msg );
525 bool HandleN0183_HDG( std::shared_ptr <const Nmea0183Msg> n0183_msg );
526 bool HandleN0183_HDM( std::shared_ptr <const Nmea0183Msg> n0183_msg );
527 bool HandleN0183_VTG( std::shared_ptr <const Nmea0183Msg> n0183_msg );
528 bool HandleN0183_GSV( std::shared_ptr <const Nmea0183Msg> n0183_msg );
529 bool HandleN0183_GGA( std::shared_ptr <const Nmea0183Msg> n0183_msg );
530 bool HandleN0183_GLL( std::shared_ptr <const Nmea0183Msg> n0183_msg );
531 bool HandleN0183_AIVDO( std::shared_ptr <const Nmea0183Msg> n0183_msg );
532
533private:
534 void CheckToolbarPosition();
535 void ODoSetSize(void);
536 void DoCOGSet(void);
537
538 void UpdateAllToolbars(ColorScheme cs);
539
540 void FilterCogSog(void);
541
542 void ApplyGlobalColorSchemetoStatusBar(void);
543 void PostProcessNMEA(bool pos_valid, bool sog_valid,
544 bool cog_valid, const wxString &sfixtime);
545
546 bool ScrubGroupArray();
547 wxString GetGroupName(int igroup);
548
549 bool EvalPriority(const wxString &message, DataStream *pDS);
550 void SetAISDisplayStyle(ChartCanvas *cc, int StyleIndx);
551
552 bool GetMasterToolItemShow(int toolid);
553 void OnToolbarAnimateTimer(wxTimerEvent &event);
554 bool CollapseGlobalToolbar();
555
556 int m_StatusBarFieldCount;
557
558 NMEA0183 m_NMEA0183; // Used to parse messages from NMEA threads
559
560 wxDateTime m_MMEAeventTime;
561 unsigned long m_ulLastNMEATicktime;
562
563 wxMutex m_mutexNMEAEvent; // Mutex to handle static data from NMEA threads
564
565 wxString m_last_reported_chart_name;
566 wxString m_last_reported_chart_pubdate;
567
568 wxString m_lastAISiconName;
569
570 // Plugin Support
571 int m_next_available_plugin_tool_id;
572
573 double COGFilterTable[MAX_COGSOG_FILTER_SECONDS];
574 double SOGFilterTable[MAX_COGSOG_FILTER_SECONDS];
575
576 bool m_bpersistent_quilt;
577 int m_ChartUpdatePeriod;
578 bool m_last_bGPSValid;
579
580 wxString prev_locale;
581 bool bPrevQuilt;
582 bool bPrevFullScreenQuilt;
583 bool bPrevOGL;
584
585 MsgPriorityHash NMEA_Msg_Hash;
586 wxString m_VDO_accumulator;
587
588 time_t m_fixtime;
589 wxMenu *piano_ctx_menu;
590 bool b_autofind;
591
592 time_t m_last_track_rotation_ts;
593 wxRect m_mainlast_tb_rect;
594 wxTimer ToolbarAnimateTimer;
595 int m_nMasterToolCountShown;
596 wxTimer m_recaptureTimer;
597
598 SignalKEventHandler m_signalKHandler;
599
600 // comm event listeners
601 ObservableListener listener_N2K_129029;
602 ObservableListener listener_N2K_129026;
603
604 ObservableListener listener_N0183_RMC;
605 ObservableListener listener_N0183_HDT;
606 ObservableListener listener_N0183_HDG;
607 ObservableListener listener_N0183_HDM;
608 ObservableListener listener_N0183_VTG;
609 ObservableListener listener_N0183_GSV;
610 ObservableListener listener_N0183_GGA;
611 ObservableListener listener_N0183_GLL;
612 ObservableListener listener_N0183_AIVDO;
613
614 DECLARE_EVENT_TABLE()
615};
616
617#endif // 0
618
619#endif
620
621#endif // _IDENTS_H__
Definition: ocpn_app.h:44
void OnFrameTimer1(wxTimerEvent &event)
void SurfaceAllCanvasToolbars(void)
Keeps listening over it's lifespan, removes itself on destruction.
Definition: observable.h:143
GNSS Lat/Long container.
Definition: comm_appmsg.h:45
Definition: track.h:79
Definition: Quilt.cpp:864