GeneralKlipperScreen/panels/splash_screen.py
2024-05-13 09:40:52 -03:00

173 lines
6.4 KiB
Python

import logging
import os
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Pango
from ks_includes.screen_panel import ScreenPanel
class Panel(ScreenPanel):
def __init__(self, screen, title):
super().__init__(screen, title)
image = self._gtk.Image(
"klipper", self._gtk.content_width * 0.2, self._gtk.content_height * 0.5
)
self.labels["text"] = Gtk.Label(
label=_("Initializing printer..."),
wrap=True,
wrap_mode=Pango.WrapMode.WORD_CHAR,
halign=Gtk.Align.CENTER,
valign=Gtk.Align.CENTER,
)
self.labels["menu"] = self._gtk.Button("settings", _("Menu"), "color4")
self.labels["menu"].connect("clicked", self._screen._go_to_submenu, "")
self.labels["restart"] = self._gtk.Button(
"refresh", _("Klipper Restart"), "color1"
)
self.labels["restart"].connect("clicked", self.restart_klipper)
self.labels["firmware_restart"] = self._gtk.Button(
"refresh", _("Firmware Restart"), "color2"
)
self.labels["firmware_restart"].connect("clicked", self.firmware_restart)
self.labels["restart_system"] = self._gtk.Button(
"refresh", _("System Restart"), "color1"
)
self.labels["restart_system"].connect("clicked", self.reboot_poweroff, "reboot")
self.labels["shutdown"] = self._gtk.Button(
"shutdown", _("System Shutdown"), "color2"
)
self.labels["shutdown"].connect("clicked", self.reboot_poweroff, "shutdown")
self.labels["retry"] = self._gtk.Button("load", _("Retry"), "color3")
self.labels["retry"].connect("clicked", self.retry)
self.labels["actions"] = Gtk.Box(hexpand=True, vexpand=False, homogeneous=True)
scroll = self._gtk.ScrolledWindow()
scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
scroll.add(self.labels["text"])
info = Gtk.Box()
info.pack_start(image, False, True, 8)
info.pack_end(scroll, True, True, 8)
main = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
main.pack_start(info, True, True, 8)
main.pack_end(self.labels["actions"], False, False, 0)
self.show_restart_buttons()
self.content.add(main)
def update_text(self, text):
self.labels["text"].set_label(f"{text}")
self.show_restart_buttons()
def clear_action_bar(self):
for child in self.labels["actions"].get_children():
self.labels["actions"].remove(child)
def show_restart_buttons(self):
self.clear_action_bar()
if self.ks_printer_cfg is not None and self._screen._ws.connected:
power_devices = self.ks_printer_cfg.get("power_devices", "")
if power_devices and self._printer.get_power_devices():
logging.info(f"Associated power devices: {power_devices}")
self.add_power_button(power_devices)
if self._screen.initialized:
self.labels["actions"].add(self.labels["restart"])
self.labels["actions"].add(self.labels["firmware_restart"])
else:
self.labels["actions"].add(self.labels["restart_system"])
self.labels["actions"].add(self.labels["shutdown"])
self.labels["actions"].add(self.labels["menu"])
if (
self._screen._ws
and not self._screen._ws.connecting
or self._screen.reinit_count > self._screen.max_retries
):
self.labels["actions"].add(self.labels["retry"])
self.labels["actions"].show_all()
def add_power_button(self, powerdevs):
self.labels["power"] = self._gtk.Button(
"shutdown", _("Power On Printer"), "color3"
)
self.labels["power"].connect(
"clicked", self._screen.power_devices, powerdevs, True
)
self.check_power_status()
self.labels["actions"].add(self.labels["power"])
def activate(self):
self.check_power_status()
def check_power_status(self):
if "power" in self.labels:
devices = self._printer.get_power_devices()
if devices is not None:
for device in devices:
if self._printer.get_power_device_status(device) == "off":
self.labels["power"].set_sensitive(True)
break
elif self._printer.get_power_device_status(device) == "on":
self.labels["power"].set_sensitive(False)
def firmware_restart(self, widget):
self._screen._ws.klippy.restart_firmware()
def restart_klipper(self, widget):
self._screen._ws.klippy.restart()
def retry(self, widget):
self._screen.connect_printer(self._screen.connecting_to_printer)
self.show_restart_buttons()
def reboot_poweroff(self, widget, method):
label = Gtk.Label(wrap=True, hexpand=True, vexpand=True)
if method == "reboot":
label.set_label(_("Are you sure you wish to reboot the system?"))
title = _("Restart")
else:
label.set_label(_("Are you sure you wish to shutdown the system?"))
title = _("Shutdown")
buttons = [
{
"name": _("Host"),
"response": Gtk.ResponseType.OK,
"style": "dialog-info",
},
{
"name": _("Cancel"),
"response": Gtk.ResponseType.CANCEL,
"style": "dialog-error",
},
]
if self._screen._ws.connected:
buttons.insert(
1,
{
"name": _("Printer"),
"response": Gtk.ResponseType.APPLY,
"style": "dialog-warning",
},
)
self._gtk.Dialog(title, buttons, label, self.reboot_poweroff_confirm, method)
def reboot_poweroff_confirm(self, dialog, response_id, method):
self._gtk.remove_dialog(dialog)
if response_id == Gtk.ResponseType.OK:
if method == "reboot":
os.system("systemctl reboot -i")
else:
os.system("systemctl poweroff -i")
elif response_id == Gtk.ResponseType.APPLY:
if method == "reboot":
self._screen._ws.send_method("machine.reboot")
else:
self._screen._ws.send_method("machine.shutdown")