Fix CR line end problem

This commit is contained in:
Jordan Ruthe 2020-11-18 10:46:57 -05:00
parent aeea57bd2f
commit 557dd86364
9 changed files with 1036 additions and 1036 deletions

View File

@ -1,204 +1,204 @@
# -*- coding: utf-8 -*-
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GdkPixbuf, GLib
import os
klipperscreendir = os.getcwd()
class KlippyGtk:
labels = {}
@staticmethod
def Label(label, style):
l = Gtk.Label(label)
if style != False:
l.get_style_context().add_class(style)
return l
@staticmethod
def ImageLabel(image_name, text, size=20, style=False):
box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=15)
image = Gtk.Image()
#TODO: update file reference
image.set_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg")
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg", 20, 20, True)
image.set_from_pixbuf(pixbuf)
label = Gtk.Label()
label.set_text(text)
box1.add(image) #, size, size)
box1.add(label)
if style != False:
ctx = box1.get_style_context()
ctx.add_class(style)
return {"l": label, "b": box1}
@staticmethod
def Image(image_name, style=False, width=None, height=None):
pixbuf = GdkPixbuf.Pixbuf.new_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg")
if height != None and width != None:
pixbuf = pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.BILINEAR)
return Gtk.Image.new_from_pixbuf(pixbuf)
@staticmethod
def ImageFromFile(filename, style=False, width=None, height=None):
if height != -1 or width != -1:
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename, width, height, True)
else:
pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename)
return Gtk.Image.new_from_pixbuf(pixbuf)
@staticmethod
def PixbufFromFile(filename, style=False, width=None, height=None):
if height != -1 or width != -1:
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename, width, height, True)
else:
pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename)
return pixbuf
@staticmethod
def ProgressBar(style=False):
bar = Gtk.ProgressBar()
if style != False:
ctx = bar.get_style_context()
ctx.add_class(style)
return bar
@staticmethod
def Button(label=None, style=None):
b = Gtk.Button(label=label)
b.set_hexpand(True)
b.set_vexpand(True)
b.set_can_focus(False)
b.props.relief = Gtk.ReliefStyle.NONE
if style != None:
b.get_style_context().add_class(style)
return b
@staticmethod
def ButtonImage(image_name, label=None, style=None, height=None, width=None):
pixbuf = GdkPixbuf.Pixbuf.new_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg")
if height != None and width != None:
pixbuf = pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.BILINEAR)
img = Gtk.Image.new_from_pixbuf(pixbuf)
b = Gtk.Button(label=label)
b.set_image(img)
b.set_hexpand(True)
b.set_vexpand(True)
b.set_can_focus(False)
b.set_image_position(Gtk.PositionType.TOP)
b.set_always_show_image(True)
b.props.relief = Gtk.ReliefStyle.NONE
if style != None:
b.get_style_context().add_class(style)
return b
@staticmethod
def Dialog(screen, buttons, content, callback=None, *args):
dialog = Gtk.Dialog()
dialog.set_default_size(screen.width - 15, screen.height - 15)
dialog.set_resizable(False)
dialog.set_transient_for(screen)
dialog.set_modal(True)
for button in buttons:
dialog.add_button(button_text=button['name'], response_id=button['response'])
dialog.connect("response", callback, *args)
dialog.get_style_context().add_class("dialog")
grid = Gtk.Grid()
grid.set_size_request(screen.width - 60, -1)
grid.set_vexpand(True)
grid.set_halign(Gtk.Align.CENTER)
grid.set_valign(Gtk.Align.CENTER)
grid.add(content)
content_area = dialog.get_content_area()
content_area.set_margin_start(15)
content_area.set_margin_end(15)
content_area.set_margin_top(15)
content_area.set_margin_bottom(15)
content_area.add(grid)
dialog.show_all()
return dialog, grid
@staticmethod
def ToggleButtonImage(image_name, label, style=False):
img = Gtk.Image.new_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg")
b = Gtk.ToggleButton(label=label)
#b.props.relief = Gtk.RELIEF_NONE
b.set_image(img)
b.set_hexpand(True)
b.set_vexpand(True)
b.set_can_focus(False)
b.set_image_position(Gtk.PositionType.TOP)
b.set_always_show_image(True)
b.props.relief = Gtk.ReliefStyle.NONE
if style != False:
ctx = b.get_style_context()
ctx.add_class(style)
return b
@staticmethod
def HomogeneousGrid():
g = Gtk.Grid()
g.set_row_homogeneous(True)
g.set_column_homogeneous(True)
return g
@staticmethod
def ToggleButton(text):
b = Gtk.ToggleButton(text)
b.props.relief = Gtk.ReliefStyle.NONE
b.set_hexpand(True)
b.set_vexpand(True)
return b
@staticmethod
def formatFileName(name):
name = name.split('/')[-1] if "/" in name else name
name = name.split('.gcod')[0] if ".gcode" in name else name
if len(name) > 25:
return name[0:25] + "\n" + name[25:50]
return name
@staticmethod
def formatTimeString(seconds):
time = int(seconds)
text = ""
if int(time/3600) !=0:
text += str(int(time/3600))+"h "
text += str(int(time/60)%60)+"m "+str(time%60)+"s"
return text
@staticmethod
def formatTemperatureString(temp, target):
if (target > temp-2 and target < temp+2) or round(target,0) == 0:
return str(round(temp,2)) + "°C" #°C →"
return str(round(temp)) + "" + str(round(target)) + "°C"
# -*- coding: utf-8 -*-
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GdkPixbuf, GLib
import os
klipperscreendir = os.getcwd()
class KlippyGtk:
labels = {}
@staticmethod
def Label(label, style):
l = Gtk.Label(label)
if style != False:
l.get_style_context().add_class(style)
return l
@staticmethod
def ImageLabel(image_name, text, size=20, style=False):
box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=15)
image = Gtk.Image()
#TODO: update file reference
image.set_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg")
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg", 20, 20, True)
image.set_from_pixbuf(pixbuf)
label = Gtk.Label()
label.set_text(text)
box1.add(image)
box1.add(label)
if style != False:
ctx = box1.get_style_context()
ctx.add_class(style)
return {"l": label, "b": box1}
@staticmethod
def Image(image_name, style=False, width=None, height=None):
pixbuf = GdkPixbuf.Pixbuf.new_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg")
if height != None and width != None:
pixbuf = pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.BILINEAR)
return Gtk.Image.new_from_pixbuf(pixbuf)
@staticmethod
def ImageFromFile(filename, style=False, width=None, height=None):
if height != -1 or width != -1:
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename, width, height, True)
else:
pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename)
return Gtk.Image.new_from_pixbuf(pixbuf)
@staticmethod
def PixbufFromFile(filename, style=False, width=None, height=None):
if height != -1 or width != -1:
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename, width, height, True)
else:
pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename)
return pixbuf
@staticmethod
def ProgressBar(style=False):
bar = Gtk.ProgressBar()
if style != False:
ctx = bar.get_style_context()
ctx.add_class(style)
return bar
@staticmethod
def Button(label=None, style=None):
b = Gtk.Button(label=label)
b.set_hexpand(True)
b.set_vexpand(True)
b.set_can_focus(False)
b.props.relief = Gtk.ReliefStyle.NONE
if style != None:
b.get_style_context().add_class(style)
return b
@staticmethod
def ButtonImage(image_name, label=None, style=None, height=None, width=None):
pixbuf = GdkPixbuf.Pixbuf.new_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg")
if height != None and width != None:
pixbuf = pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.BILINEAR)
img = Gtk.Image.new_from_pixbuf(pixbuf)
b = Gtk.Button(label=label)
b.set_image(img)
b.set_hexpand(True)
b.set_vexpand(True)
b.set_can_focus(False)
b.set_image_position(Gtk.PositionType.TOP)
b.set_always_show_image(True)
b.props.relief = Gtk.ReliefStyle.NONE
if style != None:
b.get_style_context().add_class(style)
return b
@staticmethod
def Dialog(screen, buttons, content, callback=None, *args):
dialog = Gtk.Dialog()
dialog.set_default_size(screen.width - 15, screen.height - 15)
dialog.set_resizable(False)
dialog.set_transient_for(screen)
dialog.set_modal(True)
for button in buttons:
dialog.add_button(button_text=button['name'], response_id=button['response'])
dialog.connect("response", callback, *args)
dialog.get_style_context().add_class("dialog")
grid = Gtk.Grid()
grid.set_size_request(screen.width - 60, -1)
grid.set_vexpand(True)
grid.set_halign(Gtk.Align.CENTER)
grid.set_valign(Gtk.Align.CENTER)
grid.add(content)
content_area = dialog.get_content_area()
content_area.set_margin_start(15)
content_area.set_margin_end(15)
content_area.set_margin_top(15)
content_area.set_margin_bottom(15)
content_area.add(grid)
dialog.show_all()
return dialog, grid
@staticmethod
def ToggleButtonImage(image_name, label, style=False):
img = Gtk.Image.new_from_file(klipperscreendir + "/styles/z-bolt/images/" + str(image_name) + ".svg")
b = Gtk.ToggleButton(label=label)
#b.props.relief = Gtk.RELIEF_NONE
b.set_image(img)
b.set_hexpand(True)
b.set_vexpand(True)
b.set_can_focus(False)
b.set_image_position(Gtk.PositionType.TOP)
b.set_always_show_image(True)
b.props.relief = Gtk.ReliefStyle.NONE
if style != False:
ctx = b.get_style_context()
ctx.add_class(style)
return b
@staticmethod
def HomogeneousGrid():
g = Gtk.Grid()
g.set_row_homogeneous(True)
g.set_column_homogeneous(True)
return g
@staticmethod
def ToggleButton(text):
b = Gtk.ToggleButton(text)
b.props.relief = Gtk.ReliefStyle.NONE
b.set_hexpand(True)
b.set_vexpand(True)
return b
@staticmethod
def formatFileName(name):
name = name.split('/')[-1] if "/" in name else name
name = name.split('.gcod')[0] if ".gcode" in name else name
if len(name) > 25:
return name[0:25] + "\n" + name[25:50]
return name
@staticmethod
def formatTimeString(seconds):
time = int(seconds)
text = ""
if int(time/3600) !=0:
text += str(int(time/3600))+"h "
text += str(int(time/60)%60)+"m "+str(time%60)+"s"
return text
@staticmethod
def formatTemperatureString(temp, target):
if (target > temp-2 and target < temp+2) or round(target,0) == 0:
return str(round(temp,2)) + "°C" #°C →"
return str(round(temp)) + "" + str(round(target)) + "°C"

View File

@ -1,14 +1,14 @@
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
from KlippyGtk import KlippyGtk
from KlippyGcodes import KlippyGcodes
from panels.screen_panel import ScreenPanel
class ExamplePanel(ScreenPanel):
def initialize(self, panel_name):
_ = self.lang.gettext
# Create gtk items here
return
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
from KlippyGtk import KlippyGtk
from KlippyGcodes import KlippyGcodes
from panels.screen_panel import ScreenPanel
class ExamplePanel(ScreenPanel):
def initialize(self, panel_name):
_ = self.lang.gettext
# Create gtk items here
return

View File

@ -1,204 +1,204 @@
import gi
import logging
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
from KlippyGtk import KlippyGtk
from panels.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.JobStatusPanel")
class JobStatusPanel(ScreenPanel):
is_paused = False
filename = None
def initialize(self, panel_name):
_ = self.lang.gettext
grid = KlippyGtk.HomogeneousGrid()
self.labels['progress'] = KlippyGtk.ProgressBar("printing-progress-bar")
#self.labels['progress'].set_vexpand(True)
#self.labels['progress'].set_valign(Gtk.Align.CENTER)
self.labels['progress'].set_show_text(False)
#self.labels['progress'].set_margin_top(10)
self.labels['progress'].set_margin_end(20)
self.labels['progress_text'] = Gtk.Label()
self.labels['progress_text'].get_style_context().add_class("printing-progress-text")
overlay = Gtk.Overlay()
overlay.add(self.labels['progress'])
overlay.add_overlay(self.labels['progress_text'])
self.labels['file'] = KlippyGtk.ImageLabel("file","",20,"printing-status-label")
self.labels['time_label'] = KlippyGtk.ImageLabel("speed-step",_("Time Elapsed"),20,"printing-status-label")
self.labels['time'] = KlippyGtk.Label(_("Time Elapsed"),"printing-status-label")
self.labels['time_left_label'] = KlippyGtk.ImageLabel("speed-step",_("Time Left"),20,"printing-status-label")
self.labels['time_left'] = KlippyGtk.Label(_("Time Left"),"printing-status-label")
timegrid = Gtk.Grid()
timegrid.attach(self.labels['time_label']['b'], 0, 0, 1, 1)
timegrid.attach(self.labels['time'], 0, 1, 1, 1)
timegrid.attach(self.labels['time_left_label']['b'], 1, 0, 1, 1)
timegrid.attach(self.labels['time_left'], 1, 1, 1, 1)
info = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
info.props.valign = Gtk.Align.CENTER
info.set_hexpand(True)
info.set_vexpand(True)
#info.add(self.labels['file']['b'])
#info.add(self.labels['time']['b'])
#info.add(self.labels['time_left']['b'])
#grid.attach(info,2,0,2,1)
pbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
pbox.pack_start(self.labels['file']['b'], False, True, 0)
pbox.pack_end(timegrid, False, False, 0)
#pbox.pack_end(self.labels['progress'], False, False, 0)
pbox.pack_end(overlay, False, False, 0)
grid.attach(pbox, 1, 0, 3, 2)
self.labels['extruder'] = KlippyGtk.ButtonImage("extruder-1", KlippyGtk.formatTemperatureString(0, 0))
self.labels['extruder'].set_sensitive(False)
grid.attach(self.labels['extruder'], 0, 0, 1, 1)
self.labels['heater_bed'] = KlippyGtk.ButtonImage("bed", KlippyGtk.formatTemperatureString(0, 0))
self.labels['heater_bed'].set_sensitive(False)
grid.attach(self.labels['heater_bed'], 0, 1, 1, 1)
self.labels['resume'] = KlippyGtk.ButtonImage("resume",_("Resume"),"color1")
self.labels['resume'].connect("clicked",self.resume)
self.labels['pause'] = KlippyGtk.ButtonImage("pause",_("Pause"),"color1" )
self.labels['pause'].connect("clicked",self.pause)
if self._printer.get_stat('pause_resume','is_paused') == True:
self.is_paused = True
grid.attach(self.labels['resume'], 0, 2, 1, 1)
else:
grid.attach(self.labels['pause'], 0, 2, 1, 1)
self.labels['cancel'] = KlippyGtk.ButtonImage("stop",_("Cancel"),"color2")
self.labels['cancel'].connect("clicked", self.cancel)
grid.attach(self.labels['cancel'], 1, 2, 1, 1)
self.labels['estop'] = KlippyGtk.ButtonImage("decrease",_("Emergency Stop"),"color4")
self.labels['estop'].connect("clicked", self.emergency_stop)
grid.attach(self.labels['estop'], 2, 2, 1, 1)
self.labels['control'] = KlippyGtk.ButtonImage("control",_("Control"),"color3")
self.labels['control'].connect("clicked", self._screen._go_to_submenu, "")
grid.attach(self.labels['control'], 3, 2, 1, 1)
self.panel = grid
self._screen.add_subscription(panel_name)
def resume(self, widget):
self.disable_button("pause","cancel")
self._screen._ws.klippy.print_resume(self._response_callback, "enable_button", "pause", "cancel")
self._screen.show_all()
def pause(self, widget):
self.disable_button("resume","cancel")
self._screen._ws.klippy.print_pause(self._response_callback, "enable_button", "resume", "cancel")
self._screen.show_all()
def cancel(self, widget):
_ = self.lang.gettext
dialog = KlippyGtk.ConfirmDialog(
self._screen,
_("Are you sure you wish to cancel this print?"),
[
{
"name": _("Cancel Print"),
"response": Gtk.ResponseType.OK
},
{
"name": _("Go Back"),
"response": Gtk.ResponseType.CANCEL
}
],
self.cancel_confirm
)
self.disable_button("pause","cancel")
def cancel_confirm(self, widget, response_id):
widget.destroy()
if response_id == Gtk.ResponseType.CANCEL:
self.enable_button("pause","cancel")
return
self._screen._ws.klippy.print_cancel(self._response_callback, "enable_button", "pause", "cancel")
def _response_callback(self, response, method, params, func, *args):
if func == "enable_button":
self.enable_button(*args)
def enable_button(self, *args):
for arg in args:
self.labels[arg].set_sensitive(True)
def disable_button(self, *args):
for arg in args:
self.labels[arg].set_sensitive(False)
def process_update(self, data):
self.update_temp("heater_bed",
self._printer.get_dev_stat("heater_bed","temperature"),
self._printer.get_dev_stat("heater_bed","target")
)
for x in self._printer.get_tools():
self.update_temp(x,
self._printer.get_dev_stat(x,"temperature"),
self._printer.get_dev_stat(x,"target")
)
vsd = self._printer.get_stat("print_stats")
if "filename" in vsd and self.filename != vsd['filename']:
if vsd['filename'] != "":
self.filename = KlippyGtk.formatFileName(vsd['filename'])
self.update_image_text("file", self.filename)
else:
file = "Unknown"
self.update_image_text("file", "Unknown")
progress = 0 if self._printer.get_stat('virtual_sdcard','progress') == 0 else (vsd['print_duration'] /
self._printer.get_stat('virtual_sdcard','progress') - vsd['print_duration'])
self.update_text("time", str(KlippyGtk.formatTimeString(vsd['print_duration'])))
self.update_text("time_left", str(KlippyGtk.formatTimeString(
progress
)))
self.update_progress(self._printer.get_stat('virtual_sdcard','progress'))
if "pause_resume" in data:
if self.is_paused == True and data['pause_resume']['is_paused'] == False:
self.is_paused = False
self.panel.attach(self.labels['pause'], 0, 2, 1, 1)
self.panel.remove(self.labels['resume'])
self.panel.show_all()
if self.is_paused == False and data['pause_resume']['is_paused'] == True:
self.is_paused = True
self.panel.attach(self.labels['resume'], 0, 2, 1, 1)
self.panel.remove(self.labels['pause'])
self.panel.show_all()
def update_image_text(self, label, text):
if label in self.labels and 'l' in self.labels[label]:
self.labels[label]['l'].set_text(text)
def update_text(self, label, text):
if label in self.labels:
self.labels[label].set_text(text)
def update_progress (self, progress):
self.labels['progress'].set_fraction(progress)
self.labels['progress_text'].set_text("%s%%" % (str(int(progress*100))))
def update_temp(self, dev, temp, target):
if dev in self.labels:
self.labels[dev].set_label(KlippyGtk.formatTemperatureString(temp, target))
import gi
import logging
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
from KlippyGtk import KlippyGtk
from panels.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.JobStatusPanel")
class JobStatusPanel(ScreenPanel):
is_paused = False
filename = None
def initialize(self, panel_name):
_ = self.lang.gettext
grid = KlippyGtk.HomogeneousGrid()
self.labels['progress'] = KlippyGtk.ProgressBar("printing-progress-bar")
#self.labels['progress'].set_vexpand(True)
#self.labels['progress'].set_valign(Gtk.Align.CENTER)
self.labels['progress'].set_show_text(False)
#self.labels['progress'].set_margin_top(10)
self.labels['progress'].set_margin_end(20)
self.labels['progress_text'] = Gtk.Label()
self.labels['progress_text'].get_style_context().add_class("printing-progress-text")
overlay = Gtk.Overlay()
overlay.add(self.labels['progress'])
overlay.add_overlay(self.labels['progress_text'])
self.labels['file'] = KlippyGtk.ImageLabel("file","",20,"printing-status-label")
self.labels['time_label'] = KlippyGtk.ImageLabel("speed-step",_("Time Elapsed"),20,"printing-status-label")
self.labels['time'] = KlippyGtk.Label(_("Time Elapsed"),"printing-status-label")
self.labels['time_left_label'] = KlippyGtk.ImageLabel("speed-step",_("Time Left"),20,"printing-status-label")
self.labels['time_left'] = KlippyGtk.Label(_("Time Left"),"printing-status-label")
timegrid = Gtk.Grid()
timegrid.attach(self.labels['time_label']['b'], 0, 0, 1, 1)
timegrid.attach(self.labels['time'], 0, 1, 1, 1)
timegrid.attach(self.labels['time_left_label']['b'], 1, 0, 1, 1)
timegrid.attach(self.labels['time_left'], 1, 1, 1, 1)
info = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
info.props.valign = Gtk.Align.CENTER
info.set_hexpand(True)
info.set_vexpand(True)
#info.add(self.labels['file']['b'])
#info.add(self.labels['time']['b'])
#info.add(self.labels['time_left']['b'])
#grid.attach(info,2,0,2,1)
pbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
pbox.pack_start(self.labels['file']['b'], False, True, 0)
pbox.pack_end(timegrid, False, False, 0)
#pbox.pack_end(self.labels['progress'], False, False, 0)
pbox.pack_end(overlay, False, False, 0)
grid.attach(pbox, 1, 0, 3, 2)
self.labels['extruder'] = KlippyGtk.ButtonImage("extruder-1", KlippyGtk.formatTemperatureString(0, 0))
self.labels['extruder'].set_sensitive(False)
grid.attach(self.labels['extruder'], 0, 0, 1, 1)
self.labels['heater_bed'] = KlippyGtk.ButtonImage("bed", KlippyGtk.formatTemperatureString(0, 0))
self.labels['heater_bed'].set_sensitive(False)
grid.attach(self.labels['heater_bed'], 0, 1, 1, 1)
self.labels['resume'] = KlippyGtk.ButtonImage("resume",_("Resume"),"color1")
self.labels['resume'].connect("clicked",self.resume)
self.labels['pause'] = KlippyGtk.ButtonImage("pause",_("Pause"),"color1" )
self.labels['pause'].connect("clicked",self.pause)
if self._printer.get_stat('pause_resume','is_paused') == True:
self.is_paused = True
grid.attach(self.labels['resume'], 0, 2, 1, 1)
else:
grid.attach(self.labels['pause'], 0, 2, 1, 1)
self.labels['cancel'] = KlippyGtk.ButtonImage("stop",_("Cancel"),"color2")
self.labels['cancel'].connect("clicked", self.cancel)
grid.attach(self.labels['cancel'], 1, 2, 1, 1)
self.labels['estop'] = KlippyGtk.ButtonImage("decrease",_("Emergency Stop"),"color4")
self.labels['estop'].connect("clicked", self.emergency_stop)
grid.attach(self.labels['estop'], 2, 2, 1, 1)
self.labels['control'] = KlippyGtk.ButtonImage("control",_("Control"),"color3")
self.labels['control'].connect("clicked", self._screen._go_to_submenu, "")
grid.attach(self.labels['control'], 3, 2, 1, 1)
self.panel = grid
self._screen.add_subscription(panel_name)
def resume(self, widget):
self.disable_button("pause","cancel")
self._screen._ws.klippy.print_resume(self._response_callback, "enable_button", "pause", "cancel")
self._screen.show_all()
def pause(self, widget):
self.disable_button("resume","cancel")
self._screen._ws.klippy.print_pause(self._response_callback, "enable_button", "resume", "cancel")
self._screen.show_all()
def cancel(self, widget):
_ = self.lang.gettext
dialog = KlippyGtk.ConfirmDialog(
self._screen,
_("Are you sure you wish to cancel this print?"),
[
{
"name": _("Cancel Print"),
"response": Gtk.ResponseType.OK
},
{
"name": _("Go Back"),
"response": Gtk.ResponseType.CANCEL
}
],
self.cancel_confirm
)
self.disable_button("pause","cancel")
def cancel_confirm(self, widget, response_id):
widget.destroy()
if response_id == Gtk.ResponseType.CANCEL:
self.enable_button("pause","cancel")
return
self._screen._ws.klippy.print_cancel(self._response_callback, "enable_button", "pause", "cancel")
def _response_callback(self, response, method, params, func, *args):
if func == "enable_button":
self.enable_button(*args)
def enable_button(self, *args):
for arg in args:
self.labels[arg].set_sensitive(True)
def disable_button(self, *args):
for arg in args:
self.labels[arg].set_sensitive(False)
def process_update(self, data):
self.update_temp("heater_bed",
self._printer.get_dev_stat("heater_bed","temperature"),
self._printer.get_dev_stat("heater_bed","target")
)
for x in self._printer.get_tools():
self.update_temp(x,
self._printer.get_dev_stat(x,"temperature"),
self._printer.get_dev_stat(x,"target")
)
vsd = self._printer.get_stat("print_stats")
if "filename" in vsd and self.filename != vsd['filename']:
if vsd['filename'] != "":
self.filename = KlippyGtk.formatFileName(vsd['filename'])
self.update_image_text("file", self.filename)
else:
file = "Unknown"
self.update_image_text("file", "Unknown")
progress = 0 if self._printer.get_stat('virtual_sdcard','progress') == 0 else (vsd['print_duration'] /
self._printer.get_stat('virtual_sdcard','progress') - vsd['print_duration'])
self.update_text("time", str(KlippyGtk.formatTimeString(vsd['print_duration'])))
self.update_text("time_left", str(KlippyGtk.formatTimeString(
progress
)))
self.update_progress(self._printer.get_stat('virtual_sdcard','progress'))
if "pause_resume" in data:
if self.is_paused == True and data['pause_resume']['is_paused'] == False:
self.is_paused = False
self.panel.attach(self.labels['pause'], 0, 2, 1, 1)
self.panel.remove(self.labels['resume'])
self.panel.show_all()
if self.is_paused == False and data['pause_resume']['is_paused'] == True:
self.is_paused = True
self.panel.attach(self.labels['resume'], 0, 2, 1, 1)
self.panel.remove(self.labels['pause'])
self.panel.show_all()
def update_image_text(self, label, text):
if label in self.labels and 'l' in self.labels[label]:
self.labels[label]['l'].set_text(text)
def update_text(self, label, text):
if label in self.labels:
self.labels[label].set_text(text)
def update_progress (self, progress):
self.labels['progress'].set_fraction(progress)
self.labels['progress_text'].set_text("%s%%" % (str(int(progress*100))))
def update_temp(self, dev, temp, target):
if dev in self.labels:
self.labels[dev].set_label(KlippyGtk.formatTemperatureString(temp, target))

View File

@ -1,63 +1,63 @@
import gi
import logging
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
from KlippyGtk import KlippyGtk
from panels.menu import MenuPanel
logger = logging.getLogger("KlipperScreen.MainMenu")
class MainPanel(MenuPanel):
def initialize(self, panel_name, items, extrudercount):
print("### Making MainMenu")
grid = KlippyGtk.HomogeneousGrid()
# Create Extruders and bed icons
eq_grid = KlippyGtk.HomogeneousGrid()
i = 0
for x in self._printer.get_tools():
if i > 3:
break
self.labels[x] = KlippyGtk.ButtonImage("extruder-"+str(i+1), KlippyGtk.formatTemperatureString(0, 0))
eq_grid.attach(self.labels[x], i%2, i/2, 1, 1)
i += 1
self.labels['heater_bed'] = KlippyGtk.ButtonImage("bed", KlippyGtk.formatTemperatureString(0, 0))
width = 2 if i > 1 else 1
eq_grid.attach(self.labels['heater_bed'], 0, i/2+1, width, 1)
grid.attach(eq_grid, 0, 0, 1, 1)
grid.attach(self.arrangeMenuItems(items, 2, True), 1, 0, 1, 1)
self.grid = grid
self.target_temps = {
"heater_bed": 0,
"extruder": 0
}
self._screen.add_subscription(panel_name)
def get(self):
return self.grid
def update_temp(self, dev, temp, target):
if dev in self.labels:
self.labels[dev].set_label(KlippyGtk.formatTemperatureString(temp, target))
def process_update(self, data):
self.update_temp("heater_bed",
self._printer.get_dev_stat("heater_bed","temperature"),
self._printer.get_dev_stat("heater_bed","target")
)
for x in self._printer.get_tools():
self.update_temp(x,
self._printer.get_dev_stat(x,"temperature"),
self._printer.get_dev_stat(x,"target")
)
return
import gi
import logging
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
from KlippyGtk import KlippyGtk
from panels.menu import MenuPanel
logger = logging.getLogger("KlipperScreen.MainMenu")
class MainPanel(MenuPanel):
def initialize(self, panel_name, items, extrudercount):
print("### Making MainMenu")
grid = KlippyGtk.HomogeneousGrid()
# Create Extruders and bed icons
eq_grid = KlippyGtk.HomogeneousGrid()
i = 0
for x in self._printer.get_tools():
if i > 3:
break
self.labels[x] = KlippyGtk.ButtonImage("extruder-"+str(i+1), KlippyGtk.formatTemperatureString(0, 0))
eq_grid.attach(self.labels[x], i%2, i/2, 1, 1)
i += 1
self.labels['heater_bed'] = KlippyGtk.ButtonImage("bed", KlippyGtk.formatTemperatureString(0, 0))
width = 2 if i > 1 else 1
eq_grid.attach(self.labels['heater_bed'], 0, i/2+1, width, 1)
grid.attach(eq_grid, 0, 0, 1, 1)
grid.attach(self.arrangeMenuItems(items, 2, True), 1, 0, 1, 1)
self.grid = grid
self.target_temps = {
"heater_bed": 0,
"extruder": 0
}
self._screen.add_subscription(panel_name)
def get(self):
return self.grid
def update_temp(self, dev, temp, target):
if dev in self.labels:
self.labels[dev].set_label(KlippyGtk.formatTemperatureString(temp, target))
def process_update(self, data):
self.update_temp("heater_bed",
self._printer.get_dev_stat("heater_bed","temperature"),
self._printer.get_dev_stat("heater_bed","target")
)
for x in self._printer.get_tools():
self.update_temp(x,
self._printer.get_dev_stat(x,"temperature"),
self._printer.get_dev_stat(x,"target")
)
return

View File

@ -1,61 +1,61 @@
import gi
import logging
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
from KlippyGtk import KlippyGtk
from panels.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.MenuPanel")
class MenuPanel(ScreenPanel):
def initialize(self, panel_name, items):
_ = self.lang.gettext
grid = self.arrangeMenuItems(items, 4)
b = KlippyGtk.ButtonImage('back', _('Back'))
b.connect("clicked", self._screen._menu_go_back)
grid.attach(b, 3, 1, 1, 1)
self.panel = grid
def arrangeMenuItems (self, items, columns, expandLast=False):
grid = Gtk.Grid()
grid.set_row_homogeneous(True)
grid.set_column_homogeneous(True)
l = len(items)
i = 0
for i in range(l):
col = i % columns
row = int(i/columns)
width = 1
if expandLast == True and i+1 == l and l%2 == 1:
width = 2
key = list(items[i])[0]
logger.debug("Key: %s" % key)
item = items[i][key]
b = KlippyGtk.ButtonImage(
item['icon'], item['name'], "color"+str((i%4)+1)
)
logger.debug("Item: %s" % item)
if item['panel'] != False:
b.connect("clicked", self.menu_item_clicked, item['panel'], item)
elif item['method'] != False:
params = item['params'] if item['params'] != False else {}
if item['confirm'] != False:
b.connect("clicked", self._screen._confirm_send_action, item['confirm'], item['method'], params)
else:
b.connect("clicked", self._screen._send_action, item['method'], params)
else:
b.connect("clicked", self._screen._go_to_submenu, key)
grid.attach(b, col, row, width, 1)
i += 1
return grid
import gi
import logging
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
from KlippyGtk import KlippyGtk
from panels.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.MenuPanel")
class MenuPanel(ScreenPanel):
def initialize(self, panel_name, items):
_ = self.lang.gettext
grid = self.arrangeMenuItems(items, 4)
b = KlippyGtk.ButtonImage('back', _('Back'))
b.connect("clicked", self._screen._menu_go_back)
grid.attach(b, 3, 1, 1, 1)
self.panel = grid
def arrangeMenuItems (self, items, columns, expandLast=False):
grid = Gtk.Grid()
grid.set_row_homogeneous(True)
grid.set_column_homogeneous(True)
l = len(items)
i = 0
for i in range(l):
col = i % columns
row = int(i/columns)
width = 1
if expandLast == True and i+1 == l and l%2 == 1:
width = 2
key = list(items[i])[0]
logger.debug("Key: %s" % key)
item = items[i][key]
b = KlippyGtk.ButtonImage(
item['icon'], item['name'], "color"+str((i%4)+1)
)
logger.debug("Item: %s" % item)
if item['panel'] != False:
b.connect("clicked", self.menu_item_clicked, item['panel'], item)
elif item['method'] != False:
params = item['params'] if item['params'] != False else {}
if item['confirm'] != False:
b.connect("clicked", self._screen._confirm_send_action, item['confirm'], item['method'], params)
else:
b.connect("clicked", self._screen._send_action, item['method'], params)
else:
b.connect("clicked", self._screen._go_to_submenu, key)
grid.attach(b, col, row, width, 1)
i += 1
return grid

View File

@ -1,132 +1,132 @@
import gi
import logging
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
from KlippyGtk import KlippyGtk
from KlippyGcodes import KlippyGcodes
from panels.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.MovePanel")
class MovePanel(ScreenPanel):
distance = 1
distances = ['.1','.5','1','5','10','25']
def initialize(self, panel_name):
_ = self.lang.gettext
grid = KlippyGtk.HomogeneousGrid()
self.labels['x+'] = KlippyGtk.ButtonImage("move-x+", _("X+"), "color1")
self.labels['x+'].connect("clicked", self.move, "X", "+")
self.labels['x-'] = KlippyGtk.ButtonImage("move-x-", _("X-"), "color1")
self.labels['x-'].connect("clicked", self.move, "X", "-")
self.labels['y+'] = KlippyGtk.ButtonImage("move-y+", _("Y+"), "color2")
self.labels['y+'].connect("clicked", self.move, "Y", "+")
self.labels['y-'] = KlippyGtk.ButtonImage("move-y-", _("Y-"), "color2")
self.labels['y-'].connect("clicked", self.move, "Y", "-")
self.labels['z+'] = KlippyGtk.ButtonImage("move-z-", _("Z+"), "color3")
self.labels['z+'].connect("clicked", self.move, "Z", "+")
self.labels['z-'] = KlippyGtk.ButtonImage("move-z+", _("Z-"), "color3")
self.labels['z-'].connect("clicked", self.move, "Z", "-")
self.labels['home'] = KlippyGtk.ButtonImage("home", _("Home All"))
self.labels['home'].connect("clicked", self.home)
grid.attach(self.labels['x+'], 2, 1, 1, 1)
grid.attach(self.labels['x-'], 0, 1, 1, 1)
grid.attach(self.labels['y+'], 1, 0, 1, 1)
grid.attach(self.labels['y-'], 1, 1, 1, 1)
grid.attach(self.labels['z+'], 3, 0, 1, 1)
grid.attach(self.labels['z-'], 3, 1, 1, 1)
grid.attach(self.labels['home'], 0, 0, 1, 1)
distgrid = Gtk.Grid()
j = 0;
for i in self.distances:
self.labels[i] = KlippyGtk.ToggleButton(i)
self.labels[i].connect("clicked", self.change_distance, i)
ctx = self.labels[i].get_style_context()
if j == 0:
ctx.add_class("distbutton_top")
elif j == len(self.distances)-1:
ctx.add_class("distbutton_bottom")
else:
ctx.add_class("distbutton")
if i == "1":
ctx.add_class("distbutton_active")
distgrid.attach(self.labels[i], j, 0, 1, 1)
j += 1
self.labels["1"].set_active(True)
#space_grid = KlippyGtk.HomogeneousGrid()
#space_grid.attach(Gtk.Label("Distance (mm):"),0,0,1,1)
#space_grid.attach(distgrid,0,1,1,1)
#space_grid.attach(Gtk.Label(" "),0,2,1,1)
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
bottomgrid = KlippyGtk.HomogeneousGrid()
self.labels['pos_x'] = Gtk.Label("X: 0")
self.labels['pos_y'] = Gtk.Label("Y: 0")
self.labels['pos_z'] = Gtk.Label("Z: 0")
self.labels['pos_x'].get_style_context().add_class("text")
self.labels['pos_y'].get_style_context().add_class("text")
self.labels['pos_z'].get_style_context().add_class("text")
bottomgrid.attach(self.labels['pos_x'], 0, 0, 1, 1)
bottomgrid.attach(self.labels['pos_y'], 1, 0, 1, 1)
bottomgrid.attach(self.labels['pos_z'], 2, 0, 1, 1)
box.pack_start(bottomgrid, True, True, 0)
self.labels['move_dist'] = Gtk.Label(_("Move Distance (mm)"))
self.labels['move_dist'].get_style_context().add_class("text")
box.pack_start(self.labels['move_dist'], True, True, 0)
box.pack_start(distgrid, True, True, 0)
grid.attach(box, 0, 2, 3, 1)
b = KlippyGtk.ButtonImage('back', _('Back'))
b.connect("clicked", self._screen._menu_go_back)
grid.attach(b, 3, 2, 1, 1)
self.panel = grid
self._screen.add_subscription(panel_name)
def process_update(self, data):
if "toolhead" in data and "position" in data["toolhead"]:
self.labels['pos_x'].set_text("X: %.2f" % (data["toolhead"]["position"][0]))
self.labels['pos_y'].set_text("Y: %.2f" % (data["toolhead"]["position"][1]))
self.labels['pos_z'].set_text("Z: %.2f" % (data["toolhead"]["position"][2]))
def change_distance(self, widget, distance):
if self.distance == distance:
return
logging.info("### Distance " + str(distance))
ctx = self.labels[str(self.distance)].get_style_context()
ctx.remove_class("distbutton_active")
self.distance = distance
ctx = self.labels[self.distance].get_style_context()
ctx.add_class("distbutton_active")
for i in self.distances:
if i == self.distance:
continue
self.labels[str(i)].set_active(False)
def move(self, widget, axis, dir):
dist = str(self.distance) if dir == "+" else "-" + str(self.distance)
logging.info("# Moving " + axis + " " + dist + "mm")
print("%s\n%s %s%s" % (KlippyGcodes.MOVE_RELATIVE, KlippyGcodes.MOVE, axis, dist))
self._screen._ws.klippy.gcode_script(
"%s\n%s %s%s" % (KlippyGcodes.MOVE_RELATIVE, KlippyGcodes.MOVE, axis, dist)
)
import gi
import logging
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
from KlippyGtk import KlippyGtk
from KlippyGcodes import KlippyGcodes
from panels.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.MovePanel")
class MovePanel(ScreenPanel):
distance = 1
distances = ['.1','.5','1','5','10','25']
def initialize(self, panel_name):
_ = self.lang.gettext
grid = KlippyGtk.HomogeneousGrid()
self.labels['x+'] = KlippyGtk.ButtonImage("move-x+", _("X+"), "color1")
self.labels['x+'].connect("clicked", self.move, "X", "+")
self.labels['x-'] = KlippyGtk.ButtonImage("move-x-", _("X-"), "color1")
self.labels['x-'].connect("clicked", self.move, "X", "-")
self.labels['y+'] = KlippyGtk.ButtonImage("move-y+", _("Y+"), "color2")
self.labels['y+'].connect("clicked", self.move, "Y", "+")
self.labels['y-'] = KlippyGtk.ButtonImage("move-y-", _("Y-"), "color2")
self.labels['y-'].connect("clicked", self.move, "Y", "-")
self.labels['z+'] = KlippyGtk.ButtonImage("move-z-", _("Z+"), "color3")
self.labels['z+'].connect("clicked", self.move, "Z", "+")
self.labels['z-'] = KlippyGtk.ButtonImage("move-z+", _("Z-"), "color3")
self.labels['z-'].connect("clicked", self.move, "Z", "-")
self.labels['home'] = KlippyGtk.ButtonImage("home", _("Home All"))
self.labels['home'].connect("clicked", self.home)
grid.attach(self.labels['x+'], 2, 1, 1, 1)
grid.attach(self.labels['x-'], 0, 1, 1, 1)
grid.attach(self.labels['y+'], 1, 0, 1, 1)
grid.attach(self.labels['y-'], 1, 1, 1, 1)
grid.attach(self.labels['z+'], 3, 0, 1, 1)
grid.attach(self.labels['z-'], 3, 1, 1, 1)
grid.attach(self.labels['home'], 0, 0, 1, 1)
distgrid = Gtk.Grid()
j = 0;
for i in self.distances:
self.labels[i] = KlippyGtk.ToggleButton(i)
self.labels[i].connect("clicked", self.change_distance, i)
ctx = self.labels[i].get_style_context()
if j == 0:
ctx.add_class("distbutton_top")
elif j == len(self.distances)-1:
ctx.add_class("distbutton_bottom")
else:
ctx.add_class("distbutton")
if i == "1":
ctx.add_class("distbutton_active")
distgrid.attach(self.labels[i], j, 0, 1, 1)
j += 1
self.labels["1"].set_active(True)
#space_grid = KlippyGtk.HomogeneousGrid()
#space_grid.attach(Gtk.Label("Distance (mm):"),0,0,1,1)
#space_grid.attach(distgrid,0,1,1,1)
#space_grid.attach(Gtk.Label(" "),0,2,1,1)
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
bottomgrid = KlippyGtk.HomogeneousGrid()
self.labels['pos_x'] = Gtk.Label("X: 0")
self.labels['pos_y'] = Gtk.Label("Y: 0")
self.labels['pos_z'] = Gtk.Label("Z: 0")
self.labels['pos_x'].get_style_context().add_class("text")
self.labels['pos_y'].get_style_context().add_class("text")
self.labels['pos_z'].get_style_context().add_class("text")
bottomgrid.attach(self.labels['pos_x'], 0, 0, 1, 1)
bottomgrid.attach(self.labels['pos_y'], 1, 0, 1, 1)
bottomgrid.attach(self.labels['pos_z'], 2, 0, 1, 1)
box.pack_start(bottomgrid, True, True, 0)
self.labels['move_dist'] = Gtk.Label(_("Move Distance (mm)"))
self.labels['move_dist'].get_style_context().add_class("text")
box.pack_start(self.labels['move_dist'], True, True, 0)
box.pack_start(distgrid, True, True, 0)
grid.attach(box, 0, 2, 3, 1)
b = KlippyGtk.ButtonImage('back', _('Back'))
b.connect("clicked", self._screen._menu_go_back)
grid.attach(b, 3, 2, 1, 1)
self.panel = grid
self._screen.add_subscription(panel_name)
def process_update(self, data):
if "toolhead" in data and "position" in data["toolhead"]:
self.labels['pos_x'].set_text("X: %.2f" % (data["toolhead"]["position"][0]))
self.labels['pos_y'].set_text("Y: %.2f" % (data["toolhead"]["position"][1]))
self.labels['pos_z'].set_text("Z: %.2f" % (data["toolhead"]["position"][2]))
def change_distance(self, widget, distance):
if self.distance == distance:
return
logging.info("### Distance " + str(distance))
ctx = self.labels[str(self.distance)].get_style_context()
ctx.remove_class("distbutton_active")
self.distance = distance
ctx = self.labels[self.distance].get_style_context()
ctx.add_class("distbutton_active")
for i in self.distances:
if i == self.distance:
continue
self.labels[str(i)].set_active(False)
def move(self, widget, axis, dir):
dist = str(self.distance) if dir == "+" else "-" + str(self.distance)
logging.info("# Moving " + axis + " " + dist + "mm")
print("%s\n%s %s%s" % (KlippyGcodes.MOVE_RELATIVE, KlippyGcodes.MOVE, axis, dist))
self._screen._ws.klippy.gcode_script(
"%s\n%s %s%s" % (KlippyGcodes.MOVE_RELATIVE, KlippyGcodes.MOVE, axis, dist)
)

View File

@ -1,71 +1,71 @@
import gi
import logging
import os
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
from KlippyGtk import KlippyGtk
from panels.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.SplashScreenPanel")
class SplashScreenPanel(ScreenPanel):
box = None
def initialize(self, panel_name):
_ = self.lang.gettext
image = Gtk.Image()
#TODO: update file reference
image.set_from_file(os.getcwd() + "/styles/z-bolt/images/klipper.png")
self.labels['text'] = Gtk.Label(_("Initializing printer..."))
self.labels['text'].get_style_context().add_class("text")
self.labels['actions'] = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
self.labels['actions'].set_hexpand(True)
self.labels['actions'].set_vexpand(False)
self.labels['actions'].set_halign(Gtk.Align.END)
self.labels['actions'].set_margin_end(20)
main = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=15)
main.pack_start(image, True, True, 10)
main.pack_end(self.labels['actions'], False, False, 10)
main.pack_end(self.labels['text'], True, True, 10)
box = Gtk.VBox()
box.add(main)
self.panel = box
def update_text(self, text):
self.labels['text'].set_text(text)
self.clear_action_bar()
def clear_action_bar(self):
for child in self.labels['actions'].get_children():
self.labels['actions'].remove(child)
def show_restart_buttons(self):
_ = self.lang.gettext
if "firmware_restart" not in self.labels:
self.labels['restart'] = KlippyGtk.ButtonImage("reboot",_("Restart"),"color1")
self.labels['restart'].connect("clicked", self.restart)
self.labels['firmware_restart'] = KlippyGtk.ButtonImage("restart",_("Firmware Restart"),"color2")
self.labels['firmware_restart'].connect("clicked", self.firmware_restart)
self.clear_action_bar()
self.labels['actions'].add(self.labels['restart'])
self.labels['actions'].add(self.labels['firmware_restart'])
def firmware_restart(self, widget):
self._screen._ws.klippy.restart_firmware()
def restart(self, widget):
self._screen._ws.klippy.restart()
import gi
import logging
import os
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
from KlippyGtk import KlippyGtk
from panels.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.SplashScreenPanel")
class SplashScreenPanel(ScreenPanel):
box = None
def initialize(self, panel_name):
_ = self.lang.gettext
image = Gtk.Image()
#TODO: update file reference
image.set_from_file(os.getcwd() + "/styles/z-bolt/images/klipper.png")
self.labels['text'] = Gtk.Label(_("Initializing printer..."))
self.labels['text'].get_style_context().add_class("text")
self.labels['actions'] = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
self.labels['actions'].set_hexpand(True)
self.labels['actions'].set_vexpand(False)
self.labels['actions'].set_halign(Gtk.Align.END)
self.labels['actions'].set_margin_end(20)
main = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=15)
main.pack_start(image, True, True, 10)
main.pack_end(self.labels['actions'], False, False, 10)
main.pack_end(self.labels['text'], True, True, 10)
box = Gtk.VBox()
box.add(main)
self.panel = box
def update_text(self, text):
self.labels['text'].set_text(text)
self.clear_action_bar()
def clear_action_bar(self):
for child in self.labels['actions'].get_children():
self.labels['actions'].remove(child)
def show_restart_buttons(self):
_ = self.lang.gettext
if "firmware_restart" not in self.labels:
self.labels['restart'] = KlippyGtk.ButtonImage("reboot",_("Restart"),"color1")
self.labels['restart'].connect("clicked", self.restart)
self.labels['firmware_restart'] = KlippyGtk.ButtonImage("restart",_("Firmware Restart"),"color2")
self.labels['firmware_restart'].connect("clicked", self.firmware_restart)
self.clear_action_bar()
self.labels['actions'].add(self.labels['restart'])
self.labels['actions'].add(self.labels['firmware_restart'])
def firmware_restart(self, widget):
self._screen._ws.klippy.restart_firmware()
def restart(self, widget):
self._screen._ws.klippy.restart()

View File

@ -1,240 +1,240 @@
import gi
import logging
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
from KlippyGtk import KlippyGtk
from KlippyGcodes import KlippyGcodes
from panels.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.TemperaturePanel")
class TemperaturePanel(ScreenPanel):
active_heater = "extruder"
tempdeltas = ["1","5","10","25"]
tempdelta = "10"
def initialize(self, panel_name):
_ = self.lang.gettext
grid = KlippyGtk.HomogeneousGrid()
eq_grid = KlippyGtk.HomogeneousGrid()
i = 0
for x in self._printer.get_tools():
if i > 3:
break
elif i == 0:
primary_tool = x
self.labels[x] = KlippyGtk.ToggleButtonImage("extruder-"+str(i+1), KlippyGtk.formatTemperatureString(0, 0))
self.labels[x].connect('clicked', self.select_heater, x)
if i == 0:
self.labels[x].set_active(True)
eq_grid.attach(self.labels[x], i%2, i/2, 1, 1)
i += 1
print ("Primary tool: " + primary_tool)
self.labels[primary_tool].get_style_context().add_class('button_active')
self.labels["heater_bed"] = KlippyGtk.ToggleButtonImage("bed", KlippyGtk.formatTemperatureString(0, 0))
self.labels["heater_bed"].connect('clicked', self.select_heater, "heater_bed")
width = 2 if i > 1 else 1
eq_grid.attach(self.labels["heater_bed"], 0, i/2+1, width, 1)
self.labels["control_grid"] = KlippyGtk.HomogeneousGrid()
self.labels["increase"] = KlippyGtk.ButtonImage("increase", _("Increase"), "color1")
self.labels["increase"].connect("clicked",self.change_target_temp, "+")
self.labels["decrease"] = KlippyGtk.ButtonImage("decrease", _("Decrease"), "color3")
self.labels["decrease"].connect("clicked",self.change_target_temp, "-")
self.labels["npad"] = KlippyGtk.ButtonImage("settings", _("Number Pad"), "color2")
self.labels["npad"].connect("clicked", self.show_numpad)
tempgrid = Gtk.Grid()
j = 0;
for i in self.tempdeltas:
self.labels['deg'+ i] = KlippyGtk.ToggleButton(i)
self.labels['deg'+ i].connect("clicked", self.change_temp_delta, i)
ctx = self.labels['deg'+ i].get_style_context()
if j == 0:
ctx.add_class("tempbutton_top")
elif j == len(self.tempdeltas)-1:
ctx.add_class("tempbutton_bottom")
else:
ctx.add_class("tempbutton")
if i == "10":
ctx.add_class("distbutton_active")
tempgrid.attach(self.labels['deg'+ i], 0, j, 1, 1)
j += 1
self.labels["deg" + self.tempdelta].set_active(True)
self.labels["control_grid"].attach(tempgrid, 2, 0, 1, 2)
self.labels["control_grid"].attach(self.labels["increase"], 3, 0, 1, 1)
self.labels["control_grid"].attach(self.labels["decrease"], 3, 1, 1, 1)
self.labels["control_grid"].attach(self.labels["npad"], 2, 2, 1, 1)
b = KlippyGtk.ButtonImage('back', _('Back'))
b.connect("clicked", self._screen._menu_go_back)
self.labels["control_grid"].attach(b, 3, 2, 1, 1)
grid.attach(eq_grid, 0, 0, 1, 1)
grid.attach(self.labels["control_grid"], 1, 0, 1, 1)
self.panel = grid
self._screen.add_subscription(panel_name)
self.update_temp("heater_bed",35,40)
def change_temp_delta(self, widget, tempdelta):
if self.tempdelta == tempdelta:
return
logging.info("### tempdelta " + str(tempdelta))
ctx = self.labels["deg" + str(self.tempdelta)].get_style_context()
ctx.remove_class("distbutton_active")
self.tempdelta = tempdelta
ctx = self.labels["deg" + self.tempdelta].get_style_context()
ctx.add_class("distbutton_active")
for i in self.tempdeltas:
if i == self.tempdeltas:
continue
self.labels["deg" + str(i)].set_active(False)
def show_numpad(self, widget):
_ = self.lang.gettext
numpad = KlippyGtk.HomogeneousGrid()
keys = [
['1','numpad_tleft'],
['2','numpad_top'],
['3','numpad_tright'],
['4','numpad_left'],
['5','numpad_button'],
['6','numpad_right'],
['7','numpad_left'],
['8','numpad_button'],
['9','numpad_right'],
['B','numpad_bleft'],
['0','numpad_bottom'],
['E','numpad_bright']
]
for i in range(len(keys)):
id = 'button_' + str(keys[i][0])
if keys[i][0] == "B":
self.labels[id] = KlippyGtk.ButtonImage("backspace")
elif keys[i][0] == "E":
self.labels[id] = KlippyGtk.ButtonImage("complete", None, None, 40, 40)
else:
self.labels[id] = Gtk.Button(keys[i][0])
self.labels[id].connect('clicked', self.update_entry, keys[i][0])
ctx=self.labels[id].get_style_context()
ctx.add_class(keys[i][1])
numpad.attach(self.labels[id], i%3, i/3, 1, 1)
self.labels["keypad"] = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=3)
self.labels['entry'] = Gtk.Entry()
self.labels['entry'].props.xalign = 0.5
ctx = self.labels['entry'].get_style_context()
ctx.add_class('temperature_entry')
b = KlippyGtk.ButtonImage('back', _('Close'))
b.connect("clicked", self.hide_numpad)
#numpad.attach(b, 0, 5, 3, 1)
#numpad.attach(self.labels['entry'], 0, 0, 3, 1)
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
box.add(self.labels['entry'])
box.add(numpad)
box.add(b)
self.labels["keypad"] = numpad
self.panel.remove_column(1)
#self.panel.attach(self.labels["keypad"], 1, 0, 1, 1)
self.panel.attach(box, 1, 0, 1, 1)
self.panel.show_all()
def hide_numpad(self, widget):
self.panel.remove_column(1)
self.panel.attach(self.labels["control_grid"], 1, 0, 1, 1)
self.panel.show_all()
def select_heater (self, widget, heater):
if self.active_heater == heater:
return
self.labels[self.active_heater].get_style_context().remove_class('button_active')
self.active_heater = heater
self.labels[heater].get_style_context().add_class("button_active")
if "entry" in self.labels:
self.labels['entry'].set_text("")
logging.info("### Active heater " + self.active_heater)
def process_update(self, data):
self.update_temp("heater_bed",
self._printer.get_dev_stat("heater_bed","temperature"),
self._printer.get_dev_stat("heater_bed","target")
)
for x in self._printer.get_tools():
self.update_temp(x,
self._printer.get_dev_stat(x,"temperature"),
self._printer.get_dev_stat(x,"target")
)
return
def change_target_temp(self, widget, dir):
target = self._printer.get_dev_stat(self.active_heater, "target")
if dir == "+":
target += int(self.tempdelta)
if target > KlippyGcodes.MAX_EXT_TEMP:
target = KlippyGcodes.MAX_EXT_TEMP
else:
target -= int(self.tempdelta)
if target < 0:
target = 0
self._printer.set_dev_stat(self.active_heater, "target", target)
if self.active_heater == "heater_bed":
self._screen._ws.klippy.gcode_script( KlippyGcodes.set_bed_temp(
target
))
else:
self._screen._ws.klippy.gcode_script( KlippyGcodes.set_ext_temp(
target,
self._printer.get_tool_number(self.active_heater)
))
def update_entry(self, widget, digit):
text = self.labels['entry'].get_text()
if digit == 'B':
if len(text) < 1:
return
self.labels['entry'].set_text(text[0:-1])
elif digit == 'E':
if self.active_heater == "heater_bed":
temp = int(text)
temp = 0 if temp < 0 or temp > KlippyGcodes.MAX_BED_TEMP else temp
self._screen._ws.klippy.gcode_script(KlippyGcodes.set_bed_temp(temp))
else:
temp = int(text)
temp = 0 if temp < 0 or temp > KlippyGcodes.MAX_EXT_TEMP else temp
self._screen._ws.klippy.gcode_script( KlippyGcodes.set_ext_temp(
temp,
self._printer.get_tool_number(self.active_heater)
))
self._printer.set_dev_stat(self.active_heater, "target", temp)
self.labels['entry'].set_text("")
else:
if len(text) >= 3:
return
self.labels['entry'].set_text(text + digit)
import gi
import logging
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib
from KlippyGtk import KlippyGtk
from KlippyGcodes import KlippyGcodes
from panels.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.TemperaturePanel")
class TemperaturePanel(ScreenPanel):
active_heater = "extruder"
tempdeltas = ["1","5","10","25"]
tempdelta = "10"
def initialize(self, panel_name):
_ = self.lang.gettext
grid = KlippyGtk.HomogeneousGrid()
eq_grid = KlippyGtk.HomogeneousGrid()
i = 0
for x in self._printer.get_tools():
if i > 3:
break
elif i == 0:
primary_tool = x
self.labels[x] = KlippyGtk.ToggleButtonImage("extruder-"+str(i+1), KlippyGtk.formatTemperatureString(0, 0))
self.labels[x].connect('clicked', self.select_heater, x)
if i == 0:
self.labels[x].set_active(True)
eq_grid.attach(self.labels[x], i%2, i/2, 1, 1)
i += 1
print ("Primary tool: " + primary_tool)
self.labels[primary_tool].get_style_context().add_class('button_active')
self.labels["heater_bed"] = KlippyGtk.ToggleButtonImage("bed", KlippyGtk.formatTemperatureString(0, 0))
self.labels["heater_bed"].connect('clicked', self.select_heater, "heater_bed")
width = 2 if i > 1 else 1
eq_grid.attach(self.labels["heater_bed"], 0, i/2+1, width, 1)
self.labels["control_grid"] = KlippyGtk.HomogeneousGrid()
self.labels["increase"] = KlippyGtk.ButtonImage("increase", _("Increase"), "color1")
self.labels["increase"].connect("clicked",self.change_target_temp, "+")
self.labels["decrease"] = KlippyGtk.ButtonImage("decrease", _("Decrease"), "color3")
self.labels["decrease"].connect("clicked",self.change_target_temp, "-")
self.labels["npad"] = KlippyGtk.ButtonImage("settings", _("Number Pad"), "color2")
self.labels["npad"].connect("clicked", self.show_numpad)
tempgrid = Gtk.Grid()
j = 0;
for i in self.tempdeltas:
self.labels['deg'+ i] = KlippyGtk.ToggleButton(i)
self.labels['deg'+ i].connect("clicked", self.change_temp_delta, i)
ctx = self.labels['deg'+ i].get_style_context()
if j == 0:
ctx.add_class("tempbutton_top")
elif j == len(self.tempdeltas)-1:
ctx.add_class("tempbutton_bottom")
else:
ctx.add_class("tempbutton")
if i == "10":
ctx.add_class("distbutton_active")
tempgrid.attach(self.labels['deg'+ i], 0, j, 1, 1)
j += 1
self.labels["deg" + self.tempdelta].set_active(True)
self.labels["control_grid"].attach(tempgrid, 2, 0, 1, 2)
self.labels["control_grid"].attach(self.labels["increase"], 3, 0, 1, 1)
self.labels["control_grid"].attach(self.labels["decrease"], 3, 1, 1, 1)
self.labels["control_grid"].attach(self.labels["npad"], 2, 2, 1, 1)
b = KlippyGtk.ButtonImage('back', _('Back'))
b.connect("clicked", self._screen._menu_go_back)
self.labels["control_grid"].attach(b, 3, 2, 1, 1)
grid.attach(eq_grid, 0, 0, 1, 1)
grid.attach(self.labels["control_grid"], 1, 0, 1, 1)
self.panel = grid
self._screen.add_subscription(panel_name)
self.update_temp("heater_bed",35,40)
def change_temp_delta(self, widget, tempdelta):
if self.tempdelta == tempdelta:
return
logging.info("### tempdelta " + str(tempdelta))
ctx = self.labels["deg" + str(self.tempdelta)].get_style_context()
ctx.remove_class("distbutton_active")
self.tempdelta = tempdelta
ctx = self.labels["deg" + self.tempdelta].get_style_context()
ctx.add_class("distbutton_active")
for i in self.tempdeltas:
if i == self.tempdeltas:
continue
self.labels["deg" + str(i)].set_active(False)
def show_numpad(self, widget):
_ = self.lang.gettext
numpad = KlippyGtk.HomogeneousGrid()
keys = [
['1','numpad_tleft'],
['2','numpad_top'],
['3','numpad_tright'],
['4','numpad_left'],
['5','numpad_button'],
['6','numpad_right'],
['7','numpad_left'],
['8','numpad_button'],
['9','numpad_right'],
['B','numpad_bleft'],
['0','numpad_bottom'],
['E','numpad_bright']
]
for i in range(len(keys)):
id = 'button_' + str(keys[i][0])
if keys[i][0] == "B":
self.labels[id] = KlippyGtk.ButtonImage("backspace")
elif keys[i][0] == "E":
self.labels[id] = KlippyGtk.ButtonImage("complete", None, None, 40, 40)
else:
self.labels[id] = Gtk.Button(keys[i][0])
self.labels[id].connect('clicked', self.update_entry, keys[i][0])
ctx=self.labels[id].get_style_context()
ctx.add_class(keys[i][1])
numpad.attach(self.labels[id], i%3, i/3, 1, 1)
self.labels["keypad"] = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=3)
self.labels['entry'] = Gtk.Entry()
self.labels['entry'].props.xalign = 0.5
ctx = self.labels['entry'].get_style_context()
ctx.add_class('temperature_entry')
b = KlippyGtk.ButtonImage('back', _('Close'))
b.connect("clicked", self.hide_numpad)
#numpad.attach(b, 0, 5, 3, 1)
#numpad.attach(self.labels['entry'], 0, 0, 3, 1)
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
box.add(self.labels['entry'])
box.add(numpad)
box.add(b)
self.labels["keypad"] = numpad
self.panel.remove_column(1)
#self.panel.attach(self.labels["keypad"], 1, 0, 1, 1)
self.panel.attach(box, 1, 0, 1, 1)
self.panel.show_all()
def hide_numpad(self, widget):
self.panel.remove_column(1)
self.panel.attach(self.labels["control_grid"], 1, 0, 1, 1)
self.panel.show_all()
def select_heater (self, widget, heater):
if self.active_heater == heater:
return
self.labels[self.active_heater].get_style_context().remove_class('button_active')
self.active_heater = heater
self.labels[heater].get_style_context().add_class("button_active")
if "entry" in self.labels:
self.labels['entry'].set_text("")
logging.info("### Active heater " + self.active_heater)
def process_update(self, data):
self.update_temp("heater_bed",
self._printer.get_dev_stat("heater_bed","temperature"),
self._printer.get_dev_stat("heater_bed","target")
)
for x in self._printer.get_tools():
self.update_temp(x,
self._printer.get_dev_stat(x,"temperature"),
self._printer.get_dev_stat(x,"target")
)
return
def change_target_temp(self, widget, dir):
target = self._printer.get_dev_stat(self.active_heater, "target")
if dir == "+":
target += int(self.tempdelta)
if target > KlippyGcodes.MAX_EXT_TEMP:
target = KlippyGcodes.MAX_EXT_TEMP
else:
target -= int(self.tempdelta)
if target < 0:
target = 0
self._printer.set_dev_stat(self.active_heater, "target", target)
if self.active_heater == "heater_bed":
self._screen._ws.klippy.gcode_script( KlippyGcodes.set_bed_temp(
target
))
else:
self._screen._ws.klippy.gcode_script( KlippyGcodes.set_ext_temp(
target,
self._printer.get_tool_number(self.active_heater)
))
def update_entry(self, widget, digit):
text = self.labels['entry'].get_text()
if digit == 'B':
if len(text) < 1:
return
self.labels['entry'].set_text(text[0:-1])
elif digit == 'E':
if self.active_heater == "heater_bed":
temp = int(text)
temp = 0 if temp < 0 or temp > KlippyGcodes.MAX_BED_TEMP else temp
self._screen._ws.klippy.gcode_script(KlippyGcodes.set_bed_temp(temp))
else:
temp = int(text)
temp = 0 if temp < 0 or temp > KlippyGcodes.MAX_EXT_TEMP else temp
self._screen._ws.klippy.gcode_script( KlippyGcodes.set_ext_temp(
temp,
self._printer.get_tool_number(self.active_heater)
))
self._printer.set_dev_stat(self.active_heater, "target", temp)
self.labels['entry'].set_text("")
else:
if len(text) >= 3:
return
self.labels['entry'].set_text(text + digit)

View File

@ -1,47 +1,47 @@
#
import re
import base64
dir = "/home/pi/sdcard/"
file = "square_tower_0.2mm_PLA_ENDER3_46m.gcode"
#f = f.open(file, 'r')
thumbnails = []
cur_thumbnail = {}
state = 0
with open(dir + file, 'r') as f:
for line in f:
if state == 0:
match = re.match(r'^; thumbnail begin ([0-9]+)x([0-9]+) ([0-9]+)', line)
if match:
cur_thumbnail = {
"width": match.group(1),
"height": match.group(2),
"size": match.group(3),
"data": ""
}
state = 1
continue
elif state == 1:
if re.match (r'^; thumbnail end', line):
state = 0
thumbnails.append(cur_thumbnail)
continue
match = re.match(r'^; (\S+)$', line)
if match:
cur_thumbnail['data'] += match.group(1)
if len(thumbnails) > 0:
biggest = 0
for i in range(len(thumbnails)):
if i == 0:
continue
if thumbnails[i]['width'] > thumbnails[biggest]['width']:
biggest = i
image = base64.decodestring(thumbnails[biggest]['data'])
name = file.split('.gcod')[0] + ".png"
f = open(dir + name, 'wb')
f.write(image)
f.close()
#
import re
import base64
dir = "/home/pi/sdcard/"
file = "square_tower_0.2mm_PLA_ENDER3_46m.gcode"
#f = f.open(file, 'r')
thumbnails = []
cur_thumbnail = {}
state = 0
with open(dir + file, 'r') as f:
for line in f:
if state == 0:
match = re.match(r'^; thumbnail begin ([0-9]+)x([0-9]+) ([0-9]+)', line)
if match:
cur_thumbnail = {
"width": match.group(1),
"height": match.group(2),
"size": match.group(3),
"data": ""
}
state = 1
continue
elif state == 1:
if re.match (r'^; thumbnail end', line):
state = 0
thumbnails.append(cur_thumbnail)
continue
match = re.match(r'^; (\S+)$', line)
if match:
cur_thumbnail['data'] += match.group(1)
if len(thumbnails) > 0:
biggest = 0
for i in range(len(thumbnails)):
if i == 0:
continue
if thumbnails[i]['width'] > thumbnails[biggest]['width']:
biggest = i
image = base64.decodestring(thumbnails[biggest]['data'])
name = file.split('.gcod')[0] + ".png"
f = open(dir + name, 'wb')
f.write(image)
f.close()