From bc05cda0e7b185aa1e33e82dac5a668c50b36b3e Mon Sep 17 00:00:00 2001 From: krzys-h Date: Thu, 13 Aug 2015 14:14:11 +0200 Subject: [PATCH] Removed image, link and marker limits in SatCom, closes #554 --- src/ui/controls/edit.cpp | 96 +++++++++++++++------------------------- src/ui/controls/edit.h | 13 ++---- 2 files changed, 39 insertions(+), 70 deletions(-) diff --git a/src/ui/controls/edit.cpp b/src/ui/controls/edit.cpp index 56671b96..d2888986 100644 --- a/src/ui/controls/edit.cpp +++ b/src/ui/controls/edit.cpp @@ -115,13 +115,11 @@ CEdit::CEdit() m_cursor1 = 0; m_cursor2 = 0; m_column = 0; - m_imageTotal = 0; m_timeLastScroll = 0.0f; m_timeBlink = 0.0f; m_time = 0.0f; m_historyCurrent = 0; - m_markerTotal = 0; m_bMulti = false; m_lineDescent = 0.0f; m_timeLastClick = 0.0f; @@ -640,9 +638,7 @@ void CEdit::MouseClick(Math::Point mouse) void CEdit::MouseRelease(Math::Point mouse) { - int i, j, rank; - - i = MouseDetect(mouse); + int i = MouseDetect(mouse); if ( i == -1 ) return; if ( !m_bEdit ) @@ -650,8 +646,8 @@ void CEdit::MouseRelease(Math::Point mouse) if ( m_format.size() > 0 && i < m_len && m_cursor1 == m_cursor2 && (m_format[i]&Gfx::FONT_MASK_HIGHLIGHT) == Gfx::FONT_HIGHLIGHT_LINK) //TODO { - rank = -1; - for ( j=0 ; j<=i ; j++ ) + int rank = -1; + for ( int j=0 ; j<=i ; j++ ) { if ( (j == 0 || (m_format[j-1]&Gfx::FONT_MASK_HIGHLIGHT) != Gfx::FONT_HIGHLIGHT_LINK) && // TODO check if good (m_format[j+0]&Gfx::FONT_MASK_HIGHLIGHT) == Gfx::FONT_HIGHLIGHT_LINK) // TODO @@ -659,6 +655,7 @@ void CEdit::MouseRelease(Math::Point mouse) rank ++; } } + assert(static_cast(rank) < m_link.size()); HyperJump(m_link[rank].name, m_link[rank].marker); } } @@ -783,18 +780,12 @@ void CEdit::HyperHome(std::string filename) void CEdit::HyperJump(std::string name, std::string marker) { - std::string filename; - std:: string sMarker; - int i, line, pos; - if ( m_historyCurrent >= 0 ) { m_history[m_historyCurrent].firstLine = m_lineFirst; } - sMarker = marker; - - filename = name + std::string(".txt"); + std::string filename = name + std::string(".txt"); filename = InjectLevelPathsForCurrentLevel(filename, "help/%lng%"); boost::replace_all(filename, "\\", "/"); //TODO: Fix this in files @@ -802,20 +793,17 @@ void CEdit::HyperJump(std::string name, std::string marker) { Justif(); - line = 0; - for ( i=0 ; ipos; + for ( int i=0 ; i= m_lineOffset[i] ) { - if ( pos >= m_lineOffset[i] ) - { - line = i; - } + line = i; } - break; } } @@ -896,7 +884,7 @@ void CEdit::Draw() { Math::Point pos, ppos, dim, start, end; float size = 0.0f, indentLength = 0.0f; - int i, j, beg, len, c1, c2, o1, o2, eol, iIndex, line; + int i, j, beg, len, c1, c2, o1, o2, eol, line; if ( (m_state & STATE_VISIBLE) == 0 ) return; @@ -1017,7 +1005,8 @@ void CEdit::Draw() line ++; } - iIndex = m_text[beg]; // character = index in m_image + unsigned int iIndex = m_text[beg]; // character = index in m_image + assert(iIndex < m_image.size()); pos.y -= m_lineHeight*(line-1); DrawImage(pos, m_image[iIndex].name, m_image[iIndex].width*(m_fontSize/Gfx::FONT_SIZE_SMALL), @@ -1426,12 +1415,9 @@ int GetValueParam(std::string cmd, int rank) void CEdit::FreeImage() { - std::string filename; - - for (int i = 0 ; i < m_imageTotal; i++ ) + for (auto& image : m_image) { - filename = m_image[i].name + ".png"; - m_engine->DeleteTexture(filename); + m_engine->DeleteTexture(image.name + ".png"); } } @@ -1450,7 +1436,7 @@ void CEdit::LoadImage(std::string name) bool CEdit::ReadText(std::string filename, int addSize) { - int len, i, j, n, font, iIndex, iLines, iCount, iLink; + int len, i, j, n, font, iLines, iCount; char iName[50]; float iWidth; InputSlot slot; @@ -1493,10 +1479,9 @@ bool CEdit::ReadText(std::string filename, int addSize) bInSoluce = false; font = m_fontType; - iIndex = 0; - iLink = 0; - m_imageTotal = 0; - m_markerTotal = 0; + m_image.clear(); + m_marker.clear(); + m_link.clear(); i = j = 0; bBOL = true; while ( i < m_len ) @@ -1590,12 +1575,10 @@ bool CEdit::ReadText(std::string filename, int addSize) { if ( m_bSoluce || !bInSoluce ) { - if ( iLink < EDITLINKMAX ) - { - m_link[iLink].name = GetNameParam(buffer.data()+i+3, 0); - m_link[iLink].marker = GetNameParam(buffer.data()+i+3, 1); - iLink ++; - } + HyperLink link; + link.name = GetNameParam(buffer.data()+i+3, 0); + link.marker = GetNameParam(buffer.data()+i+3, 1); + m_link.push_back(link); font &= ~Gfx::FONT_MASK_HIGHLIGHT; } i += strchr(buffer.data()+i, ';')-(buffer.data()+i)+1; @@ -1607,12 +1590,10 @@ bool CEdit::ReadText(std::string filename, int addSize) { if ( m_bSoluce || !bInSoluce ) { - if ( m_markerTotal < EDITLINKMAX ) - { - m_marker[m_markerTotal].name = GetNameParam(buffer.data()+i+3, 0); - m_marker[m_markerTotal].pos = j; - m_markerTotal ++; - } + HyperMarker marker; + marker.name = GetNameParam(buffer.data()+i+3, 0); + marker.pos = j; + m_marker.push_back(marker); } i += strchr(buffer.data()+i, ';')-(buffer.data()+i)+1; } @@ -1627,7 +1608,6 @@ bool CEdit::ReadText(std::string filename, int addSize) { if ( m_bSoluce || !bInSoluce ) { - strcpy(iName, GetNameParam(buffer.data()+i+7, 0).c_str()); //? iWidth = m_lineHeight*RetValueParam(buffer.data()+i+7, 1); @@ -1639,17 +1619,14 @@ bool CEdit::ReadText(std::string filename, int addSize) // A part of image per line of text. for ( iCount=0 ; iCount= EDITIMAGEMAX) - { - GetLogger()->Warn("Too many images, current limit is %d image lines. This limit will be removed in the future.\n", EDITIMAGEMAX); - break; - } - m_image[iIndex].name = iName; - m_image[iIndex].offset = static_cast(iCount) / static_cast(iLines); - m_image[iIndex].height = 1.0f/iLines; - m_image[iIndex].width = iWidth*0.75f; + ImageLine image; + image.name = iName; + image.offset = static_cast(iCount) / static_cast(iLines); + image.height = 1.0f/iLines; + image.width = iWidth*0.75f; - m_text[j] = static_cast(iIndex++); // as an index into m_image + m_image.push_back(image); + m_text[j] = static_cast(m_image.size()-1); // as an index into m_image m_format[j] = Gfx::FONT_MASK_IMAGE; j ++; } @@ -1840,7 +1817,6 @@ bool CEdit::ReadText(std::string filename, int addSize) } } m_len = j; - m_imageTotal = iIndex; Justif(); ColumnFix(); diff --git a/src/ui/controls/edit.h b/src/ui/controls/edit.h index a3b48351..dcf50c64 100644 --- a/src/ui/controls/edit.h +++ b/src/ui/controls/edit.h @@ -39,10 +39,6 @@ class CScroll; const int EDITSTUDIOMAX = 20000; //! maximum total number of lines const int EDITLINEMAX = 1000; -//! maximum total number of lines with images -const int EDITIMAGEMAX = 100; -//! maximum number of links -const int EDITLINKMAX = 100; //! max number of levels preserves const int EDITHISTORYMAX = 50; @@ -256,11 +252,9 @@ protected: int m_lineTotal; // number lines used (in m_lineOffset) int m_lineOffset[EDITLINEMAX]; char m_lineIndent[EDITLINEMAX]; - int m_imageTotal; - ImageLine m_image[EDITIMAGEMAX]; - HyperLink m_link[EDITLINKMAX]; - int m_markerTotal; - HyperMarker m_marker[EDITLINKMAX]; + std::vector m_image; + std::vector m_link; + std::vector m_marker; int m_historyTotal; int m_historyCurrent; HyperHistory m_history[EDITHISTORYMAX]; @@ -281,4 +275,3 @@ protected: } -