/****************************************************************************
**
** 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$
**
****************************************************************************/

/*!
    \qmltype ItemSelectionModel
    \instantiates QItemSelectionModel
    \inqmlmodule QtQml.Models
    \since 5.5
    \ingroup qtquick-models

    \brief Instantiates a QItemSelectionModel to be used in conjunction
    with a QAbstractItemModel and any view supporting it.

    \sa QItemSelectionModel, {Models and Views in Qt Quick}
*/


/*!
    \qmlproperty QAbstractItemModel ItemSelectionModel::model

    This property's value must match the view's model.
*/

/*!
    \qmlproperty bool ItemSelectionModel::hasSelection
    \readonly

    It will trigger property binding updates every time \l selectionChanged()
    is emitted, even though its value hasn't changed.

    \sa selection, selectedIndexes, select(), selectionChanged()
*/

/*!
    \qmlproperty QModelIndex ItemSelectionModel::currentIndex
    \readonly

    Use \l setCurrentIndex() to set its value.

    \sa setCurrentIndex(), currentChanged()
*/

/*!
    \qmlproperty QModelIndexList ItemSelectionModel::selectedIndexes
    \readonly

    Contains the list of all the indexes in the selection model.
*/

/*!
    \qmlmethod bool ItemSelectionModel::isSelected(QModelIndex index)

    Returns \c true if the given model item \a index is selected.
*/

/*!
    \qmlmethod bool ItemSelectionModel::isRowSelected(int row, QModelIndex parent)

    Returns \c true if all items are selected in the \a row with the given
    \a parent.

    Note that this function is usually faster than calling isSelected()
    on all items in the same row, and that unselectable items are ignored.
*/

/*!
    \qmlmethod bool ItemSelectionModel::isColumnSelected(int column, QModelIndex parent)

    Returns \c true if all items are selected in the \a column with the given
    \a parent.

    Note that this function is usually faster than calling isSelected()
    on all items in the same column, and that unselectable items are ignored.
*/

/*!
    \qmlmethod bool ItemSelectionModel::rowIntersectsSelection(int row, QModelIndex parent)

    Returns \c true if there are any items selected in the \a row with the
    given \a parent.
*/

/*!
    \qmlmethod bool ItemSelectionModel::columnIntersectsSelection(int column, QModelIndex parent)

    Returns \c true if there are any items selected in the \a column with the
    given \a parent.
*/

/*!
    \qmlmethod QModelIndexList ItemSelectionModel::selectedRows(int column)

    Returns the indexes in the given \a column for the rows where all columns
    are selected.

    \sa selectedColumns()
*/

/*!
    \qmlmethod QModelIndexList ItemSelectionModel::selectedColumns(int row)

    Returns the indexes in the given \a row for columns where all rows are
    selected.

    \sa selectedRows()
*/

/*!
    \qmlproperty object ItemSelectionModel::selection
    \readonly

    Holds the selection ranges stored in the selection model.
*/

/*!
    \qmlmethod void ItemSelectionModel::setCurrentIndex(QModelIndex index, SelectionFlags command)

    Sets the model item \a index to be the current item, and emits
    currentChanged(). The current item is used for keyboard navigation and
    focus indication; it is independent of any selected items, although a
    selected item can also be the current item.

    Depending on the specified \a command, the \a index can also become part
    of the current selection.

    Valid \a command values are described in \l {itemselectionmodelselectindex}
    {select(\e index, \e command)}.

    \sa select()
*/

/*!
    \qmlmethod void ItemSelectionModel::select(QModelIndex index, SelectionFlags command)
    \keyword itemselectionmodelselectindex

    Selects the model item \a index using the specified \a command, and emits
    selectionChanged().

    Valid values for the \a command parameter, are:

    \value NoUpdate       No selection will be made.
    \value Clear          The complete selection will be cleared.
    \value Select         All specified indexes will be selected.
    \value Deselect       All specified indexes will be deselected.
    \value Toggle         All specified indexes will be selected or
                          deselected depending on their current state.
    \value Current        The current selection will be updated.
    \value Rows           All indexes will be expanded to span rows.
    \value Columns        All indexes will be expanded to span columns.
    \value SelectCurrent  A combination of Select and Current, provided for
                          convenience.
    \value ToggleCurrent  A combination of Toggle and Current, provided for
                          convenience.
    \value ClearAndSelect A combination of Clear and Select, provided for
                          convenience.
*/

/*!
    \qmlmethod void ItemSelectionModel::select(QItemSelection selection, SelectionFlags command)

    Selects the item \a selection using the specified \a command, and emits
    selectionChanged().

    Valid \a command values are described in \l {itemselectionmodelselectindex}
    {select(\e index, \e command)}.
*/

/*!
    \qmlmethod void ItemSelectionModel::clear()

    Clears the selection model. Emits selectionChanged() and currentChanged().
*/

/*!
    \qmlmethod void ItemSelectionModel::reset()

    Clears the selection model. Does not emit any signals.
*/

/*!
    \qmlmethod void ItemSelectionModel::clearSelection()

    Clears the selection in the selection model. Emits selectionChanged().
*/

/*!
    \qmlmethod void ItemSelectionModel::clearCurrentIndex()

    Clears the current index. Emits currentChanged().
*/

/*!
    \qmlsignal ItemSelectionModel::selectionChanged(QItemSelection selected, QItemSelection deselected)

    This signal is emitted whenever the selection changes. The change in the
    selection is represented as an item selection of \a deselected items and
    an item selection of \a selected items.

    Note the that the current index changes independently from the selection.
    Also note that this signal will not be emitted when the item model is reset.

    \sa select(), currentChanged()
*/

/*!
    \qmlsignal ItemSelectionModel::currentChanged(QModelIndex current, QModelIndex previous)

    This signal is emitted whenever the current item changes. The \a previous
    model item index is replaced by the \a current index as the selection's
    current item.

    Note that this signal will not be emitted when the item model is reset.

    \sa currentIndex, setCurrentIndex(), selectionChanged()
*/
