text edit almost done

This commit is contained in:
Eduardo Bart 2011-04-15 12:46:30 -03:00
parent f1475c0569
commit 43c9c5de7c
3 changed files with 44 additions and 16 deletions

View File

@ -125,7 +125,7 @@ void Graphics::endRender()
void Graphics::drawTexturedRect(const Rect& screenCoords, const TexturePtr& texture, const Rect& textureCoords, const Color& color) void Graphics::drawTexturedRect(const Rect& screenCoords, const TexturePtr& texture, const Rect& textureCoords, const Color& color)
{ {
if(screenCoords.size().isEmpty()) if(screenCoords.isEmpty())
return; return;
glColor4ubv(color.rgbaPtr()); glColor4ubv(color.rgbaPtr());
@ -162,7 +162,7 @@ void Graphics::drawTexturedRect(const Rect& screenCoords, const TexturePtr& text
void Graphics::drawRepeatedTexturedRect(const Rect& screenCoords, const TexturePtr& texture, const Rect& textureCoords, const Color& color) void Graphics::drawRepeatedTexturedRect(const Rect& screenCoords, const TexturePtr& texture, const Rect& textureCoords, const Color& color)
{ {
if(screenCoords.size().isEmpty()) if(screenCoords.isEmpty())
return; return;
// render many repeated texture rects // render many repeated texture rects
@ -190,7 +190,7 @@ void Graphics::drawRepeatedTexturedRect(const Rect& screenCoords, const TextureP
void Graphics::drawFilledRect(const Rect& screenCoords, const Color& color) void Graphics::drawFilledRect(const Rect& screenCoords, const Color& color)
{ {
if(screenCoords.size().isEmpty()) if(screenCoords.isEmpty())
return; return;
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
@ -216,7 +216,7 @@ void Graphics::drawFilledRect(const Rect& screenCoords, const Color& color)
void Graphics::drawBoundingRect(const Rect& screenCoords, const Color& color, int innerLineWidth) void Graphics::drawBoundingRect(const Rect& screenCoords, const Color& color, int innerLineWidth)
{ {
if(2 * innerLineWidth > screenCoords.height()) if(2 * innerLineWidth > screenCoords.height() || screenCoords.isEmpty())
return; return;
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);

View File

@ -31,6 +31,7 @@ TextArea::TextArea() :
m_align(ALIGN_TOP_LEFT), m_align(ALIGN_TOP_LEFT),
m_color(Color::white), m_color(Color::white),
m_cursorPos(-1), m_cursorPos(-1),
m_startRenderPos(0),
m_cursorVisible(false) m_cursorVisible(false)
{ {
} }
@ -46,6 +47,7 @@ TextArea::TextArea(Font* font,
m_align(align), m_align(align),
m_color(color), m_color(color),
m_cursorPos(-1), m_cursorPos(-1),
m_startRenderPos(0),
m_cursorVisible(false) m_cursorVisible(false)
{ {
recalculate(); recalculate();
@ -66,10 +68,9 @@ void TextArea::draw()
// draw every 500ms // draw every 500ms
if(ticks - m_cursorTicks <= delay) { if(ticks - m_cursorTicks <= delay) {
Rect cursorRect; Rect cursorRect;
if(m_cursorPos == 0) // when cursor is at 0 or is the first visible element
if(m_cursorPos == 0 || (m_cursorPos < numGlyphs && m_glyphsCoords[m_cursorPos].topLeft() == m_drawArea.topLeft()))
cursorRect = Rect(m_drawArea.left()-1, m_drawArea.top(), 1, m_font->getGlyphHeight()); cursorRect = Rect(m_drawArea.left()-1, m_drawArea.top(), 1, m_font->getGlyphHeight());
else if(m_cursorPos == numGlyphs)
cursorRect = Rect(m_glyphsCoords[m_cursorPos-1].right(), m_glyphsCoords[m_cursorPos-1].top(), 1, m_font->getGlyphHeight());
else else
cursorRect = Rect(m_glyphsCoords[m_cursorPos-1].right(), m_glyphsCoords[m_cursorPos-1].top(), 1, m_font->getGlyphHeight()); cursorRect = Rect(m_glyphsCoords[m_cursorPos-1].right(), m_glyphsCoords[m_cursorPos-1].top(), 1, m_font->getGlyphHeight());
g_graphics.drawFilledRect(cursorRect, m_color); g_graphics.drawFilledRect(cursorRect, m_color);
@ -99,13 +100,38 @@ void TextArea::recalculate()
const Rect *glyphsTextureCoords = m_font->getGlyphsTextureCoords(); const Rect *glyphsTextureCoords = m_font->getGlyphsTextureCoords();
const Size *glyphsSize = m_font->getGlyphsSize(); const Size *glyphsSize = m_font->getGlyphsSize();
// adjust start view area when cursor is enabled and has text
if(m_cursorPos >= 0 && textLenght > 0) {
// adjust when cursor reachs left
if(m_startRenderPos > m_cursorPos) {
m_startInternalPos.x = glyphsPositions[m_cursorPos].x;
m_startInternalPos.y = glyphsPositions[m_cursorPos].y - m_font->getTopMargin();
// adjust when cursor reachs right
} else if(m_cursorPos > m_startRenderPos) {
Rect virtualRect(m_startInternalPos, m_screenCoords.size());
int pos = m_cursorPos - 1; // element before cursor
int glyph = (uchar)m_text[pos];
Rect glyphRect(glyphsPositions[pos], glyphsSize[glyph]);
// if the cursor is after the start render pos, then the glyph before the cursor must visible
if(!virtualRect.contains(glyphRect.topLeft()) || !virtualRect.contains(glyphRect.bottomRight())) {
m_startInternalPos.y = std::max(glyphRect.bottom() - virtualRect.height(), 0);
m_startInternalPos.x = std::max(glyphRect.right() - virtualRect.width() + 1, 0);
}
}
} else {
m_startInternalPos = Point(0,0);
}
m_drawArea.setLeft(m_screenCoords.left()); m_drawArea.setLeft(m_screenCoords.left());
m_drawArea.setTop(m_screenCoords.top()+m_font->getTopMargin()); m_drawArea.setTop(m_screenCoords.top()+m_font->getTopMargin());
m_drawArea.setRight(m_screenCoords.right()); m_drawArea.setRight(m_screenCoords.right());
m_drawArea.setBottom(m_screenCoords.bottom()); m_drawArea.setBottom(m_screenCoords.bottom());
m_startRenderPos = -1;
for(int i = 0; i < textLenght; ++i) { for(int i = 0; i < textLenght; ++i) {
int glyph = (uchar)m_text[i]; int glyph = (uchar)m_text[i];
m_glyphsCoords[i] = Rect();
// skip invalid glyphs // skip invalid glyphs
if(glyph < 32) if(glyph < 32)
@ -169,6 +195,10 @@ void TextArea::recalculate()
// render glyph // render glyph
m_glyphsCoords[i] = glyphScreenCoords; m_glyphsCoords[i] = glyphScreenCoords;
m_glyphsTexCoords[i] = glyphTextureCoords; m_glyphsTexCoords[i] = glyphTextureCoords;
// set who was the first complete glyph rendered
if(m_startRenderPos == -1 && glyphScreenCoords.size() == glyphsSize[glyph])
m_startRenderPos = i;
} }
} }
@ -200,12 +230,6 @@ void TextArea::setAlign(int align)
recalculate(); recalculate();
} }
void TextArea::setStartInternalPos(Point startPos)
{
m_startInternalPos = startPos;
recalculate();
}
void TextArea::enableCursor(bool enable) void TextArea::enableCursor(bool enable)
{ {
if(enable) { if(enable) {
@ -213,6 +237,7 @@ void TextArea::enableCursor(bool enable)
m_cursorTicks = g_engine.getLastFrameTicks(); m_cursorTicks = g_engine.getLastFrameTicks();
} else } else
m_cursorPos = -1; m_cursorPos = -1;
recalculate();
} }
void TextArea::appendCharacter(char c) void TextArea::appendCharacter(char c)
@ -253,4 +278,7 @@ void TextArea::moveCursor(bool right)
m_cursorTicks = g_engine.getLastFrameTicks(); m_cursorTicks = g_engine.getLastFrameTicks();
} }
} }
recalculate();
} }

View File

@ -45,7 +45,6 @@ public:
void setScreenCoords(Rect screenCoords); void setScreenCoords(Rect screenCoords);
void setAlign(int align); void setAlign(int align);
void setColor(const Color& color) { m_color = color; } void setColor(const Color& color) { m_color = color; }
void setStartInternalPos(Point startPos);
void enableCursor(bool enable = true); void enableCursor(bool enable = true);
void setCursorVisible(bool visible = true) { m_cursorVisible = visible; } void setCursorVisible(bool visible = true) { m_cursorVisible = visible; }
@ -64,8 +63,9 @@ private:
Rect m_drawArea; Rect m_drawArea;
int m_align; int m_align;
Color m_color; Color m_color;
Point m_startInternalPos;
int m_cursorPos; int m_cursorPos;
Point m_startInternalPos;
int m_startRenderPos;
int m_cursorTicks; int m_cursorTicks;
bool m_cursorVisible; bool m_cursorVisible;