diff --git a/src/gui/luainstance.cpp b/src/gui/luainstance.cpp index c12cf9a51..f8ebc45c9 100644 --- a/src/gui/luainstance.cpp +++ b/src/gui/luainstance.cpp @@ -397,6 +397,7 @@ void CLuaInstance::registerFunctions() lua_register(lua, className, NewWindow); #ifdef MARTII MenueRegister(lua); + HintboxRegister(lua); #endif } @@ -588,20 +589,20 @@ m:addItem{type="back"} m:addItem{type="separator"} function talk(a) - print(">talk") - print(a) - print("talk") + print(a) + print(">anothermenue"); - local m = menue.new{name="anothermenue", icon="settings"} - m:addItem{type="back"} - m:addItem{type="separator"} - m:addItem{type="numeric", name="testnumeric"} - m:exec() - print("<>anothermenue"); + local m = menue.new{name="anothermenue", icon="settings"} + m:addItem{type="back"} + m:addItem{type="separator"} + m:addItem{type="numeric", name="testnumeric"} + m:exec() + print("<Name.c_str()); + if (fileBrowser.exec(value) == true) + strcpy(value, fileBrowser.getSelectedFile()->Name.c_str()); if (!luaAction.empty()){ lua_pushglobaltable(L); lua_getfield(L, -1, luaAction.c_str()); @@ -745,7 +751,7 @@ int CLuaMenueFilebrowser::exec(CMenuTarget* /*parent*/, const std::string & /*ac return menu_return::RETURN_REPAINT; } -CLuaMenueStringinput::CLuaMenueStringinput(lua_State *_L, std::string _luaAction, const char *_name, char *_value, int _size, std::string _valid_chars, CChangeObserver *_observ, const char *_icon) +CLuaMenueStringinput::CLuaMenueStringinput(lua_State *_L, std::string _luaAction, const char *_name, char *_value, int _size, std::string _valid_chars, CChangeObserver *_observ, const char *_icon, bool _sms) { L = _L; luaAction = _luaAction; @@ -755,6 +761,7 @@ CLuaMenueStringinput::CLuaMenueStringinput(lua_State *_L, std::string _luaAction valid_chars = _valid_chars; icon = _icon; observ = _observ; + sms = _sms; } CLuaMenueStringinput::~CLuaMenueStringinput() @@ -763,10 +770,17 @@ CLuaMenueStringinput::~CLuaMenueStringinput() int CLuaMenueStringinput::exec(CMenuTarget* /*parent*/, const std::string & /*actionKey*/) { - CStringInput i((char *)name, value, size, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, valid_chars.c_str(), observ, icon); - i.luaAction = luaAction; - i.luaState = L; - i.exec(NULL, ""); + CStringInput *i; + if (sms) + i = new CStringInputSMS((char *)name, value, size, + NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, valid_chars.c_str(), observ, icon); + else + i = new CStringInput((char *)name, value, size, + NONEXISTANT_LOCALE, NONEXISTANT_LOCALE, valid_chars.c_str(), observ, icon); + i->luaAction = luaAction; + i->luaState = L; + i->exec(NULL, ""); + delete i; return menu_return::RETURN_REPAINT; } @@ -822,8 +836,8 @@ int CLuaInstance::MenueAddItem(lua_State *L) std::list::iterator it = m->items.begin(); tableLookupString(L, "name", (*it).name); - std::string type; tableLookupString(L, "type", type); - + std::string icon; tableLookupString(L, "icon", icon); + std::string type; tableLookupString(L, "type", type); if (type == "back") { m->m->addItem(GenericMenuBack); } else if (type == "separator") { @@ -832,20 +846,11 @@ int CLuaInstance::MenueAddItem(lua_State *L) else m->m->addItem(GenericMenuSeparatorLine); } else { - tableLookupString(L, "icon", (*it).Icon); - tableLookupString(L, "right_icon", (*it).right_Icon); + std::string right_icon; tableLookupString(L, "right_icon", right_icon); std::string action; tableLookupString(L, "action", action); - std::string shortcut; tableLookupString(L, "shortcut", shortcut); std::string value; tableLookupString(L, "value", value); int directkey = CRCInput::RC_nokey; tableLookupInt(L, "directkey", directkey); int pulldown = false; tableLookupInt(L, "pulldown", pulldown); - const char *icon = (*it).Icon.c_str(); - const char *right_icon = (*it).right_Icon.c_str(); - if (!*icon) - icon = NULL; - if (!*right_icon) - right_icon = NULL; - std::string tmp = "true"; tableLookupString(L, "enabled", tmp) || tableLookupString(L, "active", tmp); bool enabled = (tmp == "true" || tmp == "1" || tmp == "yes"); @@ -857,7 +862,7 @@ int CLuaInstance::MenueAddItem(lua_State *L) strncpy((*it).s, value.c_str(), sizeof((*it).s)); CLuaMenueForwarder *forwarder = new CLuaMenueForwarder(L, action); CMenuItem *mi = new CMenuForwarderNonLocalized( - (*it).name.c_str(), enabled, (*it).s, forwarder, NULL/*ActionKey*/, directkey, icon, right_icon); + (*it).name.c_str(), enabled, (*it).s, forwarder, NULL/*ActionKey*/, directkey, icon.c_str(), right_icon.c_str()); mi->luaAction = action; mi->luaState = L; m->m->addItem(mi); @@ -891,7 +896,7 @@ int CLuaInstance::MenueAddItem(lua_State *L) j++; } lua_pop(L, 1); - CMenuItem *mi = new CMenuOptionChooser((*it).name.c_str(), &(*it).i, kext, options_count, enabled, m->observ, directkey, icon, pulldown); + CMenuItem *mi = new CMenuOptionChooser((*it).name.c_str(), &(*it).i, kext, options_count, enabled, m->observ, directkey, icon.c_str(), pulldown); mi->luaAction = action; mi->luaState = L; m->m->addItem(mi); @@ -905,7 +910,7 @@ int CLuaInstance::MenueAddItem(lua_State *L) m->m->addItem(mi); } else if (type == "string") { strncpy((*it).s, value.c_str(), sizeof((*it).s)); - CMenuItem *mi = new CMenuOptionStringChooser((*it).name.c_str(), (*it).s, enabled, m->observ, directkey, icon, pulldown); + CMenuItem *mi = new CMenuOptionStringChooser((*it).name.c_str(), (*it).s, enabled, m->observ, directkey, icon.c_str(), pulldown); mi->luaAction = action; mi->luaState = L; m->m->addItem(mi); @@ -914,20 +919,23 @@ int CLuaInstance::MenueAddItem(lua_State *L) strncpy((*it).s, value.c_str(), sizeof((*it).s)); std::string valid_chars = " 0123456789. "; tableLookupString(L, "valid_chars", valid_chars); + int sms = 0; + tableLookupInt(L, "sms", sms); int size = 30; tableLookupInt(L, "size", size); - CLuaMenueStringinput *stringinput = new CLuaMenueStringinput(L, action, (*it).name.c_str(), (*it).s, size, valid_chars, m->observ, icon); + CLuaMenueStringinput *stringinput = new CLuaMenueStringinput(L, action, (*it).name.c_str(), (*it).s, size, valid_chars, m->observ, icon.c_str(), sms); CMenuItem *mi = new CMenuForwarderNonLocalized( - (*it).name.c_str(), enabled, (*it).s, stringinput, NULL/*ActionKey*/, directkey, icon, right_icon); + (*it).name.c_str(), enabled, (*it).s, stringinput, NULL/*ActionKey*/, directkey, icon.c_str(), right_icon.c_str()); mi->luaAction = action; mi->luaState = L; m->m->addItem(mi); m->targets.push_front(stringinput); } else if (type == "filebrowser") { strncpy((*it).s, value.c_str(), sizeof((*it).s)); - CLuaMenueFilebrowser *filebrowser = new CLuaMenueFilebrowser(L, action, (*it).s); + int dirMode = 0; tableLookupInt(L, "dir_mode", dirMode); + CLuaMenueFilebrowser *filebrowser = new CLuaMenueFilebrowser(L, action, (*it).s, dirMode); CMenuItem *mi = new CMenuForwarderNonLocalized( - (*it).name.c_str(), enabled, (*it).s, filebrowser, NULL/*ActionKey*/, directkey, icon, right_icon); + (*it).name.c_str(), enabled, (*it).s, filebrowser, NULL/*ActionKey*/, directkey, icon.c_str(), right_icon.c_str()); mi->luaAction = action; mi->luaState = L; m->m->addItem(mi); @@ -951,4 +959,142 @@ int CLuaInstance::MenueExec(lua_State *L) m->m->hide(); return 0; } + +void CLuaInstance::HintboxRegister(lua_State *L) +{ + luaL_Reg meth[] = { + { "new", CLuaInstance::HintboxNew }, + { "show", CLuaInstance::HintboxShow }, + { "paint", CLuaInstance::HintboxPaint }, + { "hide", CLuaInstance::HintboxHide }, + { "__gc", CLuaInstance::HintboxDelete }, + { NULL, NULL } + }; + + luaL_newmetatable(L, "hintbox"); + luaL_setfuncs(L, meth, 0); + lua_pushvalue(L, -1); + lua_setfield(L, -1, "__index"); + lua_setglobal(L, "hintbox"); +} + +CLuaHintbox *CLuaInstance::HintboxCheck(lua_State *L, int n) +{ + return *(CLuaHintbox **) luaL_checkudata(L, n, "hintbox"); +} + +CLuaHintbox::CLuaHintbox() +{ + caption = NULL; + b = NULL; +} + +CLuaHintbox::~CLuaHintbox() +{ + if (caption) + free(caption); + delete b; +} + +int CLuaInstance::HintboxNew(lua_State *L) +{ + lua_assert(lua_istable(L,1)); + + std::string name, text, icon = std::string(NEUTRINO_ICON_INFO); + tableLookupString(L, "name", name) || tableLookupString(L, "title", name) || tableLookupString(L, "caption", name); + tableLookupString(L, "text", text); + tableLookupString(L, "icon", icon); + int width = 450; + tableLookupInt(L, "width", width); + + CLuaHintbox **udata = (CLuaHintbox **) lua_newuserdata(L, sizeof(CLuaHintbox *)); + *udata = new CLuaHintbox(); + (*udata)->caption = strdup(name.c_str()); + (*udata)->b = new CHintBox((*udata)->caption, text.c_str(), width, icon.c_str()); + luaL_getmetatable(L, "hintbox"); + lua_setmetatable(L, -2); + return 1; +} + +int CLuaInstance::HintboxDelete(lua_State *L) +{ + CLuaHintbox *m = HintboxCheck(L, 1); + delete m; + return 0; +} + +int CLuaInstance::HintboxPaint(lua_State *L) +{ + CLuaHintbox *m = HintboxCheck(L, 1); + m->b->paint(); + return 0; +} + +int CLuaInstance::HintboxHide(lua_State *L) +{ + CLuaHintbox *m = HintboxCheck(L, 1); + m->b->hide(); + return 0; +} + +int CLuaInstance::HintboxShow(lua_State *L) +{ + CLuaHintbox *m = HintboxCheck(L, 1); + int timeout = -1; + if (lua_isnumber(L, -1)) + timeout = (int) lua_tonumber(L, -1); + m->b->paint(); + + // copied from gui/widget/hintbox.cpp + + neutrino_msg_t msg; + neutrino_msg_data_t data; + if ( timeout == -1 ) + timeout = 5; /// default timeout 5 sec + //timeout = g_settings.timing[SNeutrinoSettings::TIMING_INFOBAR]; + + uint64_t timeoutEnd = CRCInput::calcTimeoutEnd( timeout ); + + int res = messages_return::none; + + while ( ! ( res & ( messages_return::cancel_info | messages_return::cancel_all ) ) ) + { + g_RCInput->getMsgAbsoluteTimeout( &msg, &data, &timeoutEnd ); + + if ((msg == CRCInput::RC_timeout) || (msg == CRCInput::RC_ok)) + res = messages_return::cancel_info; + else if(msg == CRCInput::RC_home) + res = messages_return::cancel_all; + else if ((m->b->has_scrollbar()) && ((msg == CRCInput::RC_up) || (msg == CRCInput::RC_down))) + { + if (msg == CRCInput::RC_up) + m->b->scroll_up(); + else + m->b->scroll_down(); + } + else if((msg == CRCInput::RC_sat) || (msg == CRCInput::RC_favorites)) { + } + else if(msg == CRCInput::RC_mode) { + res = messages_return::handled; + break; + } + else if((msg == CRCInput::RC_next) || (msg == CRCInput::RC_prev)) { + res = messages_return::cancel_all; + g_RCInput->postMsg(msg, data); + } + else + { + res = CNeutrinoApp::getInstance()->handleMsg(msg, data); + if (res & messages_return::unhandled) + { + + // leave here and handle above... + g_RCInput->postMsg(msg, data); + res = messages_return::cancel_all; + } + } + } + m->b->hide(); + return 0; +} #endif diff --git a/src/gui/luainstance.h b/src/gui/luainstance.h index d3a75a397..50f7a6e14 100644 --- a/src/gui/luainstance.h +++ b/src/gui/luainstance.h @@ -28,6 +28,8 @@ extern "C" { #include #ifdef MARTII #include +#include +#include #endif /* this is stored as userdata in the lua_State */ @@ -45,8 +47,6 @@ struct CLuaMenueItem char s[255]; }; std::string name; - std::string Icon; - std::string right_Icon; }; class CLuaMenueChangeObserver : public CChangeObserver @@ -84,8 +84,9 @@ class CLuaMenueFilebrowser : public CMenuTarget lua_State *L; std::string luaAction; char *value; + bool dirMode; public: - CLuaMenueFilebrowser(lua_State *L, std::string _luaAction, char *_value); + CLuaMenueFilebrowser(lua_State *L, std::string _luaAction, char *_value, bool _dirMode); ~CLuaMenueFilebrowser(); int exec(CMenuTarget* parent, const std::string & actionKey); }; @@ -101,11 +102,22 @@ class CLuaMenueStringinput : public CMenuTarget std::string valid_chars; CChangeObserver *observ; const char *icon; + bool sms; public: - CLuaMenueStringinput(lua_State *_L, std::string _luaAction, const char *_name, char *_value, int _size, std::string _valid_chars, CChangeObserver *_observ, const char *_icon); + CLuaMenueStringinput(lua_State *_L, std::string _luaAction, const char *_name, char *_value, int _size, std::string _valid_chars, CChangeObserver *_observ, const char *_icon, bool _sms); ~CLuaMenueStringinput(); int exec(CMenuTarget* /*parent*/, const std::string & /*actionKey*/); }; + +class CLuaHintbox +{ + public: + CHintBox *b; + char *caption; + CLuaHintbox(); + ~CLuaHintbox(); +}; + #endif /* inspired by Steve Kemp http://www.steve.org.uk/ */ @@ -141,6 +153,15 @@ private: static int MenueHide(lua_State *L); static int MenueExec(lua_State *L); static CLuaMenue *MenueCheck(lua_State *L, int n); + + void HintboxRegister(lua_State *L); + static int HintboxNew(lua_State *L); + static int HintboxDelete(lua_State *L); + static int HintboxShow(lua_State *L); + static int HintboxPaint(lua_State *L); + static int HintboxHide(lua_State *L); + static CLuaHintbox *HintboxCheck(lua_State *L, int n); + static bool tableLookupString(lua_State*, const char*, std::string&); static bool tableLookupInt(lua_State*, const char*, int&); #endif