Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

skin_engine: Allow the %St() (setting) skin tag be used as a bar

%St(<setting name>) or %St(<bar tags>, setting, <setting name>)

Change-Id: I71396d683634d4d1ad2357018c4029ecb4229677

+73 -2
+25
apps/gui/option_select.c
··· 575 575 return false; 576 576 } 577 577 578 + int get_setting_info_for_bar(int setting_id, int *count, int *val) 579 + { 580 + const struct settings_list *setting = &settings[setting_id]; 581 + int var_type = setting->flags&F_T_MASK; 582 + void (*function)(int) = NULL; 583 + int oldvalue; 584 + 585 + if (var_type == F_T_INT || var_type == F_T_UINT) 586 + { 587 + oldvalue = *(int*)setting->setting; 588 + } 589 + else if (var_type == F_T_BOOL) 590 + { 591 + oldvalue = *(bool*)setting->setting?1:0; 592 + } 593 + else 594 + { 595 + *val = 0; 596 + *count = 1; 597 + return false; /* only int/bools can go here */ 598 + } 599 + 600 + val_to_selection(setting, oldvalue, count, val, &function); 601 + return true; 602 + }
+2
apps/gui/option_select.h
··· 48 48 /* only use this for int and bool settings */ 49 49 int option_value_as_int(const struct settings_list *setting); 50 50 51 + int get_setting_info_for_bar(int setting_id, int *count, int *val); 52 + 51 53 #endif /* _GUI_OPTION_SELECT_H_ */
+8
apps/gui/skin_engine/skin_display.c
··· 44 44 #include "audio.h" 45 45 #include "tagcache.h" 46 46 #include "list.h" 47 + #include "option_select.h" 47 48 48 49 #ifdef HAVE_LCD_BITMAP 49 50 #include "peakmeter.h" ··· 144 145 skinlist_get_scrollbar(&val, &min, &max); 145 146 end = val - min; 146 147 length = max - min; 148 + } 149 + else if (pb->type == SKIN_TOKEN_SETTINGBAR) 150 + { 151 + int val, count; 152 + get_setting_info_for_bar(pb->setting_id, &count, &val); 153 + length = count - 1; 154 + end = val; 147 155 } 148 156 #if CONFIG_TUNER 149 157 else if (in_radio_screen() || (get_radio_status() != FMRADIO_OFF))
+27
apps/gui/skin_engine/skin_parser.c
··· 736 736 737 737 #endif /* HAVE_LCD_BITMAP */ 738 738 739 + static int parse_progressbar_tag(struct skin_element* element, 740 + struct wps_token *token, 741 + struct wps_data *wps_data); 742 + 739 743 static int parse_setting_and_lang(struct skin_element *element, 740 744 struct wps_token *token, 741 745 struct wps_data *wps_data) ··· 757 761 return WPS_ERROR_INVALID_PARAM; 758 762 #endif 759 763 } 764 + else if (element->params_count > 1) 765 + { 766 + if (element->params_count > 4) 767 + return parse_progressbar_tag(element, token, wps_data); 768 + else 769 + return WPS_ERROR_INVALID_PARAM; 770 + } 760 771 else 761 772 { 762 773 #ifndef __PCTOOL__ ··· 891 902 pb->image = PTRTOSKINOFFSET(skin_buffer, NULL); 892 903 pb->slider = PTRTOSKINOFFSET(skin_buffer, NULL); 893 904 pb->backdrop = PTRTOSKINOFFSET(skin_buffer, NULL); 905 + pb->setting_id = -1; 894 906 pb->invert_fill_direction = false; 895 907 pb->horizontal = true; 896 908 ··· 1015 1027 else if (!strcmp(text, "notouch")) 1016 1028 suppress_touchregion = true; 1017 1029 #endif 1030 + else if (token->type == SKIN_TOKEN_SETTING && !strcmp(text, "setting")) 1031 + { 1032 + if (curr_param+1 < element->params_count) 1033 + { 1034 + curr_param++; 1035 + param++; 1036 + text = SKINOFFSETTOPTR(skin_buffer, param->data.text); 1037 + #ifndef __PCTOOL__ 1038 + if (find_setting_by_cfgname(text, &pb->setting_id) == NULL) 1039 + return WPS_ERROR_INVALID_PARAM; 1040 + #endif 1041 + } 1042 + } 1018 1043 else if (curr_param == 4) 1019 1044 image_filename = text; 1020 1045 ··· 1060 1085 token->type = SKIN_TOKEN_PEAKMETER_RIGHTBAR; 1061 1086 else if (token->type == SKIN_TOKEN_LIST_NEEDS_SCROLLBAR) 1062 1087 token->type = SKIN_TOKEN_LIST_SCROLLBAR; 1088 + else if (token->type == SKIN_TOKEN_SETTING) 1089 + token->type = SKIN_TOKEN_SETTINGBAR; 1063 1090 pb->type = token->type; 1064 1091 1065 1092 #ifdef HAVE_TOUCHSCREEN
+1
apps/gui/skin_engine/skin_render.c
··· 209 209 #endif 210 210 case SKIN_TOKEN_VOLUMEBAR: 211 211 case SKIN_TOKEN_BATTERY_PERCENTBAR: 212 + case SKIN_TOKEN_SETTINGBAR: 212 213 #ifdef HAVE_LCD_BITMAP 213 214 case SKIN_TOKEN_PROGRESSBAR: 214 215 case SKIN_TOKEN_TUNER_RSSI_BAR:
+2
apps/gui/skin_engine/wps_internals.h
··· 112 112 OFFSETTYPE(struct gui_img *) slider; 113 113 bool horizontal; 114 114 OFFSETTYPE(struct gui_img *) backdrop; 115 + int setting_id; /* for the setting bar type */ 116 + 115 117 }; 116 118 117 119 struct draw_rectangle {
+3 -2
lib/skin_parser/tag_table.c
··· 211 211 { SKIN_TOKEN_VIEWPORT_LOAD, "V" , "IIiii", 0 }, 212 212 213 213 { SKIN_TOKEN_IMAGE_BACKDROP, "X" , "f", SKIN_REFRESH_STATIC|NOBREAK }, 214 - 215 - { SKIN_TOKEN_SETTING, "St" , "S", SKIN_REFRESH_DYNAMIC }, 214 + /* This uses the bar tag params also but the first item can be a string 215 + * and we don't allow no params. */ 216 + { SKIN_TOKEN_SETTING, "St" , "[Si]|iiis*", SKIN_REFRESH_DYNAMIC }, 216 217 { SKIN_TOKEN_TRANSLATEDSTRING, "Sx" , "S", SKIN_REFRESH_STATIC }, 217 218 { SKIN_TOKEN_LANG_IS_RTL, "Sr" , "", SKIN_REFRESH_STATIC }, 218 219
+1
lib/skin_parser/tag_table.h
··· 246 246 247 247 /* Setting option */ 248 248 SKIN_TOKEN_SETTING, 249 + SKIN_TOKEN_SETTINGBAR, 249 250 SKIN_TOKEN_CURRENT_SCREEN, 250 251 SKIN_TOKEN_LANG_IS_RTL, 251 252
+4
manual/appendix/wps_tags.tex
··· 360 360 \config{\%St(<setting\tabnlindent{}name>)} & The value of the Rockbox 361 361 setting with the specified name. See \reference{ref:config_file_options} 362 362 for the list of the available settings.\\ 363 + \config{\%St(...)} & Draw a bar using from the setting. 364 + See \reference{ref:bar_tags} for details.\\ 363 365 \end{tagmap} 364 366 365 367 Examples: ··· 715 717 \opt{touchscreen}{ 716 718 \item[notouch] -- don't create the touchregion for progress/volume bars. 717 719 } 720 + \item[setting] -- Specify the setting name to draw the bar from (bar must be 721 + \%St type), the next param is the settings config name. 718 722 \end{description} 719 723 720 724 Example: \config{\%pb(0,0,-,-,-,nofill, slider, slider\_image, invert)} -- draw