2
0

index.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
  5. <meta http-equiv="X-UA-Compatible" content="IE=9"/>
  6. <meta name="generator" content="Doxygen 1.9.1"/>
  7. <meta name="viewport" content="width=device-width, initial-scale=1"/>
  8. <title>openPilotLog: Project Overview</title>
  9. <link href="tabs.css" rel="stylesheet" type="text/css"/>
  10. <script type="text/javascript" src="jquery.js"></script>
  11. <script type="text/javascript" src="dynsections.js"></script>
  12. <link href="navtree.css" rel="stylesheet" type="text/css"/>
  13. <script type="text/javascript" src="resize.js"></script>
  14. <script type="text/javascript" src="navtreedata.js"></script>
  15. <script type="text/javascript" src="navtree.js"></script>
  16. <link href="search/search.css" rel="stylesheet" type="text/css"/>
  17. <script type="text/javascript" src="search/searchdata.js"></script>
  18. <script type="text/javascript" src="search/search.js"></script>
  19. <link href="doxygen.css" rel="stylesheet" type="text/css" />
  20. <link href="custom_dark_theme.css" rel="stylesheet" type="text/css"/>
  21. </head>
  22. <body>
  23. <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  24. <div id="titlearea">
  25. <table cellspacing="0" cellpadding="0">
  26. <tbody>
  27. <tr style="height: 56px;">
  28. <td id="projectlogo"><img alt="Logo" src="icon_main.png"/></td>
  29. <td id="projectalign" style="padding-left: 0.5em;">
  30. <div id="projectname">openPilotLog
  31. </div>
  32. </td>
  33. </tr>
  34. </tbody>
  35. </table>
  36. </div>
  37. <!-- end header part -->
  38. <!-- Generated by Doxygen 1.9.1 -->
  39. <script type="text/javascript">
  40. /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  41. var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
  42. /* @license-end */
  43. </script>
  44. <script type="text/javascript" src="menudata.js"></script>
  45. <script type="text/javascript" src="menu.js"></script>
  46. <script type="text/javascript">
  47. /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  48. $(function() {
  49. initMenu('',true,false,'search.php','Search');
  50. $(document).ready(function() { init_search(); });
  51. });
  52. /* @license-end */</script>
  53. <div id="main-nav"></div>
  54. </div><!-- top -->
  55. <div id="side-nav" class="ui-resizable side-nav-resizable">
  56. <div id="nav-tree">
  57. <div id="nav-tree-contents">
  58. <div id="nav-sync" class="sync"></div>
  59. </div>
  60. </div>
  61. <div id="splitbar" style="-moz-user-select:none;"
  62. class="ui-resizable-handle">
  63. </div>
  64. </div>
  65. <script type="text/javascript">
  66. /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  67. $(document).ready(function(){initNavTree('index.html',''); initResizable(); });
  68. /* @license-end */
  69. </script>
  70. <div id="doc-content">
  71. <!-- window showing the filter options -->
  72. <div id="MSearchSelectWindow"
  73. onmouseover="return searchBox.OnSearchSelectShow()"
  74. onmouseout="return searchBox.OnSearchSelectHide()"
  75. onkeydown="return searchBox.OnSearchSelectKey(event)">
  76. </div>
  77. <!-- iframe showing the search results (closed by default) -->
  78. <div id="MSearchResultsWindow">
  79. <iframe src="javascript:void(0)" frameborder="0"
  80. name="MSearchResults" id="MSearchResults">
  81. </iframe>
  82. </div>
  83. <div class="PageDoc"><div class="header">
  84. <div class="headertitle">
  85. <div class="title">Project Overview </div> </div>
  86. </div><!--header-->
  87. <div class="contents">
  88. <div class="textblock"><p><a class="anchor" id="mainpage"></a></p>
  89. <h1><a class="anchor" id="autotoc_md0"></a>
  90. Technical Overview</h1>
  91. <ul>
  92. <li>Framework: Qt5 (C++)</li>
  93. <li>Database: sqlite3</li>
  94. </ul>
  95. <p>This program is suppposed to replace a paper logbook with an electronic version. As a first step, I want to focus on the basics, and then add 'nice-to-haves' later. These are the guidelines for this project:</p>
  96. <ul>
  97. <li>Speed: openPilotLog is supposed to be fast, lean and efficient. I have settled on using the Qt framework for the gui and code, as well as sqlite for the database.</li>
  98. <li>Cross-Platform Support: Linux, Windows and Mac (and maybe down the road iOS/Android) should be supported. Qt provides this cross-platform compatibility.</li>
  99. <li>Local: At the moment, I am not planning on implementing a cloud-sync solution. The database is local, on your machine, and moving it around should be as easy as copying it onto a USB stick. While I am not opposed to cloud syncing functionality, I want the application to be independent of external services.</li>
  100. <li>Free: This application is and always will be free to use, distribute and modify. I have used commercial solutions before and have been disappointed when a 'lifetime' license expired because the company needs to support their development and cloud infrastructure. That's fair enough, but I believe keeping a logbook of your flights is not rocket science and you should not have to pay a monthly subscription for that.</li>
  101. <li>This is an open source project. Feel free to copy, modify or distritbute it under the GPL v3.</li>
  102. </ul>
  103. <h1><a class="anchor" id="autotoc_md1"></a>
  104. Compiling the project</h1>
  105. <p>The most straight forward way is to get a copy of <a href="https://www.qt.io/download">Qt</a> and compile the project using either cmake or QtCreator and qmake. The <code>CMakeList.txt</code> and <code>.pro</code> files are included in the repository. CMake is recommended and will be the standard going forward.</p>
  106. <p>On first launch, you will run through a setup wizard for the database. If you want to test the program with a sample database, use the <code>Backup</code> functionality. Select <code>Restore external backup</code> from the GUI and import the file <code>logbook.db</code> from the assets folder in the repository.</p>
  107. <h2><a class="anchor" id="autotoc_md2"></a>
  108. Known issues</h2>
  109. <ul>
  110. <li>The setup wizard for the database requires openSSL to download the most recent data. In order for this to work on Windows, you need to place the <a href="https://wiki.openssl.org/index.php/Binaries">openSSL dll's</a> in the application directory. On Linux, this is normally not an issue. If you are running into problems there, try installing the <code>openssl-dev</code> package or similar from your distribution's package manager.</li>
  111. <li>When compiling with CMake, instead of updating the translations, there is a bug that might instead delete them. See <a href="https://bugreports.qt.io/browse/QTBUG-41736">here</a> and <a href="https://bugreports.qt.io/browse/QTBUG-76410">here</a>. Long story short, make sure to use a version of CMake that is 3.16 or earlier, or 3.19.2 or later if you want to use localisations other than English (once they're implemented).</li>
  112. </ul>
  113. <h1><a class="anchor" id="autotoc_md3"></a>
  114. Implementation Overview</h1>
  115. <p>Keeping a logbook of flights is a quintessential database task. This program could thus be seen as a user-friendly front-end to a database. The database is a sqlite3-Database, which is described in detail on the <a href="https://github.com/fiffty-50/openpilotlog/wiki/Database-Layout-and-Description">Database</a> Wiki Page.</p>
  116. <p>Access to the database is provided by the ADatabase Class, which is responsible for managing the database connection and creating and executing queries. Data is retreived from the database in form of AEntry objects. The AEntry class and its subclasses represent 'lines' in a database table. Internally, they are structs holding a <a href="https://doc.qt.io/qt-5/qmap.html">QMap&lt;QVariant, QVariant&gt;</a> with the key being the column name and the value its value. These Objects are then parsed by the different widgets and dialogues to read or write user-provided data.</p>
  117. <p>The database contents are displayed to the user in the different widgets. <b>Flights</b> are displayed in the <a class="el" href="class_logbook_widget.html" title="The LogbookWidget displays data from the database in a QSqlTableView fed by a QSqlQuery Model.">LogbookWidget</a>, <b>Pilots</b> in the <a class="el" href="class_pilots_widget.html" title="The PilotsWidget is used to view, edit, delete or add new pilots.">PilotsWidget</a> and <b>Aircraft</b> in the <a class="el" href="class_aircraft_widget.html" title="The AircraftWidget is used to view, edit, delete or add new tails.">AircraftWidget</a>. These widgets also give convenient access to the Dialogues (<a class="el" href="class_new_flight_dialog.html" title="The NewFlightDialog is used to add or edit entries from the flights table in the database.">NewFlightDialog</a>, <a class="el" href="class_new_pilot_dialog.html" title="The NewPilotDialog enables adding new entries to the pilot table in the database.">NewPilotDialog</a>, <a class="el" href="class_new_tail_dialog.html" title="The NewTailDialog enables adding new Tail entries to the database or editing existing ones.">NewTailDialog</a>), enabling editing, adding or removing entries of their respective categories.</p>
  118. <p>Widget class Elements of the User Interface dispay data from the database in a <a href="https://doc.qt.io/qt-5/qtableview.html">QTableView</a> with a <a href="https://doc.qt.io/qt-5.12/qsqlquerymodel.html">QSqlQueryModel</a>. Dialog class UI Elements receive and return AEntry objects, which are read and written to and from the database via the ADatabase class.</p>
  119. <h1><a class="anchor" id="autotoc_md4"></a>
  120. Settings</h1>
  121. <p>The <a class="el" href="class_a_standard_paths.html" title="The AStandardAppPaths class encapsulates a static QHash holding the standard paths of the application...">AStandardPaths</a> class is responsible for creating cross-platform compatible directory structures based on <a href="https://doc.qt.io/qt-5/qstandardpaths.html">QStandardPaths</a>. Settings are stored in a <code>.ini</code> file at a standardized location. The Settings widget enables the user to adjust various settings, which are stored and accessed via the <a class="el" href="class_a_settings.html" title="Thin wrapper for the QSettings class, simplifying reading and writing of settings.">ASettings</a> class, based on the <a href="https://doc.qt.io/qt-5/qsettings.html">QSettings</a> interface.</p>
  122. <h1><a class="anchor" id="autotoc_md5"></a>
  123. Import / Export</h1>
  124. <p>The <a class="el" href="class_backup_widget.html" title="The BackupWidget is the interface for the user to create and restore backups of the database.">BackupWidget</a> enables creating and restoring backup copies of the database. </p>
  125. </div></div><!-- PageDoc -->
  126. </div><!-- contents -->
  127. </div><!-- doc-content -->
  128. <!-- start footer part -->
  129. <div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  130. <ul>
  131. <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </li>
  132. </ul>
  133. </div>
  134. </body>
  135. </html>