diff options
Diffstat (limited to 'apps/gui/skin_engine/skin_display.c')
-rw-r--r-- | apps/gui/skin_engine/skin_display.c | 95 |
1 files changed, 56 insertions, 39 deletions
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index 9f310073cb..1e88863307 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c | |||
@@ -100,8 +100,9 @@ bool gui_wps_display(struct gui_wps *gwps) | |||
100 | #if LCD_DEPTH > 1 | 100 | #if LCD_DEPTH > 1 |
101 | if (display->depth > 1) | 101 | if (display->depth > 1) |
102 | { | 102 | { |
103 | gwps->data->viewports[0].vp.fg_pattern = display->get_foreground(); | 103 | struct viewport *vp = &find_viewport(VP_DEFAULT_LABEL, gwps->data)->vp; |
104 | gwps->data->viewports[0].vp.bg_pattern = display->get_background(); | 104 | vp->fg_pattern = display->get_foreground(); |
105 | vp->bg_pattern = display->get_background(); | ||
105 | } | 106 | } |
106 | #endif | 107 | #endif |
107 | display->clear_display(); | 108 | display->clear_display(); |
@@ -132,7 +133,7 @@ bool skin_update(struct gui_wps *gwps, unsigned int update_type) | |||
132 | #ifdef HAVE_LCD_BITMAP | 133 | #ifdef HAVE_LCD_BITMAP |
133 | 134 | ||
134 | static void draw_progressbar(struct gui_wps *gwps, | 135 | static void draw_progressbar(struct gui_wps *gwps, |
135 | struct wps_viewport *wps_vp) | 136 | struct skin_viewport *wps_vp) |
136 | { | 137 | { |
137 | struct screen *display = gwps->display; | 138 | struct screen *display = gwps->display; |
138 | struct wps_state *state = gwps->state; | 139 | struct wps_state *state = gwps->state; |
@@ -490,6 +491,19 @@ struct gui_img* find_image(int n, struct wps_data *data) | |||
490 | return NULL; | 491 | return NULL; |
491 | } | 492 | } |
492 | #endif | 493 | #endif |
494 | |||
495 | struct skin_viewport* find_viewport(char label, struct wps_data *data) | ||
496 | { | ||
497 | struct skin_token_list *list = data->viewports; | ||
498 | while (list) | ||
499 | { | ||
500 | struct skin_viewport *vp = (struct skin_viewport *)list->token->value.data; | ||
501 | if (vp->label == label) | ||
502 | return vp; | ||
503 | list = list->next; | ||
504 | } | ||
505 | return NULL; | ||
506 | } | ||
493 | 507 | ||
494 | 508 | ||
495 | /* Read a (sub)line to the given alignment format buffer. | 509 | /* Read a (sub)line to the given alignment format buffer. |
@@ -590,18 +604,13 @@ static bool get_line(struct gui_wps *gwps, | |||
590 | case WPS_VIEWPORT_ENABLE: | 604 | case WPS_VIEWPORT_ENABLE: |
591 | { | 605 | { |
592 | char label = data->tokens[i].value.i; | 606 | char label = data->tokens[i].value.i; |
593 | int j; | ||
594 | char temp = VP_DRAW_HIDEABLE; | 607 | char temp = VP_DRAW_HIDEABLE; |
595 | for(j=0;j<data->num_viewports;j++) | 608 | struct skin_viewport *vp = find_viewport(label, data); |
609 | if (vp) | ||
596 | { | 610 | { |
597 | temp = VP_DRAW_HIDEABLE; | 611 | if (vp->hidden_flags&VP_DRAW_WASHIDDEN) |
598 | if ((data->viewports[j].hidden_flags&VP_DRAW_HIDEABLE) && | 612 | temp |= VP_DRAW_WASHIDDEN; |
599 | (data->viewports[j].label == label)) | 613 | vp->hidden_flags = temp; |
600 | { | ||
601 | if (data->viewports[j].hidden_flags&VP_DRAW_WASHIDDEN) | ||
602 | temp |= VP_DRAW_WASHIDDEN; | ||
603 | data->viewports[j].hidden_flags = temp; | ||
604 | } | ||
605 | } | 614 | } |
606 | } | 615 | } |
607 | break; | 616 | break; |
@@ -926,7 +935,7 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode) | |||
926 | if (!id3) | 935 | if (!id3) |
927 | return false; | 936 | return false; |
928 | 937 | ||
929 | int v, line, i, subline_idx; | 938 | int line, i, subline_idx; |
930 | unsigned flags; | 939 | unsigned flags; |
931 | char linebuf[MAX_PATH]; | 940 | char linebuf[MAX_PATH]; |
932 | 941 | ||
@@ -953,7 +962,7 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode) | |||
953 | /* reset to first subline if refresh all flag is set */ | 962 | /* reset to first subline if refresh all flag is set */ |
954 | if (refresh_mode == WPS_REFRESH_ALL) | 963 | if (refresh_mode == WPS_REFRESH_ALL) |
955 | { | 964 | { |
956 | display->set_viewport(&data->viewports[0].vp); | 965 | display->set_viewport(&find_viewport(VP_DEFAULT_LABEL, data)->vp); |
957 | display->clear_viewport(); | 966 | display->clear_viewport(); |
958 | 967 | ||
959 | for (i = 0; i <= data->num_lines; i++) | 968 | for (i = 0; i <= data->num_lines; i++) |
@@ -971,21 +980,28 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode) | |||
971 | #endif | 980 | #endif |
972 | 981 | ||
973 | /* disable any viewports which are conditionally displayed */ | 982 | /* disable any viewports which are conditionally displayed */ |
974 | for (v = 0; v < data->num_viewports; v++) | 983 | struct skin_token_list *viewport_list; |
984 | for (viewport_list = data->viewports; | ||
985 | viewport_list; viewport_list = viewport_list->next) | ||
975 | { | 986 | { |
976 | if (data->viewports[v].hidden_flags&VP_DRAW_HIDEABLE) | 987 | struct skin_viewport *skin_viewport = |
988 | (struct skin_viewport *)viewport_list->token->value.data; | ||
989 | if (skin_viewport->hidden_flags&VP_DRAW_HIDEABLE) | ||
977 | { | 990 | { |
978 | if (data->viewports[v].hidden_flags&VP_DRAW_HIDDEN) | 991 | if (skin_viewport->hidden_flags&VP_DRAW_HIDDEN) |
979 | data->viewports[v].hidden_flags |= VP_DRAW_WASHIDDEN; | 992 | skin_viewport->hidden_flags |= VP_DRAW_WASHIDDEN; |
980 | else | 993 | else |
981 | data->viewports[v].hidden_flags |= VP_DRAW_HIDDEN; | 994 | skin_viewport->hidden_flags |= VP_DRAW_HIDDEN; |
982 | } | 995 | } |
983 | } | 996 | } |
984 | for (v = 0; v < data->num_viewports; v++) | 997 | |
998 | for (viewport_list = data->viewports; | ||
999 | viewport_list; viewport_list = viewport_list->next) | ||
985 | { | 1000 | { |
986 | struct wps_viewport *wps_vp = &(data->viewports[v]); | 1001 | struct skin_viewport *skin_viewport = |
1002 | (struct skin_viewport *)viewport_list->token->value.data; | ||
987 | unsigned vp_refresh_mode = refresh_mode; | 1003 | unsigned vp_refresh_mode = refresh_mode; |
988 | display->set_viewport(&wps_vp->vp); | 1004 | display->set_viewport(&skin_viewport->vp); |
989 | 1005 | ||
990 | #ifdef HAVE_LCD_BITMAP | 1006 | #ifdef HAVE_LCD_BITMAP |
991 | /* Set images to not to be displayed */ | 1007 | /* Set images to not to be displayed */ |
@@ -998,27 +1014,27 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode) | |||
998 | } | 1014 | } |
999 | #endif | 1015 | #endif |
1000 | /* dont redraw the viewport if its disabled */ | 1016 | /* dont redraw the viewport if its disabled */ |
1001 | if ((wps_vp->hidden_flags&VP_DRAW_HIDDEN)) | 1017 | if ((skin_viewport->hidden_flags&VP_DRAW_HIDDEN)) |
1002 | { | 1018 | { |
1003 | if (!(wps_vp->hidden_flags&VP_DRAW_WASHIDDEN)) | 1019 | if (!(skin_viewport->hidden_flags&VP_DRAW_WASHIDDEN)) |
1004 | display->scroll_stop(&wps_vp->vp); | 1020 | display->scroll_stop(&skin_viewport->vp); |
1005 | wps_vp->hidden_flags |= VP_DRAW_WASHIDDEN; | 1021 | skin_viewport->hidden_flags |= VP_DRAW_WASHIDDEN; |
1006 | continue; | 1022 | continue; |
1007 | } | 1023 | } |
1008 | else if (((wps_vp->hidden_flags& | 1024 | else if (((skin_viewport->hidden_flags& |
1009 | (VP_DRAW_WASHIDDEN|VP_DRAW_HIDEABLE)) | 1025 | (VP_DRAW_WASHIDDEN|VP_DRAW_HIDEABLE)) |
1010 | == (VP_DRAW_WASHIDDEN|VP_DRAW_HIDEABLE))) | 1026 | == (VP_DRAW_WASHIDDEN|VP_DRAW_HIDEABLE))) |
1011 | { | 1027 | { |
1012 | vp_refresh_mode = WPS_REFRESH_ALL; | 1028 | vp_refresh_mode = WPS_REFRESH_ALL; |
1013 | wps_vp->hidden_flags = VP_DRAW_HIDEABLE; | 1029 | skin_viewport->hidden_flags = VP_DRAW_HIDEABLE; |
1014 | } | 1030 | } |
1015 | if (vp_refresh_mode == WPS_REFRESH_ALL) | 1031 | if (vp_refresh_mode == WPS_REFRESH_ALL) |
1016 | { | 1032 | { |
1017 | display->clear_viewport(); | 1033 | display->clear_viewport(); |
1018 | } | 1034 | } |
1019 | 1035 | ||
1020 | for (line = wps_vp->first_line; | 1036 | for (line = skin_viewport->first_line; |
1021 | line <= wps_vp->last_line; line++) | 1037 | line <= skin_viewport->last_line; line++) |
1022 | { | 1038 | { |
1023 | memset(linebuf, 0, sizeof(linebuf)); | 1039 | memset(linebuf, 0, sizeof(linebuf)); |
1024 | update_line = false; | 1040 | update_line = false; |
@@ -1044,8 +1060,8 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode) | |||
1044 | /* the peakmeter should be alone on its line */ | 1060 | /* the peakmeter should be alone on its line */ |
1045 | update_line = false; | 1061 | update_line = false; |
1046 | 1062 | ||
1047 | int h = font_get(wps_vp->vp.font)->height; | 1063 | int h = font_get(skin_viewport->vp.font)->height; |
1048 | int peak_meter_y = (line - wps_vp->first_line)* h; | 1064 | int peak_meter_y = (line - skin_viewport->first_line)* h; |
1049 | 1065 | ||
1050 | /* The user might decide to have the peak meter in the last | 1066 | /* The user might decide to have the peak meter in the last |
1051 | line so that it is only displayed if no status bar is | 1067 | line so that it is only displayed if no status bar is |
@@ -1082,17 +1098,18 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode) | |||
1082 | viewport there will be a blank line. | 1098 | viewport there will be a blank line. |
1083 | To get around this we dont allow any actual drawing to happen in the | 1099 | To get around this we dont allow any actual drawing to happen in the |
1084 | deault vp if other vp's are defined */ | 1100 | deault vp if other vp's are defined */ |
1085 | ((data->num_viewports>1 && v!=0) || data->num_viewports == 1)) | 1101 | ((skin_viewport->label != VP_DEFAULT_LABEL && viewport_list->next) || |
1102 | !viewport_list->next)) | ||
1086 | { | 1103 | { |
1087 | if (flags & WPS_REFRESH_SCROLL) | 1104 | if (flags & WPS_REFRESH_SCROLL) |
1088 | { | 1105 | { |
1089 | /* if the line is a scrolling one we don't want to update | 1106 | /* if the line is a scrolling one we don't want to update |
1090 | too often, so that it has the time to scroll */ | 1107 | too often, so that it has the time to scroll */ |
1091 | if ((vp_refresh_mode & WPS_REFRESH_SCROLL) || new_subline_refresh) | 1108 | if ((vp_refresh_mode & WPS_REFRESH_SCROLL) || new_subline_refresh) |
1092 | write_line(display, &align, line - wps_vp->first_line, true); | 1109 | write_line(display, &align, line - skin_viewport->first_line, true); |
1093 | } | 1110 | } |
1094 | else | 1111 | else |
1095 | write_line(display, &align, line - wps_vp->first_line, false); | 1112 | write_line(display, &align, line - skin_viewport->first_line, false); |
1096 | } | 1113 | } |
1097 | } | 1114 | } |
1098 | 1115 | ||
@@ -1100,13 +1117,13 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode) | |||
1100 | /* progressbar */ | 1117 | /* progressbar */ |
1101 | if (vp_refresh_mode & WPS_REFRESH_PLAYER_PROGRESS) | 1118 | if (vp_refresh_mode & WPS_REFRESH_PLAYER_PROGRESS) |
1102 | { | 1119 | { |
1103 | if (wps_vp->pb) | 1120 | if (skin_viewport->pb) |
1104 | { | 1121 | { |
1105 | draw_progressbar(gwps, wps_vp); | 1122 | draw_progressbar(gwps, skin_viewport); |
1106 | } | 1123 | } |
1107 | } | 1124 | } |
1108 | /* Now display any images in this viewport */ | 1125 | /* Now display any images in this viewport */ |
1109 | wps_display_images(gwps, &wps_vp->vp); | 1126 | wps_display_images(gwps, &skin_viewport->vp); |
1110 | #endif | 1127 | #endif |
1111 | } | 1128 | } |
1112 | 1129 | ||