Skip to content

Commit edb0a26

Browse files
committed
EspNowChat: Split input into separate activities
1 parent a9be5df commit edb0a26

3 files changed

Lines changed: 143 additions & 32 deletions

File tree

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import lvgl as lv
2+
from mpos import Activity, AppearanceManager
3+
from mpos import Activity, DisplayMetrics, BuildInfo, DeviceInfo
4+
try:
5+
import network
6+
except ImportError:
7+
network = None
8+
9+
class ChannelActivity(Activity):
10+
def onCreate(self):
11+
screen = lv.obj()
12+
screen.set_style_pad_all(0, lv.PART.MAIN)
13+
screen.set_flex_flow(lv.FLEX_FLOW.COLUMN)
14+
15+
self._add_label(screen, 'Current Network settings:', is_header=True)
16+
if network:
17+
sta = network.WLAN(network.WLAN.IF_STA)
18+
self.current_config = sta.config
19+
else:
20+
self.current_config={
21+
'essid': '<no network>',
22+
'channel': None
23+
}
24+
25+
self._add_label(screen, f'channel: {self.current_config["channel"]}')
26+
self._add_label(screen, f'essid: {self.current_config["essid"]}')
27+
28+
#
29+
# self.input_textarea = lv.textarea(screen)
30+
# self.input_textarea.set_width(lv.pct(100))
31+
# self.input_textarea.set_placeholder_text("Message ...")
32+
# self.input_textarea.set_style_text_font(lv.font_montserrat_16, lv.PART.MAIN)
33+
#
34+
# keyboard = lv.keyboard(screen)
35+
# keyboard.set_style_text_font(lv.font_montserrat_20, lv.PART.MAIN)
36+
# keyboard.set_style_min_height(175, lv.PART.MAIN)
37+
# AppearanceManager.apply_keyboard_fix(keyboard)
38+
# keyboard.set_textarea(self.input_textarea)
39+
# keyboard.add_event_cb(self.keyboard_cb, lv.EVENT.READY, None)
40+
41+
self.setContentView(screen)
42+
43+
def keyboard_cb(self, event):
44+
text = self.input_textarea.get_text()
45+
self.setResult(result_code="text", data=text)
46+
self.finish()
47+
48+
def _add_label(self, parent, text, is_header=False, margin_top=DisplayMetrics.pct_of_height(5)):
49+
"""
50+
Based on About._add_label()
51+
"""
52+
label = lv.label(parent)
53+
label.set_text(text)
54+
55+
if is_header:
56+
primary_color = lv.theme_get_color_primary(None)
57+
label.set_style_text_color(primary_color, lv.PART.MAIN)
58+
label.set_style_text_font(lv.font_montserrat_14, lv.PART.MAIN)
59+
label.set_style_margin_top(margin_top, lv.PART.MAIN)
60+
label.set_style_margin_bottom(DisplayMetrics.pct_of_height(2), lv.PART.MAIN)
61+
else:
62+
label.set_style_text_font(lv.font_montserrat_12, lv.PART.MAIN)
63+
label.set_style_margin_bottom(2, lv.PART.MAIN)
64+
return label

internal_filesystem/apps/com.micropythonos.espnow_chat/assets/espnow_chat.py

Lines changed: 50 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66

77
import lvgl as lv
88
import machine
9+
from channel_activity import ChannelActivity
10+
from message_input_activity import MessageInputActivity
911
from micropython import const
10-
from mpos import Activity, MposKeyboard, TaskManager
12+
from mpos import Activity, Intent, TaskManager
1113
from mpos.time import localtime
1214

1315
try:
@@ -32,29 +34,38 @@ def pformat_mac(mac):
3234

3335
class EspNowChat(Activity):
3436
def onCreate(self):
35-
main_content = lv.obj()
36-
main_content.set_flex_flow(lv.FLEX_FLOW.COLUMN)
37-
main_content.set_style_pad_gap(10, 0)
38-
39-
self.input_textarea = lv.textarea(main_content)
40-
self.input_textarea.set_placeholder_text("Message input...")
41-
self.input_textarea.set_one_line(True)
42-
self.input_textarea.set_style_text_font(lv.font_montserrat_16, lv.PART.MAIN)
43-
self.input_textarea.set_width(lv.pct(100))
44-
self.input_textarea.add_event_cb(self.show_keyboard, lv.EVENT.CLICKED, None)
45-
46-
self.keyboard = MposKeyboard(main_content)
47-
self.keyboard.set_textarea(self.input_textarea)
48-
self.keyboard.add_event_cb(self.keyboard_cb, lv.EVENT.READY, None)
49-
self.keyboard.add_flag(lv.obj.FLAG.HIDDEN)
50-
51-
self.messages = lv.label(main_content)
52-
self.messages.set_style_text_font(lv.font_montserrat_14, 0)
37+
screen = lv.obj()
38+
screen.set_style_pad_all(0, lv.PART.MAIN)
39+
screen.set_flex_flow(lv.FLEX_FLOW.COLUMN)
40+
41+
messages_row = lv.obj(screen)
42+
messages_row.set_width(lv.pct(100))
43+
messages_row.set_height(lv.SIZE_CONTENT)
44+
messages_row.set_style_pad_all(0, 1)
45+
messages_row.set_flex_flow(lv.FLEX_FLOW.ROW)
46+
47+
self.messages = lv.label(messages_row)
48+
self.messages.set_style_text_font(lv.font_montserrat_12, 0)
49+
50+
self.button_row = lv.obj(screen)
51+
self.button_row.set_width(lv.pct(100))
52+
self.button_row.set_height(lv.SIZE_CONTENT)
53+
self.button_row.set_flex_flow(lv.FLEX_FLOW.ROW)
54+
55+
self.write_btn = lv.button(self.button_row)
56+
write_label = lv.label(self.write_btn)
57+
write_label.set_text("Send Message")
58+
self.write_btn.add_event_cb(self.open_message_input, lv.EVENT.CLICKED, None)
59+
60+
self.channel_btn = lv.button(self.button_row)
61+
channel_btn_label = lv.label(self.channel_btn)
62+
channel_btn_label.set_text("Channel")
63+
self.channel_btn.add_event_cb(self.open_channel_activity, lv.EVENT.CLICKED, None)
5364

5465
# Buffer to store and display the latest 20 messages:
5566
self.messages_buffer = deque((), 20)
5667

57-
self.setContentView(main_content)
68+
self.setContentView(screen)
5869

5970
if aioespnow and network:
6071
print("Initialize WLAN interface...")
@@ -80,21 +91,28 @@ def info(self, text):
8091
hour, minute, second = now[3], now[4], now[5]
8192
message = f"{hour:02}:{minute:02}:{second:02} {text}"
8293
print(message)
83-
self.messages_buffer.appendleft(message)
94+
self.messages_buffer.append(message)
8495
self.messages.set_text("\n".join(self.messages_buffer))
85-
86-
def keyboard_cb(self, event):
87-
message = self.input_textarea.get_text()
88-
if not message:
89-
print("Ignore empty input")
90-
else:
91-
self.input_textarea.set_text("")
92-
print(f"Create task to send {message=}...")
96+
self.button_row.scroll_to_view_recursive(True)
97+
98+
def open_message_input(self, event):
99+
intent = Intent(activity_class=MessageInputActivity)
100+
self.startActivityForResult(intent, self.on_message_input_result)
101+
102+
def open_channel_activity(self, event):
103+
intent = Intent(activity_class=ChannelActivity)
104+
self.startActivityForResult(intent, self.on_channel_activity_result)
105+
106+
def on_message_input_result(self, result: dict):
107+
print(f"on_message_input_result: {result=}")
108+
if not result:
109+
return
110+
if message := result.get("data"):
111+
print(f"Create task to send {message=}")
93112
TaskManager.create_task(self.send_messages(message))
94113

95-
def show_keyboard(self, event):
96-
print("Show keyboard")
97-
self.keyboard.remove_flag(lv.obj.FLAG.HIDDEN)
114+
def on_channel_activity_result(self, result: dict):
115+
print(f"WIP - on_channel_activity_result: {result=}")
98116

99117
async def send_messages(self, message):
100118
self.info(f"Sending: {message} ({self.own_id})")
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import lvgl as lv
2+
from mpos import Activity, AppearanceManager
3+
4+
5+
class MessageInputActivity(Activity):
6+
def onCreate(self):
7+
screen = lv.obj()
8+
screen.set_style_pad_all(0, lv.PART.MAIN)
9+
screen.set_flex_flow(lv.FLEX_FLOW.COLUMN)
10+
11+
self.input_textarea = lv.textarea(screen)
12+
self.input_textarea.set_width(lv.pct(100))
13+
self.input_textarea.set_one_line(True)
14+
self.input_textarea.set_placeholder_text("Message ...")
15+
self.input_textarea.set_style_text_font(lv.font_montserrat_16, lv.PART.MAIN)
16+
17+
keyboard = lv.keyboard(screen)
18+
keyboard.set_style_text_font(lv.font_montserrat_20, lv.PART.MAIN)
19+
keyboard.set_style_min_height(175, lv.PART.MAIN)
20+
AppearanceManager.apply_keyboard_fix(keyboard)
21+
keyboard.set_textarea(self.input_textarea)
22+
keyboard.add_event_cb(self.keyboard_cb, lv.EVENT.READY, None)
23+
24+
self.setContentView(screen)
25+
26+
def keyboard_cb(self, event):
27+
text = self.input_textarea.get_text()
28+
self.setResult(result_code="text", data=text)
29+
self.finish()

0 commit comments

Comments
 (0)