[Wgui-cvs] wgui/src wg_editbox.cpp,1.92,1.93
Status: Beta
Brought to you by:
greenwire
|
From: Rob W. <gre...@us...> - 2004-07-22 21:17:36
|
Update of /cvsroot/wgui/wgui/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1199/src Modified Files: wg_editbox.cpp Log Message: Fixed a bug with the edit box scrolling code, and cleaned it up. Index: wg_editbox.cpp =================================================================== RCS file: /cvsroot/wgui/wgui/src/wg_editbox.cpp,v retrieving revision 1.92 retrieving revision 1.93 diff -C2 -d -r1.92 -r1.93 *** wg_editbox.cpp 19 Jul 2004 21:49:56 -0000 1.92 --- wg_editbox.cpp 22 Jul 2004 21:17:25 -0000 1.93 *************** *** 159,166 **** if (CApplication::Instance()->GetKeyFocus() == dynamic_cast<const CWindow*>(this) && !m_bReadOnly) { ! CPoint Offset; std::vector<CRect> CharRects; ! m_pRenderedString->GetMetrics(0, &Offset, &CharRects); std::string::size_type SelStartNorm = 0; --- 159,166 ---- if (CApplication::Instance()->GetKeyFocus() == dynamic_cast<const CWindow*>(this) && !m_bReadOnly) { ! CPoint BoundedDims; CPoint Offset; std::vector<CRect> CharRects; ! m_pRenderedString->GetMetrics(&BoundedDims, &Offset, &CharRects); std::string::size_type SelStartNorm = 0; *************** *** 179,215 **** if (! m_bMouseDown) { ! int RightBorder = CharRects[SelStartNorm + SelLenNorm - 1].Right() + Offset.XPos() + SubRect.Left() + m_ScrollOffset; ! int LeftBorder = CharRects[SelStartNorm].Left() + Offset.XPos() + m_ScrollOffset; ! ! if (m_SelLength < 0) { ! if (LeftBorder <= 0) { ! m_ScrollOffset = -(CharRects[SelStartNorm].Left() + Offset.XPos()); } ! else if (RightBorder > SubRect.Right()) { ! m_ScrollOffset = SubRect.Right() - (CharRects[SelStartNorm + SelLenNorm].Right() + Offset.XPos() + SubRect.Left()); } ! } ! else ! { ! if (RightBorder >= SubRect.Right()) { ! m_ScrollOffset = SubRect.Right() - (CharRects[SelStartNorm + SelLenNorm].Right() + Offset.XPos() + SubRect.Left()); } ! else if (LeftBorder < 0) { ! m_ScrollOffset = -(CharRects[SelStartNorm].Left() + Offset.XPos()); } - } ! if (m_ScrollOffset != 0 && ! (CharRects[m_sWindowText.length()].Right() + Offset.XPos() + SubRect.Left() + m_ScrollOffset < SubRect.Right())) ! { ! m_ScrollOffset = SubRect.Right() - (CharRects[m_sWindowText.length()].Right() + Offset.XPos() + SubRect.Left()); ! if (m_ScrollOffset > 0) { ! m_ScrollOffset = 0; } } --- 179,213 ---- if (! m_bMouseDown) { ! if (CharRects.empty() || BoundedDims.XPos() < SubRect.Width()) { ! m_ScrollOffset = 0; ! } ! else ! { ! int iCursorPos = 0; ! if (m_SelStart + m_SelLength >= CharRects.size()) { ! iCursorPos = CharRects.back().Right() + Offset.XPos() + SubRect.Left() + m_ScrollOffset; } ! else { ! iCursorPos = CharRects.at(m_SelStart + m_SelLength).Left() + Offset.XPos() + SubRect.Left() + m_ScrollOffset; } ! if (iCursorPos < SubRect.Left()) { ! m_ScrollOffset = -(iCursorPos - m_ScrollOffset - SubRect.Left() - Offset.XPos()); } ! else if (iCursorPos > SubRect.Right()) { ! m_ScrollOffset = -(iCursorPos - m_ScrollOffset - SubRect.Left() - Offset.XPos() - SubRect.Width() + 1); } ! if (m_ScrollOffset < 0 && (CharRects.back().Right() + Offset.XPos() + SubRect.Left() + m_ScrollOffset < SubRect.Right())) { ! m_ScrollOffset = SubRect.Right() - CharRects.back().Right() - 1; ! if (m_ScrollOffset > 0) ! { ! m_ScrollOffset = 0; ! } } } *************** *** 222,227 **** SelRect.SetBottom(SubRect.Bottom()); SelRect.SetTop(SubRect.Top()); ! SelRect.SetLeft(CharRects[SelStartNorm].Left() + Offset.XPos() + SubRect.Left() + m_ScrollOffset); ! SelRect.SetRight(CharRects[SelLenNorm + SelStartNorm - 1].Right() + Offset.XPos() + SubRect.Left() + m_ScrollOffset); SelRect.ClipTo(SubRect); Painter.DrawRect(SelRect, true, CApplication::Instance()->GetDefaultSelectionColor(), CApplication::Instance()->GetDefaultSelectionColor()); --- 220,225 ---- SelRect.SetBottom(SubRect.Bottom()); SelRect.SetTop(SubRect.Top()); ! SelRect.SetLeft(CharRects.at(SelStartNorm).Left() + Offset.XPos() + SubRect.Left() + m_ScrollOffset); ! SelRect.SetRight(CharRects.at(SelLenNorm + SelStartNorm - 1).Right() + Offset.XPos() + SubRect.Left() + m_ScrollOffset); SelRect.ClipTo(SubRect); Painter.DrawRect(SelRect, true, CApplication::Instance()->GetDefaultSelectionColor(), CApplication::Instance()->GetDefaultSelectionColor()); *************** *** 230,235 **** { //RenderStringWithCursor ! int CursorPos; ! CursorPos = CharRects[m_SelStart + m_SelLength].Left() + Offset.XPos() + SubRect.Left() + m_ScrollOffset; if (CursorPos >= SubRect.Left() && CursorPos <= SubRect.Right()) { --- 228,240 ---- { //RenderStringWithCursor ! int CursorPos = Offset.XPos() + SubRect.Left() + m_ScrollOffset; ! if (m_SelStart + m_SelLength >= CharRects.size() && !CharRects.empty()) ! { ! CursorPos += CharRects.back().Right(); ! } ! else if (m_SelStart + m_SelLength >= 0 && m_SelStart + m_SelLength < CharRects.size()) ! { ! CursorPos += CharRects.at(m_SelStart + m_SelLength).Left(); ! } if (CursorPos >= SubRect.Left() && CursorPos <= SubRect.Right()) { *************** *** 290,301 **** SubRect.Grow(-3); - int xDelta = abs(WindowPoint.XPos() - (CharRects[0].Left() + Offset.XPos() + SubRect.Left())); m_SelStart = 0; ! for (unsigned int i = 0; i < m_pRenderedString->GetLength(); ++i) { ! if (abs(WindowPoint.XPos() - (CharRects[i].Right() + Offset.XPos() + SubRect.Left() + m_ScrollOffset)) < xDelta) { ! xDelta = abs(WindowPoint.XPos() - (CharRects[i].Right() + Offset.XPos() + SubRect.Left() + m_ScrollOffset)); ! m_SelStart = i + 1; } } --- 295,309 ---- SubRect.Grow(-3); m_SelStart = 0; ! if (!CharRects.empty()) { ! int xDelta = abs(WindowPoint.XPos() - (CharRects.front().Left() + Offset.XPos() + SubRect.Left())); ! for (unsigned int i = 0; i < m_pRenderedString->GetLength(); ++i) { ! if (abs(WindowPoint.XPos() - (CharRects.at(i).Right() + Offset.XPos() + SubRect.Left() + m_ScrollOffset)) < xDelta) ! { ! xDelta = abs(WindowPoint.XPos() - (CharRects.at(i).Right() + Offset.XPos() + SubRect.Left() + m_ScrollOffset)); ! m_SelStart = i + 1; ! } } } *************** *** 366,377 **** m_pRenderedString->GetMetrics(0, &Offset, &CharRects); - int xDelta = abs(WindowPoint.XPos() - (CharRects[0].Left() + Offset.XPos() + SubRect.Left() + m_ScrollOffset)); std::string::size_type CursorPos = 0; ! for (unsigned int i = 0; i < m_pRenderedString->GetLength(); ++i) { ! if (abs(WindowPoint.XPos() - (CharRects[i].Right() + Offset.XPos() + SubRect.Left() + m_ScrollOffset)) < xDelta) { ! xDelta = abs(WindowPoint.XPos() - (CharRects[i].Right() + Offset.XPos() + SubRect.Left() + m_ScrollOffset)); ! CursorPos = i + 1; } } --- 374,388 ---- m_pRenderedString->GetMetrics(0, &Offset, &CharRects); std::string::size_type CursorPos = 0; ! if (!CharRects.empty()) { ! int xDelta = abs(WindowPoint.XPos() - (CharRects.front().Left() + Offset.XPos() + SubRect.Left() + m_ScrollOffset)); ! for (unsigned int i = 0; i < m_pRenderedString->GetLength(); ++i) { ! if (abs(WindowPoint.XPos() - (CharRects.at(i).Right() + Offset.XPos() + SubRect.Left() + m_ScrollOffset)) < xDelta) ! { ! xDelta = abs(WindowPoint.XPos() - (CharRects.at(i).Right() + Offset.XPos() + SubRect.Left() + m_ScrollOffset)); ! CursorPos = i + 1; ! } } } |