From 7e6fe71b5ee0ca1a7a015a9d432b7528a02a11bf Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Mon, 2 Apr 2012 09:49:43 -0300 Subject: [PATCH] new build types * and remove uneeded files --- CMakeLists.txt | 3 + modules/core_styles/styles/lineedits.otui | 13 - src/framework/CMakeLists.txt | 35 +- src/framework/ui/uilineedit.cpp | 499 ---------------------- src/framework/ui/uilineedit.h | 89 ---- 5 files changed, 20 insertions(+), 619 deletions(-) delete mode 100644 modules/core_styles/styles/lineedits.otui delete mode 100644 src/framework/ui/uilineedit.cpp delete mode 100644 src/framework/ui/uilineedit.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 653862a6..2e6ebdc2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,9 @@ PROJECT(otclient) INCLUDE(src/framework/CMakeLists.txt) INCLUDE(src/otclient/CMakeLists.txt) +# functions map for reading backtraces +SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -Wl,-Map=otclient.map") + OPTION(USE_PCH "Use precompiled header (speed up compile)" OFF) SET(executable_SOURCES src/main.cpp) diff --git a/modules/core_styles/styles/lineedits.otui b/modules/core_styles/styles/lineedits.otui deleted file mode 100644 index aae4257b..00000000 --- a/modules/core_styles/styles/lineedits.otui +++ /dev/null @@ -1,13 +0,0 @@ -LineEdit < UILineEdit - font: verdana-11px-antialised - color: #aaaaaa - size: 86 20 - text-margin: 3 - image-source: /core_styles/styles/images/panel_flat.png - image-border: 1 - - $disabled: - color: #aaaaaa88 - -PasswordLineEdit < LineEdit - text-hidden: true diff --git a/src/framework/CMakeLists.txt b/src/framework/CMakeLists.txt index 01e3d4f7..84021d09 100644 --- a/src/framework/CMakeLists.txt +++ b/src/framework/CMakeLists.txt @@ -9,6 +9,7 @@ SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake;${CMAKE_MODULE_PATH}") # framework options OPTION(WINDOWS_CONSOLE "Enables console window on Windows platform" OFF) OPTION(USE_OPENGL_ES2 "Use OpenGL ES 2.0 (for mobiles devices)" OFF) +OPTION(CRASH_HANDLER "Generate crash reports" ON) SET(BUILD_REVISION "custom" CACHE "Git revision string (intended for releases)" STRING) # set debug as default build type @@ -36,15 +37,19 @@ FIND_PACKAGE(ZLIB REQUIRED) # setup compiler options SET(CXX_WARNS "-Wall -Wextra -Werror -Wno-unused-parameter -Wno-unused-but-set-variable") -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_WARNS} -std=gnu++0x -pipe") -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CXX_WARNS} -pipe") -SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb") -SET(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb") -SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O1 -ggdb") -SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O1 -ggdb") -SET(CMAKE_CXX_FLAGS_RELEASE "-Ofast -fomit-frame-pointer") -SET(CMAKE_C_FLAGS_RELEASE "-Ofast -fomit-frame-pointer") -SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -static-libgcc -static-libstdc++ -Wl,--as-needed") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_WARNS} -std=gnu++0x -pipe") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CXX_WARNS} -pipe") +SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb") +SET(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb") +SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O1 -ggdb") +SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O1 -ggdb") +SET(CMAKE_CXX_FLAGS_RELEASE "-O2") +SET(CMAKE_C_FLAGS_RELEASE "-O2") +SET(CMAKE_CXX_FLAGS_RELFORPERFORMANCE "-Ofast") +SET(CMAKE_C_FLAGS_RELFORPERFORMANCE "-Ofast") +SET(CMAKE_CXX_FLAGS_RELFORSIZE "-Os") +SET(CMAKE_C_FLAGS_RELFORSIZE "-Os") +SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -static-libgcc -static-libstdc++ -Wl,--as-needed") MESSAGE(STATUS "Build type: " ${CMAKE_BUILD_TYPE}) ADD_DEFINITIONS(-DBUILD_TYPE="${CMAKE_BUILD_TYPE}") @@ -60,22 +65,16 @@ ENDIF() IF(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") - ADD_DEFINITIONS(-DDEBUG) MESSAGE(STATUS "Debug information: ON") - OPTION(CRASH_HANDLER "Generate crash reports" ON) + ADD_DEFINITIONS(-DDEBUG) ELSE() MESSAGE(STATUS "Debug information: OFF") - OPTION(CRASH_HANDLER "Generate crash reports" OFF) -ENDIF() -IF(CMAKE_BUILD_TYPE STREQUAL "Release") # NDEBUG disable asserts - ADD_DEFINITIONS(-DNDEBUG) + #ADD_DEFINITIONS(-DNDEBUG) + # strip all debug information SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -s") - IF(CRASH_HANDLER) - MESSAGE(SEND_ERROR "Crash handler cannot be enabled in release mode.") - ENDIF() ENDIF() IF(CRASH_HANDLER) diff --git a/src/framework/ui/uilineedit.cpp b/src/framework/ui/uilineedit.cpp deleted file mode 100644 index c87bbbd1..00000000 --- a/src/framework/ui/uilineedit.cpp +++ /dev/null @@ -1,499 +0,0 @@ -/* - * Copyright (c) 2010-2012 OTClient - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "uilineedit.h" -#include -#include -#include -#include -#include - -UILineEdit::UILineEdit() -{ - m_cursorPos = 0; - m_textAlign = Fw::AlignLeftCenter; - m_startRenderPos = 0; - m_textHorizontalMargin = 0; - m_textHidden = false; - m_alwaysActive = false; - m_shiftNavigation = false; - blinkCursor(); -} - -void UILineEdit::drawSelf() -{ - drawBackground(m_rect); - drawBorder(m_rect); - drawImage(m_rect); - drawIcon(m_rect); - - //TODO: text rendering could be much optimized by using vertex buffer or caching the render into a texture - - int textLength = m_text.length(); - const TexturePtr& texture = m_font->getTexture(); - - g_painter.setColor(m_color); - for(int i=0;i= 0) { - assert(m_cursorPos <= textLength); - // draw every 333ms - const int delay = 333; - if(g_clock.ticksElapsed(m_cursorTicks) <= delay) { - Rect cursorRect; - // when cursor is at 0 or is the first visible element - if(m_cursorPos == 0 || m_cursorPos == m_startRenderPos) - cursorRect = Rect(m_drawArea.left()-1, m_drawArea.top(), 1, m_font->getGlyphHeight()); - else - cursorRect = Rect(m_glyphsCoords[m_cursorPos-1].right(), m_glyphsCoords[m_cursorPos-1].top(), 1, m_font->getGlyphHeight()); - g_painter.drawFilledRect(cursorRect); - } else if(g_clock.ticksElapsed(m_cursorTicks) >= 2*delay) { - m_cursorTicks = g_clock.ticks(); - } - } -} - -void UILineEdit::update() -{ - std::string text = getDisplayedText(); - int textLength = text.length(); - - // prevent glitches - if(m_rect.isEmpty()) - return; - - // map glyphs positions - Size textBoxSize; - const std::vector& glyphsPositions = m_font->calculateGlyphsPositions(text, m_textAlign, &textBoxSize); - const Rect *glyphsTextureCoords = m_font->getGlyphsTextureCoords(); - const Size *glyphsSize = m_font->getGlyphsSize(); - int glyph; - - // resize just on demand - if(textLength > (int)m_glyphsCoords.size()) { - m_glyphsCoords.resize(textLength); - m_glyphsTexCoords.resize(textLength); - } - - // readjust start view area based on cursor position - if(m_cursorPos >= 0 && textLength > 0) { - assert(m_cursorPos <= textLength); - if(m_cursorPos < m_startRenderPos) // cursor is before the previuos first rendered glyph, so we need to update - { - m_startInternalPos.x = glyphsPositions[m_cursorPos].x; - m_startInternalPos.y = glyphsPositions[m_cursorPos].y - m_font->getYOffset(); - m_startRenderPos = m_cursorPos; - } else if(m_cursorPos > m_startRenderPos || // cursor is after the previuos first rendered glyph - (m_cursorPos == m_startRenderPos && textLength == m_cursorPos)) // cursor is at the previuos rendered element, and is the last text element - { - Rect virtualRect(m_startInternalPos, m_rect.size() - Size(2*m_textHorizontalMargin, 0) ); // previous rendered virtual rect - int pos = m_cursorPos - 1; // element before cursor - glyph = (uchar)text[pos]; // glyph of the element before cursor - Rect glyphRect(glyphsPositions[pos], glyphsSize[glyph]); - - // if the cursor is not on the previous rendered virtual rect we need to update it - if(!virtualRect.contains(glyphRect.topLeft()) || !virtualRect.contains(glyphRect.bottomRight())) { - // calculate where is the first glyph visible - Point startGlyphPos; - startGlyphPos.y = std::max(glyphRect.bottom() - virtualRect.height(), 0); - startGlyphPos.x = std::max(glyphRect.right() - virtualRect.width(), 0); - - // find that glyph - for(pos = 0; pos < textLength; ++pos) { - glyph = (uchar)text[pos]; - glyphRect = Rect(glyphsPositions[pos], glyphsSize[glyph]); - glyphRect.setTop(std::max(glyphRect.top() - m_font->getYOffset() - m_font->getGlyphSpacing().height(), 0)); - glyphRect.setLeft(std::max(glyphRect.left() - m_font->getGlyphSpacing().width(), 0)); - - // first glyph entirely visible found - if(glyphRect.topLeft() >= startGlyphPos) { - m_startInternalPos.x = glyphsPositions[pos].x; - m_startInternalPos.y = glyphsPositions[pos].y - m_font->getYOffset(); - m_startRenderPos = pos; - break; - } - } - } - } - } else { - m_startInternalPos = Point(0,0); - } - - Rect textScreenCoords = m_rect; - textScreenCoords.expandLeft(-m_textHorizontalMargin); - textScreenCoords.expandRight(-m_textHorizontalMargin); - m_drawArea = textScreenCoords; - - if(m_textAlign & Fw::AlignBottom) { - m_drawArea.translate(0, textScreenCoords.height() - textBoxSize.height()); - } else if(m_textAlign & Fw::AlignVerticalCenter) { - m_drawArea.translate(0, (textScreenCoords.height() - textBoxSize.height()) / 2); - } else { // AlignTop - } - - if(m_textAlign & Fw::AlignRight) { - m_drawArea.translate(textScreenCoords.width() - textBoxSize.width(), 0); - } else if(m_textAlign & Fw::AlignHorizontalCenter) { - m_drawArea.translate((textScreenCoords.width() - textBoxSize.width()) / 2, 0); - } else { // AlignLeft - - } - - for(int i = 0; i < textLength; ++i) { - glyph = (uchar)text[i]; - m_glyphsCoords[i].clear(); - - // skip invalid glyphs - if(glyph < 32) - continue; - - // calculate initial glyph rect and texture coords - Rect glyphScreenCoords(glyphsPositions[i], glyphsSize[glyph]); - Rect glyphTextureCoords = glyphsTextureCoords[glyph]; - - // first translate to align position - if(m_textAlign & Fw::AlignBottom) { - glyphScreenCoords.translate(0, textScreenCoords.height() - textBoxSize.height()); - } else if(m_textAlign & Fw::AlignVerticalCenter) { - glyphScreenCoords.translate(0, (textScreenCoords.height() - textBoxSize.height()) / 2); - } else { // AlignTop - // nothing to do - } - - if(m_textAlign & Fw::AlignRight) { - glyphScreenCoords.translate(textScreenCoords.width() - textBoxSize.width(), 0); - } else if(m_textAlign & Fw::AlignHorizontalCenter) { - glyphScreenCoords.translate((textScreenCoords.width() - textBoxSize.width()) / 2, 0); - } else { // AlignLeft - // nothing to do - } - - // only render glyphs that are after startRenderPosition - if(glyphScreenCoords.bottom() < m_startInternalPos.y || glyphScreenCoords.right() < m_startInternalPos.x) - continue; - - // bound glyph topLeft to startRenderPosition - if(glyphScreenCoords.top() < m_startInternalPos.y) { - glyphTextureCoords.setTop(glyphTextureCoords.top() + (m_startInternalPos.y - glyphScreenCoords.top())); - glyphScreenCoords.setTop(m_startInternalPos.y); - } - if(glyphScreenCoords.left() < m_startInternalPos.x) { - glyphTextureCoords.setLeft(glyphTextureCoords.left() + (m_startInternalPos.x - glyphScreenCoords.left())); - glyphScreenCoords.setLeft(m_startInternalPos.x); - } - - // subtract startInternalPos - glyphScreenCoords.translate(-m_startInternalPos); - - // translate rect to screen coords - glyphScreenCoords.translate(textScreenCoords.topLeft()); - - // only render if glyph rect is visible on screenCoords - if(!textScreenCoords.intersects(glyphScreenCoords)) - continue; - - // bound glyph bottomRight to screenCoords bottomRight - if(glyphScreenCoords.bottom() > textScreenCoords.bottom()) { - glyphTextureCoords.setBottom(glyphTextureCoords.bottom() + (textScreenCoords.bottom() - glyphScreenCoords.bottom())); - glyphScreenCoords.setBottom(textScreenCoords.bottom()); - } - if(glyphScreenCoords.right() > textScreenCoords.right()) { - glyphTextureCoords.setRight(glyphTextureCoords.right() + (textScreenCoords.right() - glyphScreenCoords.right())); - glyphScreenCoords.setRight(textScreenCoords.right()); - } - - // render glyph - m_glyphsCoords[i] = glyphScreenCoords; - m_glyphsTexCoords[i] = glyphTextureCoords; - } -} - -void UILineEdit::setTextHorizontalMargin(int margin) -{ - m_textHorizontalMargin = margin; - update(); -} - -void UILineEdit::setCursorPos(int pos) -{ - if(pos != m_cursorPos) { - if(pos < 0) - m_cursorPos = 0; - else if((uint)pos >= m_text.length()) - m_cursorPos = m_text.length(); - else - m_cursorPos = pos; - update(); - } -} - -void UILineEdit::setCursorEnabled(bool enable) -{ - if(enable) { - m_cursorPos = 0; - blinkCursor(); - } else - m_cursorPos = -1; - update(); -} - -void UILineEdit::setTextHidden(bool hidden) -{ - m_textHidden = true; - update(); -} - -void UILineEdit::setAlwaysActive(bool enable) -{ - m_alwaysActive = enable; -} - -void UILineEdit::appendText(std::string text) -{ - if(m_cursorPos >= 0) { - // replace characters that are now allowed - boost::replace_all(text, "\n", ""); - boost::replace_all(text, "\r", " "); - - if(text.length() > 0) { - - // only ignore text append if it contains invalid characters - if(m_validCharacters.size() > 0) { - for(uint i = 0; i < text.size(); ++i) { - if(m_validCharacters.find(text[i]) == std::string::npos) - return; - } - } - - std::string oldText = m_text; - m_text.insert(m_cursorPos, text); - m_cursorPos += text.length(); - blinkCursor(); - update(); - UIWidget::onTextChange(m_text, oldText); - } - } -} - -void UILineEdit::appendCharacter(char c) -{ - if(c == '\n' || c == '\r') - return; - - if(m_cursorPos >= 0) { - if(m_validCharacters.size() > 0 && m_validCharacters.find(c) == std::string::npos) - return; - - std::string tmp; - tmp = c; - std::string oldText = m_text; - m_text.insert(m_cursorPos, tmp); - m_cursorPos++; - blinkCursor(); - update(); - UIWidget::onTextChange(m_text, oldText); - } -} - -void UILineEdit::removeCharacter(bool right) -{ - std::string oldText = m_text; - if(m_cursorPos >= 0 && m_text.length() > 0) { - if((uint)m_cursorPos >= m_text.length()) { - m_text.erase(m_text.begin() + (--m_cursorPos)); - } else { - if(right) - m_text.erase(m_text.begin() + m_cursorPos); - else if(m_cursorPos > 0) - m_text.erase(m_text.begin() + --m_cursorPos); - } - blinkCursor(); - update(); - UIWidget::onTextChange(m_text, oldText); - } -} - -void UILineEdit::moveCursor(bool right) -{ - if(right) { - if((uint)m_cursorPos+1 <= m_text.length()) { - m_cursorPos++; - blinkCursor(); - } - } else { - if(m_cursorPos-1 >= 0) { - m_cursorPos--; - blinkCursor(); - } - } - update(); -} - -int UILineEdit::getTextPos(Point pos) -{ - int textLength = m_text.length(); - - // find any glyph that is actually on the - int candidatePos = -1; - for(int i=0;igetYOffset() + m_font->getGlyphSpacing().height()); - clickGlyphRect.expandLeft(m_font->getGlyphSpacing().width()+1); - if(clickGlyphRect.contains(pos)) - return i; - else if(pos.y >= clickGlyphRect.top() && pos.y <= clickGlyphRect.bottom()) { - if(pos.x <= clickGlyphRect.left()) - candidatePos = i; - else if(pos.x >= clickGlyphRect.right()) - candidatePos = i+1; - } - } - return candidatePos; -} - -std::string UILineEdit::getDisplayedText() -{ - if(m_textHidden) - return std::string(m_text.length(), '*'); - else - return m_text; -} - -void UILineEdit::onTextChange(const std::string& text, const std::string& oldText) -{ - m_cursorPos = text.length(); - blinkCursor(); - update(); - UIWidget::onTextChange(text, oldText); -} - -void UILineEdit::onFontChange(const std::string& font) -{ - update(); - UIWidget::onFontChange(font); -} - -void UILineEdit::onStyleApply(const std::string& styleName, const OTMLNodePtr& styleNode) -{ - UIWidget::onStyleApply(styleName, styleNode); - - for(const OTMLNodePtr& node : styleNode->children()) { - if(node->tag() == "text") { - setText(node->value()); - setCursorPos(m_text.length()); - } else if(node->tag() == "text-hidden") - setTextHidden(node->value()); - else if(node->tag() == "text-margin") - setTextHorizontalMargin(node->value()); - else if(node->tag() == "always-active") - setAlwaysActive(node->value()); - else if(node->tag() == "shift-navigation") - setShiftNavigation(node->value()); - } -} - -void UILineEdit::onGeometryChange(const Rect& oldRect, const Rect& newRect) -{ - update(); - UIWidget::onGeometryChange(oldRect, newRect); -} - -void UILineEdit::onFocusChange(bool focused, Fw::FocusReason reason) -{ - if(focused && !m_alwaysActive) { - if(reason == Fw::KeyboardFocusReason) - setCursorPos(m_text.length()); - else - blinkCursor(); - } - UIWidget::onFocusChange(focused, reason); -} - -bool UILineEdit::onKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks) -{ - if(UIWidget::onKeyPress(keyCode, keyboardModifiers, autoRepeatTicks)) - return true; - - if(keyboardModifiers == Fw::KeyboardNoModifier) { - if(keyCode == Fw::KeyDelete) { // erase right character - removeCharacter(true); - return true; - } else if(keyCode == Fw::KeyBackspace) { // erase left character { - removeCharacter(false); - return true; - } else if(keyCode == Fw::KeyRight && !m_shiftNavigation) { // move cursor right - moveCursor(true); - return true; - } else if(keyCode == Fw::KeyLeft && !m_shiftNavigation) { // move cursor left - moveCursor(false); - return true; - } else if(keyCode == Fw::KeyHome) { // move cursor to first character - setCursorPos(0); - return true; - } else if(keyCode == Fw::KeyEnd) { // move cursor to last character - setCursorPos(m_text.length()); - return true; - } else if(keyCode == Fw::KeyTab && !m_shiftNavigation) { - if(UIWidgetPtr parent = getParent()) - parent->focusNextChild(Fw::KeyboardFocusReason); - return true; - } - } else if(keyboardModifiers == Fw::KeyboardCtrlModifier) { - if(keyCode == Fw::KeyV) { - appendText(g_window.getClipboardText()); - return true; - } - } else if(keyboardModifiers == Fw::KeyboardShiftModifier) { - if(keyCode == Fw::KeyRight && m_shiftNavigation) { // move cursor right - moveCursor(true); - return true; - } else if(keyCode == Fw::KeyLeft && m_shiftNavigation) { // move cursor left - moveCursor(false); - return true; - } - } - - return false; -} - -bool UILineEdit::onKeyText(const std::string& keyText) -{ - appendText(keyText); - return true; -} - -bool UILineEdit::onMousePress(const Point& mousePos, Fw::MouseButton button) -{ - if(button == Fw::MouseLeftButton) { - int pos = getTextPos(mousePos); - if(pos >= 0) - setCursorPos(pos); - } - return true; -} - -void UILineEdit::blinkCursor() -{ - m_cursorTicks = g_clock.ticks(); -} diff --git a/src/framework/ui/uilineedit.h b/src/framework/ui/uilineedit.h deleted file mode 100644 index 4922e710..00000000 --- a/src/framework/ui/uilineedit.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2010-2012 OTClient - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifndef UILINEEDIT_H -#define UILINEEDIT_H - -#include "uiwidget.h" - -class UILineEdit : public UIWidget -{ -public: - UILineEdit(); - - virtual void drawSelf(); - -private: - void update(); - -public: - void setTextHorizontalMargin(int margin); - void setCursorPos(int pos); - void setCursorEnabled(bool enable); - void setTextHidden(bool hidden); - void setAlwaysActive(bool enable); - void setValidCharacters(const std::string validCharacters) { m_validCharacters = validCharacters; } - void setShiftNavigation(bool enable) { m_shiftNavigation = enable; } - - void moveCursor(bool right); - void appendText(std::string text); - void appendCharacter(char c); - void removeCharacter(bool right); - - std::string getDisplayedText(); - int getTextPos(Point pos); - int getTextHorizontalMargin() { return m_textHorizontalMargin; } - int getCursorPos() { return m_cursorPos; } - bool isCursorEnabled() { return m_cursorPos != -1; } - bool isAlwaysActive() { return m_alwaysActive; } - bool isTextHidden() { return m_textHidden; } - bool isShiftNavigation() { return m_shiftNavigation; } - -protected: - virtual void onTextChange(const std::string& text, const std::string& oldText); - virtual void onFontChange(const std::string& font); - virtual void onStyleApply(const std::string& styleName, const OTMLNodePtr& styleNode); - virtual void onGeometryChange(const Rect& oldRect, const Rect& newRect); - virtual void onFocusChange(bool focused, Fw::FocusReason reason); - virtual bool onKeyText(const std::string& keyText); - virtual bool onKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks); - virtual bool onMousePress(const Point& mousePos, Fw::MouseButton button); - -private: - void blinkCursor(); - - Rect m_drawArea; - int m_cursorPos; - Point m_startInternalPos; - int m_startRenderPos; - ticks_t m_cursorTicks; - int m_textHorizontalMargin; - bool m_textHidden; - bool m_alwaysActive; - bool m_shiftNavigation; - std::string m_validCharacters; - - std::vector m_glyphsCoords; - std::vector m_glyphsTexCoords; -}; - -#endif