Skip to content

Commit 5e27c20

Browse files
lightningpiggy: add settings screen
1 parent 12efd65 commit 5e27c20

File tree

1 file changed

+184
-2
lines changed
  • internal_filesystem/apps/com.lightningpiggy.displaywallet/assets

1 file changed

+184
-2
lines changed

internal_filesystem/apps/com.lightningpiggy.displaywallet/assets/displaywallet.py

Lines changed: 184 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,163 @@
11
import time
22

3+
import mpos.config
4+
5+
# screens:
6+
appscreen = lv.screen_active()
7+
settings_screen = None
8+
9+
10+
11+
12+
# Settings screen implementation
13+
class SettingsScreen(lv.obj):
14+
def __init__(self):
15+
super().__init__(None)
16+
self.prefs = mpos.config.SharedPreferences("com.lightningpiggy.displaywallet")
17+
self.settings = [
18+
{"title": "Wallet Type", "key": "wallet_type", "value_label": None},
19+
{"title": "LNBits URL", "key": "lnbits_url", "value_label": None},
20+
{"title": "LNBits Read/Invoice Key", "key": "lnbits_readkey", "value_label": None},
21+
{"title": "NWC URL", "key": "nwc_url", "value_label": None},
22+
]
23+
self.keyboard = None # Global reference for keyboard
24+
self.textarea = None # Global reference for textarea
25+
self.msgbox = None # Global reference for msgbox
26+
self.create_ui()
27+
28+
def create_ui(self):
29+
print("creating ui...")
30+
self.set_size(lv.pct(100), lv.pct(100))
31+
self.set_style_pad_all(10, 0)
32+
self.set_flex_flow(lv.FLEX_FLOW.COLUMN)
33+
self.set_style_border_width(0, 0)
34+
35+
# Create settings entries
36+
for setting in self.settings:
37+
# Container for each setting
38+
setting_cont = lv.obj(self)
39+
setting_cont.set_width(lv.pct(100))
40+
setting_cont.set_height(lv.SIZE_CONTENT)
41+
setting_cont.set_style_border_width(1, 0)
42+
setting_cont.set_style_border_color(lv.color_hex(0xCCCCCC), 0)
43+
setting_cont.set_style_border_side(lv.BORDER_SIDE.BOTTOM, 0)
44+
setting_cont.set_style_pad_all(8, 0)
45+
setting_cont.add_flag(lv.obj.FLAG.CLICKABLE)
46+
47+
# Title label (bold, larger)
48+
title = lv.label(setting_cont)
49+
title.set_text(setting["title"])
50+
title.set_style_text_font(lv.font_montserrat_16, 0)
51+
title.set_style_text_color(lv.color_hex(0x000000), 0)
52+
title.set_style_text_decor(lv.TEXT_DECOR.NONE, 0)
53+
title.set_pos(0, 0)
54+
55+
# Value label (smaller, below title)
56+
value = lv.label(setting_cont)
57+
value.set_text(self.prefs.get_string(setting["key"], "Not set"))
58+
value.set_style_text_font(lv.font_montserrat_12, 0)
59+
value.set_style_text_color(lv.color_hex(0x666666), 0)
60+
value.set_pos(0, 20)
61+
setting["value_label"] = value # Store reference for updating
62+
63+
# Add click event to open msgbox
64+
setting_cont.add_event_cb(
65+
lambda e, s=setting: self.open_edit_popup(s), lv.EVENT.CLICKED, None
66+
)
67+
68+
# Initialize keyboard (hidden initially)
69+
self.keyboard = lv.keyboard(lv.screen_active())
70+
self.keyboard.set_size(lv.pct(100), lv.pct(40))
71+
self.keyboard.align(lv.ALIGN.BOTTOM_MID, 0, 0)
72+
self.keyboard.add_flag(lv.obj.FLAG.HIDDEN)
73+
74+
75+
76+
def open_edit_popup(self, setting):
77+
# Close existing msgbox and keyboard if open
78+
if self.msgbox:
79+
self.msgbox.delete()
80+
self.msgbox = None
81+
if self.keyboard:
82+
self.keyboard.add_flag(lv.obj.FLAG.HIDDEN)
83+
84+
# Create msgbox
85+
self.msgbox = lv.msgbox(self)
86+
self.msgbox.add_title(setting["title"])
87+
self.msgbox.set_width(lv.pct(80))
88+
self.msgbox.center()
89+
90+
# Create content container
91+
content = self.msgbox.get_content()
92+
content.set_style_pad_all(10, 0)
93+
content.set_flex_flow(lv.FLEX_FLOW.COLUMN)
94+
95+
# Textarea for editing
96+
self.textarea = lv.textarea(content)
97+
self.textarea.set_width(lv.pct(100))
98+
self.textarea.set_height(lv.SIZE_CONTENT)
99+
self.textarea.set_text(self.prefs.get_string(setting["key"], ""))
100+
self.textarea.add_event_cb(self.textarea_cb, lv.EVENT.FOCUSED, None)
101+
self.textarea.add_event_cb(self.textarea_cb, lv.EVENT.DEFOCUSED, None)
102+
103+
# Button container
104+
btn_cont = lv.obj(content)
105+
btn_cont.set_width(lv.pct(100))
106+
btn_cont.set_height(lv.SIZE_CONTENT)
107+
btn_cont.set_style_pad_all(5, 0)
108+
btn_cont.set_flex_flow(lv.FLEX_FLOW.ROW)
109+
btn_cont.set_style_flex_main_place(lv.FLEX_ALIGN.SPACE_BETWEEN, 0)
110+
111+
# Save button
112+
save_btn = lv.button(btn_cont)
113+
save_btn.set_size(lv.pct(45), lv.SIZE_CONTENT)
114+
save_label = lv.label(save_btn)
115+
save_label.set_text("Save")
116+
save_label.center()
117+
save_btn.add_event_cb(
118+
lambda e, s=setting: self.save_setting(s), lv.EVENT.CLICKED, None
119+
)
120+
121+
# Cancel button
122+
cancel_btn = lv.button(btn_cont)
123+
cancel_btn.set_size(lv.pct(45), lv.SIZE_CONTENT)
124+
cancel_label = lv.label(cancel_btn)
125+
cancel_label.set_text("Cancel")
126+
cancel_label.center()
127+
cancel_btn.add_event_cb(self.close_popup, lv.EVENT.CLICKED, None)
128+
129+
def textarea_cb(self, event):
130+
code = event.get_code()
131+
if code == lv.EVENT.FOCUSED:
132+
self.keyboard.remove_flag(lv.obj.FLAG.HIDDEN)
133+
self.keyboard.set_textarea(self.textarea)
134+
elif code == lv.EVENT.DEFOCUSED:
135+
self.keyboard.add_flag(lv.obj.FLAG.HIDDEN)
136+
137+
def save_setting(self, setting):
138+
if self.textarea:
139+
new_value = self.textarea.get_text()
140+
editor = self.prefs.edit()
141+
editor.put_string(setting["key"], new_value)
142+
editor.commit()
143+
setting["value_label"].set_text(new_value if new_value else "Not set")
144+
self.close_popup(None)
145+
146+
def close_popup(self, event):
147+
if self.msgbox:
148+
self.msgbox.delete()
149+
self.msgbox = None
150+
if self.keyboard:
151+
self.keyboard.add_flag(lv.obj.FLAG.HIDDEN)
152+
153+
154+
155+
def settings_button_tap(event):
156+
global settings_screen
157+
if not settings_screen:
158+
settings_screen = SettingsScreen()
159+
lv.screen_load(settings_screen)
160+
3161
def build_main_ui():
4162
appscreen.clean()
5163
balance_label = lv.label(appscreen)
@@ -14,14 +172,38 @@ def build_main_ui():
14172
balance_line = lv.line(appscreen)
15173
balance_line.set_points([{'x':0,'y':35},{'x':300,'y':35}],2)
16174
balance_line.add_style(style_line, 0)
175+
settings_button = lv.button(appscreen)
176+
settings_button.align(lv.ALIGN.BOTTOM_RIGHT, 0, 0)
177+
snap_label = lv.label(settings_button)
178+
snap_label.set_text(lv.SYMBOL.SETTINGS)
179+
snap_label.center()
180+
settings_button.add_event_cb(settings_button_tap,lv.EVENT.CLICKED,None)
181+
17182

18183
def janitor_cb(timer):
19-
if lv.screen_active() != appscreen:
184+
if lv.screen_active() != appscreen and lv.screen_active() != settings_screen:
20185
print("app backgrounded, cleaning up...")
21186
janitor.delete()
22187
# No cleanups to do, but in a real app, you might stop timers, deinitialize hardware devices you used, close network connections, etc.
23188

24-
appscreen = lv.screen_active()
25189
janitor = lv.timer_create(janitor_cb, 1000, None)
26190

27191
build_main_ui()
192+
193+
config = mpos.config.SharedPreferences("com.lightningpiggy.displaywallet")
194+
195+
wallet_type = config.get_string("wallet_type")
196+
if wallet_type == "lnbits":
197+
try:
198+
wallet = LNBitsWallet(config.get_string("lnbits_url"), config.get_string("lnbits_readkey"))
199+
except Exception as e:
200+
print("Couldn't initialize LNBitsWallet because {e}")
201+
elif wallet_type == "nwc":
202+
try:
203+
wallet = NWCWallet(config.get_string("nwc_url"))
204+
except Exception as e:
205+
print("Couldn't initialize NWCWallet because {e}")
206+
else:
207+
print(f"No or unsupported wallet type configured: '{wallet_type}'")
208+
209+

0 commit comments

Comments
 (0)