Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/source/gui/COList.cpp
Show All 35 Lines | COList::COList(CGUI* pGUI) | ||||
AddSetting<int>("selected_column_order"); | AddSetting<int>("selected_column_order"); | ||||
AddSetting<CGUISpriteInstance>("sprite_asc"); // Show the order of sorting | AddSetting<CGUISpriteInstance>("sprite_asc"); // Show the order of sorting | ||||
AddSetting<CGUISpriteInstance>("sprite_desc"); | AddSetting<CGUISpriteInstance>("sprite_desc"); | ||||
AddSetting<CGUISpriteInstance>("sprite_not_sorted"); | AddSetting<CGUISpriteInstance>("sprite_not_sorted"); | ||||
} | } | ||||
void COList::SetupText() | void COList::SetupText() | ||||
{ | { | ||||
CGUIList* pList; | const CGUIList& pList = GUI<CGUIList>::GetSetting(this, "list"); | ||||
GUI<CGUIList>::GetSettingPointer(this, "list", pList); | m_ItemsYPositions.resize(pList.m_Items.size() + 1); | ||||
m_ItemsYPositions.resize(pList->m_Items.size() + 1); | |||||
// Delete all generated texts. Some could probably be saved, | // Delete all generated texts. Some could probably be saved, | ||||
// but this is easier, and this function will never be called | // but this is easier, and this function will never be called | ||||
// continuously, or even often, so it'll probably be okay. | // continuously, or even often, so it'll probably be okay. | ||||
m_GeneratedTexts.clear(); | m_GeneratedTexts.clear(); | ||||
CStrW font; | CStrW font; | ||||
if (GUI<CStrW>::GetSetting(this, "font", font) != PSRETURN_OK || font.empty()) | if (GUI<CStrW>::GetSetting(this, "font", font) != PSRETURN_OK || font.empty()) | ||||
Show All 25 Lines | for (const COListColumn& column : m_Columns) | ||||
const CGUIText& text = AddText(gui_string, font, width, buffer_zone, this); | const CGUIText& text = AddText(gui_string, font, width, buffer_zone, this); | ||||
m_HeadingHeight = std::max(m_HeadingHeight, text.GetSize().cy + COLUMN_SHIFT.y); | m_HeadingHeight = std::max(m_HeadingHeight, text.GetSize().cy + COLUMN_SHIFT.y); | ||||
} | } | ||||
// Generate texts | // Generate texts | ||||
float buffered_y = 0.f; | float buffered_y = 0.f; | ||||
for (size_t i = 0; i < pList->m_Items.size(); ++i) | for (size_t i = 0; i < pList.m_Items.size(); ++i) | ||||
{ | { | ||||
m_ItemsYPositions[i] = buffered_y; | m_ItemsYPositions[i] = buffered_y; | ||||
float shift = 0.0f; | float shift = 0.0f; | ||||
for (const COListColumn& column : m_Columns) | for (const COListColumn& column : m_Columns) | ||||
{ | { | ||||
float width = column.m_Width; | float width = column.m_Width; | ||||
if (column.m_Width > 0 && column.m_Width < 1) | if (column.m_Width > 0 && column.m_Width < 1) | ||||
width *= m_TotalAvailableColumnWidth; | width *= m_TotalAvailableColumnWidth; | ||||
CGUIList* pList_c; | CGUIList& pList_c = GUI<CGUIList>::GetSetting(this, "list_" + column.m_Id); | ||||
GUI<CGUIList>::GetSettingPointer(this, "list_" + column.m_Id, pList_c); | |||||
CGUIText* text; | CGUIText* text; | ||||
if (!pList_c->m_Items[i].GetOriginalString().empty()) | if (!pList_c.m_Items[i].GetOriginalString().empty()) | ||||
text = &AddText(pList_c->m_Items[i], font, width, buffer_zone, this); | text = &AddText(pList_c.m_Items[i], font, width, buffer_zone, this); | ||||
else | else | ||||
{ | { | ||||
// Minimum height of a space character of the current font size | // Minimum height of a space character of the current font size | ||||
CGUIString align_string; | CGUIString align_string; | ||||
align_string.SetValue(L" "); | align_string.SetValue(L" "); | ||||
text = &AddText(align_string, font, width, buffer_zone, this); | text = &AddText(align_string, font, width, buffer_zone, this); | ||||
} | } | ||||
shift = std::max(shift, text->GetSize().cy); | shift = std::max(shift, text->GetSize().cy); | ||||
} | } | ||||
buffered_y += shift; | buffered_y += shift; | ||||
} | } | ||||
m_ItemsYPositions[pList->m_Items.size()] = buffered_y; | m_ItemsYPositions[pList.m_Items.size()] = buffered_y; | ||||
if (scrollbar) | if (scrollbar) | ||||
{ | { | ||||
CRect rect = GetListRect(); | CRect rect = GetListRect(); | ||||
GetScrollBar(0).SetScrollRange(m_ItemsYPositions.back()); | GetScrollBar(0).SetScrollRange(m_ItemsYPositions.back()); | ||||
GetScrollBar(0).SetScrollSpace(rect.GetHeight()); | GetScrollBar(0).SetScrollSpace(rect.GetHeight()); | ||||
GetScrollBar(0).SetX(rect.right); | GetScrollBar(0).SetX(rect.right); | ||||
▲ Show 20 Lines • Show All 186 Lines • ▼ Show 20 Lines | void COList::DrawList(const int& selected, const CStr& _sprite, const CStr& _sprite_selected, const CStr& _textcolor) | ||||
bool scrollbar; | bool scrollbar; | ||||
GUI<bool>::GetSetting(this, "scrollbar", scrollbar); | GUI<bool>::GetSetting(this, "scrollbar", scrollbar); | ||||
if (scrollbar) | if (scrollbar) | ||||
IGUIScrollBarOwner::Draw(); | IGUIScrollBarOwner::Draw(); | ||||
CRect rect = GetListRect(); | CRect rect = GetListRect(); | ||||
CGUISpriteInstance* sprite = NULL; | CGUISpriteInstance& sprite = GUI<CGUISpriteInstance>::GetSetting(this, _sprite); | ||||
CGUISpriteInstance* sprite_selectarea = NULL; | CGUISpriteInstance& sprite_selectarea = GUI<CGUISpriteInstance>::GetSetting(this, _sprite_selected); | ||||
int cell_id; | int cell_id; | ||||
GUI<CGUISpriteInstance>::GetSettingPointer(this, _sprite, sprite); | |||||
GUI<CGUISpriteInstance>::GetSettingPointer(this, _sprite_selected, sprite_selectarea); | |||||
GUI<int>::GetSetting(this, "cell_id", cell_id); | GUI<int>::GetSetting(this, "cell_id", cell_id); | ||||
CGUIList* pList; | m_pGUI->DrawSprite(sprite, cell_id, bz, rect); | ||||
GUI<CGUIList>::GetSettingPointer(this, "list", pList); | |||||
GetGUI()->DrawSprite(*sprite, cell_id, bz, rect); | |||||
float scroll = 0.f; | float scroll = 0.f; | ||||
if (scrollbar) | if (scrollbar) | ||||
scroll = GetScrollBar(0).GetPos(); | scroll = GetScrollBar(0).GetPos(); | ||||
// Draw item selection | // Draw item selection | ||||
if (selected != -1) | if (selected != -1) | ||||
{ | { | ||||
Show All 19 Lines | if (rect_sel.top <= rect.bottom && | ||||
rect_sel.right = GetScrollBar(0).GetOuterRect().left; | rect_sel.right = GetScrollBar(0).GetOuterRect().left; | ||||
if (rect_sel.left >= GetScrollBar(0).GetOuterRect().left && | if (rect_sel.left >= GetScrollBar(0).GetOuterRect().left && | ||||
rect_sel.left < GetScrollBar(0).GetOuterRect().right) | rect_sel.left < GetScrollBar(0).GetOuterRect().right) | ||||
rect_sel.left = GetScrollBar(0).GetOuterRect().right; | rect_sel.left = GetScrollBar(0).GetOuterRect().right; | ||||
} | } | ||||
// Draw item selection | // Draw item selection | ||||
GetGUI()->DrawSprite(*sprite_selectarea, cell_id, bz+0.05f, rect_sel); | m_pGUI->DrawSprite(sprite_selectarea, cell_id, bz+0.05f, rect_sel); | ||||
} | } | ||||
} | } | ||||
// Draw line above column header | // Draw line above column header | ||||
CGUISpriteInstance* sprite_heading = NULL; | CGUISpriteInstance& sprite_heading = GUI<CGUISpriteInstance>::GetSetting(this, "sprite_heading"); | ||||
GUI<CGUISpriteInstance>::GetSettingPointer(this, "sprite_heading", sprite_heading); | |||||
CRect rect_head(m_CachedActualSize.left, m_CachedActualSize.top, m_CachedActualSize.right, | CRect rect_head(m_CachedActualSize.left, m_CachedActualSize.top, m_CachedActualSize.right, | ||||
m_CachedActualSize.top + m_HeadingHeight); | m_CachedActualSize.top + m_HeadingHeight); | ||||
GetGUI()->DrawSprite(*sprite_heading, cell_id, bz, rect_head); | m_pGUI->DrawSprite(sprite_heading, cell_id, bz, rect_head); | ||||
// Draw column headers | // Draw column headers | ||||
bool sortable; | bool sortable; | ||||
GUI<bool>::GetSetting(this, "sortable", sortable); | GUI<bool>::GetSetting(this, "sortable", sortable); | ||||
CStr selectedColumn; | CStr selectedColumn; | ||||
GUI<CStr>::GetSetting(this, "selected_column", selectedColumn); | GUI<CStr>::GetSetting(this, "selected_column", selectedColumn); | ||||
Show All 16 Lines | for (size_t col = 0; col < m_Columns.size(); ++col) | ||||
if (m_Columns[col].m_Width < 1 && m_Columns[col].m_Width > 0) | if (m_Columns[col].m_Width < 1 && m_Columns[col].m_Width > 0) | ||||
width *= m_TotalAvailableColumnWidth; | width *= m_TotalAvailableColumnWidth; | ||||
CPos leftTopCorner = m_CachedActualSize.TopLeft() + CPos(xpos, 0); | CPos leftTopCorner = m_CachedActualSize.TopLeft() + CPos(xpos, 0); | ||||
// Draw sort arrows in colum header | // Draw sort arrows in colum header | ||||
if (sortable) | if (sortable) | ||||
{ | { | ||||
CGUISpriteInstance* sprite; | CStr spriteName; | ||||
if (selectedColumn == m_Columns[col].m_Id) | if (selectedColumn == m_Columns[col].m_Id) | ||||
{ | { | ||||
if (selectedColumnOrder == 0) | if (selectedColumnOrder == 0) | ||||
LOGERROR("selected_column_order must not be 0"); | LOGERROR("selected_column_order must not be 0"); | ||||
if (selectedColumnOrder != -1) | if (selectedColumnOrder != -1) | ||||
GUI<CGUISpriteInstance>::GetSettingPointer(this, "sprite_asc", sprite); | spriteName = "sprite_asc"; | ||||
else | else | ||||
GUI<CGUISpriteInstance>::GetSettingPointer(this, "sprite_desc", sprite); | spriteName = "sprite_desc"; | ||||
} | } | ||||
else | else | ||||
GUI<CGUISpriteInstance>::GetSettingPointer(this, "sprite_not_sorted", sprite); | spriteName = "sprite_not_sorted"; | ||||
GetGUI()->DrawSprite(*sprite, cell_id, bz + 0.1f, CRect(leftTopCorner + CPos(width - SORT_SPRITE_DIM, 0), leftTopCorner + CPos(width, SORT_SPRITE_DIM))); | CGUISpriteInstance& sprite = GUI<CGUISpriteInstance>::GetSetting(this, spriteName); | ||||
m_pGUI->DrawSprite(sprite, cell_id, bz + 0.1f, CRect(leftTopCorner + CPos(width - SORT_SPRITE_DIM, 0), leftTopCorner + CPos(width, SORT_SPRITE_DIM))); | |||||
} | } | ||||
// Draw column header text | // Draw column header text | ||||
DrawText(col, color, leftTopCorner + COLUMN_SHIFT, bz + 0.1f, rect_head); | DrawText(col, color, leftTopCorner + COLUMN_SHIFT, bz + 0.1f, rect_head); | ||||
xpos += width; | xpos += width; | ||||
} | } | ||||
// Draw list items for each column | // Draw list items for each column | ||||
const CGUIList& pList = GUI<CGUIList>::GetSetting(this, "list"); | |||||
const size_t objectsCount = m_Columns.size(); | const size_t objectsCount = m_Columns.size(); | ||||
for (size_t i = 0; i < pList->m_Items.size(); ++i) | for (size_t i = 0; i < pList.m_Items.size(); ++i) | ||||
{ | { | ||||
if (m_ItemsYPositions[i+1] - scroll < 0 || | if (m_ItemsYPositions[i+1] - scroll < 0 || | ||||
m_ItemsYPositions[i] - scroll > rect.GetHeight()) | m_ItemsYPositions[i] - scroll > rect.GetHeight()) | ||||
continue; | continue; | ||||
const float rowHeight = m_ItemsYPositions[i+1] - m_ItemsYPositions[i]; | const float rowHeight = m_ItemsYPositions[i+1] - m_ItemsYPositions[i]; | ||||
// Clipping area (we'll have to substract the scrollbar) | // Clipping area (we'll have to substract the scrollbar) | ||||
▲ Show 20 Lines • Show All 41 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator