/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** 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.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
    \page whatsnew59.html
    \title What's New in Qt 5.9
    \brief Lists the new features in Qt 5.9.

    Qt 5.9 is a long-term support (LTS) release.

    \section1 New Features in Qt 5.9

    \section2 Qt Core Module
    \list
        \li Added the \c {qfloat16 f} and \c {qfloat16 &f} overload functions to
            the QDataStream class for writing a floating point number to the
            stream and reading it from the stream.
        \li Made the QProcessEnvironment class available on iOS, tvOS, watchOS,
            and VxWorks.
        \li QRegularExpression now requires the PCRE2 library version 10.20, or
            later. Support for the PCRE1 library was dropped. A copy of PCRE2
            is shipped with Qt and will automatically be used on the platforms
            that lack it.
        \li Added the QOperatingSystemVersion class to provide convenient
            access to the operating system and version.
    \endlist

    \section2 Qt GUI Module
    \list
        \li Made the QPainter class' GL engine functional with core profile
            OpenGL contexts.
        \li Added the QImage::reinterpretAsFormat() function to change the image
            format without changing the data.
        \li Added support for \e {compute shaders} in QOpenGLShader::ShaderType
            and QOpenGLShaderProgram also with OpenGL ES 3.1 and newer.
        \li Enabled stem-darkening and gamma-correction on OpenType fonts on
            platforms that use FreeType, if supported.
    \endlist

    \section2 Qt Multimedia Module
    Added the following QML properties:
    \list
        \li \l{CameraCapture::supportedResolutions}
            {CameraCapture.supportedResolutions}
        \li \l{CameraFlash::supportedModes}{CameraFlash.supportedModes}
        \li \l{MediaPlayer::notifyInterval}{MediaPlayer.notifyInterval} (also
            for the \l Audio and \l Video types)
        \li \l{MediaPlayer::loops}{Video.loops}
    \endlist

    \section2 Qt Network Module
    \list
        \li Added the QNetworkAccessManager::addStrictTransportSecurityHosts()
            function to support HSTS (HTTP Strict Transport Security) policies.
        \li Added the QNetworkAccessManager::redirectPolicy() function and the
            QNetworkRequest::RedirectPolicy enumeration to determine whether the
            Network Access API should automatically follow a HTTP redirect
            response.
    \endlist

    \section2 Qt QML Module
    \list
        \li Added support for ahead-of-time generation of QML type caches.
    \endlist

    \section2 Qt Quick Module
    \list
        \li Enabled caching OpenGL shader program binaries used by the Qt GUI
            module (QPainter's GL paint engine) and the Qt Quick scenegraph on
            disk to improve application-startup and view-initialization times.
        \li Added an OpenVG backend for Qt Quick.
        \li Enabled making window-screen associations directly from QML by using
            \l {Window::screen}{Window.screen} and \l{Qt::application}
            {Qt.application.screens}. This enables creating multi-screen aware
            applications for desktop and embedded without involving C++ code.
        \li Added a way to query information about the font actually used to
            render a \l [QtQuick] Text type.
        \li Added an image provider that can share decoded image data and memory
            between processes.
    \endlist

    \section2 Qt Quick Controls 2 Module
    \list
        \li Introduced new QML types: \l DelayButton, \l ScrollView.
        \li Added multi-touch support.
        \li Made the \l ComboBox type editable.
        \li Added the \l{Drawer::}{interactive} property for making a \l Drawer
            type non-interactive and persistent.
        \li Enabled live value updates (by default) for the \l Slider,
            \l [QtQuickControls2] RangeSlider, and \l Dial types.
        \li Added dedicated notification signals for user interaction:
            AbstractButton::toggled(), Slider::moved(),
            SpinBox::valueModified(), and so on.
        \li Enabled incremental discrete scrolling with the \l ScrollBar type.
        \li Added enabling and disabling the swipe for the \l SwipeDelegate
            type. In addition, the swipe can now be opened programmatically.
        \li Added support for the vertical orientation to the
            \l {SwipeView::orientation}{SwipeView.orientation} property.
    \endlist

    \section2 Qt 3D Module
    \list
        \li Added rendering Qt Quick 2 scenes to a texture and interacting with
            them within a 3D world.
        \li Added a Technical Preview of a new animation subsystem that enables
            non-blocking, keyframe animations on the threadpool and exporting
            from animations from Blender.
        \li Added Physics Based Rendering (PBR) material
            (\l{Qt3DExtras::}{QMetalRoughMaterial} and
            \l{Qt3DExtras::}{QTexturedMetalRoughMaterial}) to Qt3DExtras for
            improved appearance when used with environment maps.
        \li Added 3D text support to Qt3DExtras.
        \li Added the LevelOfDetail type to control the representation of an
            entity based on distance from the observer or size on the screen. It
            comes with a convenience loader class that loads different QML
            files.
        \li Made the Mesh type plugin based. It comes with plugins for the
            Wavefront OBJ, PLY and FBX formats and makes it easy to add other
            formats.
        \li Added distance field based 2D textured text that can be freely
            rotated but is based on planar geometry.
    \endlist

    \section2 Qt Bluetooth Module
    \list
        \li Added Classic Bluetooth support for WinRT.
        \li Added Bluetooth LE Peripheral support for Android.
    \endlist

    \section2 Qt Charts Module
    \list
        \li Added support for minor grid lines for logarithmic axes.
        \li Added options for legend marker shapes to QLegend::MarkerShape.
        \li Added support for adding more than one bar series to a chart.
    \endlist

    \section2 Qt Location Module
    \list
        \li Added support for rotating and tilting maps.
        \li Added touch gestures for rotating and tilting maps.
        \li Improved support for stacking multiple \l Map types.
        \li Added the MapCopyrightNotice type to flexibly position the
            copyrights of multiple map elements on top.
        \li Enabled styling the HTML copyright using CSS.
        \li Added support for handing the rendering of map items to the plugin.
        \li Added the \e MapboxGL plugin that is based on the
            \c mapbox-gl-native mapping engine.
        \li Added the \l Map::fitViewportToVisibleMapItems() method to only
            consider visible items when fitting the viewport.
        \li Added the MapItemGroup type to combine multiple map items in a
            separate QML file.
        \li Added the \l{Map::fieldOfView}{Map.fieldOfView} property to control
            the camera's field of view when the map is tilted.
        \li Added the MapParameter type to expose and control plugin-specific
            runtime functionality.
    \endlist

    \section2 Qt NFC Module
    \list
        \li Enabled using NFC when running as an Android service.
        \li Added support for communicating with ISO-DEP, NFC-A, NFC-B, NFC-F,
            and NFC-V tags or smartcards, such as the German eID card,
            using QNearFieldTarget::sendCommand() on Android.
    \endlist

    \section2 Qt SerialBus Module
    \list
        \li Added the CAN FD Bitrate Switch (BRS) and Error State Indicator
            (ESI) flags to QCanBusFrame (QCanBusFrame::hasBitrateSwitch() and
            QCanBusFrame::hasErrorStateIndicator()).
        \li Added QCanBusDeviceInfo for information about available CAN
            interfaces.
        \li Added a plugin to support SYS-TEC electronic CAN adapters on
            Windows.
    \endlist

    \section2 Qt Virtual Keyboard Module
    \list
        \li Added support for selection handles for the dedicated (desktop)
            keyboard.
        \li Changed the behavior of the shift handler to only activate caps lock
            if the shift key is double-clicked.
        \li Added support for external keyboard layouts, which allows overriding
            and exclusion of the built-in keyboard layouts.
        \li Added a language selection popup for faster selection of the input
            language.
        \li Added support for the automatic selection of the only remaining word
            in the suggestion list.
        \li Made the word candidate list automatically hidden when inactive.
        \li Added full screen input mode.
    \endlist

    \section2 Qt WebEngine Module
    \list
        \li Based on Chromium 56.
        \li Switched internally to the new Chromium build-system GN.
        \li Added loading with HTTP POST.
        \li Added support for user scripts with QQuickWebEngineProfiles and for
            using QQuickWebEngineUserScripts from C++.
        \li DownloadItems now get a reason when they are interrupted or fail.
    \endlist

    \section2 Qt WebSockets Module
    \list
        \li Added support for handling external QTcpSocket objects.
    \endlist

    \section2 Embedded Platforms
    \list
        \li Added experimental DRM dumb buffer support to the \c linuxfb
            platform plugin, to help devices that do not support the deprecated
            \c fbdev  model (or have problems with \c fbdev emulation).
        \li Added support for filtering and prediction of touch events to the
            \c evdevtouch plugin.
    \endlist

    \section1 New Modules
    \list
        \li \l {Qt Gamepad} - Enables Qt gaming applications to respond to
            gamepad input.
     \endlist

    This module was previously released as a technology preview and is
    now a fully supported Qt add-on module.

    \section1 Technology Preview Modules
    \list
        \li \l {Qt Network Authorization} -  Online authorization support with
            OAuth protocol, versions 1 and 2.
        \li \l {Qt Remote Objects} - Sharing QObject interfaces (signals, slots,
            and properties) between processes or devices,
        \li \l {Qt Speech} -  Text to speech and speech recognition
            functionality. Currently only the text to speech features are
            released. Includes backends for several speech synthesizers on
            Windows, Linux, macOS, and Android.
     \endlist

     \section1 Platform Changes
     \list
        \li Removed support for WinRT on Windows 8.1.
        \li Debug builds on GCC platforms now use \c -Og optimizations by
            default. This can be disabled with the configure flag
            \c -no-optimize-debug.
    \endlist

    \section1 Deprecated Functionality
    \list
        \li Qt Script
    \endlist

    Deprecated modules are still included in Qt 5.9, but are considered for
    removal in future releases.

    \section1 List of API Changes

    The pages below contain a list of API changes in Qt 5.9:
    \list
    \li \l{New Classes and Functions in Qt 5.9}
    \li \l{Obsolete Classes}
    \endlist

    \section1 Additions to Other Qt 5 Releases

    \list
        \li \l{What's New in Qt 5.8}
        \li \l{What's New in Qt 5.7}
        \li \l{What's New in Qt 5.6}
        \li \l{What's New in Qt 5.5}
        \li \l{What's New in Qt 5.4}
        \li \l{What's New in Qt 5.3}
        \li \l{What's New in Qt 5.2}
        \li \l{What's New in Qt 5.1}
        \li \l{What's New in Qt 5.0}
    \endlist

*/

/*!
    \page newclasses59.html
    \title New Classes and Functions in Qt 5.9
    \brief A list of new APIs in Qt 5.9.

    This page contains a comprehensive list of all new classes and functions
    introduced in Qt 5.9. Links to new APIs in previous Qt 5 releases are found
    at the bottom of this page.

    \sincelist 5.9

    \section1 Additions to Other Qt 5 Releases

    \list
        \li \l{What's New in Qt 5.8}
        \li \l{What's New in Qt 5.7}
        \li \l{What's New in Qt 5.6}
        \li \l{What's New in Qt 5.5}
        \li \l{What's New in Qt 5.4}
        \li \l{What's New in Qt 5.3}
        \li \l{What's New in Qt 5.2}
        \li \l{What's New in Qt 5.1}
        \li \l{What's New in Qt 5.0}
    \endlist
*/

