/****************************************************************************
**
** 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 whatsnew510.html
    \title What's New in Qt 5.10
    \brief Lists the new features in Qt 5.10.

    \section1 New Features in Qt 5.10

    \section2 Qt Connectivity Module
    \list
        \li The UWP Bluetooth and Bluetooth LE backends can now be used on
            Windows 10.
    \endlist

    \section2 Qt Graphical Effects Module
    \list
        \li Added support for effects in core profile OpenGL contexts.
    \endlist

    \section2 Qt GUI Module
    \list
        \li Added the cross-platform Vulkan enablers, QVulkanInstance, QWindow
            with type VulkanSurface, and QVulkanWindow. These enablers are for
            Windows, Linux (xcb), and Android (level 23+).
        \li Added new flags and functions to QSurfaceFormat and QOpenGLWidget,
            to request sRGB-capable default/backing framebuffers.
        \li Added the cross-platform enablers for OpenGL ES 3.2 API, which are
            now accessible through QOpenGLExtraFunctions.
        \li Added support for more than 2 Gigabyte of pixel data in QImage.
        \li Added QFont::PreferNoShaping style strategy.
    \endlist

    \section2 Qt Network Module
    \list
        \li Upgraded OpenSSL back-end to use library v1.1.
        \li Persistent store of HSTS policies in QNAM (QSettings-based).
    \endlist

    \section2 Qt Quick Module
    \list
        \li Added a shapes plugin, providing a Shape type under
            QtQuick.Shapes 1.0, which enables adding stroked and filled paths
            into Qt Quick scenes. Such shapes are rendered either by generating
            geometry or by using the GL_NV_path_rendering extension.
        \li Added the Qt.labs.handlers plugin (tech. preview), providing
            TapHandler, PinchHandler, and DragHandler. These are lightweight
            objects for handling events from the mouse or the touchscreen in a
            device-agnostic way.
            \note The plugin is available as a technology preview so it could
            could change in future releases.
        \li Added support for multi-sample framebuffers to QQuickItem layers
            using the layer.samples property.
        \li Added \l[QML]{Text::}{font.kerning} and
            \l[QML]{Text::}{font.preferShaping} properties for
            advanced control over the font shaping subsystem.
        \li Added \l[QML]{Text::}{advance} property to Text to retrieve the
            typographical advance width.
        \li Added Image element to enable direct loading of ETC1 and ETC2
            compressed textures from \c .pkm files on platforms where ETC1/2
            are supported.
    \endlist

    \section2 Qt Quick Controls 2 Module
    \list
        \li Added support for effects in core profile OpenGL contexts.
        \li Added new QML types: \l Action, ActionGroup, and MenuBar.
        \li Added these new styles:
         \list
          \li The Fusion style offers a platform agnostic desktop-oriented
              look'n'feel.
          \li The Imagine style is based on image assets that can be provided
              using a predefined naming convention.
         \endlist
        \li Added actions support for it in:
         \list
          \li buttons, delegates, menus,
          \li exclusive button groups,
          \li nested menus, and cascading sub-menus.
         \endlist
        \li Added support for:
         \list
          \li wrapping SpinBox,
          \li propagating palettes (only Fusion & Imagine styles for now),
          \li specifying the default font and palette in qtquickcontrols2.conf,
          \li and preliminary support for mnemonics in MenuItem (only shortcut
              functionality).
         \endlist
        \li Added the following new members:
         \list
          \li TabBar::index, \l{TabBar::}{tabBar}, and \l{TabBar::}{position}
              attached properties.
          \li Dialog::applied(), \l{Dialog::}{reset}(),
              \l{Dialog::}{discarded}(), and \l{Dialog::}{helpRequested}()
              signals.
          \li Dialog::standardButton() method.
          \li StackView::empty property.
          \li Menu::popup() and \l{Menu::}{dismiss}() methods.
          \li Menu::actionAt(), \l{Menu::}{addAction}(),
              \l{Menu::}{insertAction}(), \l{Menu::}{removeAction}(),
              and \l{Menu::}{takeAction}() methods.
          \li Menu::menuAt(), \l{Menu::}{addMenu}(), \l{Menu::}{insertMenu}(),
              \l{Menu::}{removeMenu}(), and \l{Menu::}{takeMenu}() methods.
          \li Menu::count and \l{Menu::}{currentIndex} properties.
          \li MenuItem::menu property.
          \li Container::removeItem(Item) and takeItem(int) methods
              (TabBar and SwipeView).
          \li Popup::enabled, \l{Popup::}{mirrored}, and  \l{Popup::}{opened}
              properties.
          \li \c horizontal and \c vertical properties to all controls
              that have the \c orientation property: RangeSlider, \l Slider,
              ScrollBar, ScrollIndicator, and SwipeView.
         \endlist
        \li Other improvements:
         \list
          \li Added support for specifying a transition for StackView::clear().
          \li Enabled support for ApplicationWindow::activeFocusControl attached
              property for a plain \l Window.
          \li Enabled background dimming for popups without ApplicationWindow.
          \li Updated Material style for DialogButtonBox to use the Android
              button layout.
          \li Updated default style \l Slider and RangeSlider to visually indicate
              the progress/range.
         \endlist
    \endlist

    \section2 Qt SerialBus Module
    \list
        \li Added local echo flag to QCanBusFrame to mark frames that are sent
            from the local system to the CAN bus.
    \endlist

    \section2 Qt Virtual Keyboard Module
    \list
        \li Added the keyboard layouts for Hebrew, Serbian, Hungarian, Czech,
            Croatian, Bulgarian, Greek, Estonian, and Dutch.
        \li Added handwriting support for Farsi, Arabic, and
            CJK (Chinese/Japanese/Korean).
        \li Added new component (InputModeKey) for input mode switch.
    \endlist

    \section2 Qt WebEngine Module
    \list
        \li Updated to be based on Chromium 60.
        \li Added pause/resume functionality to download items.
        \li Added settings for blocking JavaScript focus and hiding scrollbars.
        \li Updated QWebEnginePage with more WebActions, which were supported
            by QWebPage earlier.
        \li Added QWebEnginePage::download for triggering downloads.
    \endlist

    \section2 Qt Widgets Module
    \list
        \li Added support for embedding a window into a QWidget on Android
            using \l{QWidget::createWindowContainer}().
        \li Added support for rendering and reading back (grabbing) offscreen
            content using QOpenGLWidget.
        \li Added \c AA_DisableWindowContextHelpButton attribute that prevents
            the automatic "What's this" button on dialogs on Windows.
        \li Added \c tabStopDistance property in QTextOption, QTextEdit,
            and QPlainTextEdit.
        \li Added \c selectionEnd(), \c selectionLength() to QLineEdit,
            complementing \c selectionStart().
        \li Added QInputDialog::setDoubleStep to enable changing of the step
            amount for \c getDouble().
        \li Added \c isPersistentEditorOpen() to QAbstractItemView, QTreeWidget,
            QTableWidget, and QListWidget.
        \li Added new \l{QStyle::StyleHint}, \c SH_TitleBar_ShowToolTipsOnButtons.
        \li Added support for specifying custom internal texture formats in
            QOpenGLWidget.
    \endlist

    \section1 New Modules
    \list
        \li \l {Qt Network Authorization} - Provides support for OAuth1 and OAuth2.
        \li \l {Qt Speech} - Enables text-to-speech in Qt Applications.
     \endlist

    These modules were previously released as technology preview and are
    now fully supported Qt add-on modules.

    \section1 Technology Preview Modules
    \list
        \li \l {Qt Remote Objects} (TP2) - Sharing QObject interfaces (signals, slots,
            and properties) between processes or devices.
        \li \l{Qt Quick WebGL}{Qt WebGL} Streaming Plugin - Enables streaming Qt application
            to a web browser over the network.
     \endlist

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

    Deprecated modules are still included in Qt 5.10, 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.10:
    \list
    \li \l{New Classes and Functions in Qt 5.10}
    \li \l{Obsolete Classes}
    \endlist

    \section1 Additions to Other Qt 5 Releases

    \list
        \li \l{What's New in Qt 5.9}
        \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 newclasses510.html
    \title New Classes and Functions in Qt 5.10
    \brief A list of new APIs in Qt 5.10.

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

    \sincelist 5.10

    \section1 Additions to Other Qt 5 Releases

    \list
        \li \l{What's New in Qt 5.9}
        \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
*/

