123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
- <meta http-equiv="X-UA-Compatible" content="IE=9"/>
- <meta name="generator" content="Doxygen 1.9.1"/>
- <meta name="viewport" content="width=device-width, initial-scale=1"/>
- <title>openPilotLog: Project Overview</title>
- <link href="tabs.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript" src="jquery.js"></script>
- <script type="text/javascript" src="dynsections.js"></script>
- <link href="navtree.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript" src="resize.js"></script>
- <script type="text/javascript" src="navtreedata.js"></script>
- <script type="text/javascript" src="navtree.js"></script>
- <link href="search/search.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript" src="search/searchdata.js"></script>
- <script type="text/javascript" src="search/search.js"></script>
- <link href="doxygen.css" rel="stylesheet" type="text/css" />
- <link href="custom_dark_theme.css" rel="stylesheet" type="text/css"/>
- </head>
- <body>
- <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
- <div id="titlearea">
- <table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
- <td id="projectlogo"><img alt="Logo" src="icon_main.png"/></td>
- <td id="projectalign" style="padding-left: 0.5em;">
- <div id="projectname">openPilotLog
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- </div>
- <!-- end header part -->
- <!-- Generated by Doxygen 1.9.1 -->
- <script type="text/javascript">
- /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
- var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
- /* @license-end */
- </script>
- <script type="text/javascript" src="menudata.js"></script>
- <script type="text/javascript" src="menu.js"></script>
- <script type="text/javascript">
- /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
- $(function() {
- initMenu('',true,false,'search.php','Search');
- $(document).ready(function() { init_search(); });
- });
- /* @license-end */</script>
- <div id="main-nav"></div>
- </div><!-- top -->
- <div id="side-nav" class="ui-resizable side-nav-resizable">
- <div id="nav-tree">
- <div id="nav-tree-contents">
- <div id="nav-sync" class="sync"></div>
- </div>
- </div>
- <div id="splitbar" style="-moz-user-select:none;"
- class="ui-resizable-handle">
- </div>
- </div>
- <script type="text/javascript">
- /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
- $(document).ready(function(){initNavTree('index.html',''); initResizable(); });
- /* @license-end */
- </script>
- <div id="doc-content">
- <!-- window showing the filter options -->
- <div id="MSearchSelectWindow"
- onmouseover="return searchBox.OnSearchSelectShow()"
- onmouseout="return searchBox.OnSearchSelectHide()"
- onkeydown="return searchBox.OnSearchSelectKey(event)">
- </div>
- <!-- iframe showing the search results (closed by default) -->
- <div id="MSearchResultsWindow">
- <iframe src="javascript:void(0)" frameborder="0"
- name="MSearchResults" id="MSearchResults">
- </iframe>
- </div>
- <div class="PageDoc"><div class="header">
- <div class="headertitle">
- <div class="title">Project Overview </div> </div>
- </div><!--header-->
- <div class="contents">
- <div class="textblock"><p><a class="anchor" id="mainpage"></a></p>
- <h1><a class="anchor" id="autotoc_md0"></a>
- Technical Overview</h1>
- <ul>
- <li>Framework: Qt5 (C++)</li>
- <li>Database: sqlite3</li>
- </ul>
- <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>
- <ul>
- <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>
- <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>
- <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>
- <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>
- <li>This is an open source project. Feel free to copy, modify or distritbute it under the GPL v3.</li>
- </ul>
- <h1><a class="anchor" id="autotoc_md1"></a>
- Compiling the project</h1>
- <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 cmake.</p>
- <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>
- <h2><a class="anchor" id="autotoc_md2"></a>
- Known issues</h2>
- <ul>
- <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>
- <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>
- </ul>
- <h1><a class="anchor" id="autotoc_md3"></a>
- Implementation Overview</h1>
- <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>
- <p>Access to the database is provided by the <a class="el" href="class_o_p_l_1_1_database.html" title="The DB class encapsulates the SQL database by providing fast access to hot database data.">OPL::Database</a> Class, which is responsible for managing the database connection and creating and executing queries. Data is retreived from the database in form of Row objects. The <a class="el" href="class_o_p_l_1_1_row.html" title="The Row class provides an interface for retreiving and submitting entries from the database.">OPL::Row</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/qhash.html">QQHash<QVariant, QVariant></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>
- <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>
- <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_o_p_l_1_1_row.html" title="The Row class provides an interface for retreiving and submitting entries from the database.">OPL::Row</a> objects, which are read and written to and from the database via the <a class="el" href="class_o_p_l_1_1_database.html" title="The DB class encapsulates the SQL database by providing fast access to hot database data.">OPL::Database</a> class.</p>
- <h1><a class="anchor" id="autotoc_md4"></a>
- Settings</h1>
- <p><a class="el" href="class_settings.html" title="Thin wrapper for the QSettings class, simplifying reading and writing of settings.">Settings</a> are stored in a <code>.ini</code> file at a standardized location. The <a class="el" href="class_settings.html" title="Thin wrapper for the QSettings class, simplifying reading and writing of settings.">Settings</a> widget enables the user to adjust various settings, which are stored and accessed via the <a class="el" href="class_settings.html" title="Thin wrapper for the QSettings class, simplifying reading and writing of settings.">Settings</a> class, based on the <a href="https://doc.qt.io/qt-5/qsettings.html">QSettings</a> interface.</p>
- <h1><a class="anchor" id="autotoc_md5"></a>
- Import / Export</h1>
- <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>
- </div></div><!-- PageDoc -->
- </div><!-- contents -->
- </div><!-- doc-content -->
- <!-- start footer part -->
- <div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
- <ul>
- <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>
- </ul>
- </div>
- </body>
- </html>
|