The monochrome theme of LVGL cannot display the indicator part of the slider widget

What do you want to achieve?

I want to make the local style effect for the indicator part of a slider. Because LVGL’s mono theme can’t display indicator part, i tried to use local styles to make indicator part appear, but the code below doesn’t work:

    lv_obj_set_style_bg_color(slider_fan_speed, lv_color_hex(0xFFFFFF), LV_PART_INDICATOR);
    lv_obj_set_style_bg_opa(slider_fan_speed, LV_OPA_COVER, LV_PART_INDICATOR);

What have you tried so far?

I have done the same thing to the knob part of the same slider, the local style worked well.

Code to reproduce

void fan_slider_event_cb(lv_event_t * e)
{
    uint16_t value = lv_slider_get_value(lv_event_get_target_obj(e));
    fan_set_speed(value); //Control the speed of fan (from 0 to 100%)
}

...

void fan_ui()
{
    lv_theme_t * theme = lv_theme_mono_init(lv_display_get_default(), false, &lv_font_montserrat_20);
    lv_display_set_theme(lv_display_get_default(), theme);

    /*Create a screen*/
    lv_obj_t * scr_fan = lv_obj_create(NULL);

    lv_obj_t * slider_fan_speed = lv_slider_create(scr_fan);
    lv_obj_set_size(slider_fan_speed, LV_PCT(65), LV_PCT(20));
    lv_obj_center(slider_fan_speed);
    lv_obj_add_event_cb(slider_fan_speed, fan_slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
    lv_obj_set_style_bg_color(slider_fan_speed, lv_color_hex(0xFFFFFF), LV_PART_INDICATOR);
    lv_obj_set_style_bg_opa(slider_fan_speed, LV_OPA_COVER, LV_PART_INDICATOR);
    lv_obj_set_style_bg_color(slider_fan_speed, lv_color_hex(0x000000), LV_PART_KNOB);
    lv_obj_set_style_bg_opa(slider_fan_speed, LV_OPA_COVER, LV_PART_KNOB);
    lv_slider_set_range(slider_fan_speed, 0, 100);
    lv_slider_set_value(slider_fan_speed, 0, LV_ANIM_OFF);

    ...

    /*Add items to group_fan*/
    lv_group_t * group_fan = lv_group_create();
    lv_group_add_obj(group_fan, slider_fan_speed);
    lv_group_set_wrap(group_fan, false);
    ...

    lv_screen_load(scr_fan);
}

Screenshot and/or video

Environment

  • LVGL version: 9.3
  • Input device: encoder
  • display device: mono OLED drived by SSD1306

I don’t know why after i have added the sentence below, the indicator part appear:

lv_obj_set_style_radius(slider_fan_speed, LV_RADIUS_CIRCLE, LV_PART_INDICATOR);

This seems to be a bug of slider. Only by adding the following statement will the indicator appear.

lv_obj_set_style_radius(slider_fan_speed, ... , LV_PART_INDICATOR);

:expressionless: