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
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
from gi.repository import Gtk, Gdk
class Prompt:
@ -15,10 +15,14 @@ class Prompt:
self.id = 1
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):
logging.info(f'{data}')
if data.startswith('prompt_begin'):
# action:prompt_begin <headline>
self.header = data.replace('prompt_begin', '')
if self.header:
self.window_title = self.header
@ -26,14 +30,9 @@ class Prompt:
self.buttons = []
return
elif data.startswith('prompt_text'):
# action:prompt_text <text>
self.text = data.replace('prompt_text ', '')
return
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_footer_button ', '')
params = data.split('|')
@ -70,7 +69,7 @@ class Prompt:
close = self.gtk.Button("cancel", scale=self.gtk.bsidescale)
close.set_hexpand(False)
close.set_vexpand(False)
close.connect("clicked", self.end)
close.connect("clicked", self.close)
scroll = self.gtk.ScrolledWindow(steppers=False)
scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
@ -88,13 +87,20 @@ class Prompt:
content,
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):
for button in self.buttons:
if button['response'] == response_id:
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:
self.gtk.remove_dialog(self.prompt)
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"]:
if not (data.startswith("B:") or data.startswith("T:")):
if data.startswith("// action:"):
self.wake_screen()
if self.prompt is None:
action = data[10:]
if action.startswith('prompt_begin'):
if self.prompt is not None:
self.prompt.end()
self.prompt = Prompt(self)
self.prompt.decode(data[10:])
if self.prompt is None:
return
self.prompt.decode(action)
elif data.startswith("echo: "):
self.show_popup_message(data[6:], 1)
elif data.startswith("!! "):