Merge pull request #707 from jfrickmann/LuaWidgets
Add lcd.exitFullScreen(), removed full screen message
This commit is contained in:
@@ -30,7 +30,6 @@
|
||||
#endif
|
||||
|
||||
constexpr uint32_t WIDGET_FOCUS_TIMEOUT = 10*1000; // 10 seconds
|
||||
constexpr uint32_t FULLSCREEN_HINT_DELAY = 5*1000; // 5 seconds
|
||||
|
||||
static void openWidgetMenu(Widget * parent)
|
||||
{
|
||||
@@ -125,11 +124,6 @@ void Widget::paint(BitmapBuffer * dc)
|
||||
}
|
||||
dc->drawRect(0, 0, width(), height(), 2, STASHED, COLOR_THEME_FOCUS);
|
||||
}
|
||||
|
||||
if (fullscreen && (RTOS_GET_MS() - fsStartedTS < FULLSCREEN_HINT_DELAY)) {
|
||||
dc->drawText(width() / 2, height() / 2, "Press [RTN] long to exit",
|
||||
FONT(XL) | CENTERED | VCENTERED | COLOR_THEME_PRIMARY3);
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(HARDWARE_KEYS)
|
||||
@@ -186,7 +180,6 @@ void Widget::setFullscreen(bool fullscreen)
|
||||
setRect(parent->getRect());
|
||||
setLeft(parent->getScrollPositionX());
|
||||
this->fullscreen = true;
|
||||
fsStartedTS = RTOS_GET_MS();
|
||||
bringToTop();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,7 +111,6 @@ class Widget : public Button
|
||||
PersistentData * persistentData;
|
||||
uint32_t focusGainedTS = 0;
|
||||
bool fullscreen = false;
|
||||
uint32_t fsStartedTS = 0;
|
||||
};
|
||||
|
||||
void registerWidget(const WidgetFactory * factory);
|
||||
|
||||
@@ -22,10 +22,11 @@
|
||||
#include <cstdio>
|
||||
#include "opentx.h"
|
||||
#include "libopenui.h"
|
||||
|
||||
#include "widget.h"
|
||||
#include "api_colorlcd.h"
|
||||
|
||||
BitmapBuffer* luaLcdBuffer = nullptr;
|
||||
Widget* runningFS = nullptr;
|
||||
|
||||
static int8_t getTextHorizontalOffset(LcdFlags flags)
|
||||
{
|
||||
@@ -1216,6 +1217,25 @@ static int luaLcdDrawHudRectangle(lua_State *L)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*luadoc
|
||||
@function lcd.exitFullScreen()
|
||||
|
||||
Exit full screen widget mode.
|
||||
|
||||
@notice Only available on radios with color display
|
||||
|
||||
@status current Introduced in 2.5.0
|
||||
*/
|
||||
static int luaLcdExitFullScreen(lua_State *L)
|
||||
{
|
||||
if (runningFS) {
|
||||
Widget* rfs = runningFS;
|
||||
runningFS = nullptr;
|
||||
rfs->setFullscreen(false);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
const luaL_Reg lcdLib[] = {
|
||||
{ "refresh", luaLcdRefresh },
|
||||
{ "clear", luaLcdClear },
|
||||
@@ -1246,5 +1266,6 @@ const luaL_Reg lcdLib[] = {
|
||||
{ "drawAnnulus", luaLcdDrawAnnulus },
|
||||
{ "drawLineWithClipping", luaLcdDrawLineWithClipping },
|
||||
{ "drawHudRectangle", luaLcdDrawHudRectangle },
|
||||
{ "exitFullScreen", luaLcdExitFullScreen },
|
||||
{ NULL, NULL } /* sentinel */
|
||||
};
|
||||
|
||||
@@ -39,5 +39,6 @@ constexpr int8_t text_vertical_offset[7] {2,2,0,2,3,3,7};
|
||||
|
||||
extern bool luaLcdAllowed;
|
||||
extern BitmapBuffer * luaLcdBuffer;
|
||||
extern Widget * runningFS;
|
||||
|
||||
LcdFlags flagsRGB(LcdFlags flags);
|
||||
+12
-19
@@ -100,20 +100,6 @@ void luaSetInstructionsLimit(lua_State * L, int count)
|
||||
#endif
|
||||
}
|
||||
|
||||
void exec(int function, int nresults=0)
|
||||
{
|
||||
if (lsWidgets == 0) return;
|
||||
|
||||
if (function) {
|
||||
luaSetInstructionsLimit(lsWidgets, WIDGET_SCRIPTS_MAX_INSTRUCTIONS);
|
||||
lua_rawgeti(lsWidgets, LUA_REGISTRYINDEX, function);
|
||||
if (lua_pcall(lsWidgets, 0, nresults, 0) != 0) {
|
||||
TRACE("Error in theme %s", lua_tostring(lsWidgets, -1));
|
||||
// TODO disable theme - revert back to default theme???
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ZoneOption * createOptionsArray(int reference, uint8_t maxOptions)
|
||||
{
|
||||
if (reference == 0) {
|
||||
@@ -242,6 +228,8 @@ struct eventData {
|
||||
|
||||
class LuaWidget: public Widget
|
||||
{
|
||||
friend class LuaWidgetFactory;
|
||||
|
||||
public:
|
||||
LuaWidget(const WidgetFactory * factory, FormGroup * parent, const rect_t & rect, WidgetPersistentData * persistentData, int luaWidgetDataRef):
|
||||
Widget(factory, parent, rect, persistentData),
|
||||
@@ -367,11 +355,12 @@ class LuaWidgetFactory: public WidgetFactory
|
||||
l_pushtableint(option->name, value);
|
||||
}
|
||||
|
||||
if (lua_pcall(lsWidgets, 2, 1, 0) != 0) {
|
||||
TRACE("Error in widget %s create() function: %s", getName(), lua_tostring(lsWidgets, -1));
|
||||
}
|
||||
int widgetData = luaL_ref(lsWidgets, LUA_REGISTRYINDEX);
|
||||
return new LuaWidget(this, parent, rect, persistentData, widgetData);
|
||||
bool err = lua_pcall(lsWidgets, 2, 1, 0);
|
||||
int widgetData = err ? LUA_NOREF : luaL_ref(lsWidgets, LUA_REGISTRYINDEX);
|
||||
LuaWidget* lw = new LuaWidget(this, parent, rect, persistentData, widgetData);
|
||||
if (err)
|
||||
lw->setErrorMessage("create()");
|
||||
return lw;
|
||||
}
|
||||
|
||||
protected:
|
||||
@@ -529,10 +518,12 @@ void LuaWidget::refresh(BitmapBuffer* dc)
|
||||
// This little hack is needed to not interfere with the LCD usage of preempted scripts
|
||||
bool lla = luaLcdAllowed;
|
||||
luaLcdAllowed = true;
|
||||
runningFS = this;
|
||||
|
||||
if (lua_pcall(lsWidgets, 3, 0, 0) != 0) {
|
||||
setErrorMessage("refresh()");
|
||||
}
|
||||
runningFS = nullptr;
|
||||
// Remove LCD
|
||||
luaLcdAllowed = lla;
|
||||
luaLcdBuffer = nullptr;
|
||||
@@ -551,9 +542,11 @@ void LuaWidget::background()
|
||||
if (factory->backgroundFunction) {
|
||||
lua_rawgeti(lsWidgets, LUA_REGISTRYINDEX, factory->backgroundFunction);
|
||||
lua_rawgeti(lsWidgets, LUA_REGISTRYINDEX, luaWidgetDataRef);
|
||||
runningFS = this;
|
||||
if (lua_pcall(lsWidgets, 1, 0, 0) != 0) {
|
||||
setErrorMessage("background()");
|
||||
}
|
||||
runningFS = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user