From: Felix Domke Date: Fri, 20 May 2005 19:34:06 +0000 (+0000) Subject: - split einput contents to own files X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=ee0a99a85f0e8c01e44422c4bc2c81fce7ee7e5e - split einput contents to own files - add string input --- diff --git a/lib/gui/Makefile.am b/lib/gui/Makefile.am index 24f7067..951cc4f 100644 --- a/lib/gui/Makefile.am +++ b/lib/gui/Makefile.am @@ -7,7 +7,7 @@ noinst_LIBRARIES = libenigma_gui.a libenigma_gui_a_SOURCES = \ ebutton.cpp elabel.cpp eslider.cpp ewidget.cpp ewidgetdesktop.cpp \ ewindow.cpp ewindowstyle.cpp elistbox.cpp elistboxcontent.cpp \ - epixmap.cpp ewindowstyleskinned.cpp einput.cpp + epixmap.cpp ewindowstyleskinned.cpp einput.cpp einputstring.cpp einputnumber.cpp diff --git a/lib/gui/einput.cpp b/lib/gui/einput.cpp index 7f37c4d..7d411f9 100644 --- a/lib/gui/einput.cpp +++ b/lib/gui/einput.cpp @@ -1,15 +1,13 @@ #include #include #include -#include -eInput::eInput(eWidget *parent): eLabel(parent) -{ - /* default to center alignment */ - m_valign = alignCenter; - m_halign = alignCenter; +#include - m_mode = 0; +eInput::eInput(eWidget *parent): eWidget(parent) +{ + m_mode = 1; + m_have_focus = 0; } eInput::~eInput() @@ -60,27 +58,33 @@ int eInput::event(int event, void *data, void *data2) para->renderString(text, 0); int glyphs = para->size(); - if (m_mode && cursor < glyphs) + if (m_have_focus) { - /* 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 - { - /* otherwise, insert small cursor */ - 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(), 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 if (cursor) + { + bbox = para->getGlyphBBox(cursor - 1); + bbox = eRect(bbox.right(), 0, 2, size().height()); + } else + { + bbox = eRect(0, 0, 2, size().height()); + } + painter.fill(bbox); } - painter.fill(bbox); } painter.renderPara(para, ePoint(0, 0)); @@ -113,6 +117,9 @@ int eInput::event(int event, void *data, void *data2) case toggleOverwrite: setOverwriteMode(!m_mode); break; + case accept: + changed(); + mayKillFocus(); } return 1; } @@ -133,6 +140,11 @@ int eInput::event(int event, void *data, void *data2) ptr->bindAction("InputActions", 0, 0, this); // bind all keys ptr->bindAction("", 0, 1, this); + m_have_focus = 1; + eRCInput::getInstance()->setKeyboardMode(eRCInput::kmAscii); + // fixme. we should use a style for this. + setBackgroundColor(gRGB(64, 64, 128)); + invalidate(); break; } case evtFocusLost: @@ -142,182 +154,28 @@ int eInput::event(int event, void *data, void *data2) eActionMap::getInstance(ptr); ptr->unbindAction(this, 0); ptr->unbindAction(this, 1); + m_have_focus = 0; + if (m_content) + m_content->validate(); + eRCInput::getInstance()->setKeyboardMode(eRCInput::kmNone); + clearBackgroundColor(); + invalidate(); break; } default: break; } - return eLabel::event(event, data, data2); + return eWidget::event(event, data, data2); } -int eInput::getNumber() +void eInput::setFont(gFont *fnt) { - return atoi(m_text.c_str()); + m_font = fnt; + invalidate(); } -DEFINE_REF(eInputContentNumber); - void eInputContent::setInput(eInput *widget) { m_input = widget; } -eInputContentNumber::eInputContentNumber(int cur, int min, int max) -{ - m_min = min; - m_max = max; - m_value = cur; - m_cursor = 0; - m_input = 0; - recalcLen(); -} - -void eInputContentNumber::getDisplay(std::string &res, int &cursor) -{ - // TODO - char r[128]; - sprintf(r, "%d", m_value); - res = r; - cursor = m_cursor; -} - -void eInputContentNumber::moveCursor(int dir) -{ - eDebug("move cursor.."); - int old_cursor = m_cursor; - - switch (dir) - { - case dirLeft: - --m_cursor; - break; - case dirRight: - ++m_cursor; - break; - case dirHome: - m_cursor = 0; - break; - case dirEnd: - m_cursor = m_len; - break; - } - - if (m_cursor < 0) - m_cursor = 0; - if (m_cursor > m_len) - m_cursor = m_len; - - if (m_cursor != old_cursor) - if (m_input) - m_input->invalidate(); -} - -int eInputContentNumber::haveKey(int code, int overwrite) -{ - int have_digit = -1; - -#define ASCII(x) (x | 0x8000) -#define DIGIT(x) case KEY_##x: case KEY_KP##x: case ASCII(x|0x30): have_digit=x; break; - switch (code) - { - DIGIT(0); - DIGIT(1); - DIGIT(2); - DIGIT(3); - DIGIT(4); - DIGIT(5); - DIGIT(6); - 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(); - - // can happen when 0 -> x - if (m_cursor > m_len) - m_cursor = m_len; - - if (m_input) - m_input->invalidate(); - return 1; - } - return 0; -} - -void eInputContentNumber::deleteChar(int dir) -{ - if (dir == deleteForward) - { - eDebug("forward"); - if (m_cursor != m_len) - ++m_cursor; - else - return; - } - /* backward delete at begin */ - if (!m_cursor) - return; - insertDigit(m_cursor, -1); - - if (m_len > 1) - m_cursor--; - recalcLen(); - if (m_input) - m_input->invalidate(); -} - -int eInputContentNumber::isValid() -{ - return m_value >= m_min && m_value <= m_max; -} - -void eInputContentNumber::recalcLen() -{ - int v = m_value; - m_len = 0; - while (v) - { - ++m_len; - v /= 10; - } - - if (!m_len) /* zero */ - m_len = 1; -} - -void eInputContentNumber::insertDigit(int pos, int dig) -{ - /* get stuff left from cursor */ - int exp = 1; - int i; - for (i = 0; i < (m_len - pos); ++i) - exp *= 10; - - /* now it's 1...max */ - int left = m_value / exp; - int right = m_value % exp; - - if (dig >= 0) - { - left *= 10; - left += dig; - } else if (dig == -1) /* delete */ - { - left /= 10; - } - - left *= exp; - left += right; - m_value = left; -} diff --git a/lib/gui/einput.h b/lib/gui/einput.h index 76342df..7c65cc1 100644 --- a/lib/gui/einput.h +++ b/lib/gui/einput.h @@ -1,12 +1,12 @@ #ifndef __lib_gui_einput_h #define __lib_gui_einput_h -#include +#include #include class eInputContent; -class eInput: public eLabel +class eInput: public eWidget { public: eInput(eWidget *parent); @@ -22,16 +22,18 @@ public: moveEnd, deleteForward, deleteBackward, - toggleOverwrite + toggleOverwrite, + accept }; void setContent(eInputContent *cnt); void setOverwriteMode(int o); - int getNumber(); + void setFont(gFont *font); protected: - int m_mode; + ePtr m_font; + int m_mode, m_have_focus; ePtr m_content; int event(int event, void *data=0, void *data2=0); }; @@ -62,31 +64,9 @@ public: virtual int haveKey(int code, int overwrite)=0; virtual int isValid()=0; + virtual void validate()=0; protected: eInput *m_input; }; -class eInputContentNumber: public eInputContent -{ - DECLARE_REF(eInputContentNumber); -public: - eInputContentNumber(int cur, int min, int max); - - void getDisplay(std::string &res, int &cursor); - void moveCursor(int dir); - int haveKey(int code, int overwrite); - void deleteChar(int dir); - int isValid(); - -private: - void recalcLen(); - - void insertDigit(int pos, int dig); - - int m_value; - int m_cursor, m_len; - - int m_min, m_max; -}; - #endif diff --git a/lib/gui/einputnumber.cpp b/lib/gui/einputnumber.cpp new file mode 100644 index 0000000..29c7880 --- /dev/null +++ b/lib/gui/einputnumber.cpp @@ -0,0 +1,207 @@ +#include +#include + +DEFINE_REF(eInputContentNumber); + +eInputContentNumber::eInputContentNumber(int cur, int min, int max) +{ + m_min = min; + m_max = max; + m_value = cur; + m_cursor = 0; + m_input = 0; + recalcLen(); +} + +void eInputContentNumber::getDisplay(std::string &res, int &cursor) +{ + // TODO + char r[128]; + + int e = 1; + for (int i = 1; i < m_len; ++i) + e *= 10; + + int v = m_value; + + int i; + for (i = 0; i < m_len; ++i) + { + int rem = v / e; + r[i] = '0' + rem; + v %= e; + + e /= 10; + } + + r[i] = 0; + + res = r; + cursor = m_cursor; +} + +void eInputContentNumber::moveCursor(int dir) +{ + eDebug("move cursor.."); + int old_cursor = m_cursor; + + switch (dir) + { + case dirLeft: + --m_cursor; + break; + case dirRight: + ++m_cursor; + break; + case dirHome: + m_cursor = 0; + break; + case dirEnd: + m_cursor = m_len; + break; + } + + if (m_cursor < 0) + m_cursor = 0; + if (m_cursor > m_len) + m_cursor = m_len; + + if (m_cursor != old_cursor) + if (m_input) + m_input->invalidate(); +} + +int eInputContentNumber::haveKey(int code, int overwrite) +{ + int have_digit = -1; + + /* we handle KEY_KPx, but not KEY_x. otherwise we would get stuff twice. */ +#define ASCII(x) (x | 0x8000) +#define DIGIT(x) /* case KEY_##x: */ case KEY_KP##x: case ASCII(x|0x30): have_digit=x; break; + switch (code) + { + DIGIT(0); + DIGIT(1); + DIGIT(2); + DIGIT(3); + DIGIT(4); + DIGIT(5); + DIGIT(6); + 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); + else + ++m_len; + + m_cursor++; + + assert(m_cursor <= m_len); + + if (m_input) + m_input->invalidate(); + return 1; + } + return 0; +} + +void eInputContentNumber::deleteChar(int dir) +{ + if (dir == deleteForward) + { + eDebug("forward"); + if (m_cursor != m_len) + ++m_cursor; + else + return; + } + /* backward delete at begin */ + if (!m_cursor) + return; + + if (!m_len) + return; + + insertDigit(m_cursor, -1); + + m_len--; + m_cursor--; + + if (m_input) + m_input->invalidate(); +} + +int eInputContentNumber::isValid() +{ + return m_value >= m_min && m_value <= m_max; +} + +void eInputContentNumber::validate() +{ + recalcLen(); +} + +void eInputContentNumber::setValue(int val) +{ + m_value = val; + recalcLen(); + if (m_cursor > m_len) + m_cursor = m_len; + if (m_input) + m_input->invalidate(); +} + +int eInputContentNumber::getValue() +{ + return m_value; +} + +void eInputContentNumber::recalcLen() +{ + int v = m_value; + m_len = 0; + while (v) + { + ++m_len; + v /= 10; + } + + if (!m_len) /* zero */ + m_len = 1; +} + +void eInputContentNumber::insertDigit(int pos, int dig) +{ + /* get stuff left from cursor */ + int exp = 1; + int i; + for (i = 0; i < (m_len - pos); ++i) + exp *= 10; + + /* now it's 1...max */ + int left = m_value / exp; + int right = m_value % exp; + + if (dig >= 0) + { + left *= 10; + left += dig; + } else if (dig == -1) /* delete */ + { + left /= 10; + } + + left *= exp; + left += right; + m_value = left; +} + diff --git a/lib/gui/einputnumber.h b/lib/gui/einputnumber.h new file mode 100644 index 0000000..c4f3013 --- /dev/null +++ b/lib/gui/einputnumber.h @@ -0,0 +1,35 @@ +#ifndef __lib_gui_einputnumber_h +#define __lib_gui_einputnumber_h + +#include + +class eInputContentNumber: public eInputContent +{ + DECLARE_REF(eInputContentNumber); +public: + eInputContentNumber(int cur, int min, int max); + + void getDisplay(std::string &res, int &cursor); + void moveCursor(int dir); + int haveKey(int code, int overwrite); + void deleteChar(int dir); + int isValid(); + + void validate(); + + void setValue(int num); + int getValue(); + +private: + void recalcLen(); + + void insertDigit(int pos, int dig); + + int m_value; + int m_cursor, m_len; + + int m_min, m_max; +}; + + +#endif diff --git a/lib/gui/einputstring.cpp b/lib/gui/einputstring.cpp new file mode 100644 index 0000000..9ead4fa --- /dev/null +++ b/lib/gui/einputstring.cpp @@ -0,0 +1,126 @@ +#include + +DEFINE_REF(eInputContentString); + +eInputContentString::eInputContentString() +{ + m_string = "bla"; + m_cursor = 0; + m_input = 0; + m_len = m_string.size(); +} + +void eInputContentString::getDisplay(std::string &res, int &cursor) +{ + res = m_string; + cursor = m_cursor; +} + +void eInputContentString::moveCursor(int dir) +{ + int old_cursor = m_cursor; + + switch (dir) + { + case dirLeft: + --m_cursor; + break; + case dirRight: + ++m_cursor; + break; + case dirHome: + m_cursor = 0; + break; + case dirEnd: + m_cursor = m_len; + break; + } + + if (m_cursor < 0) + m_cursor = 0; + if (m_cursor > m_len) + m_cursor = m_len; + + if (m_cursor != old_cursor) + if (m_input) + m_input->invalidate(); +} + +int eInputContentString::haveKey(int code, int overwrite) +{ + int have_char = -1; + + if (code >= 0x8020) + have_char = code &~ 0x8000; + + if (have_char != -1) + { + if (overwrite && m_cursor < m_len) + m_string[m_cursor] = have_char; + else + { + m_string.insert(m_cursor, 1, have_char); + ++m_len; + } + + m_cursor++; + + assert(m_cursor <= m_len); + + if (m_input) + m_input->invalidate(); + return 1; + } + return 0; +} + +void eInputContentString::deleteChar(int dir) +{ + if (dir == deleteForward) + { + eDebug("forward"); + if (m_cursor != m_len) + ++m_cursor; + else + return; + } + /* backward delete at begin */ + if (!m_cursor) + return; + + if (!m_len) + return; + + m_string.erase(m_cursor - 1, m_cursor); + + m_len--; + m_cursor--; + + if (m_input) + m_input->invalidate(); +} + +int eInputContentString::isValid() +{ + return 1; +} + +void eInputContentString::validate() +{ +} + +void eInputContentString::setText(const std::string &str) +{ + m_string = str; + m_len = m_string.size(); + if (m_cursor > m_len) + m_cursor = m_len; + + if (m_input) + m_input->invalidate(); +} + +std::string eInputContentString::getText() +{ + return m_string; +} diff --git a/lib/gui/einputstring.h b/lib/gui/einputstring.h new file mode 100644 index 0000000..a4eb52a --- /dev/null +++ b/lib/gui/einputstring.h @@ -0,0 +1,31 @@ +#ifndef __lib_gui_einputstring_h +#define __lib_gui_einputstring_h + +#include + +class eInputContentString: public eInputContent +{ + DECLARE_REF(eInputContentString); +public: + eInputContentString(); + + void getDisplay(std::string &res, int &cursor); + void moveCursor(int dir); + int haveKey(int code, int overwrite); + void deleteChar(int dir); + int isValid(); + + void validate(); + + void setText(const std::string &text); + std::string getText(); + +private: + void insertChar(int pos, int ch); + + std::string m_string; + + int m_cursor, m_len; +}; + +#endif