mirror of
https://github.com/flipperdevices/flipperzero-firmware.git
synced 2025-12-12 12:51:22 +04:00
* feat: backport js_gpio from unleashed * feat: backport js_keyboard, TextInputModel::minimum_length from unleashed * fix: api version inconsistency * style: js_gpio * build: fix submodule ._ . * refactor: js_gpio * docs: type declarations for gpio * feat: gpio interrupts * fix: js_gpio freeing, resetting and minor stylistic changes * style: js_gpio * style: mlib array, fixme's * feat: js_gpio adc * feat: js_event_loop * docs: js_event_loop * feat: js_event_loop subscription cancellation * feat: js_event_loop + js_gpio integration * fix: js_event_loop memory leak * feat: stop event loop on back button * test: js: basic, math, event_loop * feat: js_event_loop queue * feat: js linkage to previously loaded plugins * build: fix ci errors * feat: js module ordered teardown * feat: js_gui_defer_free * feat: basic hourglass view * style: JS ASS (Argument Schema for Scripts) * fix: js_event_loop mem leaks and lifetime problems * fix: crashing test and pvs false positives * feat: mjs custom obj destructors, gui submenu view * refactor: yank js_gui_defer_free (yuck) * refactor: maybe_unsubscribe * empty_screen, docs, typing fix-ups * docs: navigation event & demo * feat: submenu setHeader * feat: text_input * feat: text_box * docs: text_box availability * ci: silence irrelevant pvs low priority warning * style: use furistring * style: _get_at -> _safe_get * fix: built-in module name assignment * feat: js_dialog; refactor, optimize: js_gui * docs: js_gui * ci: silence pvs warning: Memory allocation is infallible * style: fix storage spelling * feat: foreign pointer signature checks * feat: js_storage * docs: js_storage * fix: my unit test was breaking other tests ;_; * ci: fix ci? * Make doxygen happy * docs: flipper, math, notification, global * style: review suggestions * style: review fixups * fix: badusb demo script * docs: badusb * ci: add nofl * ci: make linter happy * Bump api version Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
78 lines
3.3 KiB
JavaScript
78 lines
3.3 KiB
JavaScript
// import modules
|
|
let eventLoop = require("event_loop");
|
|
let gui = require("gui");
|
|
let loadingView = require("gui/loading");
|
|
let submenuView = require("gui/submenu");
|
|
let emptyView = require("gui/empty_screen");
|
|
let textInputView = require("gui/text_input");
|
|
let textBoxView = require("gui/text_box");
|
|
let dialogView = require("gui/dialog");
|
|
|
|
// declare view instances
|
|
let views = {
|
|
loading: loadingView.make(),
|
|
empty: emptyView.make(),
|
|
keyboard: textInputView.makeWith({
|
|
header: "Enter your name",
|
|
minLength: 0,
|
|
maxLength: 32,
|
|
}),
|
|
helloDialog: dialogView.makeWith({
|
|
center: "Hi Flipper! :)",
|
|
}),
|
|
longText: textBoxView.makeWith({
|
|
text: "This is a very long string that demonstrates the TextBox view. Use the D-Pad to scroll backwards and forwards.\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse rhoncus est malesuada quam egestas ultrices. Maecenas non eros a nulla eleifend vulputate et ut risus. Quisque in mauris mattis, venenatis risus eget, aliquam diam. Fusce pretium feugiat mauris, ut faucibus ex volutpat in. Phasellus volutpat ex sed gravida consectetur. Aliquam sed lectus feugiat, tristique lectus et, bibendum lacus. Ut sit amet augue eu sapien elementum aliquam quis vitae tortor. Vestibulum quis commodo odio. In elementum fermentum massa, eu pellentesque nibh cursus at. Integer eleifend lacus nec purus elementum sodales. Nulla elementum neque urna, non vulputate massa semper sed. Fusce ut nisi vitae dui blandit congue pretium vitae turpis.",
|
|
}),
|
|
demos: submenuView.makeWith({
|
|
header: "Choose a demo",
|
|
items: [
|
|
"Hourglass screen",
|
|
"Empty screen",
|
|
"Text input & Dialog",
|
|
"Text box",
|
|
"Exit app",
|
|
],
|
|
}),
|
|
};
|
|
|
|
// demo selector
|
|
eventLoop.subscribe(views.demos.chosen, function (_sub, index, gui, eventLoop, views) {
|
|
if (index === 0) {
|
|
gui.viewDispatcher.switchTo(views.loading);
|
|
// the loading view captures all back events, preventing our navigation callback from firing
|
|
// switch to the demo chooser after a second
|
|
eventLoop.subscribe(eventLoop.timer("oneshot", 1000), function (_sub, _, gui, views) {
|
|
gui.viewDispatcher.switchTo(views.demos);
|
|
}, gui, views);
|
|
} else if (index === 1) {
|
|
gui.viewDispatcher.switchTo(views.empty);
|
|
} else if (index === 2) {
|
|
gui.viewDispatcher.switchTo(views.keyboard);
|
|
} else if (index === 3) {
|
|
gui.viewDispatcher.switchTo(views.longText);
|
|
} else if (index === 4) {
|
|
eventLoop.stop();
|
|
}
|
|
}, gui, eventLoop, views);
|
|
|
|
// say hi after keyboard input
|
|
eventLoop.subscribe(views.keyboard.input, function (_sub, name, gui, views) {
|
|
views.helloDialog.set("text", "Hi " + name + "! :)");
|
|
gui.viewDispatcher.switchTo(views.helloDialog);
|
|
}, gui, views);
|
|
|
|
// go back after the greeting dialog
|
|
eventLoop.subscribe(views.helloDialog.input, function (_sub, button, gui, views) {
|
|
if (button === "center")
|
|
gui.viewDispatcher.switchTo(views.demos);
|
|
}, gui, views);
|
|
|
|
// go to the demo chooser screen when the back key is pressed
|
|
eventLoop.subscribe(gui.viewDispatcher.navigation, function (_sub, _, gui, views) {
|
|
gui.viewDispatcher.switchTo(views.demos);
|
|
}, gui, views);
|
|
|
|
// run UI
|
|
gui.viewDispatcher.switchTo(views.demos);
|
|
eventLoop.run();
|