Ticket #3905: 3905_COList_refresh_v2.1.patch
File 3905_COList_refresh_v2.1.patch, 6.9 KB (added by , 8 years ago) |
---|
-
source/gui/COList.cpp
24 24 #include "soundmanager/ISoundManager.h" 25 25 26 26 COList::COList() 27 : CList(), m_HeadingHeight(30.f), m_Selected Def(-1), m_SelectedColumnOrder(0)27 : CList(), m_HeadingHeight(30.f), m_SelectedColumn(-1), m_SelectedColumnOrder(0) 28 28 { 29 29 AddSetting(GUIST_CGUISpriteInstance, "sprite_heading"); 30 30 AddSetting(GUIST_bool, "sortable"); // The actual sorting is done in JS for more versatility … … 82 82 GUI<CStr>::GetSetting(this, "default_column", defaultColumn); 83 83 defaultColumn = "list_" + defaultColumn; 84 84 85 for (size_t c = 0; c < m_ ObjectsDefs.size(); ++c)85 for (size_t c = 0; c < m_Columns.size(); ++c) 86 86 { 87 87 SGUIText* text = new SGUIText(); 88 88 CGUIString gui_string; 89 gui_string.SetValue(m_ ObjectsDefs[c].m_Heading);89 gui_string.SetValue(m_Columns[c].m_Heading); 90 90 *text = GetGUI()->GenerateText(gui_string, font, width, buffer_zone, this); 91 91 AddText(text); 92 92 93 if (m_Selected Def == (size_t)-1 && defaultColumn == m_ObjectsDefs[c].m_Id)94 m_Selected Def= c;93 if (m_SelectedColumn == (size_t)-1 && defaultColumn == m_Columns[c].m_Id) 94 m_SelectedColumn = c; 95 95 } 96 96 97 if (m_Selected Def!= (size_t)-1)98 GUI<CStr>::SetSetting(this, "selected_column", m_ ObjectsDefs[m_SelectedDef].m_Id.substr(5));97 if (m_SelectedColumn != (size_t)-1) 98 GUI<CStr>::SetSetting(this, "selected_column", m_Columns[m_SelectedColumn].m_Id.substr(5)); 99 99 100 100 if (m_SelectedColumnOrder == 0) 101 101 { … … 109 109 for (size_t i = 0; i < pList->m_Items.size(); ++i) 110 110 { 111 111 m_ItemsYPositions[i] = buffered_y; 112 for (size_t c = 0; c < m_ ObjectsDefs.size(); ++c)112 for (size_t c = 0; c < m_Columns.size(); ++c) 113 113 { 114 114 CGUIList* pList_c; 115 GUI<CGUIList>::GetSettingPointer(this, m_ ObjectsDefs[c].m_Id, pList_c);115 GUI<CGUIList>::GetSettingPointer(this, m_Columns[c].m_Id, pList_c); 116 116 SGUIText* text = new SGUIText(); 117 117 *text = GetGUI()->GenerateText(pList_c->m_Items[i], font, width, buffer_zone, this); 118 118 if (c == 0) … … 147 147 148 148 switch (Message.type) 149 149 { 150 case GUIM_SETTINGS_UPDATED: 151 { 152 if (Message.value == "selected_column_order") 153 GUI<int>::GetSetting(this, "selected_column_order", m_SelectedColumnOrder); 154 else if (Message.value == "selected_column") 155 { 156 CStr selectedColumn; 157 GUI<CStr>::GetSetting(this, "selected_column", selectedColumn); 158 for (size_t c = 0; c < m_Columns.size(); ++c) 159 { 160 if (m_Columns[c].m_Id.substr(5) == selectedColumn) 161 m_SelectedColumn = c; 162 } 163 } 164 return; 165 } 150 166 // If somebody clicks on the column heading 151 167 case GUIM_MOUSE_PRESS_LEFT: 152 168 { … … 160 176 return; 161 177 162 178 float xpos = 0; 163 for (size_t def = 0; def < m_ ObjectsDefs.size(); ++def)179 for (size_t def = 0; def < m_Columns.size(); ++def) 164 180 { 165 float width = m_ ObjectsDefs[def].m_Width;181 float width = m_Columns[def].m_Width; 166 182 // Check if it's a decimal value, and if so, assume relative positioning. 167 if (m_ ObjectsDefs[def].m_Width < 1 && m_ObjectsDefs[def].m_Width > 0)183 if (m_Columns[def].m_Width < 1 && m_Columns[def].m_Width > 0) 168 184 width *= m_TotalAvalibleColumnWidth; 169 185 CPos leftTopCorner = m_CachedActualSize.TopLeft() + CPos(xpos, 0); 170 186 if (mouse.x >= leftTopCorner.x && … … 171 187 mouse.x < leftTopCorner.x + width && 172 188 mouse.y < leftTopCorner.y + m_HeadingHeight) 173 189 { 174 if (def != m_Selected Def)190 if (def != m_SelectedColumn) 175 191 { 176 192 m_SelectedColumnOrder = 1; 177 m_Selected Def= def;193 m_SelectedColumn = def; 178 194 } 179 195 else 180 196 m_SelectedColumnOrder = -m_SelectedColumnOrder; 181 GUI<CStr>::SetSetting(this, "selected_column", m_ ObjectsDefs[def].m_Id.substr(5));197 GUI<CStr>::SetSetting(this, "selected_column", m_Columns[def].m_Id.substr(5)); 182 198 GUI<int>::SetSetting(this, "selected_column_order", m_SelectedColumnOrder); 183 199 GUI<int>::SetSetting(this, "selected_def", def); 184 200 ScriptEvent("selectioncolumnchange"); … … 215 231 } 216 232 else if (child.GetNodeName() == elmt_def) 217 233 { 218 ObjectDefoDef;234 COListColumn oDef; 219 235 220 236 for (XMBAttribute attr : child.GetAttributes()) 221 237 { … … 282 298 } 283 299 } 284 300 285 m_ ObjectsDefs.push_back(oDef);301 m_Columns.push_back(oDef); 286 302 287 303 AddSetting(GUIST_CGUIList, oDef.m_Id); 288 304 SetupText(); … … 380 396 381 397 // Draw column headers 382 398 float xpos = 0; 383 for (size_t def = 0; def < m_ ObjectsDefs.size(); ++def)399 for (size_t def = 0; def < m_Columns.size(); ++def) 384 400 { 385 401 // Check if it's a decimal value, and if so, assume relative positioning. 386 float width = m_ ObjectsDefs[def].m_Width;387 if (m_ ObjectsDefs[def].m_Width < 1 && m_ObjectsDefs[def].m_Width > 0)402 float width = m_Columns[def].m_Width; 403 if (m_Columns[def].m_Width < 1 && m_Columns[def].m_Width > 0) 388 404 width *= m_TotalAvalibleColumnWidth; 389 405 390 406 CPos leftTopCorner = m_CachedActualSize.TopLeft() + CPos(xpos, 0); … … 391 407 392 408 CGUISpriteInstance* sprite; 393 409 // If the list sorted by current column 394 if (m_Selected Def== def)410 if (m_SelectedColumn == def) 395 411 sprite = sprite_order; 396 412 else 397 413 sprite = sprite_not_sorted; … … 405 421 } 406 422 407 423 // Draw list items for each column 408 const size_t objectsCount = m_ ObjectsDefs.size();424 const size_t objectsCount = m_Columns.size(); 409 425 for (size_t i = 0; i < pList->m_Items.size(); ++i) 410 426 { 411 427 if (m_ItemsYPositions[i+1] - scroll < 0 || … … 435 451 // Determine text position and width 436 452 const CPos textPos = rect.TopLeft() + CPos(xpos, -scroll + m_ItemsYPositions[i]); 437 453 438 float width = m_ ObjectsDefs[def].m_Width;;454 float width = m_Columns[def].m_Width;; 439 455 // Check if it's a decimal value, and if so, assume relative positioning. 440 if (m_ ObjectsDefs[def].m_Width < 1 && m_ObjectsDefs[def].m_Width > 0)456 if (m_Columns[def].m_Width < 1 && m_Columns[def].m_Width > 0) 441 457 width *= m_TotalAvalibleColumnWidth; 442 458 443 459 // Clip text to the column (to prevent drawing text into the neighboring column) … … 446 462 cliparea2.bottom = std::min(cliparea2.bottom, textPos.y + rowHeight); 447 463 448 464 // Draw list item 449 DrawText(objectsCount * (i +/*Heading*/1) + def, m_ObjectsDefs[def].m_TextColor, textPos, bz+0.1f, cliparea2);465 DrawText(objectsCount * (i +/*Heading*/1) + def, m_Columns[def].m_TextColor, textPos, bz + 0.1f, cliparea2); 450 466 xpos += width; 451 467 } 452 468 } -
source/gui/COList.h
23 23 /** 24 24 * Represents a column. 25 25 */ 26 struct ObjectDef26 struct COListColumn 27 27 { 28 28 CColor m_TextColor; 29 29 CStr m_Id; … … 63 63 /** 64 64 * Available columns. 65 65 */ 66 std::vector< ObjectDef> m_ObjectsDefs;66 std::vector<COListColumn> m_Columns; 67 67 68 68 /** 69 69 * Index of the selected column. 70 70 */ 71 size_t m_Selected Def;71 size_t m_SelectedColumn; 72 72 73 73 /** 74 74 * +1 for ascending, -1 for descending sort order.