summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine/skin_display.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/skin_engine/skin_display.c')
-rw-r--r--apps/gui/skin_engine/skin_display.c95
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
134static void draw_progressbar(struct gui_wps *gwps, 135static 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
495struct 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