跳转至

lib/graphic/widget/menu/icontext_menu.h

Icon-text menu widget for scrollable menu display. More...

Classes

Name
struct CFBD_IconTextMenuItem
struct _CFBD_IconTextMenuOps
Operation table for icon-text menu.
struct _CFBD_IconTextMenu

Detailed Description

Icon-text menu widget for scrollable menu display.

Provides a horizontal scrollable menu widget optimized for small displays, featuring icon+text menu items with smooth scrolling animation and gesture-based navigation.

Source code

#pragma once
#include <stddef.h>
#include <stdint.h>

#include "base/point.h"
#include "base/rectangle.h"
#include "base/size.h"
#include "cfbd_define.h"
#include "cfbd_graphic_define.h"
#include "menu_item.h"
#include "widget/animation/animation.h"
#include "widget/base_support/image.h"
#include "widget/text.h"

typedef struct _CFBD_IconTextMenu CFBD_IconTextMenu;

#define CFBD_ICONTEXT_MENU_DEFAULT_ITEM_WIDTH (60)     
#define CFBD_ICONTEXT_MENU_DEFAULT_ITEM_HEIGHT (80)    
#define CFBD_ICONTEXT_MENU_ICON_SIZE (48)              
#define CFBD_ICONTEXT_MENU_ICON_TEXT_GAP (4)           
#define CFBD_ICONTEXT_MENU_TEXT_SIZE ASCII_6x8         
#define CFBD_ICONTEXT_MENU_ANIMATION_DURATION_MS (300) 
#define CFBD_ICONTEXT_MENU_VISIBLE_ITEMS (3)           

typedef enum
{
    CFBD_ICONTEXT_ITEM_NORMAL = 0,  
    CFBD_ICONTEXT_ITEM_FOCUSED = 1, 
    CFBD_ICONTEXT_ITEM_PRESSED = 2, 
    CFBD_ICONTEXT_ITEM_DISABLED = 3 
} CFBD_IconTextMenuItemState;

typedef enum
{
    CFBD_ICONTEXT_SCROLL_LEFT = -1, 
    CFBD_ICONTEXT_SCROLL_RIGHT = 1, 
    CFBD_ICONTEXT_SCROLL_NONE = 0   
} CFBD_IconTextScrollDirection;

typedef struct
{
    const char* label;

    uint8_t* icon_bitmap;

    CFBDGraphicSize icon_size;

    CFBD_IconTextMenuItemState state;

    CFBD_MenuItemCallbackPack callback;

    CFBDGraphic_Point render_position;

    CCGraphic_Image icon_widget;

    CFBDGraphic_Text text_widget;

    void* user_data;
} CFBD_IconTextMenuItem;

typedef struct _CFBD_IconTextMenuOps
{
    CFBD_Bool (*add_item)(CFBD_IconTextMenu* pMenu,
                          const char* label,
                          uint8_t* icon_bitmap,
                          CFBDGraphicSize* icon_size,
                          CFBD_MenuItemCallbackPack* callback);

    void (*scroll)(CFBD_IconTextMenu* pMenu, CFBD_IconTextScrollDirection direction);

    CFBD_Bool (*select_index)(CFBD_IconTextMenu* pMenu, int index);

    void (*activate_current)(CFBD_IconTextMenu* pMenu);

    void (*immediate_draw)(CFBD_IconTextMenu* pMenu);

    CFBD_Bool (*update)(CFBD_IconTextMenu* pMenu, uint32_t delta_ms);

    void (*set_appearance)(CFBD_IconTextMenu* pMenu,
                           uint32_t bg_color,
                           uint32_t highlight_color,
                           uint32_t text_color);

    void (*set_dimensions)(CFBD_IconTextMenu* pMenu,
                           SizeBaseType width,
                           SizeBaseType height,
                           uint16_t spacing);

    CFBD_IconTextMenuItem* (*get_selected_item)(CFBD_IconTextMenu* pMenu);

    CFBD_IconTextMenuItem* (*get_item)(CFBD_IconTextMenu* pMenu, int index);

    void (*set_circular)(CFBD_IconTextMenu* pMenu, CFBD_Bool is_circular);

    void (*animate_scroll)(CFBD_IconTextMenu* pMenu, CFBD_IconTextScrollDirection direction);

    void (*set_selection_border)(CFBD_IconTextMenu* pMenu, uint16_t width);
} CFBD_IconTextMenuOps;

typedef struct _CFBD_IconTextMenu
{
    CFBD_IconTextMenuOps* operations;

    CFBD_IconTextMenuItem* items;

    size_t item_count;

    size_t capacity;

    CFBD_GraphicDevice* device;

    CFBDGraphicRect viewport;

    int selected_index;

    int first_visible_index;

    int16_t scroll_offset;

    int16_t target_scroll_offset;

    CFBD_IconTextScrollDirection scroll_direction;

    CFBD_BaseAnimation scroll_animation;

    SizeBaseType item_width;

    SizeBaseType item_height;

    uint16_t item_spacing;

    CFBD_Bool is_circular;

    CFBD_Bool is_animating;

    int16_t animation_start_offset;

    uint32_t animation_elapsed_ms;

    int16_t prev_scroll_offset;

    uint8_t anim_current_frame;

    uint16_t selection_border_width;
} CFBD_IconTextMenu;

void CFBD_InitIconTextMenu(CFBD_IconTextMenu* pMenu,
                           CFBD_GraphicDevice* device,
                           CFBDGraphicRect* viewport,
                           CFBD_IconTextMenuItem* items_buffer,
                           size_t capacity);

Updated on 2026-02-03 at 13:21:55 +0000