void CameraControl::OnExcute(float sec) { float move_speed = m_move_speed; // 前后移动 float len = sec * move_speed * m_fDirection; if (len != 0) { // 前后平移 MoveFront(-len); } // 上下移动 float len1 = sec * move_speed * m_fUpDirection; if (len1 != 0) { MoveUp(len1); } // 左右平移 float delta = sec * move_speed * m_fShiftDirection; if (delta != 0) { MoveShift(delta); } }
void TerminalDisplay::Move(Pos p) { Attach(); if (fWritePos == p) return; if (fWritePos.fLine > p.fLine) { MoveUp(fWritePos.fLine - p.fLine); fWritePos.fLine -= fWritePos.fLine - p.fLine; } else if (fWritePos.fLine < p.fLine) { MoveDown(p.fLine - fWritePos.fLine); fWritePos.fLine += p.fLine - fWritePos.fLine; } if (p.fCol == 0) { MoveFront(); fWritePos.fCol = 0; } else if (fWritePos.fCol > p.fCol) { MoveLeft(fWritePos.fCol - p.fCol); fWritePos.fCol -= fWritePos.fCol - p.fCol; } else if (p.fCol > fWritePos.fCol) { MoveRight(p.fCol - fWritePos.fCol); fWritePos.fCol += p.fCol - fWritePos.fCol; } }
size_t TerminalDisplay::WriteWrappedElement(const Text& Element, size_t TextOffset, size_t WriteOffset, size_t Requested) { size_t Start = TextOffset; size_t Remaining = Requested; size_t Available = Element.length() - Start; if (Requested == (size_t) -1) { Requested = Available; } if (Available > 0) { if (Available < Remaining) { Remaining = Available; } while (Remaining > 0) { size_t numThisLine = Remaining; // How much can this line hold? size_t numToEOL = GetWidth() - ((Start + WriteOffset) % GetWidth()); if (!numToEOL) { MoveDown(); ++fWritePos.fLine; MoveFront(); fWritePos.fCol = 0; numToEOL = GetWidth(); } if (numThisLine > numToEOL) { numThisLine = numToEOL; } if (GetContext()->GetColorizer()) { // We only write same-color chunks; how long is it? const std::vector<char>& Colors = Element.GetColors(); char ThisColor = Colors[Start]; size_t numSameColor = 1; while (numSameColor < numThisLine && ThisColor == Colors[Start + numSameColor]) ++numSameColor; numThisLine = numSameColor; if (ThisColor != fPrevColor) { Color C; GetContext()->GetColorizer()->GetColor(ThisColor, C); SetColor(ThisColor, C); fPrevColor = ThisColor; } } WriteRawString(Element.GetText().c_str() + Start, numThisLine); fWritePos = IndexToPos(PosToIndex(fWritePos) + numThisLine); if (numThisLine == numToEOL) { ActOnEOL(); } Start += numThisLine; Remaining -= numThisLine; } } if (Requested == Available) { size_t VisL = fWriteLen / GetWidth(); size_t Wrote = WriteOffset + TextOffset + Requested; size_t WroteL = Wrote / GetWidth(); size_t NumToEOL = GetWidth() - (Wrote % GetWidth()); if (fWriteLen > Wrote && NumToEOL > 0) { // Wrote less and not at EOL EraseToRight(); } if (WroteL < VisL) { Pos prevWC = GetCursor(); MoveFront(); fWritePos.fCol = 0; for (size_t l = WroteL + 1; l <= VisL; ++l) { MoveDown(); ++fWritePos.fLine; EraseToRight(); } Move(prevWC); } } return Remaining; }