11import 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+
3161def 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
18183def 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 ()
25189janitor = lv .timer_create (janitor_cb , 1000 , None )
26190
27191build_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