diff options
Diffstat (limited to 'examples/embedded/flightinfo')
-rw-r--r-- | examples/embedded/flightinfo/.prev_CMakeLists.txt | 47 | ||||
-rw-r--r-- | examples/embedded/flightinfo/CMakeLists.txt | 51 | ||||
-rw-r--r-- | examples/embedded/flightinfo/aircraft.png | bin | 20200 -> 0 bytes | |||
-rw-r--r-- | examples/embedded/flightinfo/flightinfo.cpp | 401 | ||||
-rw-r--r-- | examples/embedded/flightinfo/flightinfo.pro | 9 | ||||
-rw-r--r-- | examples/embedded/flightinfo/flightinfo.qrc | 5 | ||||
-rw-r--r-- | examples/embedded/flightinfo/form.ui | 226 |
7 files changed, 0 insertions, 739 deletions
diff --git a/examples/embedded/flightinfo/.prev_CMakeLists.txt b/examples/embedded/flightinfo/.prev_CMakeLists.txt deleted file mode 100644 index f7898e8ed8..0000000000 --- a/examples/embedded/flightinfo/.prev_CMakeLists.txt +++ /dev/null @@ -1,47 +0,0 @@ -# Generated from flightinfo.pro. - -cmake_minimum_required(VERSION 3.14) -project(flightinfo LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -set(INSTALL_EXAMPLEDIR "examples/embedded/flightinfo") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Network) -find_package(Qt6 COMPONENTS Widgets) - -add_qt_gui_executable(flightinfo - flightinfo.cpp - form.ui -) -target_link_libraries(flightinfo PUBLIC - Qt::Core - Qt::Gui - Qt::Network - Qt::Widgets -) - - -# Resources: -set(flightinfo_resource_files - "aircraft.png" -) - -qt6_add_resources(flightinfo "flightinfo" - PREFIX - "/" - FILES - ${flightinfo_resource_files} -) - -install(TARGETS flightinfo - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/embedded/flightinfo/CMakeLists.txt b/examples/embedded/flightinfo/CMakeLists.txt deleted file mode 100644 index 4daf7d86c7..0000000000 --- a/examples/embedded/flightinfo/CMakeLists.txt +++ /dev/null @@ -1,51 +0,0 @@ -# Generated from flightinfo.pro. - -cmake_minimum_required(VERSION 3.14) -project(flightinfo LANGUAGES CXX) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/embedded/flightinfo") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Network) -find_package(Qt6 COMPONENTS Widgets) - -add_qt_gui_executable(flightinfo - flightinfo.cpp - form.ui -) -target_link_libraries(flightinfo PUBLIC - Qt::Core - Qt::Gui - Qt::Network - Qt::Widgets -) - - -# Resources: -set(flightinfo_resource_files - "aircraft.png" -) - -qt6_add_resources(flightinfo "flightinfo" - PREFIX - "/" - FILES - ${flightinfo_resource_files} -) - -install(TARGETS flightinfo - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/embedded/flightinfo/aircraft.png b/examples/embedded/flightinfo/aircraft.png Binary files differdeleted file mode 100644 index 2312bcc9f0..0000000000 --- a/examples/embedded/flightinfo/aircraft.png +++ /dev/null diff --git a/examples/embedded/flightinfo/flightinfo.cpp b/examples/embedded/flightinfo/flightinfo.cpp deleted file mode 100644 index 0f8dfb5b6a..0000000000 --- a/examples/embedded/flightinfo/flightinfo.cpp +++ /dev/null @@ -1,401 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the demonstration applications of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtCore> -#include <QtWidgets> -#include <QtNetwork> - -#include "ui_form.h" - -#define FLIGHTVIEW_URL "http://mobile.flightview.com/TrackByFlight.aspx" -#define FLIGHTVIEW_RANDOM "http://mobile.flightview.com/TrackSampleFlight.aspx" - -// strips all invalid constructs that might trip QXmlStreamReader -static QString sanitized(const QString &xml) -{ - QString data = xml; - - // anything up to the html tag - int i = data.indexOf("<html"); - if (i > 0) - data.remove(0, i - 1); - - // everything inside the head tag - i = data.indexOf("<head"); - if (i > 0) - data.remove(i, data.indexOf("</head>") - i + 7); - - // invalid link for JavaScript code - while (true) { - i = data.indexOf("onclick=\"gotoUrl("); - if (i < 0) - break; - data.remove(i, data.indexOf('\"', i + 9) - i + 1); - } - - // all inline frames - while (true) { - i = data.indexOf("<iframe"); - if (i < 0) - break; - data.remove(i, data.indexOf("</iframe>") - i + 8); - } - - // entities - data.remove(" "); - data.remove("©"); - - return data; -} - -class FlightInfo : public QMainWindow -{ - Q_OBJECT - -private: - - Ui_Form ui; - QUrl m_url; - QDate m_searchDate; - QPixmap m_map; - QNetworkAccessManager m_manager; - QList<QNetworkReply *> mapReplies; - -public: - - FlightInfo(QMainWindow *parent = 0): QMainWindow(parent) { - - QWidget *w = new QWidget(this); - ui.setupUi(w); - setCentralWidget(w); - - ui.searchBar->hide(); - ui.infoBox->hide(); - connect(ui.searchButton, SIGNAL(clicked()), SLOT(startSearch())); - connect(ui.flightEdit, SIGNAL(returnPressed()), SLOT(startSearch())); - - setWindowTitle("Flight Info"); - - // Rendered from the public-domain vectorized aircraft - // http://openclipart.org/media/people/Jarno - m_map = QPixmap(":/aircraft.png"); - - QAction *searchTodayAction = new QAction("Today's Flight", this); - QAction *searchYesterdayAction = new QAction("Yesterday's Flight", this); - QAction *randomAction = new QAction("Random Flight", this); - connect(searchTodayAction, SIGNAL(triggered()), SLOT(today())); - connect(searchYesterdayAction, SIGNAL(triggered()), SLOT(yesterday())); - connect(randomAction, SIGNAL(triggered()), SLOT(randomFlight())); - connect(&m_manager, SIGNAL(finished(QNetworkReply*)), - this, SLOT(handleNetworkData(QNetworkReply*))); - addAction(searchTodayAction); - addAction(searchYesterdayAction); - addAction(randomAction); - setContextMenuPolicy(Qt::ActionsContextMenu); - } - -private slots: - - void handleNetworkData(QNetworkReply *networkReply) { - if (!networkReply->error()) { - if (!mapReplies.contains(networkReply)) { - // Assume UTF-8 encoded - QByteArray data = networkReply->readAll(); - QString xml = QString::fromUtf8(data); - digest(xml); - } else { - mapReplies.removeOne(networkReply); - m_map.loadFromData(networkReply->readAll()); - update(); - } - } - networkReply->deleteLater(); - } - - void today() { - QDateTime timestamp = QDateTime::currentDateTime(); - m_searchDate = timestamp.date(); - searchFlight(); - } - - void yesterday() { - QDateTime timestamp = QDateTime::currentDateTime(); - timestamp = timestamp.addDays(-1); - m_searchDate = timestamp.date(); - searchFlight(); - } - - void searchFlight() { - ui.searchBar->show(); - ui.infoBox->hide(); - ui.flightStatus->hide(); - ui.flightName->setText("Enter flight number"); - ui.flightEdit->setFocus(); -#ifdef QT_KEYPAD_NAVIGATION - ui.flightEdit->setEditFocus(true); -#endif - m_map = QPixmap(); - update(); - } - - void startSearch() { - ui.searchBar->hide(); - QString flight = ui.flightEdit->text().simplified(); - if (!flight.isEmpty()) - request(flight, m_searchDate); - } - - void randomFlight() { - request(QString(), QDate::currentDate()); - } - -public slots: - - void request(const QString &flightCode, QDate date) { - - setWindowTitle("Loading..."); - - QString code = flightCode.simplified(); - QString airlineCode = code.left(2).toUpper(); - QString flightNumber = code.mid(2, code.length()); - - ui.flightName->setText("Searching for " + code); - - QUrlQuery query; - query.addQueryItem("view", "detail"); - query.addQueryItem("al", airlineCode); - query.addQueryItem("fn", flightNumber); - query.addQueryItem("dpdat", date.toString("yyyyMMdd")); - m_url = QUrl(FLIGHTVIEW_URL); - m_url.setQuery(query); - - if (code.isEmpty()) { - // random flight as sample - m_url = QUrl(FLIGHTVIEW_RANDOM); - ui.flightName->setText("Getting a random flight..."); - } - - m_manager.get(QNetworkRequest(m_url)); - } - - -private: - - void digest(const QString &content) { - - setWindowTitle("Flight Info"); - QString data = sanitized(content); - - // do we only get the flight list? - // we grab the first leg in the flight list - // then fetch another URL for the real flight info - int i = data.indexOf("a href=\"?view=detail"); - if (i > 0) { - QString href = data.mid(i, data.indexOf('\"', i + 8) - i + 1); - QRegularExpression regex("dpap=([A-Za-z0-9]+)"); - QRegularExpressionMatch match = regex.match(href); - QString airport = match.captured(1); - QUrlQuery query(m_url); - query.addQueryItem("dpap", airport); - m_url.setQuery(query); - m_manager.get(QNetworkRequest(m_url)); - return; - } - - QXmlStreamReader xml(data); - bool inFlightName = false; - bool inFlightStatus = false; - bool inFlightMap = false; - bool inFieldName = false; - bool inFieldValue = false; - - QString flightName; - QString flightStatus; - QStringList fieldNames; - QStringList fieldValues; - - while (!xml.atEnd()) { - xml.readNext(); - - if (xml.tokenType() == QXmlStreamReader::StartElement) { - auto className = xml.attributes().value("class"); - inFlightName |= xml.name() == u"h1"; - inFlightStatus |= className == u"FlightDetailHeaderStatus"; - inFlightMap |= className == u"flightMap"; - if (xml.name() == u"td" && !className.isEmpty()) { - if (className.contains(u"fieldTitle")) { - inFieldName = true; - fieldNames += QString(); - fieldValues += QString(); - } - if (className.contains(u"fieldValue")) - inFieldValue = true; - } - if (xml.name() == u"img" && inFlightMap) { - const QByteArray encoded - = ("http://mobile.flightview.com/" % xml.attributes().value("src")).toLatin1(); - QUrl url = QUrl::fromPercentEncoding(encoded); - mapReplies.append(m_manager.get(QNetworkRequest(url))); - } - } - - if (xml.tokenType() == QXmlStreamReader::EndElement) { - inFlightName &= xml.name() != u"h1"; - inFlightStatus &= xml.name() != u"div"; - inFlightMap &= xml.name() != u"div"; - inFieldName &= xml.name() != u"td"; - inFieldValue &= xml.name() != u"td"; - } - - if (xml.tokenType() == QXmlStreamReader::Characters) { - if (inFlightName) - flightName += xml.text(); - if (inFlightStatus) - flightStatus += xml.text(); - if (inFieldName) - fieldNames.last() += xml.text(); - if (inFieldValue) - fieldValues.last() += xml.text(); - } - } - - if (fieldNames.isEmpty()) { - QString code = ui.flightEdit->text().simplified().left(10); - QString msg = QString("Flight %1 is not found").arg(code); - ui.flightName->setText(msg); - return; - } - - ui.flightName->setText(flightName); - flightStatus.remove("Status: "); - ui.flightStatus->setText(flightStatus); - ui.flightStatus->show(); - - QStringList whiteList; - whiteList << "Departure"; - whiteList << "Arrival"; - whiteList << "Scheduled"; - whiteList << "Takeoff"; - whiteList << "Estimated"; - whiteList << "Term-Gate"; - - QString text; - text = QString("<table width=%1>").arg(width() - 25); - for (int i = 0; i < fieldNames.count(); i++) { - QString fn = fieldNames[i].simplified(); - if (fn.endsWith(':')) - fn = fn.left(fn.length() - 1); - if (!whiteList.contains(fn)) - continue; - - QString fv = fieldValues[i].simplified(); - bool special = false; - special |= fn.startsWith("Departure"); - special |= fn.startsWith("Arrival"); - text += "<tr>"; - if (special) { - text += "<td align=center colspan=2>"; - text += "<b><font size=+1>" + fv + "</font></b>"; - text += "</td>"; - } else { - text += "<td align=right>"; - text += fn; - text += " : "; - text += " "; - text += "</td>"; - text += "<td>"; - text += fv; - text += "</td>"; - } - text += "</tr>"; - } - text += "</table>"; - ui.detailedInfo->setText(text); - ui.infoBox->show(); - } - - void resizeEvent(QResizeEvent *event) { - Q_UNUSED(event); - ui.detailedInfo->setMaximumWidth(width() - 25); - } - - void paintEvent(QPaintEvent *event) { - QMainWindow::paintEvent(event); - QPainter p(this); - p.fillRect(rect(), QColor(131, 171, 210)); - if (!m_map.isNull()) { - int x = (width() - m_map.width()) / 2; - int space = ui.infoBox->pos().y(); - if (!ui.infoBox->isVisible()) - space = height(); - int top = ui.titleBox->height(); - int y = qMax(top, (space - m_map.height()) / 2); - p.drawPixmap(x, y, m_map); - } - p.end(); - } - -}; - - -#include "flightinfo.moc" - -int main(int argc, char **argv) -{ - Q_INIT_RESOURCE(flightinfo); - - QApplication app(argc, argv); - - FlightInfo w; - w.resize(360, 504); - w.show(); - - return app.exec(); -} diff --git a/examples/embedded/flightinfo/flightinfo.pro b/examples/embedded/flightinfo/flightinfo.pro deleted file mode 100644 index 4e62b24576..0000000000 --- a/examples/embedded/flightinfo/flightinfo.pro +++ /dev/null @@ -1,9 +0,0 @@ -TEMPLATE = app -TARGET = flightinfo -SOURCES = flightinfo.cpp -FORMS += form.ui -RESOURCES = flightinfo.qrc -QT += network widgets - -target.path = $$[QT_INSTALL_EXAMPLES]/embedded/flightinfo -INSTALLS += target diff --git a/examples/embedded/flightinfo/flightinfo.qrc b/examples/embedded/flightinfo/flightinfo.qrc deleted file mode 100644 index babea7e0cb..0000000000 --- a/examples/embedded/flightinfo/flightinfo.qrc +++ /dev/null @@ -1,5 +0,0 @@ -<RCC> - <qresource prefix="/" > - <file>aircraft.png</file> - </qresource> -</RCC> diff --git a/examples/embedded/flightinfo/form.ui b/examples/embedded/flightinfo/form.ui deleted file mode 100644 index 3a24c758a6..0000000000 --- a/examples/embedded/flightinfo/form.ui +++ /dev/null @@ -1,226 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>Form</class> - <widget class="QWidget" name="Form"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>220</width> - <height>171</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="spacing"> - <number>0</number> - </property> - <property name="margin"> - <number>0</number> - </property> - <item> - <widget class="QFrame" name="titleBox"> - <property name="styleSheet"> - <string>QFrame { -background-color: #45629a; -} - -QLabel { -color: white; -}</string> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <property name="lineWidth"> - <number>0</number> - </property> - <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="spacing"> - <number>0</number> - </property> - <property name="margin"> - <number>4</number> - </property> - <item> - <widget class="QLabel" name="flightName"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Powered by FlightView</string> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="flightStatus"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="styleSheet"> - <string>background-color: white; -color: #45629a;</string> - </property> - <property name="lineWidth"> - <number>0</number> - </property> - <property name="text"> - <string>Ready</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="margin"> - <number>4</number> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QFrame" name="searchBar"> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <property name="margin"> - <number>5</number> - </property> - <item> - <widget class="QLineEdit" name="flightEdit"> - <property name="styleSheet"> - <string>color: black; -border: 1px solid black; -background: white; -selection-background-color: lightgray;</string> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="searchButton"> - <property name="styleSheet"> - <string>color: rgb(255, 255, 255); -background-color: rgb(85, 85, 255); -padding: 2px; -border: 2px solid rgb(0, 0, 127);</string> - </property> - <property name="text"> - <string>Search</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </item> - <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>58</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QFrame" name="infoBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="styleSheet"> - <string>QFrame { border: 2px solid white; -border-radius: 10px; -margin: 5px; -background-color: rgba(69, 98, 154, 192); }</string> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <property name="spacing"> - <number>0</number> - </property> - <property name="margin"> - <number>5</number> - </property> - <item> - <widget class="QLabel" name="detailedInfo"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="styleSheet"> - <string>color: white; -border: none; -background-color: none;</string> - </property> - <property name="text"> - <string/> - </property> - <property name="textFormat"> - <enum>Qt::RichText</enum> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - <property name="textInteractionFlags"> - <set>Qt::NoTextInteraction</set> - </property> - </widget> - </item> - </layout> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> |