/*
 * Copyright (c) 2009-2021 Arm Limited. All rights reserved.
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the License); you may
 * not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __LIST_VIEW_H__
#define __LIST_VIEW_H__

/*============================ INCLUDES ======================================*/
#include "arm_2d.h"
#include "arm_2d_helper_list.h"
#include "arm_extra_lcd_printf.h"
#include "__common.h"

#ifdef   __cplusplus
extern "C" {
#endif

#if defined(__clang__)
#   pragma clang diagnostic push
#   pragma clang diagnostic ignored "-Wmissing-declarations"
#   pragma clang diagnostic ignored "-Wmicrosoft-anon-tag"
#   pragma clang diagnostic ignored "-Wpadded"
#endif

/*============================ MACROS ========================================*/

/* OOC header, please DO NOT modify  */
#ifdef __NUMBER_LIST_IMPLEMENT__
#   undef   __NUMBER_LIST_IMPLEMENT__
#   define  __ARM_2D_IMPL__
#elif defined(__NUMBER_LIST_INHERIT__)
#   undef   __NUMBER_LIST_INHERIT__
#   define __ARM_2D_INHERIT__
#endif
#include "arm_2d_utils.h"


/*============================ MACROFIED FUNCTIONS ===========================*/
/*============================ TYPES =========================================*/

typedef struct list_view_cfg_t {

    arm_2d_size_t tListSize;

    arm_2d_draw_list_item_handler_t     *fnOnDrawListItemBackground;            /*!< the On-Draw-List-Core-Item-Background event handler */
    arm_2d_helper_draw_handler_t        *fnOnDrawListBackground;                /*!< the On-Draw-List-Core-Background event handler */
    arm_2d_helper_draw_handler_t        *fnOnDrawListCover;                     /*!< the On-Draw-List-Core-Cover event handler */

    __arm_2d_list_item_iterator         *fnIterator;
    __arm_2d_list_region_calculator_t   *fnCalculator;
    arm_2d_list_item_t *ptItems;
    uint16_t hwCount;
    uint16_t hwItemSizeInByte;

    int16_t hwSwitchingPeriodInMs;
    bool bIgnoreBackground;
    uint8_t chOpacity;
    COLOUR_INT tBackgroundColour;
} list_view_cfg_t;


typedef struct list_view_t {
    implement(__arm_2d_list_core_t);

ARM_PRIVATE(
    list_view_cfg_t tListViewCFG;
    
    int32_t nSelection;
    int32_t nIterationIndex;
)

} list_view_t;

/*============================ GLOBAL VARIABLES ==============================*/
/*============================ PROTOTYPES ====================================*/

extern
ARM_NONNULL(1,2)
void list_view_init(list_view_t *ptThis, 
                    list_view_cfg_t *ptCFG);



extern
ARM_NONNULL(1,2)
arm_fsm_rt_t list_view_show(list_view_t *ptThis,
                            const arm_2d_tile_t *ptTile, 
                            const arm_2d_region_t *ptRegion, 
                            bool bIsNewFrame);

extern
ARM_NONNULL(1)
void list_view_move_selection(  list_view_t *ptThis,
                                int16_t iSteps,
                                int32_t nFinishInMs);

#if defined(__clang__)
#   pragma clang diagnostic pop
#endif

#ifdef   __cplusplus
}
#endif

#endif