From: Felix Domke Date: Thu, 19 May 2005 22:55:12 +0000 (+0000) Subject: - add overwrite support X-Git-Tag: 2.6.0~5842 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/16e1c26e4bfebd5960e9f4613da06c96556f5b4e - add overwrite support - add focus handling --- diff --git a/lib/gui/einput.cpp b/lib/gui/einput.cpp index b87c664c..7f37c4db 100644 --- a/lib/gui/einput.cpp +++ b/lib/gui/einput.cpp @@ -9,20 +9,20 @@ eInput::eInput(eWidget *parent): eLabel(parent) m_valign = alignCenter; m_halign = alignCenter; - ePtr ptr; - eActionMap::getInstance(ptr); - ptr->bindAction("InputActions", 0, 0, this); - - // bind all keys - ptr->bindAction("", 0, 1, this); + m_mode = 0; } eInput::~eInput() { - ePtr ptr; - eActionMap::getInstance(ptr); - ptr->unbindAction(this, 0); - ptr->unbindAction(this, 1); + mayKillFocus(); +} + +void eInput::setOverwriteMode(int m) +{ + int om = m_mode; + m_mode = m; + if (om != m_mode) + invalidate(); } void eInput::setContent(eInputContent *content) @@ -58,19 +58,30 @@ int eInput::event(int event, void *data, void *data2) eDebug("cursor is %d", cursor); para->setFont(m_font); para->renderString(text, 0); - int glyphs = para->size(); - eRect bbox; - if (cursor < glyphs) + + if (m_mode && cursor < glyphs) { - bbox = para->getGlyphBBox(cursor); - bbox = eRect(bbox.left()-1, 0, 2, size().height()); + /* in overwrite mode, when not at end of line, invert the current cursor position. */ + para->setGlyphFlag(cursor, GS_INVERT); + eRect bbox = para->getGlyphBBox(cursor); + bbox = eRect(bbox.left(), 0, bbox.width() + 2, size().height()); + painter.fill(bbox); } else { - bbox = para->getGlyphBBox(cursor - 1); - bbox = eRect(bbox.right(), 0, 2, size().height()); + /* otherwise, insert small cursor */ + eRect bbox; + if (cursor < glyphs) + { + bbox = para->getGlyphBBox(cursor); + bbox = eRect(bbox.left()-1, 0, 2, size().height()); + } else + { + bbox = para->getGlyphBBox(cursor - 1); + bbox = eRect(bbox.right(), 0, 2, size().height()); + } + painter.fill(bbox); } - painter.fill(bbox); painter.renderPara(para, ePoint(0, 0)); @@ -99,6 +110,9 @@ int eInput::event(int event, void *data, void *data2) case deleteBackward: m_content->deleteChar(eInputContent::deleteBackward); break; + case toggleOverwrite: + setOverwriteMode(!m_mode); + break; } return 1; } @@ -107,8 +121,27 @@ int eInput::event(int event, void *data, void *data2) { int key = (int)data; int flags = (int)data2; - if (m_content && !(flags & 1)) - m_content->haveKey(key); + if (m_content && !(flags & 1)) // only make/repeat, no break + return m_content->haveKey(key, m_mode); + break; + } + case evtFocusGot: + { + eDebug("focus got in %p", this); + ePtr ptr; + eActionMap::getInstance(ptr); + ptr->bindAction("InputActions", 0, 0, this); + // bind all keys + ptr->bindAction("", 0, 1, this); + break; + } + case evtFocusLost: + { + eDebug("focus lostin %p", this); + ePtr ptr; + eActionMap::getInstance(ptr); + ptr->unbindAction(this, 0); + ptr->unbindAction(this, 1); break; } default: @@ -179,7 +212,7 @@ void eInputContentNumber::moveCursor(int dir) m_input->invalidate(); } -int eInputContentNumber::haveKey(int code) +int eInputContentNumber::haveKey(int code, int overwrite) { int have_digit = -1; @@ -197,11 +230,16 @@ int eInputContentNumber::haveKey(int code) DIGIT(7); DIGIT(8); DIGIT(9); + default: + return 0; } if (have_digit != -1) { insertDigit(m_cursor, have_digit); + /* if overwrite and not end of line, erase char first. */ + if (overwrite && m_cursor < m_len) + insertDigit(m_cursor + 1, -1); m_cursor++; recalcLen(); @@ -212,6 +250,7 @@ int eInputContentNumber::haveKey(int code) if (m_input) m_input->invalidate(); + return 1; } return 0; } diff --git a/lib/gui/einput.h b/lib/gui/einput.h index cab45589..76342df6 100644 --- a/lib/gui/einput.h +++ b/lib/gui/einput.h @@ -21,13 +21,17 @@ public: moveHome, moveEnd, deleteForward, - deleteBackward + deleteBackward, + toggleOverwrite }; void setContent(eInputContent *cnt); + void setOverwriteMode(int o); + int getNumber(); protected: + int m_mode; ePtr m_content; int event(int event, void *data=0, void *data2=0); }; @@ -55,7 +59,7 @@ public: virtual void deleteChar(int dir)=0; /* no movement keys except stuff like '.' or so*/ - virtual int haveKey(int code)=0; + virtual int haveKey(int code, int overwrite)=0; virtual int isValid()=0; protected: @@ -70,7 +74,7 @@ public: void getDisplay(std::string &res, int &cursor); void moveCursor(int dir); - int haveKey(int code); + int haveKey(int code, int overwrite); void deleteChar(int dir); int isValid();