~aleteoryx/muditaos

a6232fb61b82b51eb76e4b2b5cd47f6670d77ca7 — Lefucjusz 2 years ago a07177c
[MOS-932] Minor ListViewEngine cleanup

Minor cleanup of ListViewEngine.cpp.
2 files changed, 51 insertions(+), 52 deletions(-)

M module-gui/gui/widgets/ListViewEngine.cpp
M module-gui/gui/widgets/ListViewEngine.hpp
M module-gui/gui/widgets/ListViewEngine.cpp => module-gui/gui/widgets/ListViewEngine.cpp +30 -31
@@ 18,7 18,7 @@ namespace gui
        clear();
    }

    void ListViewEngine::setElementsCount(unsigned int count)
    void ListViewEngine::setElementsCount(unsigned count)
    {
        if ((elementsCount != count) || (elementsCount == listview::nPos)) {
            onElementsCountChanged(count);


@@ 55,7 55,7 @@ namespace gui
        return elementsCount == 0;
    }

    void ListViewEngine::rebuildList(listview::RebuildType rebuildType, unsigned int dataOffset, bool forceRebuild)
    void ListViewEngine::rebuildList(listview::RebuildType rebuildType, unsigned dataOffset, bool forceRebuild)
    {
        if (pageLoaded || forceRebuild) {



@@ 87,7 87,7 @@ namespace gui
        storedFocusIndex = listview::nPos;
    }

    void ListViewEngine::prepareOnOffsetRebuild(unsigned int dataOffset)
    void ListViewEngine::prepareOnOffsetRebuild(unsigned dataOffset)
    {
        if (dataOffset < elementsCount) {
            startIndex       = dataOffset;


@@ 105,13 105,14 @@ namespace gui
        }
    }

    void ListViewEngine::prepareOnPageElementRebuild(unsigned int dataOffset)
    void ListViewEngine::prepareOnPageElementRebuild(unsigned dataOffset)
    {
        startIndex       = (dataOffset / calculateMaxItemsOnPage()) * calculateMaxItemsOnPage();
        storedFocusIndex = dataOffset % calculateMaxItemsOnPage();
        const auto maxItemsOnPage = calculateMaxItemsOnPage();
        startIndex                = (dataOffset / maxItemsOnPage) * maxItemsOnPage;
        storedFocusIndex          = dataOffset % maxItemsOnPage;
    }

    void ListViewEngine::setup(listview::RebuildType rebuildType, unsigned int dataOffset)
    void ListViewEngine::setup(listview::RebuildType rebuildType, unsigned dataOffset)
    {
        switch (rebuildType) {
        case listview::RebuildType::Full:


@@ 147,12 148,12 @@ namespace gui
        clear();
    }

    unsigned int ListViewEngine::getFocusItemIndex()
    unsigned ListViewEngine::getFocusItemIndex()
    {
        auto index = body->getFocusItemIndex();

        if (direction == listview::Direction::Top) {
            int position = currentPageSize - 1 - index;
            const int position = currentPageSize - 1 - index;
            index        = std::abs(position);
        }



@@ 176,7 177,7 @@ namespace gui
    {
        body->setFocusItem(nullptr);

        while (auto el = body->children.back()) {
        while (const auto el = body->children.back()) {

            if (el->type == ItemType::LIST_ITEM) {



@@ 187,8 188,9 @@ namespace gui
                    body->erase(el);
                }
            }
            else
            else {
                body->erase(el);
            }
        }
    }



@@ 242,16 244,18 @@ namespace gui

    Order ListViewEngine::getOrderFromDirection() const noexcept
    {
        if (direction == listview::Direction::Bottom)
        if (direction == listview::Direction::Bottom) {
            return Order::Next;
        }

        return Order::Previous;
    }

    Order ListViewEngine::getOppositeOrderFromDirection() const noexcept
    {
        if (direction == listview::Direction::Bottom)
        if (direction == listview::Direction::Bottom) {
            return Order::Previous;
        }

        return Order::Next;
    }


@@ 306,9 310,7 @@ namespace gui
    {
        currentPageSize = 0;

        ListItem *item = nullptr;

        while ((item = provider->getItem(getOrderFromDirection())) != nullptr) {
        while (const auto item = provider->getItem(getOrderFromDirection())) {

            body->addWidget(item);



@@ 340,7 342,7 @@ namespace gui

        if (requestCompleteData) {

            unsigned int page   = 0;
            unsigned page       = 0;
            auto pageStartIndex = 0;

            clear();


@@ 401,7 403,7 @@ namespace gui
        }
    }

    void ListViewEngine::onElementsCountChanged(unsigned int count)
    void ListViewEngine::onElementsCountChanged(unsigned count)
    {
        if (elementsCount == 0 || count == 0) {
            shouldCallEmptyListCallbacks = true;


@@ 433,9 435,9 @@ namespace gui
    {
        if (currentPageSize != body->getVisibleChildrenCount()) {

            unsigned int diff = currentPageSize < body->getVisibleChildrenCount()
                                    ? 0
                                    : currentPageSize - body->getVisibleChildrenCount();
            const unsigned diff = currentPageSize < body->getVisibleChildrenCount()
                                      ? 0
                                      : currentPageSize - body->getVisibleChildrenCount();
            currentPageSize   = body->getVisibleChildrenCount();

            if (direction == listview::Direction::Top) {


@@ 453,24 455,21 @@ namespace gui
        }
    }

    unsigned int ListViewEngine::calculateMaxItemsOnPage()
    unsigned ListViewEngine::calculateMaxItemsOnPage()
    {
        assert(provider->getMinimalItemSpaceRequired() != 0);
        auto count = body->getPrimarySize() / provider->getMinimalItemSpaceRequired();

        const auto count = body->getPrimarySize() / provider->getMinimalItemSpaceRequired();
        return count;
    }

    unsigned int ListViewEngine::calculateLimit(listview::Direction value)
    unsigned ListViewEngine::calculateLimit(listview::Direction value)
    {
        auto minLimit =
            (2 * currentPageSize > calculateMaxItemsOnPage() ? 2 * currentPageSize : calculateMaxItemsOnPage());
        const auto minLimit = std::max(2 * currentPageSize, calculateMaxItemsOnPage());

        if (value == listview::Direction::Bottom) {
            return (minLimit + startIndex <= elementsCount ? minLimit : elementsCount - startIndex);
        }
        else {
            return minLimit < startIndex ? minLimit : startIndex;
            return (minLimit + startIndex <= elementsCount) ? minLimit : (elementsCount - startIndex);
        }
        return std::min(minLimit, startIndex);
    }

    bool ListViewEngine::requestNextPage()

M module-gui/gui/widgets/ListViewEngine.hpp => module-gui/gui/widgets/ListViewEngine.hpp +21 -21
@@ 10,7 10,7 @@ namespace gui
{
    namespace listview
    {
        inline constexpr auto nPos = std::numeric_limits<unsigned int>::max();
        inline constexpr auto nPos = std::numeric_limits<unsigned>::max();

        /// Possible List scrolling directions
        enum class Direction


@@ 59,24 59,24 @@ namespace gui

    struct ListViewScrollSetupData
    {
        const unsigned int storedStartIndex;
        const unsigned int currentPage;
        const unsigned int pagesCount;
        const unsigned storedStartIndex;
        const unsigned currentPage;
        const unsigned pagesCount;
    };

    struct ListViewScrollUpdateData
    {
        const unsigned int startIndex;
        const unsigned int listPageSize;
        const unsigned int elementsCount;
        const unsigned int elementMinimalSpaceRequired;
        const unsigned startIndex;
        const unsigned listPageSize;
        const unsigned elementsCount;
        const unsigned elementMinimalSpaceRequired;
        const listview::Direction direction;
        const Boundaries boundaries;
    };

    class ListItemProvider;

    using rebuildRequest = std::pair<listview::RebuildType, unsigned int>;
    using rebuildRequest = std::pair<listview::RebuildType, unsigned>;

    class ListViewEngine
    {


@@ 85,15 85,15 @@ namespace gui
        virtual ~ListViewEngine();

        /// First requested index from provider
        unsigned int startIndex = 0;
        unsigned startIndex = 0;
        void setStartIndex();
        /// Recalculating startIndex if list internal conditions (i.e. size has changed).
        void recalculateStartIndex();
        /// Calculate max items on page based on provided minimal item in axis size from provider.
        /// That method is used when full list render can be omitted.
        unsigned int calculateMaxItemsOnPage();
        unsigned calculateMaxItemsOnPage();
        /// Calculates request elements count to full next request page with small excess
        unsigned int calculateLimit(listview::Direction value = listview::Direction::Bottom);
        unsigned calculateLimit(listview::Direction value = listview::Direction::Bottom);
        /// Recalculate startIndex on body resize requests
        void recalculateOnBoxRequestedResize();



@@ 105,13 105,13 @@ namespace gui
        void fillFirstPage();

        /// Stored index of focused element before new data request
        unsigned int storedFocusIndex = listview::nPos;
        [[nodiscard]] unsigned int getFocusItemIndex();
        unsigned storedFocusIndex = listview::nPos;
        [[nodiscard]] unsigned getFocusItemIndex();

        /// Total provider elements count
        unsigned int elementsCount = listview::nPos;
        void setElementsCount(unsigned int count);
        void onElementsCountChanged(unsigned int count);
        void setElementsCount(unsigned count);
        void onElementsCountChanged(unsigned count);
        bool shouldCallEmptyListCallbacks = false;
        void checkEmptyListCallbacks();



@@ 119,7 119,7 @@ namespace gui
        std::shared_ptr<ListItemProvider> provider = nullptr;

        /// Count of elements displayed on current page
        unsigned int currentPageSize = 0;
        unsigned currentPageSize = 0;
        /// Flag indicating that page has been loaded
        bool pageLoaded = true;
        /// Handle focusing method


@@ 145,11 145,11 @@ namespace gui
        /// Stored last executed rebuildRequest
        rebuildRequest lastRebuildRequest = {listview::RebuildType::Full, 0};
        /// Setup method for list rebuild request
        void setup(listview::RebuildType rebuildType, unsigned int dataOffset = 0);
        void setup(listview::RebuildType rebuildType, unsigned dataOffset = 0);
        void prepareFullRebuild();
        void prepareOnOffsetRebuild(unsigned int dataOffset);
        void prepareOnOffsetRebuild(unsigned dataOffset);
        void prepareInPlaceRebuild();
        void prepareOnPageElementRebuild(unsigned int dataOffset);
        void prepareOnPageElementRebuild(unsigned dataOffset);

        /// List boundaries types
        Boundaries boundaries = Boundaries::Fixed;


@@ 179,7 179,7 @@ namespace gui

        /// send list rebuild request
        void rebuildList(listview::RebuildType rebuildType = listview::RebuildType::Full,
                         unsigned int dataOffset           = 0,
                         unsigned dataOffset               = 0,
                         bool forceRebuild                 = false);
        /// In case of elements count change there can be a need to resend request in case of having one async query for
        /// count and records.