(view);
+ if (table)
+ {
+ table->setTexture(file);
+
+ return;
}
}
@@ -433,10 +444,9 @@ namespace NLGUI
{
if (pVT)
{
- pVT->setFontSize(style.FontSize);
pVT->setColor(style.TextColor);
pVT->setFontName(style.FontFamily);
- pVT->setFontSize(style.FontSize);
+ pVT->setFontSize(style.FontSize, false);
pVT->setEmbolden(style.FontWeight >= FONT_WEIGHT_BOLD);
pVT->setOblique(style.FontOblique);
pVT->setUnderlined(style.Underlined);
@@ -697,7 +707,7 @@ namespace NLGUI
}
// Add a image download request in the multi_curl
- void CGroupHTML::addImageDownload(const string &url, CViewBase *img, const CStyleParams &style, TImageType type)
+ void CGroupHTML::addImageDownload(const string &url, CViewBase *img, const CStyleParams &style, TImageType type, const std::string &placeholder)
{
std::string finalUrl;
img->setModulateGlobalColor(style.GlobalColor);
@@ -723,8 +733,7 @@ namespace NLGUI
std::string temp = dest;
if (!CFile::fileExists(temp))
{
- // TODO: placeholder
- temp = "web_del.tga";
+ temp = placeholder;
}
setImage(img, temp, type);
setImageSize(img, style);
@@ -1144,8 +1153,10 @@ namespace NLGUI
case HTML_STRONG: renderPseudoElement(":before", elm); break;
case HTML_STYLE: htmlSTYLE(elm); break;
case HTML_TABLE: htmlTABLE(elm); break;
+ case HTML_TBODY: renderPseudoElement(":before", elm); break;
case HTML_TD: htmlTD(elm); break;
case HTML_TEXTAREA: htmlTEXTAREA(elm); break;
+ case HTML_TFOOT: renderPseudoElement(":before", elm); break;
case HTML_TH: htmlTH(elm); break;
case HTML_TITLE: htmlTITLE(elm); break;
case HTML_TR: htmlTR(elm); break;
@@ -1206,7 +1217,9 @@ namespace NLGUI
case HTML_STYLE: htmlSTYLEend(elm); break;
case HTML_TABLE: htmlTABLEend(elm); break;
case HTML_TD: htmlTDend(elm); break;
+ case HTML_TBODY: renderPseudoElement(":after", elm); break;
case HTML_TEXTAREA: htmlTEXTAREAend(elm); break;
+ case HTML_TFOOT: renderPseudoElement(":after", elm); break;
case HTML_TH: htmlTHend(elm); break;
case HTML_TITLE: htmlTITLEend(elm); break;
case HTML_TR: htmlTRend(elm); break;
@@ -1493,6 +1506,9 @@ namespace NLGUI
initImageDownload();
initBnpDownload();
+
+ // setup default browser style
+ setProperty("browser_css_file", "browser.css");
}
// ***************************************************************************
@@ -1771,6 +1787,11 @@ namespace NLGUI
{
return toString( _TimeoutValue );
}
+ else
+ if( name == "browser_css_file" )
+ {
+ return _BrowserCssFile;
+ }
else
return CGroupScrollText::getProperty( name );
}
@@ -2144,6 +2165,24 @@ namespace NLGUI
_TimeoutValue = d;
return;
}
+ else
+ if( name == "browser_css_file")
+ {
+ _BrowserStyle.reset();
+ _BrowserCssFile = value;
+ if (!_BrowserCssFile.empty())
+ {
+ std::string filename = CPath::lookup(_BrowserCssFile, false, true, true);
+ if (!filename.empty())
+ {
+ NLMISC::CSString css;
+ if (css.readFromFile(filename))
+ {
+ _BrowserStyle.parseStylesheet(css);
+ }
+ }
+ }
+ }
else
CGroupScrollText::setProperty( name, value );
}
@@ -2217,6 +2256,7 @@ namespace NLGUI
xmlSetProp( node, BAD_CAST "browse_redo", BAD_CAST _BrowseRedoButton.c_str() );
xmlSetProp( node, BAD_CAST "browse_refresh", BAD_CAST _BrowseRefreshButton.c_str() );
xmlSetProp( node, BAD_CAST "timeout", BAD_CAST toString( _TimeoutValue ).c_str() );
+ xmlSetProp( node, BAD_CAST "browser_css_file", BAD_CAST _BrowserCssFile.c_str() );
return node;
}
@@ -2400,6 +2440,12 @@ namespace NLGUI
if(ptr)
fromString((const char*)ptr, _TimeoutValue);
+ ptr = xmlGetProp (cur, (xmlChar*)"browser_css_file");
+ if (ptr)
+ {
+ setProperty("browser_css_file", (const char *)ptr);
+ }
+
return true;
}
@@ -2597,31 +2643,49 @@ namespace NLGUI
// Keep this char ?
bool keep = true;
+ // char is between table elements
+ // TODO: only whitespace is handled, text is added to either TD, or after TABLE (should be before)
+ bool tableWhitespace = getTable() && (_Cells.empty() || _Cells.back() == NULL);
+
switch (input)
{
// Return / tab only in mode
case '\t':
case '\n':
{
- // Get the last char
- ucchar lastChar = lastCharParam;
- if (lastChar == 0)
- lastChar = getLastChar();
- keep = ((lastChar != (ucchar)' ') &&
- (lastChar != 0)) || getPRE() || (_CurrentViewImage && (lastChar == 0));
- if(!getPRE())
- input = ' ';
+ if (tableWhitespace)
+ {
+ keep = false;
+ }
+ else
+ {
+ // Get the last char
+ ucchar lastChar = lastCharParam;
+ if (lastChar == 0)
+ lastChar = getLastChar();
+ keep = ((lastChar != (ucchar)' ') &&
+ (lastChar != 0)) || getPRE() || (_CurrentViewImage && (lastChar == 0));
+ if(!getPRE())
+ input = ' ';
+ }
}
break;
case ' ':
{
- // Get the last char
- ucchar lastChar = lastCharParam;
- if (lastChar == 0)
- lastChar = getLastChar();
- keep = ((lastChar != (ucchar)' ') &&
- (lastChar != (ucchar)'\n') &&
- (lastChar != 0)) || getPRE() || (_CurrentViewImage && (lastChar == 0));
+ if (tableWhitespace)
+ {
+ keep = false;
+ }
+ else
+ {
+ // Get the last char
+ ucchar lastChar = lastCharParam;
+ if (lastChar == 0)
+ lastChar = getLastChar();
+ keep = ((lastChar != (ucchar)' ') &&
+ (lastChar != (ucchar)'\n') &&
+ (lastChar != 0)) || getPRE() || (_CurrentViewImage && (lastChar == 0));
+ }
}
break;
case 0xd:
@@ -3407,6 +3471,7 @@ namespace NLGUI
CViewBitmap *bitmap = dynamic_cast (view);
if (bitmap)
{
+ // TODO: background color should have separate bitmap from background texture
// Change the background color
bitmap->setColor (bgcolor);
bitmap->setModulateGlobalColor(false);
@@ -3429,6 +3494,7 @@ namespace NLGUI
bitmap->setPosRef(Hotspot_TL);
bitmap->setX(0);
bitmap->setY(0);
+ // FIXME: renders behind container background
bitmap->setRenderLayer(-2);
bitmap->setScale(scale);
bitmap->setTile(tile);
@@ -3439,7 +3505,7 @@ namespace NLGUI
else
bitmap->setSizeRef("");
- addImageDownload(bgtex, view);
+ addImageDownload(bgtex, view, CStyleParams(), TImageType::NormalImage, "");
}
}
}
@@ -4924,49 +4990,7 @@ namespace NLGUI
_WaitingForStylesheet = false;
_StylesheetQueue.clear();
_Style.reset();
-
- std::string css;
-
- // TODO: browser css
- css += "html { background-color: " + getRGBAString(BgColor) + "; color: " + getRGBAString(TextColor) + "; font-size: " + toString(TextFontSize) + "px;}";
- css += "a { color: " + getRGBAString(LinkColor) + "; text-decoration: underline; -ryzom-modulate-color: "+toString(LinkColorGlobalColor)+";}";
- css += "h1 { color: " + getRGBAString(H1Color) + "; font-size: "+ toString("%d", H1FontSize) + "px; -ryzom-modulate-color: "+toString(H1ColorGlobalColor)+";}";
- css += "h2 { color: " + getRGBAString(H2Color) + "; font-size: "+ toString("%d", H2FontSize) + "px; -ryzom-modulate-color: "+toString(H2ColorGlobalColor)+";}";
- css += "h3 { color: " + getRGBAString(H3Color) + "; font-size: "+ toString("%d", H3FontSize) + "px; -ryzom-modulate-color: "+toString(H3ColorGlobalColor)+";}";
- css += "h4 { color: " + getRGBAString(H4Color) + "; font-size: "+ toString("%d", H4FontSize) + "px; -ryzom-modulate-color: "+toString(H4ColorGlobalColor)+";}";
- css += "h5 { color: " + getRGBAString(H5Color) + "; font-size: "+ toString("%d", H5FontSize) + "px; -ryzom-modulate-color: "+toString(H5ColorGlobalColor)+";}";
- css += "h6 { color: " + getRGBAString(H6Color) + "; font-size: "+ toString("%d", H6FontSize) + "px; -ryzom-modulate-color: "+toString(H6ColorGlobalColor)+";}";
- css += "input[type=\"text\"] { color: " + getRGBAString(TextColor) + "; font-size: " + toString("%d", TextFontSize) + "px; font-weight: normal; text-shadow: 1px 1px #000;}";
- css += "pre { font-family: monospace;}";
- // th { text-align: center; } - overwrites align property
- css += "th { font-weight: bold; }";
- css += "textarea { color: " + getRGBAString(TextColor) + "; font-weight: normal; font-size: " + toString("%d", TextFontSize) + "px; text-shadow: 1px 1px #000;}";
- css += "del { text-decoration: line-through;}";
- css += "u { text-decoration: underline;}";
- css += "em { font-style: italic; }";
- css += "strong { font-weight: bold; }";
- css += "small { font-size: smaller;}";
- css += "dt { font-weight: bold; }";
- css += "hr { color: rgb(120, 120, 120);}";
- // block level elements
- css += "address, article, aside, blockquote, details, dialog, dd, div, dl, dt, fieldset, figcaption, figure,";
- css += "footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, hr, li, main, nav, ol, p, pre, section, table,";
- css += "ul { display: block; }";
- css += "table { display: table; }";
- // td { padding: 1px;} - overwrites cellpadding attribute
- // table { border-spacing: 2px;} - overwrites cellspacing attribute
- css += "table { border-collapse: separate;}";
- // webkit pseudo elements
- css += "meter::-webkit-meter-bar, meter::-webkit-optimum-value, meter::-webkit-suboptimum-value, meter::-webkit-even-less-good-value { background: none; }";
- css += "meter::-webkit-meter-bar { background-color: rgb(100, 100, 100); width: 5em; height: 1em;}";
- css += "meter::-webkit-meter-optimum-value { background-color: rgb(80, 220, 80); }";
- css += "meter::-webkit-meter-suboptimum-value { background-color: rgb(220, 220, 80); }";
- css += "meter::-webkit-meter-even-less-good-value { background-color: rgb(220, 80, 80); }";
- // webkit pseudo elements
- css += "progress::-webkit-progress-bar, progress::-webkit-progress-value { background: none; }";
- css += "progress::-webkit-progress-bar { background-color: rgb(230, 230, 230); width: 10em; height: 1em; }";
- css += "progress::-webkit-progress-value { background-color: rgb(0, 100, 180);}";
- _Style.parseStylesheet(css);
+ _Style = _BrowserStyle;
}
// ***************************************************************************
@@ -5245,9 +5269,7 @@ namespace NLGUI
{
CGroupHTML::CCellParams cellParams;
if (!_CellParams.empty() && inherit)
- {
cellParams = _CellParams.back();
- }
if (_Style.hasStyle("background-color"))
cellParams.BgColor = _Style.Current.BackgroundColor;
@@ -5260,6 +5282,11 @@ namespace NLGUI
if (elm.hasNonEmptyAttribute("l_margin"))
fromString(elm.getAttribute("l_margin"), cellParams.LeftMargin);
+ if (_Style.hasStyle("height"))
+ cellParams.Height = _Style.Current.Height;
+ else if (elm.hasNonEmptyAttribute("height"))
+ fromString(elm.getAttribute("height"), cellParams.Height);
+
{
std::string align;
// having text-align on table/tr should not override td align attribute
@@ -5989,16 +6016,20 @@ namespace NLGUI
ucstring ucValue;
ucValue.fromUtf8(elm.getAttribute("value"));
- uint size = 120;
+ uint size = 20;
uint maxlength = 1024;
if (elm.hasNonEmptyAttribute("size"))
fromString(elm.getAttribute("size"), size);
if (elm.hasNonEmptyAttribute("maxlength"))
fromString(elm.getAttribute("maxlength"), maxlength);
+ // ryzom client used to have 'size' attribute in pixels, (12 == was default font size)
+ if (_Style.hasStyle("-ryzom-input-size-px") && _Style.getStyle("-ryzom-input-size-px") == "true")
+ size = size / 12;
+
string textTemplate(!templateName.empty() ? templateName : DefaultFormTextGroup);
// Add the editbox
- CInterfaceGroup *textArea = addTextArea (textTemplate, name.c_str (), 1, size/12, false, ucValue, maxlength);
+ CInterfaceGroup *textArea = addTextArea (textTemplate, name.c_str (), 1, size, false, ucValue, maxlength);
if (textArea)
{
// Add the text area to the form
@@ -6213,7 +6244,8 @@ namespace NLGUI
// width: 5em, height: 1em
uint32 width = _Style.Current.Width > -1 ? _Style.Current.Width : _Style.Current.FontSize * 5;
uint32 height = _Style.Current.Height > -1 ? _Style.Current.Height : _Style.Current.FontSize;
- uint32 border = _Style.Current.BorderWidth > -1 ? _Style.Current.BorderWidth : 0;
+ // FIXME: only using border-top
+ uint32 border = _Style.Current.BorderTopWidth > -1 ? _Style.Current.BorderTopWidth : 0;
uint barw = (uint) (width * meter.getValueRatio());
CRGBA bgColor = meter.getBarColor(elm, _Style);
@@ -6428,7 +6460,8 @@ namespace NLGUI
// width: 10em, height: 1em
uint32 width = _Style.Current.Width > -1 ? _Style.Current.Width : _Style.Current.FontSize * 10;
uint32 height = _Style.Current.Height > -1 ? _Style.Current.Height : _Style.Current.FontSize;
- uint32 border = _Style.Current.BorderWidth > -1 ? _Style.Current.BorderWidth : 0;
+ // FIXME: only using border-top
+ uint32 border = _Style.Current.BorderTopWidth > -1 ? _Style.Current.BorderTopWidth : 0;
uint barw = (uint) (width * progress.getValueRatio());
CRGBA bgColor = progress.getBarColor(elm, _Style);
@@ -6503,7 +6536,7 @@ namespace NLGUI
sb->setMinH(_Style.Current.Height);
sb->setMaxVisibleLine(size);
- sb->setFontSize(_Style.Current.FontSize);
+ sb->setFontSize(_Style.Current.FontSize, false);
}
entry.SelectBox = sb;
@@ -6576,36 +6609,84 @@ namespace NLGUI
fromString(elm.getAttribute("cellpadding"), table->CellPadding);
if (_Style.hasStyle("width"))
- getPercentage(table->ForceWidthMin, table->TableRatio, _Style.getStyle("width").c_str());
- else if (elm.hasNonEmptyAttribute("width"))
- getPercentage (table->ForceWidthMin, table->TableRatio, elm.getAttribute("width").c_str());
-
- if (_Style.hasStyle("border") || _Style.hasStyle("border-width"))
{
- table->Border = _Style.Current.BorderWidth;
+ // _Style.Width does not handle '%' unit currently
+ if (_Style.Current.Width > 0)
+ {
+ table->ForceWidthMin = _Style.Current.Width;
+ table->TableRatio = 0;
+ }
+ else
+ {
+ getPercentage (table->ForceWidthMin, table->TableRatio, _Style.getStyle("width").c_str());
+ }
}
- else if (elm.hasAttribute("border"))
+ else if (elm.hasNonEmptyAttribute("width"))
{
- std::string s = elm.getAttribute("border");
- if (s.empty())
- table->Border = 1;
- else
- fromString(elm.getAttribute("border"), table->Border);
+ getPercentage (table->ForceWidthMin, table->TableRatio, elm.getAttribute("width").c_str());
}
- if (_Style.hasStyle("border-color"))
+ // border from css or from attribute
{
- std::string s = toLower(_Style.getStyle("border-color"));
- if (s == "currentcolor")
- table->BorderColor = _Style.Current.TextColor;
+ uint32 borderWidth = 0;
+ CRGBA borderColor = CRGBA::Transparent;
+
+ // TODO: _Style->hasBorder() ??
+ table->Border = new CSSBorderRenderer();
+ if (elm.hasAttribute("border"))
+ {
+ std::string s = elm.getAttribute("border");
+ if (s.empty())
+ borderWidth = 1;
+ else
+ fromString(elm.getAttribute("border"), borderWidth);
+
+ if (elm.hasNonEmptyAttribute("bordercolor"))
+ scanHTMLColor(elm.getAttribute("bordercolor").c_str(), borderColor);
+ else
+ borderColor = CRGBA(128, 128, 128, 255);
+
+ table->CellBorder = (borderWidth > 0);
+ table->Border->setWidth(borderWidth, borderWidth, borderWidth, borderWidth);
+ table->Border->setColor(borderColor, borderColor, borderColor, borderColor);
+ table->Border->setStyle(CSSLineStyle::OUTSET, CSSLineStyle::OUTSET, CSSLineStyle::OUTSET, CSSLineStyle::OUTSET);
+ }
else
- scanHTMLColor(s.c_str(), table->BorderColor);
+ {
+ table->CellBorder = false;
+ }
+
+ if (_Style.hasStyle("border-top-width")) table->Border->TopWidth = _Style.Current.BorderTopWidth;
+ if (_Style.hasStyle("border-right-width")) table->Border->RightWidth = _Style.Current.BorderRightWidth;
+ if (_Style.hasStyle("border-bottom-width")) table->Border->BottomWidth = _Style.Current.BorderBottomWidth;
+ if (_Style.hasStyle("border-left-width")) table->Border->LeftWidth = _Style.Current.BorderLeftWidth;
+
+ if (_Style.hasStyle("border-top-color")) table->Border->TopColor = _Style.Current.BorderTopColor;
+ if (_Style.hasStyle("border-right-color")) table->Border->RightColor = _Style.Current.BorderRightColor;
+ if (_Style.hasStyle("border-bottom-color")) table->Border->BottomColor = _Style.Current.BorderBottomColor;
+ if (_Style.hasStyle("border-left-color")) table->Border->LeftColor = _Style.Current.BorderLeftColor;
+
+ if (_Style.hasStyle("border-top-style")) table->Border->TopStyle = _Style.Current.BorderTopStyle;
+ if (_Style.hasStyle("border-right-style")) table->Border->RightStyle = _Style.Current.BorderRightStyle;
+ if (_Style.hasStyle("border-bottom-style")) table->Border->BottomStyle = _Style.Current.BorderBottomStyle;
+ if (_Style.hasStyle("border-left-style")) table->Border->LeftStyle = _Style.Current.BorderLeftStyle;
}
- else if (elm.hasNonEmptyAttribute("bordercolor"))
+
+ if (_Style.hasStyle("background-image"))
{
- scanHTMLColor(elm.getAttribute("bordercolor").c_str(), table->BorderColor);
+ if (_Style.checkStyle("background-repeat", "repeat"))
+ table->setTextureTile(true);
+
+ if (_Style.checkStyle("background-size", "100%"))
+ table->setTextureScale(true);
+
+ string image = _Style.getStyle("background-image");
+ addImageDownload(image, table, CStyleParams(), TImageType::NormalImage, "");
}
+ // setting ModulateGlobalColor must be after addImageDownload
+ if (_Style.checkStyle("-ryzom-modulate-bgcolor", "true"))
+ table->setModulateGlobalColor(true);
table->setMarginLeft(getIndent());
addHtmlGroup (table, 0);
@@ -6633,9 +6714,21 @@ namespace NLGUI
// ***************************************************************************
void CGroupHTML::htmlTD(const CHtmlElement &elm)
{
+ CRGBA rowColor = CRGBA::Transparent;
+ // remember row color so we can blend it with cell color
+ if (!_CellParams.empty())
+ rowColor = _CellParams.back().BgColor;
+
// Get cells parameters
getCellsParameters(elm, true);
+ // if cell has own background,then it must be blended with row
+ if (rowColor.A > 0 && (elm.hasNonEmptyAttribute("bgcolor") || _Style.hasStyle("background-color")))
+ {
+ if (_CellParams.back().BgColor.A < 255)
+ _CellParams.back().BgColor.blendFromui(rowColor, _CellParams.back().BgColor, _CellParams.back().BgColor.A);
+ }
+
if (elm.ID == HTML_TH)
{
if (!_Style.hasStyle("font-weight"))
@@ -6658,14 +6751,6 @@ namespace NLGUI
return;
}
- if (_Style.hasStyle("padding"))
- {
- uint32 a;
- // TODO: cssLength
- if (fromString(_Style.getStyle("padding"), a))
- table->CellPadding = a;
- }
-
_Cells.back() = new CGroupCell(CViewBase::TCtorParam());
if (_Style.checkStyle("background-repeat", "repeat"))
@@ -6677,7 +6762,7 @@ namespace NLGUI
if (_Style.hasStyle("background-image"))
{
string image = _Style.getStyle("background-image");
- addImageDownload(image, _Cells.back());
+ addImageDownload(image, _Cells.back(), CStyleParams(), TImageType::NormalImage, "");
}
if (elm.hasNonEmptyAttribute("colspan"))
@@ -6692,19 +6777,70 @@ namespace NLGUI
_Cells.back()->NoWrap = _CellParams.back().NoWrap;
_Cells.back()->ColSpan = std::max(1, _Cells.back()->ColSpan);
_Cells.back()->RowSpan = std::max(1, _Cells.back()->RowSpan);
+ _Cells.back()->Height = _CellParams.back().Height;
float temp;
if (_Style.hasStyle("width"))
- getPercentage (_Cells.back()->WidthWanted, _Cells.back()->TableRatio, _Style.getStyle("width").c_str());
+ {
+ // _Style.Width does not handle '%' unit currently
+ if (_Style.Current.Width > 0)
+ {
+ _Cells.back()->WidthWanted = _Style.Current.Width;
+ _Cells.back()->TableRatio = 0;
+ }
+ else
+ {
+ getPercentage (_Cells.back()->WidthWanted, _Cells.back()->TableRatio, _Style.getStyle("width").c_str());
+ }
+ }
else if (elm.hasNonEmptyAttribute("width"))
+ {
getPercentage (_Cells.back()->WidthWanted, _Cells.back()->TableRatio, elm.getAttribute("width").c_str());
-
- if (_Style.hasStyle("height"))
- getPercentage (_Cells.back()->Height, temp, _Style.getStyle("height").c_str());
- else if (elm.hasNonEmptyAttribute("height"))
- getPercentage (_Cells.back()->Height, temp, elm.getAttribute("height").c_str());
+ }
_Cells.back()->NewLine = getTR();
+
+ // setting ModulateGlobalColor must be after addImageDownload
+ if (_Style.checkStyle("-ryzom-modulate-bgcolor", "true"))
+ _Cells.back()->setModulateGlobalColor(true);
+
+ // border from
+ if (table->CellBorder)
+ {
+ _Cells.back()->Border->setWidth(1, 1, 1, 1);
+ _Cells.back()->Border->setColor(table->Border->TopColor, table->Border->RightColor, table->Border->BottomColor, table->Border->LeftColor);
+ _Cells.back()->Border->setStyle(CSSLineStyle::INSET, CSSLineStyle::INSET, CSSLineStyle::INSET, CSSLineStyle::INSET);
+ }
+
+ if (_Style.hasStyle("border-top-width")) _Cells.back()->Border->TopWidth = _Style.Current.BorderTopWidth;
+ if (_Style.hasStyle("border-right-width")) _Cells.back()->Border->RightWidth = _Style.Current.BorderRightWidth;
+ if (_Style.hasStyle("border-bottom-width")) _Cells.back()->Border->BottomWidth = _Style.Current.BorderBottomWidth;
+ if (_Style.hasStyle("border-left-width")) _Cells.back()->Border->LeftWidth = _Style.Current.BorderLeftWidth;
+
+ if (_Style.hasStyle("border-top-color")) _Cells.back()->Border->TopColor = _Style.Current.BorderTopColor;
+ if (_Style.hasStyle("border-right-color")) _Cells.back()->Border->RightColor = _Style.Current.BorderRightColor;
+ if (_Style.hasStyle("border-bottom-color")) _Cells.back()->Border->BottomColor = _Style.Current.BorderBottomColor;
+ if (_Style.hasStyle("border-left-color")) _Cells.back()->Border->LeftColor = _Style.Current.BorderLeftColor;
+
+ if (_Style.hasStyle("border-top-style")) _Cells.back()->Border->TopStyle = _Style.Current.BorderTopStyle;
+ if (_Style.hasStyle("border-right-style")) _Cells.back()->Border->RightStyle = _Style.Current.BorderRightStyle;
+ if (_Style.hasStyle("border-bottom-style")) _Cells.back()->Border->BottomStyle = _Style.Current.BorderBottomStyle;
+ if (_Style.hasStyle("border-left-style")) _Cells.back()->Border->LeftStyle = _Style.Current.BorderLeftStyle;
+
+ // padding from
+ if (table->CellPadding)
+ {
+ _Cells.back()->PaddingTop = table->CellPadding;
+ _Cells.back()->PaddingRight = table->CellPadding;
+ _Cells.back()->PaddingBottom = table->CellPadding;
+ _Cells.back()->PaddingLeft = table->CellPadding;
+ }
+
+ if (_Style.hasStyle("padding-top")) _Cells.back()->PaddingTop = _Style.Current.PaddingTop;
+ if (_Style.hasStyle("padding-right")) _Cells.back()->PaddingRight = _Style.Current.PaddingRight;
+ if (_Style.hasStyle("padding-bottom")) _Cells.back()->PaddingBottom = _Style.Current.PaddingBottom;
+ if (_Style.hasStyle("padding-left")) _Cells.back()->PaddingLeft = _Style.Current.PaddingLeft;
+
table->addChild (_Cells.back());
// reusing indent pushed by table
@@ -6813,6 +6949,13 @@ namespace NLGUI
// ***************************************************************************
void CGroupHTML::htmlTR(const CHtmlElement &elm)
{
+ // prevent inheriting from table
+ if (!_CellParams.empty())
+ {
+ _CellParams.back().BgColor = CRGBA::Transparent;
+ _CellParams.back().Height = 0;
+ }
+
// Get cells parameters
getCellsParameters(elm, true);
diff --git a/code/nel/src/gui/group_menu.cpp b/code/nel/src/gui/group_menu.cpp
index 79be55110..c7db05e4f 100644
--- a/code/nel/src/gui/group_menu.cpp
+++ b/code/nel/src/gui/group_menu.cpp
@@ -1233,7 +1233,7 @@ namespace NLGUI
pV->setText (name);
}
pV->setColor (_GroupMenu->_Color);
- pV->setFontSize (_GroupMenu->_FontSize);
+ pV->setFontSize (_GroupMenu->_FontSize, _GroupMenu->_FontSizeCoef);
pV->setShadow (_GroupMenu->_Shadow);
pV->setShadowOutline (_GroupMenu->_ShadowOutline);
pV->setCheckable(checkable);
@@ -1322,7 +1322,7 @@ namespace NLGUI
}
pV->setColor (_GroupMenu->_Color);
- pV->setFontSize (_GroupMenu->_FontSize);
+ pV->setFontSize (_GroupMenu->_FontSize, _GroupMenu->_FontSizeCoef);
pV->setShadow (_GroupMenu->_Shadow);
pV->setShadowOutline (_GroupMenu->_ShadowOutline);
pV->setCheckable(checkable);
@@ -2024,6 +2024,7 @@ namespace NLGUI
_ShadowColorGrayed = CRGBA::Black;
_HighLightOver.set(128, 0, 0, 255);
_FontSize = 12;
+ _FontSizeCoef = true;
_Shadow = false;
_ShadowOutline = false;
_ResizeFromChildH = _ResizeFromChildW = true;
@@ -2618,9 +2619,10 @@ namespace NLGUI
}
// ------------------------------------------------------------------------------------------------
- void CGroupMenu::setFontSize(uint fontSize)
+ void CGroupMenu::setFontSize(uint fontSize, bool coef)
{
_FontSize = fontSize;
+ _FontSizeCoef = coef;
}
// ------------------------------------------------------------------------------------------------
diff --git a/code/nel/src/gui/group_table.cpp b/code/nel/src/gui/group_table.cpp
index 45c3b7e1e..6f61b7571 100644
--- a/code/nel/src/gui/group_table.cpp
+++ b/code/nel/src/gui/group_table.cpp
@@ -25,6 +25,7 @@
#include "nel/misc/i_xml.h"
#include "nel/misc/i18n.h"
#include "nel/misc/xml_auto_ptr.h"
+#include "nel/gui/css_border_renderer.h"
using namespace std;
using namespace NLMISC;
@@ -52,6 +53,9 @@ namespace NLGUI
RowSpan = 1;
TableColumnIndex = 0;
Group = new CInterfaceGroup(CViewBase::TCtorParam());
+ // TODO: only initialize if border is set
+ Border = new CSSBorderRenderer();
+ PaddingTop = PaddingRight = PaddingBottom = PaddingLeft = 0;
Align = Left;
VAlign = Middle;
LeftMargin = 0;
@@ -59,9 +63,12 @@ namespace NLGUI
IgnoreMaxWidth = false;
IgnoreMinWidth = false;
AddChildW = false;
- _UserTexture = false;
_TextureTiled = false;
_TextureScaled = false;
+ _TextureXReal = 0;
+ _TextureYReal = 0;
+ _TextureWReal = 0;
+ _TextureHReal = 0;
setEnclosedGroupDefaultParams();
addGroup (Group);
}
@@ -481,85 +488,72 @@ namespace NLGUI
rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_WReal-1, _YReal, 1, _HReal, 0, false, rVR.getBlankTextureId(), CRGBA(0,255,255,255) );
}
+ uint8 CurrentAlpha = 255;
+ CGroupTable *table = NULL;
+ if (getParent ())
+ {
+ table = static_cast (getParent ());
+ CurrentAlpha = table->CurrentAlpha;
+ }
+
// Draw the background
- if (_UserTexture || BgColor.A != 0)
+ if (BgColor.A > 0 || !_TextureId.empty())
{
CViewRenderer &rVR = *CViewRenderer::getInstance();
- if (_UserTexture)
+
+ bool flush = false;
+ if (CurrentAlpha > 0 && !_TextureId.empty())
{
- CRGBA col;
- if (BgColor.A == 0 )
- col = CRGBA(255,255,255,255);
- else
- col = BgColor;
-
-
+ CRGBA col = CRGBA::White;
+ col.A = CurrentAlpha;
+
+ sint32 oldSciX, oldSciY, oldSciW, oldSciH;
+ makeNewClip (oldSciX, oldSciY, oldSciW, oldSciH);
+
if (_TextureScaled && !_TextureTiled)
{
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal,
- _WReal, _HReal,
- 0, false,
- _TextureId,
- col );
+ rVR.drawRotFlipBitmap(_RenderLayer, _TextureXReal, _TextureYReal, _WReal, _HReal, 0, false, _TextureId, col);
}
else
{
if (!_TextureTiled)
- {
- rVR.draw11RotFlipBitmap (_RenderLayer, _XReal, _YReal,
- 0, false,
- _TextureId,
- col);
- }
+ rVR.drawRotFlipBitmap(_RenderLayer, _TextureXReal, _TextureYReal, _TextureWReal, _TextureHReal, 0, false, _TextureId, col);
else
- {
- rVR.drawRotFlipBitmapTiled(_RenderLayer, _XReal, _YReal,
- _WReal, _HReal,
- 0, false,
- _TextureId,
- 0,
- col);
- }
+ rVR.drawRotFlipBitmapTiled(_RenderLayer, _TextureXReal, _TextureYReal, _WReal, _TextureHReal, 0, false, _TextureId, 0, col);
}
-
+
+ restoreClip (oldSciX, oldSciY, oldSciW, oldSciH);
+
+ flush = true;
}
- else
+
+ if (BgColor.A > 0)
{
- CRGBA finalColor;
- finalColor.modulateFromColor (BgColor, CWidgetManager::getInstance()->getGlobalColor());
+ CRGBA finalColor = BgColor;
+ if (_ModulateGlobalColor)
+ finalColor.modulateFromColor (finalColor, CWidgetManager::getInstance()->getGlobalColor());
+ finalColor.A = (uint8) (((uint16) CurrentAlpha * (uint16) finalColor.A) >> 8);
- // Get the parent table
- if (getParent ())
- {
- CGroupTable *table = static_cast (getParent ());
- finalColor.A = (uint8) (((uint16) table->CurrentAlpha * (uint16) finalColor.A) >> 8);
- }
-
- //nlinfo("Blank Texture");
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal, _WReal, _HReal, 0, false, rVR.getBlankTextureId(), finalColor);
+ if (finalColor.A > 0)
+ rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal, _WReal, _HReal, 0, false, rVR.getBlankTextureId(), finalColor);
+
+ flush = true;
}
+
+ if (flush)
+ rVR.flush();
}
// Get the parent table
- if (getParent ())
{
- CGroupTable *table = static_cast (getParent ());
- if (table->Border) {
- CRGBA lighter = blend(table->BorderColor, CRGBA::White, 0.5f);
-
- CRGBA borderColorTL;
- borderColorTL.modulateFromColor (lighter, CWidgetManager::getInstance()->getGlobalColor());
- borderColorTL.A = (uint8) (((uint16) table->CurrentAlpha * (uint16) borderColorTL.A) >> 8);
-
- CRGBA borderColorBR;
- borderColorBR.modulateFromColor (table->BorderColor, CWidgetManager::getInstance()->getGlobalColor());
- borderColorBR.A = (uint8) (((uint16) table->CurrentAlpha * (uint16) borderColorBR.A) >> 8);
-
- CViewRenderer &rVR = *CViewRenderer::getInstance();
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal, _WReal, 1, 0, false, rVR.getBlankTextureId(), borderColorTL );
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal, 1, _HReal, 0, false, rVR.getBlankTextureId(), borderColorBR );
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal+_HReal-1, _WReal, 1, 0, false, rVR.getBlankTextureId(), borderColorBR );
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_WReal-1, _YReal, 1, _HReal, 0, false, rVR.getBlankTextureId(), borderColorTL );
+ // TODO: monitor these in checkCoords and update when changed
+ uint8 contentAlpha = CWidgetManager::getInstance()->getGlobalColorForContent().A;
+ if (contentAlpha > 0)
+ {
+ Border->CurrentAlpha = contentAlpha;
+ Border->setRenderLayer(_RenderLayer);
+ Border->setModulateGlobalColor(_ModulateGlobalColor);
+ Border->draw();
}
}
@@ -584,14 +578,13 @@ namespace NLGUI
{
if (TxName.empty() || TxName == "none")
{
- _UserTexture = false;
- nlinfo("Set no texture");
+ _TextureId.clear();
}
else
{
- nlinfo("Set texture to cell : %s", TxName.c_str());
- _UserTexture = true;
_TextureId.setTexture (TxName.c_str (), 0, 0, -1, -1, false);
+
+ updateTextureCoords();
}
}
@@ -611,6 +604,31 @@ namespace NLGUI
_TextureScaled = scaled;
}
+ // ----------------------------------------------------------------------------
+ void CGroupCell::updateTextureCoords()
+ {
+ if (_TextureId.empty()) return;
+
+ CViewRenderer &rVR = *CViewRenderer::getInstance();
+ rVR.getTextureSizeFromId (_TextureId, _TextureWReal, _TextureHReal);
+
+ _TextureXReal = _XReal;
+ _TextureYReal = _YReal + _HReal - _TextureHReal;
+ if (_TextureTiled && _TextureHReal > 0)
+ {
+ sint diff = (_HReal / _TextureHReal) * _TextureHReal;
+ _TextureYReal -= diff;
+ _TextureHReal += diff;
+ }
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupCell::updateCoords()
+ {
+ CInterfaceGroup::updateCoords();
+
+ updateTextureCoords();
+ }
// ----------------------------------------------------------------------------
NLMISC_REGISTER_OBJECT(CViewBase, CGroupTable, std::string, "table");
@@ -622,11 +640,21 @@ namespace NLGUI
_ContentValidated = false;
TableRatio = 0.f;
ForceWidthMin = 0;
- Border=0;
- BorderColor = CRGBA(32, 32, 32, 255);
+
+ // TODO: only initialize when needed
+ Border = new CSSBorderRenderer();
+
+ CellBorder = false;
CellPadding=1;
CellSpacing=2;
ContinuousUpdate = false;
+
+ _TextureTiled = false;
+ _TextureScaled = false;
+ _TextureXReal = 0;
+ _TextureYReal = 0;
+ _TextureWReal = 0;
+ _TextureHReal = 0;
}
// ----------------------------------------------------------------------------
@@ -688,13 +716,62 @@ namespace NLGUI
// ----------------------------------------------------------------------------
CGroupTable::~CGroupTable()
{
+ if (Border)
+ {
+ delete Border;
+ Border = NULL;
+ }
+
/* uint i;
for (i=0; i<_Cells.size(); i++)
delete _Cells[i];
_Cells.clear ();*/
}
+ // ----------------------------------------------------------------------------
+ void CGroupTable::setTexture(const std::string & TxName)
+ {
+ if (TxName.empty() || TxName == "none")
+ {
+ _TextureId.clear();
+ }
+ else
+ {
+ _TextureId.setTexture (TxName.c_str (), 0, 0, -1, -1, false);
+
+ updateTextureCoords();
+ }
+ }
+ // ----------------------------------------------------------------------------
+ void CGroupTable::setTextureTile(bool tiled)
+ {
+ _TextureTiled = tiled;
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupTable::setTextureScale(bool scaled)
+ {
+ _TextureScaled = scaled;
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupTable::updateTextureCoords()
+ {
+ if (_TextureId.empty()) return;
+
+ CViewRenderer &rVR = *CViewRenderer::getInstance();
+ rVR.getTextureSizeFromId (_TextureId, _TextureWReal, _TextureHReal);
+
+ _TextureXReal = _XReal;
+ _TextureYReal = _YReal + _HReal - _TextureHReal;
+ if (_TextureTiled && _TextureHReal > 0)
+ {
+ sint diff = (_HReal / _TextureHReal) * _TextureHReal;
+ _TextureYReal -= diff;
+ _TextureHReal += diff;
+ }
+ }
// ----------------------------------------------------------------------------
void CGroupTable::updateCoords()
@@ -736,24 +813,24 @@ namespace NLGUI
additionnalWidth = (sint32) width;
}
+ sint32 cellBorderPadding = cell->getPaddingLeftRight();
+ if (cell->Border)
+ cellBorderPadding += cell->Border->getLeftRightWidth();
+
// Get width min and max
if( !cell->IgnoreMaxWidth)
- {
- cell->WidthMax = cell->getMaxUsedW() + cell->LeftMargin;
- }
+ cell->WidthMax = cell->getMaxUsedW() + cell->LeftMargin + cellBorderPadding;
else
- {
cell->WidthMax = cell->WidthWanted + additionnalWidth + cell->LeftMargin;
- }
+
sint32 cellWidth;
if(!cell->IgnoreMinWidth)
- {
- cellWidth = cell->NoWrap ? cell->WidthMax : cell->getMinUsedW() + cell->LeftMargin;
- }
+ cellWidth = cell->NoWrap ? cell->WidthMax : cell->getMinUsedW() + cell->LeftMargin + cellBorderPadding;
else
- {
cellWidth = cell->NoWrap ? cell->WidthMax : cell->LeftMargin;
- }
+
+ if (cellWidth < cellBorderPadding)
+ cellWidth = cellBorderPadding;
// New cell ?
if (cell->NewLine)
@@ -795,11 +872,11 @@ namespace NLGUI
_Columns[column].WidthMax = (sint32)(cell->WidthMax*colspan);
if (cell->TableRatio*colspan > _Columns[column].TableRatio)
_Columns[column].TableRatio = cell->TableRatio*colspan;
- if (cell->WidthWanted*colspan + additionnalWidth > _Columns[column].WidthWanted)
- _Columns[column].WidthWanted = (sint32)(cell->WidthWanted*colspan) + additionnalWidth;
+ if ((cell->WidthWanted + additionnalWidth)*colspan > _Columns[column].WidthWanted)
+ _Columns[column].WidthWanted = (sint32)((cell->WidthWanted + additionnalWidth)*colspan);
- if (_Columns[column].WidthWanted + additionnalWidth)
- _Columns[column].WidthMax = _Columns[column].WidthWanted + additionnalWidth;
+ if (_Columns[column].WidthWanted > _Columns[column].WidthMax)
+ _Columns[column].WidthMax = _Columns[column].WidthWanted;
if (_Columns[column].WidthWanted > _Columns[column].Width)
_Columns[column].Width = _Columns[column].WidthWanted;
@@ -821,15 +898,21 @@ namespace NLGUI
column++;
}
- // Width of cells and table borders
- sint32 padding = CellPadding + (Border ? 1 : 0);
- sint32 borderWidth = 2*Border + ((sint32)_Columns.size()+1) * CellSpacing + ((sint32)_Columns.size()*2) * padding;
+ // Additional space contributing to table width
+ sint32 tableBorderSpacing = Border->getLeftWidth() + Border->getRightWidth();
+ tableBorderSpacing += ((sint32)_Columns.size()+1) * CellSpacing;;
+
+ sint32 innerForceWidthMin = ForceWidthMin;
+ if (innerForceWidthMin < tableBorderSpacing)
+ innerForceWidthMin = 0;
+ else
+ innerForceWidthMin -= tableBorderSpacing;
// Get the width
- sint32 tableWidthMax = ForceWidthMin?ForceWidthMin:_LastParentW; // getWReal();
- sint32 tableWidthMin = std::max(ForceWidthMin, (sint32)((float)tableWidthMax*TableRatio));
- tableWidthMax = std::max ((sint32)0, tableWidthMax-borderWidth);
- tableWidthMin = std::max ((sint32)0, tableWidthMin-borderWidth);
+ sint32 tableWidthMax = innerForceWidthMin ? innerForceWidthMin : _LastParentW - tableBorderSpacing; // getWReal();
+ sint32 tableWidthMin = std::max(innerForceWidthMin, (sint32)((float)tableWidthMax*TableRatio));
+ tableWidthMax = std::max ((sint32)0, tableWidthMax);
+ tableWidthMin = std::max ((sint32)0, tableWidthMin);
// Get the width of the table and normalize percent of the cell (sum of TableRatio must == 1)
sint32 tableWidth = 0;
@@ -845,10 +928,10 @@ namespace NLGUI
// force table width to fit all columns
// if width is set, then use column min width
- if (ForceWidthMin > 0)
- tableWidthMax = std::min(_LastParentW - borderWidth, std::max(tableWidthMax, tableWidth));
+ if (innerForceWidthMin > 0)
+ tableWidthMax = std::min(_LastParentW - tableBorderSpacing, std::max(tableWidthMax, tableWidth));
else
- tableWidthMax = std::min(_LastParentW - borderWidth, std::max(tableWidthMax, tableMaxContentWidth));
+ tableWidthMax = std::min(_LastParentW - tableBorderSpacing, std::max(tableWidthMax, tableMaxContentWidth));
if (tableWidthMax < 0)
tableWidthMax = 0;
@@ -857,6 +940,7 @@ namespace NLGUI
std::swap(tableWidthMin, tableWidthMax);
// Eval table size with all percent cells resized
+ // TODO: _Columns[i].TableRatio is for outer width
sint32 tableWidthSizeAfterPercent = tableWidth;
for (i=0; i<_Columns.size(); i++)
{
@@ -1028,8 +1112,9 @@ namespace NLGUI
// *** Now we know each column width, resize cells and get the height for each row
column = 0;
+ // FIXME: real cell padding
sint32 row = 0;
- sint32 currentX = Border + CellSpacing + padding;
+ sint32 currentX = 0;
_Rows.clear ();
for (i=0; i<_Cells.size(); i++)
@@ -1039,7 +1124,7 @@ namespace NLGUI
if (cell->NewLine)
{
column = 0;
- currentX = Border + CellSpacing + padding;
+ currentX = Border->LeftWidth + CellSpacing;
_Rows.push_back(CRow());
}
@@ -1048,7 +1133,7 @@ namespace NLGUI
{
// we have active rowspan, must add up 'skipped' columns
for( ; column < (uint)cell->TableColumnIndex; ++column)
- currentX += _Columns[column].Width + padding*2 + CellSpacing;
+ currentX += _Columns[column].Width + CellSpacing;
}
// Set the x and width
@@ -1057,11 +1142,19 @@ namespace NLGUI
sint32 alignmentX = 0;
sint32 widthReduceX = 0;
sint32 columnWidth = _Columns[column].Width;
+ sint32 cellBorderPaddingLeft = cell->PaddingLeft;
+ sint32 cellBorderPaddingRight = cell->PaddingRight;
+ if (cell->Border)
+ {
+ cellBorderPaddingLeft += cell->Border->getLeftWidth();
+ cellBorderPaddingRight += cell->Border->getRightWidth();
+ }
+
if (cell->ColSpan > 1)
{
// scan ahead and add up column widths as they might be different
for(int j = 1; jColSpan; j++)
- columnWidth += CellSpacing + padding*2 + _Columns[column+j].Width;
+ columnWidth += CellSpacing + _Columns[column+j].Width;
}
if (cell->WidthMax < columnWidth)
@@ -1081,11 +1174,13 @@ namespace NLGUI
}
}
- cell->setX(currentX - padding);
- cell->setW(columnWidth + padding*2);
+ // outer
+ cell->setX(currentX);
+ cell->setW(columnWidth);
- cell->Group->setX(alignmentX + cell->LeftMargin + padding);
- cell->Group->setW(columnWidth - widthReduceX);
+ // inner
+ cell->Group->setX(cellBorderPaddingLeft + alignmentX + cell->LeftMargin);
+ cell->Group->setW(columnWidth - widthReduceX - cellBorderPaddingLeft - cellBorderPaddingRight);
cell->Group->CInterfaceElement::updateCoords();
// Update coords to get H
@@ -1094,16 +1189,23 @@ namespace NLGUI
// Resize the row array
float rowspan = 1.f / (float)cell->RowSpan;
- _Rows.back().Height = std::max((sint32)(cell->Height*rowspan), std::max(_Rows.back().Height, (sint32)(cell->Group->getH()*rowspan)));
+ uint cellBorderPadding = cell->getPaddingTopBottom();
+ if (cell->Border)
+ cellBorderPadding += cell->Border->getTopBottomWidth();
+ sint32 cellHeight = std::max((sint32)(cell->Height*rowspan), (sint32)(cell->Group->getH()*rowspan + cellBorderPadding));
+ _Rows.back().Height = std::max(_Rows.back().Height, (sint32)cellHeight);
// Next column
- currentX += columnWidth + 2*padding + CellSpacing;
+ currentX += columnWidth + CellSpacing;
column += cell->ColSpan;
}
// Set cell Y
row = 0;
- sint32 currentY = -(Border + CellSpacing + padding);
+ sint32 currentY = -CellSpacing;
+ if (Border)
+ currentY -= Border->getTopWidth();
+
for (i=0; i<_Cells.size(); i++)
{
// New cell ?
@@ -1112,7 +1214,7 @@ namespace NLGUI
{
if (_Rows[row].Height != 0)
{
- currentY -= _Rows[row].Height + 2*padding + CellSpacing;
+ currentY -= _Rows[row].Height + CellSpacing;
}
row++;
}
@@ -1120,12 +1222,19 @@ namespace NLGUI
// Check align
sint32 alignmentY = 0;
sint32 rowHeight = _Rows[row].Height;
+ sint32 cellBorderPaddingTop = cell->PaddingTop;
+ sint32 cellBorderPaddingBottom = cell->PaddingBottom;
+ if (cell->Border)
+ {
+ cellBorderPaddingTop += cell->Border->getTopWidth();
+ cellBorderPaddingBottom += cell->Border->getBottomWidth();
+ }
if (cell->RowSpan > 1)
{
// we need to scan down and add up row heights
int k = std::min((sint32)_Rows.size(), row + cell->RowSpan);
for(int j=row+1; jGroup->getH() < rowHeight)
{
@@ -1142,15 +1251,26 @@ namespace NLGUI
}
}
- cell->setY(currentY + padding);
- cell->setH (rowHeight + 2*padding);
- cell->Group->setY(-(alignmentY + padding));
+ // outer
+ cell->setY(currentY);
+ cell->setH (rowHeight);
+ // inner
+ cell->Group->setY(-(alignmentY + cellBorderPaddingTop - cellBorderPaddingBottom));
}
- // Resize the table
- setW(finalWidth+borderWidth-_LastParentW);
+ // final row
if (!_Rows.empty())
- currentY -= _Rows[row].Height + padding + CellSpacing + Border;
+ currentY -= _Rows.back().Height;
+ currentY -= CellSpacing;
+ finalWidth += ((sint)_Columns.size() + 1) * CellSpacing;
+ if (Border)
+ {
+ currentY -= Border->getBottomWidth();
+ finalWidth += Border->getLeftWidth() + Border->getRightWidth();
+ }
+
+ // Resize the table
+ setW(finalWidth-_LastParentW);
setH(-currentY);
// All done
@@ -1160,8 +1280,22 @@ namespace NLGUI
CInterfaceGroup::updateCoords();
+ updateTextureCoords();
+ // update borders if present
+ if (Border)
+ {
+ Border->setRect(_XReal + _MarginLeft, _YReal, _WReal, _HReal);
+ }
+ // update cell borders if present
+ for (uint32 i=0; i<_Cells.size(); i++)
+ {
+ if (_Cells[i]->Border)
+ {
+ _Cells[i]->Border->setRect(_Cells[i]->_XReal, _Cells[i]->_YReal, _Cells[i]->_WReal, _Cells[i]->_HReal);
+ }
+ }
// Validated
_ContentValidated = true;
@@ -1267,7 +1401,8 @@ namespace NLGUI
for (i=0; iLeftWidth + Border->RightWidth + ((sint32)columns.size()+1) * CellSpacing + ((sint32)columns.size()*2) * CellPadding;
return maxWidth;
}
@@ -1312,7 +1447,8 @@ namespace NLGUI
for (i=0; iLeftWidth + Border->RightWidth + ((sint32)columns.size()+1) * CellSpacing + ((sint32)columns.size()*2) * CellPadding;
return maxWidth;
}
@@ -1342,64 +1478,62 @@ namespace NLGUI
if (!_Columns.empty() && !_Rows.empty())
{
- sint32 border = Border + CellSpacing;
- if (border && BgColor.A)
+ bool flush = false;
+ CViewRenderer &rVR = *CViewRenderer::getInstance();
+
+ if (BgColor.A > 0)
{
- CRGBA finalColor;
- finalColor.modulateFromColor (BgColor, CWidgetManager::getInstance()->getGlobalColor());
- finalColor.A = CurrentAlpha;
+ CRGBA finalColor = BgColor;
+ if (_ModulateGlobalColor)
+ finalColor.modulateFromColor (finalColor, CWidgetManager::getInstance()->getGlobalColor());
+ finalColor.A = (uint8) (((uint16) CurrentAlpha * (uint16) finalColor.A) >> 8);
+
+ rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal, _WReal, _HReal, 0, false, rVR.getBlankTextureId(), finalColor);
+
+ flush = true;
+ }
- // Draw the top line
- CViewRenderer &rVR = *CViewRenderer::getInstance();
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal-border+_HReal, _WReal, border, 0, false, rVR.getBlankTextureId(), finalColor);
+ // Draw the background
+ if (CurrentAlpha > 0 && !_TextureId.empty())
+ {
+ sint32 oldSciX, oldSciY, oldSciW, oldSciH;
+ makeNewClip (oldSciX, oldSciY, oldSciW, oldSciH);
- // Draw the left line
- sint32 insideHeight = std::max((sint32)0, (sint32)_HReal - (sint32)border);
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal, border, insideHeight, 0, false, rVR.getBlankTextureId(), finalColor);
+ CRGBA col = CRGBA::White;
+ col.A = CurrentAlpha;
- // Draw the inside borders
- if (CellSpacing)
+ if (_TextureScaled && !_TextureTiled)
{
- uint i;
- sint32 x, y;
- for (i=0; i<_Cells.size(); i++)
- {
- CGroupCell *cell = _Cells[i];
-
- x = cell->getXReal();
- y = cell->getYReal() - CellSpacing;
- // right
- rVR.drawRotFlipBitmap (_RenderLayer, x + cell->getW(), y, CellSpacing, cell->getH() + CellSpacing, 0, false, rVR.getBlankTextureId(), finalColor);
- // bottom
- rVR.drawRotFlipBitmap (_RenderLayer, x, y, cell->getW(), CellSpacing, 0, false, rVR.getBlankTextureId(), finalColor);
- }
+ rVR.drawRotFlipBitmap(_RenderLayer, _TextureXReal, _TextureYReal, _WReal, _HReal, 0, false, _TextureId, col);
+ }
+ else
+ {
+ if (!_TextureTiled)
+ rVR.drawRotFlipBitmap(_RenderLayer, _TextureXReal, _TextureYReal, _TextureWReal, _TextureHReal, 0, false, _TextureId, col);
+ else
+ rVR.drawRotFlipBitmapTiled(_RenderLayer, _TextureXReal, _TextureYReal, _WReal, _TextureHReal, 0, false, _TextureId, 0, col);
}
+ restoreClip (oldSciX, oldSciY, oldSciW, oldSciH);
+ flush = true;
}
- if (Border)
- {
- CViewRenderer &rVR = *CViewRenderer::getInstance();
- CRGBA borderColorTL;
- CRGBA lighter = blend(BorderColor, CRGBA::White, 0.5f);
- borderColorTL.modulateFromColor (lighter, CWidgetManager::getInstance()->getGlobalColor());
- borderColorTL.A = CurrentAlpha;
+ // flush background color and image
+ if (flush)
+ rVR.flush();
- CRGBA borderColorBR;
- borderColorBR.modulateFromColor (BorderColor, CWidgetManager::getInstance()->getGlobalColor());
- borderColorBR.A = CurrentAlpha;
-
- // beveled table border
- for (sint32 i=0; igetGlobalColorForContent().A;
+ if (contentAlpha > 0)
{
- // bottom, left, top, right
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal+i, _YReal+i, _WReal-i*2, 1, 0, false, rVR.getBlankTextureId(), borderColorBR);
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal+i, _YReal+i, 1, _HReal-i*2, 0, false, rVR.getBlankTextureId(), borderColorTL);
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal+i, _YReal+_HReal-i-1, _WReal-i*2, 1, 0, false, rVR.getBlankTextureId(), borderColorTL);
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_WReal-i-1, _YReal+i, 1, _HReal-i*2, 0, false, rVR.getBlankTextureId(), borderColorBR);
+ Border->CurrentAlpha = CurrentAlpha;
+ Border->setRenderLayer(_RenderLayer);
+ Border->setModulateGlobalColor(_ModulateGlobalColor);
+ Border->draw();
}
}
-
}
CInterfaceGroup::draw ();
@@ -1412,12 +1546,12 @@ namespace NLGUI
{
if( name == "border" )
{
- return toString( Border );
+ return toString( Border->TopWidth );
}
else
if( name == "bordercolor" )
{
- return toString( BorderColor );
+ return toString( Border->TopColor );
}
else
if( name == "cellpadding" )
@@ -1452,7 +1586,12 @@ namespace NLGUI
{
sint32 i;
if( fromString( value, i ) )
- Border = i;
+ {
+ Border->TopWidth = i;
+ Border->RightWidth = i;
+ Border->BottomWidth = i;
+ Border->LeftWidth = i;
+ }
return;
}
else
@@ -1460,7 +1599,12 @@ namespace NLGUI
{
CRGBA c;
if( fromString( value, c ) )
- BorderColor = c;
+ {
+ Border->TopColor = c;
+ Border->RightColor = c;
+ Border->BottomColor = c;
+ Border->LeftColor = c;
+ }
return;
}
else
@@ -1505,8 +1649,8 @@ namespace NLGUI
return NULL;
xmlSetProp( node, BAD_CAST "type", BAD_CAST "table" );
- xmlSetProp( node, BAD_CAST "border", BAD_CAST toString( Border ).c_str() );
- xmlSetProp( node, BAD_CAST "bordercolor", BAD_CAST toString( BorderColor ).c_str() );
+ xmlSetProp( node, BAD_CAST "border", BAD_CAST toString( Border->TopWidth ).c_str() );
+ xmlSetProp( node, BAD_CAST "bordercolor", BAD_CAST toString( Border->TopColor ).c_str() );
xmlSetProp( node, BAD_CAST "cellpadding", BAD_CAST toString( CellPadding ).c_str() );
xmlSetProp( node, BAD_CAST "cellspacing", BAD_CAST toString( CellSpacing ).c_str() );
xmlSetProp( node, BAD_CAST "bgcolor", BAD_CAST toString( BgColor ).c_str() );
@@ -1528,13 +1672,16 @@ namespace NLGUI
ptr = (char*) xmlGetProp( cur, (xmlChar*)"border" );
if (ptr)
{
- fromString((const char*)ptr, Border);
+ uint32 w;
+ fromString((const char*)ptr, w);
+ Border->setWidth(w, w, w, w);
}
//
ptr = (char*) xmlGetProp( cur, (xmlChar*)"bordercolor" );
if (ptr)
{
- BorderColor = convertColor((const char*)ptr);
+ CRGBA c = convertColor((const char*)ptr);
+ Border->setColor(c, c, c, c);
}
//
ptr = (char*) xmlGetProp( cur, (xmlChar*)"cellpadding" );
diff --git a/code/nel/src/gui/html_parser.cpp b/code/nel/src/gui/html_parser.cpp
index 1c5914bb5..3d7303706 100644
--- a/code/nel/src/gui/html_parser.cpp
+++ b/code/nel/src/gui/html_parser.cpp
@@ -190,6 +190,35 @@ namespace NLGUI
elm.reindexChilds();
parent.reindexChilds();
}
+
+ // move all directly under to its own ("table > tbody > tr" selector).
+ // TODO: move first real to front, move first real at the end
+ if (elm.ID == HTML_TABLE)
+ {
+ std::list::iterator it = elm.Children.begin();
+ std::list::iterator tbody = elm.Children.end();
+ for(it = elm.Children.begin(); it != elm.Children.end(); ++it)
+ {
+ if (it->ID == HTML_TR)
+ {
+ if (tbody == elm.Children.end())
+ {
+ tbody = elm.Children.insert(it, CHtmlElement(CHtmlElement::ELEMENT_NODE, "tbody"));
+ tbody->ID = HTML_TBODY;
+ tbody->parent = &elm;
+ }
+ tbody->Children.splice(tbody->Children.end(), elm.Children, it);
+ it = tbody;
+ }
+ else if (tbody != elm.Children.end())
+ {
+ tbody->reindexChilds();
+ tbody = elm.Children.end();
+ }
+ }
+
+ elm.reindexChilds();
+ }
}
}
diff --git a/code/nel/src/gui/view_renderer.cpp b/code/nel/src/gui/view_renderer.cpp
index 66da2800b..7d60f3c31 100644
--- a/code/nel/src/gui/view_renderer.cpp
+++ b/code/nel/src/gui/view_renderer.cpp
@@ -1932,6 +1932,16 @@ namespace NLGUI
return _TextureId >= 0;
}
+ // ***************************************************************************
+ void CViewRenderer::CTextureId::clear()
+ {
+ if (_TextureId >= 0)
+ {
+ CViewRenderer::getInstance()->deleteTexture(_TextureId);
+ _TextureId = -1;
+ }
+ }
+
// ***************************************************************************
void CViewRenderer::CTextureId::serial(NLMISC::IStream &f)
{
diff --git a/code/nel/src/misc/rgba.cpp b/code/nel/src/misc/rgba.cpp
index 277793489..33b6c42ec 100644
--- a/code/nel/src/misc/rgba.cpp
+++ b/code/nel/src/misc/rgba.cpp
@@ -48,6 +48,7 @@ const CRGBA CRGBA::Blue(0, 0, 255) ;
const CRGBA CRGBA::Magenta(255, 0, 255) ;
const CRGBA CRGBA::Cyan(0, 255, 255) ;
const CRGBA CRGBA::White(255, 255, 255) ;
+const CRGBA CRGBA::Transparent(0, 0, 0, 0);
// ***************************************************************************
void CRGBA::serial(NLMISC::IStream &f)