From edb3a4bdee23ef7f266c662ca5965517cb108484 Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Sat, 28 Mar 2026 12:04:16 +0100 Subject: [PATCH] EspNowChat: Split input into seperate activity --- .../assets/espnow_chat.py | 46 +++++++--------- .../assets/message_input_activity.py | 52 +++++++++++++++++++ 2 files changed, 71 insertions(+), 27 deletions(-) create mode 100644 internal_filesystem/apps/com.micropythonos.espnow_chat/assets/message_input_activity.py diff --git a/internal_filesystem/apps/com.micropythonos.espnow_chat/assets/espnow_chat.py b/internal_filesystem/apps/com.micropythonos.espnow_chat/assets/espnow_chat.py index 87b74c2c..daa880ee 100644 --- a/internal_filesystem/apps/com.micropythonos.espnow_chat/assets/espnow_chat.py +++ b/internal_filesystem/apps/com.micropythonos.espnow_chat/assets/espnow_chat.py @@ -6,8 +6,9 @@ import lvgl as lv import machine +from message_input_activity import MessageInputActivity from micropython import const -from mpos import Activity, MposKeyboard, TaskManager +from mpos import Activity, Intent, TaskManager from mpos.time import localtime try: @@ -33,24 +34,16 @@ def pformat_mac(mac): class EspNowChat(Activity): def onCreate(self): main_content = lv.obj() - main_content.set_flex_flow(lv.FLEX_FLOW.COLUMN) - main_content.set_style_pad_gap(10, 0) - - self.input_textarea = lv.textarea(main_content) - self.input_textarea.set_placeholder_text("Message input...") - self.input_textarea.set_one_line(True) - self.input_textarea.set_style_text_font(lv.font_montserrat_16, lv.PART.MAIN) - self.input_textarea.set_width(lv.pct(100)) - self.input_textarea.add_event_cb(self.show_keyboard, lv.EVENT.CLICKED, None) - - self.keyboard = MposKeyboard(main_content) - self.keyboard.set_textarea(self.input_textarea) - self.keyboard.add_event_cb(self.keyboard_cb, lv.EVENT.READY, None) - self.keyboard.add_flag(lv.obj.FLAG.HIDDEN) self.messages = lv.label(main_content) self.messages.set_style_text_font(lv.font_montserrat_14, 0) + self.write_btn = lv.button(main_content) + write_label = lv.label(self.write_btn) + write_label.set_text("Send Message") + self.write_btn.align(lv.ALIGN.BOTTOM_RIGHT, -10, -10) + self.write_btn.add_event_cb(self.open_message_input, lv.EVENT.CLICKED, None) + # Buffer to store and display the latest 20 messages: self.messages_buffer = deque((), 20) @@ -80,21 +73,20 @@ def info(self, text): hour, minute, second = now[3], now[4], now[5] message = f"{hour:02}:{minute:02}:{second:02} {text}" print(message) - self.messages_buffer.appendleft(message) + self.messages_buffer.append(message) self.messages.set_text("\n".join(self.messages_buffer)) - def keyboard_cb(self, event): - message = self.input_textarea.get_text() - if not message: - print("Ignore empty input") - else: - self.input_textarea.set_text("") - print(f"Create task to send {message=}...") - TaskManager.create_task(self.send_messages(message)) + def open_message_input(self, event): + intent = Intent(activity_class=MessageInputActivity) + self.startActivityForResult(intent, self.on_message_input_result) - def show_keyboard(self, event): - print("Show keyboard") - self.keyboard.remove_flag(lv.obj.FLAG.HIDDEN) + def on_message_input_result(self, result: dict): + print(f"on_message_input_result: {result=}") + if not result: + return + if message := result.get("data"): + print(f"Create task to send {message=}") + TaskManager.create_task(self.send_messages(message)) async def send_messages(self, message): self.info(f"Sending: {message} ({self.own_id})") diff --git a/internal_filesystem/apps/com.micropythonos.espnow_chat/assets/message_input_activity.py b/internal_filesystem/apps/com.micropythonos.espnow_chat/assets/message_input_activity.py new file mode 100644 index 00000000..881021c5 --- /dev/null +++ b/internal_filesystem/apps/com.micropythonos.espnow_chat/assets/message_input_activity.py @@ -0,0 +1,52 @@ +import lvgl as lv +from mpos import Activity + + +class MessageInputActivity(Activity): + def onCreate(self): + main_content = lv.obj() + main_content.set_flex_flow(lv.FLEX_FLOW.COLUMN) + # main_content.set_size(lv.pct(100), lv.SIZE_CONTENT) + main_content.set_width(lv.pct(100)) + main_content.set_style_pad_gap(1, 1) + + input_column = lv.obj(main_content) + input_column.set_flex_flow(lv.FLEX_FLOW.COLUMN) + input_column.set_size(lv.pct(100), lv.SIZE_CONTENT) + input_column.set_style_pad_gap(0, 0) + + self.input_textarea = lv.textarea(input_column) + self.input_textarea.set_placeholder_text("Message ...") + self.input_textarea.set_one_line(True) + self.input_textarea.set_style_text_font(lv.font_montserrat_16, lv.PART.MAIN) + + keyboard_column = lv.obj(main_content) + keyboard_column.set_flex_flow(lv.FLEX_FLOW.COLUMN) + keyboard_column.set_width(lv.pct(100)) + keyboard_column.set_style_pad_gap(0, 0) + + self.keyboard = lv.keyboard(keyboard_column) + self.keyboard.set_textarea(self.input_textarea) + self.keyboard.add_event_cb(self.keyboard_cb, lv.EVENT.READY, None) + + btn_column = lv.obj(main_content) + btn_column.set_flex_flow(lv.FLEX_FLOW.COLUMN) + btn_column.set_size(lv.pct(100), lv.SIZE_CONTENT) + btn_column.set_style_pad_gap(0, 0) + + cancel_btn = lv.button(btn_column) + cancel_label = lv.label(cancel_btn) + cancel_label.set_text("Cancel") + cancel_label.align(lv.ALIGN.BOTTOM_RIGHT, -2, -2) + cancel_btn.add_event_cb(self.cancel_clicked, lv.EVENT.CLICKED, None) + + self.setContentView(main_content) + + def keyboard_cb(self, event): + text = self.input_textarea.get_text() + self.setResult(result_code="text", data=text) + self.finish() + + def cancel_clicked(self, event): + self.setResult(None) + self.finish()