33 enum { XIndent = 4, YIndent = 4, XMargin = 3, YMargin = 3 };
47 const char *
GetID()
override {
return "Scoreboard"; }
57 void C4Scoreboard::Entry::SwapWith(Entry *pSwap)
59 Entry swp; swp.Text.Take(std::move(Text)); swp.iVal = iVal;
60 Text.Take(std::move(pSwap->Text)); iVal = pSwap->iVal;
61 pSwap->Text.Take(std::move(swp.Text)); pSwap->iVal = swp.iVal;
68 pEntries =
nullptr; iRows=iCols=0;
74 void C4Scoreboard::AddRow(int32_t iInsertBefore)
77 int32_t iNewEntryCount = (iRows+1) * iCols;
78 if (!iNewEntryCount) { ++iRows;
return; }
80 Entry *pNewEntries =
new Entry[iNewEntryCount];
81 for (int32_t iRow = 0, iFromRow = 0; iFromRow < iRows; ++iRow,++iFromRow)
83 if (iFromRow == iInsertBefore) ++iRow;
84 for (int32_t iCol = 0; iCol < iCols; ++iCol)
85 pNewEntries[iRow*iCols+iCol].GrabFrom(
GetCell(iCol, iFromRow));
88 delete [] pEntries; pEntries = pNewEntries;
91 void C4Scoreboard::AddCol(int32_t iInsertBefore)
94 int32_t iNewEntryCount = iRows * (iCols + 1);
95 if (!iNewEntryCount) { ++iCols;
return; }
97 Entry *pNewEntries =
new Entry[iNewEntryCount];
98 for (int32_t iRow = 0; iRow < iRows; ++iRow)
99 for (int32_t iCol = 0, iFromCol = 0; iFromCol < iCols; ++iCol, ++iFromCol)
101 if (iFromCol == iInsertBefore) ++iCol;
102 pNewEntries[iRow*(iCols+1)+iCol].GrabFrom(
GetCell(iFromCol, iRow));
105 delete [] pEntries; pEntries = pNewEntries;
108 void C4Scoreboard::DelRow(int32_t iDelIndex)
111 int32_t iNewEntryCount = (iRows-1) * iCols;
112 if (!iNewEntryCount) { --iRows;
delete [] pEntries; pEntries =
nullptr;
return; }
114 Entry *pNewEntries =
new Entry[iNewEntryCount]; Entry *pCpy = pNewEntries;
115 for (int32_t iRow = 0, iFromRow = 0; iRow < (iRows-1); ++iRow,++iFromRow)
117 if (iFromRow == iDelIndex) ++iFromRow;
118 for (int32_t iCol = 0; iCol < iCols; ++iCol)
119 pCpy++->GrabFrom(
GetCell(iCol, iFromRow));
122 delete [] pEntries; pEntries = pNewEntries;
125 void C4Scoreboard::DelCol(int32_t iDelIndex)
128 int32_t iNewEntryCount = iRows * (iCols-1);
129 if (!iNewEntryCount) { --iCols;
delete [] pEntries; pEntries =
nullptr;
return; }
131 Entry *pNewEntries =
new Entry[iNewEntryCount]; Entry *pCpy = pNewEntries;
132 for (int32_t iRow = 0; iRow < iRows; ++iRow)
133 for (int32_t iCol = 0, iFromCol = 0; iCol < (iCols-1); ++iCol,++iFromCol)
135 if (iFromCol == iDelIndex) ++iFromCol;
136 pCpy++->GrabFrom(
GetCell(iFromCol, iRow));
139 delete [] pEntries; pEntries = pNewEntries;
142 void C4Scoreboard::SwapRows(int32_t iRow1, int32_t iRow2)
144 Entry *pXChg1 = pEntries+iRow1*iCols;
145 Entry *pXChg2 = pEntries+iRow2*iCols;
146 int32_t i = iCols;
while (i--) pXChg1++->SwapWith(pXChg2++);
149 int32_t C4Scoreboard::GetColByKey(int32_t iKey)
const
152 if (!iRows)
return -1;
154 Entry *pCheck = pEntries;
155 for (int32_t i = 0; i < iCols; ++i)
156 if (pCheck++->iVal == iKey)
return i;
160 int32_t C4Scoreboard::GetRowByKey(int32_t iKey)
const
163 if (!iCols)
return -1;
165 Entry *pCheck = pEntries;
166 for (int32_t i = 0; i < iRows; ++i,(pCheck+=iCols))
167 if (pCheck->iVal == iKey)
return i;
174 if (!iCols || !iRows)
176 if (!iCols) AddCol(0);
177 if (!iRows) AddRow(0);
181 int32_t iCol = GetColByKey(iColKey);
182 if (iCol<0) { AddCol(iCol=iCols);
GetCell(iCol, 0)->iVal = iColKey; }
183 int32_t iRow = GetRowByKey(iRowKey);
184 if (iRow<0) { AddRow(iRow=iRows);
GetCell(0, iRow)->iVal = iRowKey; }
186 Entry *pCell =
GetCell(iCol, iRow);
187 pCell->Text.Copy(szValue);
188 if (iCol && iRow) pCell->iVal = iValue;
190 if (!szValue || !*szValue)
196 for (i=1; i<iCols; ++i)
if (
GetCell(i, iRow)->Text)
break;
197 if (i == iCols) DelRow(iRow);
202 for (i=1; i<iRows; ++i)
if (
GetCell(iCol, i)->Text)
break;
203 if (i == iRows) DelCol(iCol);
217 int32_t iCol = GetColByKey(iColKey);
218 int32_t iRow = GetRowByKey(iRowKey);
219 if (iCol<0 || iRow<0)
return nullptr;
221 Entry *pCell =
GetCell(iCol, iRow);
222 return pCell->Text.getData();
228 int32_t iCol = GetColByKey(iColKey);
229 int32_t iRow = GetRowByKey(iRowKey);
230 if (iCol<0 || iRow<0)
return 0;
232 Entry *pCell =
GetCell(iCol, iRow);
238 int32_t iCol = GetColByKey(iColKey);
239 if (iCol>=0) DelCol(iCol);
245 int32_t iRow = GetRowByKey(iRowKey);
246 if (iRow>=0) DelRow(iRow);
253 int32_t iCol = GetColByKey(iColKey);
254 if (iCol<0)
return false;
256 int32_t iSortDir = fReverse ? -1 : +1;
257 int32_t iSortBegin=1, iSortEnd=iRows-1;
258 while (iSortBegin < iSortEnd)
260 int32_t iNewBorder = iSortBegin; int32_t i;
261 for (i = iSortBegin; i < iSortEnd; ++i)
262 if (
GetCell(iCol, i)->iVal * iSortDir >
GetCell(iCol, i+1)->iVal * iSortDir)
267 iSortEnd = iNewBorder;
268 for (i = iSortEnd; i > iSortBegin; --i)
269 if (
GetCell(iCol, i-1)->iVal * iSortDir >
GetCell(iCol, i)->iVal * iSortDir)
274 iSortBegin = iNewBorder;
279 void C4Scoreboard::InvalidateRows()
318 if (deserializing)
Clear();
324 if (deserializing) pEntries =
new Entry[iRows * iCols];
325 for (int32_t iRow = 0; iRow < iRows; ++iRow)
326 for (int32_t iCol = 0; iCol < iCols; ++iCol)
328 Entry *pEnt =
GetCell(iCol, iRow);
343 :
C4GUI::Dialog(100, 100,
"nops", false), piColWidths(nullptr), pBrd(pForScoreboard)
350 delete [] piColWidths;
351 pBrd->
pDlg =
nullptr;
357 int32_t iRowCount = pBrd->iRows; int32_t iColCount = pBrd->iCols;
358 delete [] piColWidths; piColWidths =
nullptr;
361 if (!iRowCount || !iColCount)
return;
363 piColWidths =
new int32_t[iColCount];
364 int32_t iWdt=XMargin*2, iHgt=YMargin*2;
365 for (int32_t iCol = 0; iCol < iColCount; ++iCol)
367 piColWidths[iCol] = XIndent;
368 for (int32_t iRow = 0; iRow < iRowCount; ++iRow)
370 C4Scoreboard::Entry *pCell = pBrd->
GetCell(iCol, iRow);
373 iWdt += piColWidths[iCol];
376 const char *szTitle = pBrd->
GetCell(0,0)->Text.getData();
399 if (!piColWidths)
Update();
401 ParentClass::Draw(cgo);
407 ParentClass::DrawElement(cgo);
409 int32_t iRowCount = pBrd->iRows; int32_t iColCount = pBrd->iCols;
411 for (int32_t iRow = 0; iRow < iRowCount; ++iRow)
414 for (int32_t iCol = 0; iCol < iColCount; ++iCol)
416 const char *szText = pBrd->
GetCell(iCol, iRow)->Text.getData();
417 if (szText && *szText && (iRow || iCol))
419 iX += piColWidths[iCol];
C4GraphicsResource GraphicsResource
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
StdStrBuf FormatString(const char *szFmt,...)
bool TextOut(const char *szText, CStdFont &rFont, float fZoom, C4Surface *sfcDest, float iTx, float iTy, DWORD dwFCol=0xffffffff, BYTE byForm=ALeft, bool fDoMarkup=true)
int32_t GetMarginTop() override
int32_t GetMarginBottom() override
int32_t GetMarginRight() override
int32_t GetMarginLeft() override
void SetTitle(const char *szToTitle, bool fShowCloseButton=true)
virtual Screen * GetScreen()
void SetBounds(const C4Rect &rcNewBound)
static C4Facet GetIconFacet(Icons icoIconIndex)
bool ShowRemoveDlg(Dialog *pDlg)
const C4Rect & GetPreferredDlgRect()
void SetPos(int32_t iXPos, int32_t iYPos)
void SetIcon(const C4Facet &rfctIcon)
C4ScoreboardDlg(C4Scoreboard *pForScoreboard)
void DrawElement(C4TargetFacet &cgo) override
const char * GetID() override
bool DoPlacement(C4GUI::Screen *pOnScreen, const C4Rect &rPreferredDlgRect) override
void Draw(C4TargetFacet &cgo) override
~C4ScoreboardDlg() override
bool IsMouseControlled() override
class C4ScoreboardDlg * pDlg
bool SortBy(int32_t iColKey, bool fReverse)
void DoDlgShow(int32_t iChange, bool fUserToggle)
void CompileFunc(StdCompiler *pComp)
Entry * GetCell(int32_t iCol, int32_t iRow) const
int32_t GetCellData(int32_t iColKey, int32_t iRowKey)
void RemoveCol(int32_t iColKey)
void RemoveRow(int32_t iRowKey)
void SetCell(int32_t iColKey, int32_t iRowKey, const char *szValue, int32_t iValue)
const char * GetCellString(int32_t iColKey, int32_t iRowKey)
int GetLineHeight() const
int32_t GetTextWidth(const char *szText, bool fCheckMarkup=true)
void Value(const T &rStruct)
virtual bool isDeserializer()