From 7bc4a59528ab13f3062dc1520e76f9ecedd87400 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Sat, 14 May 2005 15:23:23 +0000 Subject: - work on timers - add eInput widget - add python/Tools - add flexible listbox content --- lib/gui/einput.cpp | 208 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 lib/gui/einput.cpp (limited to 'lib/gui/einput.cpp') diff --git a/lib/gui/einput.cpp b/lib/gui/einput.cpp new file mode 100644 index 00000000..b2c8ad14 --- /dev/null +++ b/lib/gui/einput.cpp @@ -0,0 +1,208 @@ +#include +#include +#include + +eInput::eInput(eWidget *parent): eLabel(parent) +{ + /* default to center alignment */ + m_valign = alignCenter; + m_halign = alignCenter; + + ePtr ptr; + eActionMap::getInstance(ptr); + ptr->bindAction("InputActions", 0, 0, this); +} + +eInput::~eInput() +{ + ePtr ptr; + eActionMap::getInstance(ptr); + ptr->unbindAction(this, 0); +} + +void eInput::setContent(eInputContent *content) +{ + if (m_content) + m_content->setInput(0); + m_content = content; + if (m_content) + m_content->setInput(this); +} + +int eInput::event(int event, void *data, void *data2) +{ + switch (event) + { + case evtPaint: + { + gPainter &painter = *(gPainter*)data2; + ePtr style; + + getStyle(style); + + eWidget::event(event, data, data2); + + ePtr para = new eTextPara(eRect(0, 0, size().width(), size().height())); + + std::string text; + int cursor = -1; + + if (m_content) + m_content->getDisplay(text, cursor); + + eDebug("cursor is %d", cursor); + para->setFont(m_font); + para->renderString(text, 0); + + int glyphs = para->size(); + 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.renderPara(para, ePoint(0, 0)); + + return 0; + } + case evtAction: + if (isVisible()) + { + switch((int)data2) + { + case moveLeft: + m_content->moveCursor(eInputContent::dirLeft); + break; + case moveRight: + m_content->moveCursor(eInputContent::dirRight); + break; + case moveHome: + m_content->moveCursor(eInputContent::dirHome); + break; + case moveEnd: + m_content->moveCursor(eInputContent::dirEnd); + break; + case deleteChar: + // not yet + break; + } + return 1; + } + return 0; + default: + break; + } + return eLabel::event(event, data, data2); +} + +int eInput::getNumber() +{ + return atoi(m_text.c_str()); +} + +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) +{ + insertDigit(m_cursor, code); + recalcLen(); + return 0; +} + +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 - 1); ++i) + exp *= 10; + + /* now it's 1...max */ + int left = m_value / exp; + int right = m_value % exp; + left *= 10; + left += dig; + left *= exp; + left += right; + m_value = left; +} -- cgit v1.2.3