Index: COList.h =================================================================== --- COList.h +++ COList.h @@ -68,6 +68,7 @@ private: // Width of space available for columns float m_TotalAvailableColumnWidth; + float m_HeadingHeight; }; #endif // INCLUDED_COLIST Index: COList.cpp =================================================================== --- COList.cpp +++ COList.cpp @@ -26,13 +26,13 @@ COList::COList() : CList() { AddSetting(GUIST_CGUISpriteInstance, "sprite_heading"); - AddSetting(GUIST_float, "heading_height"); AddSetting(GUIST_bool, "sortable"); // The actual sorting is done in JS for more versatility AddSetting(GUIST_CStr, "selected_column"); AddSetting(GUIST_int, "selected_column_order"); AddSetting(GUIST_CGUISpriteInstance, "sprite_asc"); // Show the order of sorting AddSetting(GUIST_CGUISpriteInstance, "sprite_desc"); AddSetting(GUIST_CGUISpriteInstance, "sprite_not_sorted"); + m_HeadingHeight = 0; } void COList::SetupText() @@ -61,23 +61,28 @@ bool scrollbar; GUI::GetSetting(this, "scrollbar", scrollbar); - float width = GetListRect().GetWidth(); + m_TotalAvailableColumnWidth = GetListRect().GetWidth(); // remove scrollbar if applicable if (scrollbar && GetScrollBar(0).GetStyle()) - width -= GetScrollBar(0).GetStyle()->m_Width; - - m_TotalAvailableColumnWidth = width; + m_TotalAvailableColumnWidth -= GetScrollBar(0).GetStyle()->m_Width; float buffer_zone = 0.f; GUI::GetSetting(this, "buffer_zone", buffer_zone); for (COListColumn column : m_Columns) { + float width = column.m_Width; + if (column.m_Width > 0 && column.m_Width < 1) + { + width *= m_TotalAvailableColumnWidth; + } + SGUIText* text = new SGUIText(); CGUIString gui_string; gui_string.SetValue(column.m_Heading); *text = GetGUI()->GenerateText(gui_string, font, width, buffer_zone, this); AddText(text); + m_HeadingHeight = std::max(m_HeadingHeight, text->m_Size.cy); } // Generate texts @@ -87,10 +92,16 @@ { m_ItemsYPositions[i] = buffered_y; float shift = 0.0f; - for (size_t c = 0; c < m_Columns.size(); ++c) + for (COListColumn column : m_Columns) { + float width = column.m_Width; + if (column.m_Width > 0 && column.m_Width < 1) + { + width *= m_TotalAvailableColumnWidth; + } + CGUIList* pList_c; - GUI::GetSettingPointer(this, "list_" + m_Columns[c].m_Id, pList_c); + GUI::GetSettingPointer(this, "list_" + column.m_Id, pList_c); SGUIText* text = new SGUIText(); if (!pList_c->m_Items[i].GetOriginalString().empty()) *text = GetGUI()->GenerateText(pList_c->m_Items[i], font, width, buffer_zone, this); @@ -124,9 +135,7 @@ CRect COList::GetListRect() const { - float headingHeight; - GUI::GetSetting(this, "heading_height", headingHeight); - return m_CachedActualSize + CRect(0, headingHeight, 0, 0); + return m_CachedActualSize + CRect(0, m_HeadingHeight, 0, 0); } void COList::HandleMessage(SGUIMessage& Message) @@ -151,8 +160,6 @@ GUI::GetSetting(this, "selected_column", selectedColumn); int selectedColumnOrder; GUI::GetSetting(this, "selected_column_order", selectedColumnOrder); - float headingHeight; - GUI::GetSetting(this, "heading_height", headingHeight); float xpos = 0; for (COListColumn column : m_Columns) @@ -169,7 +176,7 @@ CPos leftTopCorner = m_CachedActualSize.TopLeft() + CPos(xpos, 0); if (mouse.x >= leftTopCorner.x && mouse.x < leftTopCorner.x + width && - mouse.y < leftTopCorner.y + headingHeight) + mouse.y < leftTopCorner.y + m_HeadingHeight) { if (column.m_Id != selectedColumn) { @@ -369,14 +376,11 @@ } } - float headingHeight; - GUI::GetSetting(this, "heading_height", headingHeight); - // Draw line above column header CGUISpriteInstance* sprite_heading = NULL; GUI::GetSettingPointer(this, "sprite_heading", sprite_heading); CRect rect_head(m_CachedActualSize.left, m_CachedActualSize.top, m_CachedActualSize.right, - m_CachedActualSize.top + headingHeight); + m_CachedActualSize.top + m_HeadingHeight); GetGUI()->DrawSprite(*sprite_heading, cell_id, bz, rect_head); // Draw column headers