index.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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.8.18"/>
  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.8.18 -->
  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');
  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 <a class="el" href="class_a_database.html" title="The DB class encapsulates the SQL database by providing fast access to hot database data.">ADatabase</a> Class, which is responsible for managing the database connection and creating and executing queries. Data is retreived from the database in form of <a class="el" href="class_a_entry.html" title="The Entry class encapsulates table metadata(table name, row id) and data for new and existing entries...">AEntry</a> objects. The <a class="el" href="class_a_entry.html" title="The Entry class encapsulates table metadata(table name, row id) and data for new and existing entries...">AEntry</a> 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">NewFlightDialog</a>, <a class="el" href="class_new_pilot_dialog.html">NewPilotDialog</a>, <a class="el" href="class_new_tail_dialog.html" title="The NewTail class is a dialog for adding a new tail to the database or editing an existing one.">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 <a class="el" href="class_a_entry.html" title="The Entry class encapsulates table metadata(table name, row id) and data for new and existing entries...">AEntry</a> objects, which are read and written to and from the database via the <a class="el" href="class_a_database.html" title="The DB class encapsulates the SQL database by providing fast access to hot database data.">ADatabase</a> 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 QMap 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
  132. <a href="http://www.doxygen.org/index.html">
  133. <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.18 </li>
  134. </ul>
  135. </div>
  136. </body>
  137. </html>