prompts: add escape and backspace to close, prevent concurrent prompts, send prompt_end at close

This commit is contained in:
alfrix 2024-01-03 19:00:40 -03:00
parent c0741f5c81
commit 5ad03b5dd1
2 changed files with 22 additions and 12 deletions

View File

@ -2,7 +2,7 @@ import logging
import gi import gi
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
from gi.repository import Gtk from gi.repository import Gtk, Gdk
class Prompt: class Prompt:
@ -15,10 +15,14 @@ class Prompt:
self.id = 1 self.id = 1
self.prompt = None self.prompt = None
def _key_press_event(self, widget, event):
keyval_name = Gdk.keyval_name(event.keyval)
if keyval_name == "Escape" or keyval_name == "BackSpace":
self.close()
def decode(self, data): def decode(self, data):
logging.info(f'{data}') logging.info(f'{data}')
if data.startswith('prompt_begin'): if data.startswith('prompt_begin'):
# action:prompt_begin <headline>
self.header = data.replace('prompt_begin', '') self.header = data.replace('prompt_begin', '')
if self.header: if self.header:
self.window_title = self.header self.window_title = self.header
@ -26,14 +30,9 @@ class Prompt:
self.buttons = [] self.buttons = []
return return
elif data.startswith('prompt_text'): elif data.startswith('prompt_text'):
# action:prompt_text <text>
self.text = data.replace('prompt_text ', '') self.text = data.replace('prompt_text ', '')
return return
elif data.startswith('prompt_button ') or data.startswith('prompt_footer_button'): elif data.startswith('prompt_button ') or data.startswith('prompt_footer_button'):
# action:prompt_button <label>|<gcode?>|<color?>
# <label>: text of the button
# <gcode?>: optional G-Code (Default is the label text)
# <color?>: optional secondary, info, warning, error
data = data.replace('prompt_button ', '') data = data.replace('prompt_button ', '')
data = data.replace('prompt_footer_button ', '') data = data.replace('prompt_footer_button ', '')
params = data.split('|') params = data.split('|')
@ -70,7 +69,7 @@ class Prompt:
close = self.gtk.Button("cancel", scale=self.gtk.bsidescale) close = self.gtk.Button("cancel", scale=self.gtk.bsidescale)
close.set_hexpand(False) close.set_hexpand(False)
close.set_vexpand(False) close.set_vexpand(False)
close.connect("clicked", self.end) close.connect("clicked", self.close)
scroll = self.gtk.ScrolledWindow(steppers=False) scroll = self.gtk.ScrolledWindow(steppers=False)
scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
@ -88,13 +87,20 @@ class Prompt:
content, content,
self.response, self.response,
) )
self.prompt.connect("key-press-event", self._key_press_event)
self.prompt.connect("delete-event", self.close)
self.screen.wake_screen()
def response(self, dialog, response_id): def response(self, dialog, response_id):
for button in self.buttons: for button in self.buttons:
if button['response'] == response_id: if button['response'] == response_id:
self.screen._send_action(None, "printer.gcode.script", {'script': button['gcode']}) self.screen._send_action(None, "printer.gcode.script", {'script': button['gcode']})
def end(self, *args): def close(self, *args):
script = {'script': 'RESPOND type="command" msg="action:prompt_end"'}
self.screen._send_action(None, "printer.gcode.script", script)
def end(self):
if self.prompt is not None: if self.prompt is not None:
self.gtk.remove_dialog(self.prompt) self.gtk.remove_dialog(self.prompt)
self.prompt = None self.prompt = None

View File

@ -768,10 +768,14 @@ class KlipperScreen(Gtk.Window):
elif action == "notify_gcode_response" and self.printer.state not in ["error", "shutdown"]: elif action == "notify_gcode_response" and self.printer.state not in ["error", "shutdown"]:
if not (data.startswith("B:") or data.startswith("T:")): if not (data.startswith("B:") or data.startswith("T:")):
if data.startswith("// action:"): if data.startswith("// action:"):
self.wake_screen() action = data[10:]
if self.prompt is None: if action.startswith('prompt_begin'):
if self.prompt is not None:
self.prompt.end()
self.prompt = Prompt(self) self.prompt = Prompt(self)
self.prompt.decode(data[10:]) if self.prompt is None:
return
self.prompt.decode(action)
elif data.startswith("echo: "): elif data.startswith("echo: "):
self.show_popup_message(data[6:], 1) self.show_popup_message(data[6:], 1)
elif data.startswith("!! "): elif data.startswith("!! "):