WebView 3.6: better table support, bugfixes

git-svn-id: svn://kolibrios.org@9294 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Kirill Lipatov (Leency) 2021-11-21 11:42:21 +00:00
parent 40ec5cc46e
commit 53fd96fe51
4 changed files with 60 additions and 12 deletions

View File

@ -198,6 +198,7 @@ void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){
//*/ //*/
RenderTextbuf(); RenderTextbuf();
if (debug_mode) { debugch('<'); if(!tag.opened)debugch('/'); debug(#tag.name); debugln(">"); }
$push cur_encoding $push cur_encoding
SetStyle(); SetStyle();
$pop eax $pop eax

View File

@ -71,10 +71,12 @@ void TWebBrowser::RenderTextbuf()
dword lbp = #linebuf; dword lbp = #linebuf;
int br; //break position int br; //break position
char nul = '\0'; char nul = '\0';
int len; unsigned int len;
//Do we need a line break? //Do we need a line break?
if (!linebuf[0]) return;
while (len = strlen(lbp)) && (len * list.font_w + draw_x - left_gap >= draw_w) { while (len = strlen(lbp)) && (len * list.font_w + draw_x - left_gap >= draw_w) {
//Yes, we do. Lets calculate where... //Yes, we do. Lets calculate where...
br = len; br = len;
@ -109,7 +111,9 @@ void TWebBrowser::RenderTextbuf()
RenderLine(lbp); RenderLine(lbp);
} }
} }
debugln("rnd_");
RenderLine(lbp); RenderLine(lbp);
debugln("_rnd");
} }
void TWebBrowser::NewLine() void TWebBrowser::NewLine()

View File

@ -51,7 +51,10 @@ void TWebBrowser::SetStyle()
if (tag.is("title")) { tag_title(); return; } if (tag.is("title")) { tag_title(); return; }
if (tag.is("body")) { tag_body(); return; } if (tag.is("body")) { tag_body(); return; }
if (tag.is("html")) { t_html = tag.opened; return; } if (tag.is("html")) { t_html = tag.opened; return; }
tag_table(); if (tag.is("table")) { tag_table(); return; }
if (tag.is("tr")) { tag_table(); return; }
if (tag.is("th")) { tag_table(); return; }
if (tag.is("td")) { tag_table(); return; }
} }
void TWebBrowser::tag_p() void TWebBrowser::tag_p()
@ -320,8 +323,8 @@ NOIMG:
struct TABLE { struct TABLE {
int count;
int depth; int depth;
collection_int cols; collection_int cols;
} table; } table;
@ -335,6 +338,7 @@ dword tallest_cell_in_row;
void TWebBrowser::tag_table_reset() void TWebBrowser::tag_table_reset()
{ {
table.depth = 0; table.depth = 0;
table.count = 0;
colcount = 0; colcount = 0;
tr_pos = 0; tr_pos = 0;
td_pos = 0; td_pos = 0;
@ -347,11 +351,11 @@ void TWebBrowser::tag_table()
if (link) tag_a(); if (link) tag_a();
style.b = false; style.b = false;
} }
if (tag.is("table")) { if (tag.is("table")) {
if(tag.opened) { if(tag.opened) {
table.depth++; table.depth++;
if (table.depth==1) { if (table.depth==1) {
table.count++;
colcount = 0; colcount = 0;
} }
} else { } else {
@ -379,14 +383,16 @@ void TWebBrowser::tag_table()
} }
colcount = 0; colcount = 0;
} }
if (tag.opened) && (tag.is("td")) || (tag.is("th")) { if (tag.opened) if (tag.is("td")) || (tag.is("th")) {
if (!table.cols.count) { table.cols.add(1); colcount = 0;}
colcount++; colcount++;
if (colcount) table.cols.set(table.cols.count-1, colcount); if (colcount) table.cols.set(table.cols.count-1, colcount);
//if (tag.get_number_of("colspan")) colcount += tag.number-1; //if (tag.get_number_of("colspan")) colcount += tag.number-1;
} }
} else { } else {
if (tag.is("tr")) { if (tag.is("tr")) {
if (tag.opened) { if (tag.opened) {
_TR_FIX:
if (draw_x==left_gap) && (draw_y==BODY_MARGIN) { if (draw_x==left_gap) && (draw_y==BODY_MARGIN) {
row_start_y = tallest_cell_in_row = draw_y; row_start_y = tallest_cell_in_row = draw_y;
} else { } else {
@ -401,18 +407,55 @@ void TWebBrowser::tag_table()
draw_x = left_gap = style.tag_list.level * 5 * list.font_w + BODY_MARGIN; draw_x = left_gap = style.tag_list.level * 5 * list.font_w + BODY_MARGIN;
draw_w = list.w; draw_w = list.w;
} }
if (tr_pos) && (tag.is("td")) || (tag.is("th")) { if (tag.is("td")) || (tag.is("th")) {
if (!tr_pos) goto _TR_FIX;
/*
if (tag.opened) {
if (tag.get_value_of("bgcolor")) {
bg_colors.add(GetColor(tag.value));
} else {
bg_colors.add(bg_colors.get(0));
}
} */
tallest_cell_in_row = math.max(draw_y+style.cur_line_h-list.item_h, tallest_cell_in_row); tallest_cell_in_row = math.max(draw_y+style.cur_line_h-list.item_h, tallest_cell_in_row);
style.cur_line_h = list.item_h; style.cur_line_h = list.item_h;
if (tag.opened) { if (tag.opened) {
draw_w = list.w - BODY_MARGIN - BODY_MARGIN - 23 / table.cols.get(tr_pos-1);
draw_x = left_gap = draw_w * td_pos + BODY_MARGIN; if (!td_pos) {
//debugval(itoa(draw_x), list.w); draw_x = left_gap = BODY_MARGIN;
} else {
draw_x = left_gap = left_gap + draw_w;
}
draw_w = list.w - BODY_MARGIN - 23 - left_gap;
if (EAX = table.cols.get(tr_pos-1)-td_pos) draw_w /= EAX; else {
draw_y = row_start_y;
draw_x = left_gap = BODY_MARGIN;
}
if (table.cols.get(tr_pos-1)-td_pos>1) && (tag.get_number_of("width")) {
if (strchr(tag.value, '%')) {
tag.number = list.w - BODY_MARGIN - 23 - left_gap * tag.number / 100;
}
if (tag.number < draw_w) draw_w = tag.number;
}
draw_y = row_start_y; draw_y = row_start_y;
//canvas.WriteText(draw_x, draw_y, 10001001b, 0x0000FE, itoa(draw_x), NULL); //canvas.WriteText(draw_x, draw_y, 10001001b, 0x0000FE, itoa(draw_x), NULL);
td_pos++; td_pos++;
} }
} }
} }
if (draw_x > list.w) {
draw_x = left_gap = BODY_MARGIN;
draw_w = list.w - BODY_MARGIN - 23 - left_gap;
table.depth = 0;
NewLine();
if (debug_mode) {
debugln("anomaly draw_x");
canvas.DrawBar(0, draw_y, 20, 20, 0xFF0000);
}
}
} }

View File

@ -107,4 +107,4 @@ char editbox_icons[] = FROM "res/editbox_icons.raw";
#define DEFAULT_URL URL_SERVICE_HOMEPAGE #define DEFAULT_URL URL_SERVICE_HOMEPAGE
char version[]="WebView 3.52c"; char version[]="WebView 3.6";