Revision control

++ // Copyright (C) 2016 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
++
++ /*!
++ \example itemviews/fetchmore
++ \title Fetch More Example
++ \examplecategory {User Interface Components}
++ \ingroup examples-itemviews
++ \brief The Fetch More example shows how to add items to an item view
++ model on demand.
++
++ \image fetchmore-example.png
++ {Application that fetches and adds more items into the view model}
++
++ When you have large - or perhaps even infinite - data sets, you
++ will need to add items to the model in batches, and preferably only
++ when the items are needed by the view (i.e., when they become visible
++ in the view).
++
++ In this example, we implement \c FileListModel - an item view
++ model containing the entries of a directory. We also have \c
++ Window, which sets up the GUI and feeds the model with
++ directories.
++
++ The UI consists of a dialog with a list showing the contents
++ of the root directory. Directories can be navigated by double-clicking.
++
++ At the bottom, there is a log window displaying messages when the view
++ asks the model for more data.
++
++ To exercise it, navigate to a large directory (say \c /bin), and scroll
++ to the bottom. Log messages appear showing the data being retrieved.
++
++ Let's take a tour of \c {FileListModel}'s code.
++
++ \section1 FileListModel Class Definition
++
++ The \c FileListModel inherits QAbstractListModel and contains the
++ contents of a directory. It will add items to itself only when
++ requested to do so by the view.
++
++ \snippet itemviews/fetchmore/filelistmodel.h 0
++
++ The secret lies in the reimplementation of
++ \l{QAbstractItemModel::}{fetchMore()} and
++ \l{QAbstractItemModel::}{canFetchMore()} from QAbstractItemModel.
++ These functions are called by the item view when it needs more
++ items.
++
++ The \c setDirPath() function sets the directory the model will
++ work on. We emit \c numberPopulated() each time we add a batch of
++ items to the model.
++
++ We keep all directory entries in \c fileList. \c fileCount is the
++ number of items that have been added to the model.
++
++ \section1 FileListModel Class Implementation
++
++ We start by checking out the \c setDirPath().
++
++ \snippet itemviews/fetchmore/filelistmodel.cpp 0
++
++ We use a QDir to get the contents of the directory. We need to
++ inform QAbstractItemModel that we want to remove all items - if
++ any - from the model.
++
++ \snippet itemviews/fetchmore/filelistmodel.cpp 1
++
++ The \c canFetchMore() function is called by the view when it needs
++ more items. We return true if there still are entries that we have
++ not added to the model; otherwise, we return false.
++
++ And now, the \c fetchMore() function itself:
++
++ \snippet itemviews/fetchmore/filelistmodel.cpp 2
++
++ We first calculate the number of items to fetch.
++ \l{QAbstractItemModel::}{beginInsertRows()} and
++ \l{QAbstractItemModel::}{endInsertRows()} are mandatory for
++ QAbstractItemModel to keep up with the row insertions. Finally, we
++ emit \c numberPopulated(), which is picked up by \c Window.
++
++ To complete the tour, we also look at \c rowCount() and \c data().
++
++ \snippet itemviews/fetchmore/filelistmodel.cpp 4
++
++ Notice that the row count is only the items we have added so far,
++ i.e., not the number of entries in the directory.
++
++ In \c data(), we return the appropriate entry from the \c
++ fileList. We also separate the batches with a different background
++ color.
++ */
++