files: refactor and cleanups
This commit is contained in:
parent
e7cbc1d2ca
commit
8717dd8836
@ -16,21 +16,12 @@ class KlippyFiles:
|
|||||||
self.directories = []
|
self.directories = []
|
||||||
self.gcodes_path = None
|
self.gcodes_path = None
|
||||||
|
|
||||||
def initialize(self):
|
def set_gcodes_path(self):
|
||||||
if "virtual_sdcard" in self._screen.printer.get_config_section_list():
|
virtual_sdcard = self._screen.printer.get_config_section("virtual_sdcard")
|
||||||
vsd = self._screen.printer.get_config_section("virtual_sdcard")
|
if virtual_sdcard and "path" in virtual_sdcard:
|
||||||
if "path" in vsd:
|
self.gcodes_path = os.path.expanduser(virtual_sdcard['path'])
|
||||||
self.gcodes_path = os.path.expanduser(vsd['path'])
|
|
||||||
logging.info(f"Gcodes path: {self.gcodes_path}")
|
logging.info(f"Gcodes path: {self.gcodes_path}")
|
||||||
|
|
||||||
def reset(self):
|
|
||||||
self._screen = None
|
|
||||||
self.callbacks = None
|
|
||||||
self.files = None
|
|
||||||
self.filelist = None
|
|
||||||
self.directories = None
|
|
||||||
self.gcodes_path = None
|
|
||||||
|
|
||||||
def _callback(self, result, method, params):
|
def _callback(self, result, method, params):
|
||||||
if method == "server.files.list":
|
if method == "server.files.list":
|
||||||
if "result" in result and isinstance(result['result'], list):
|
if "result" in result and isinstance(result['result'], list):
|
||||||
@ -44,7 +35,7 @@ class KlippyFiles:
|
|||||||
newfiles.append(file)
|
newfiles.append(file)
|
||||||
self.add_file(item, False)
|
self.add_file(item, False)
|
||||||
|
|
||||||
self.run_callbacks(newfiles, deletedfiles)
|
self.run_callbacks(newfiles=newfiles, deletedfiles=deletedfiles)
|
||||||
|
|
||||||
if len(deletedfiles) > 0:
|
if len(deletedfiles) > 0:
|
||||||
for file in deletedfiles:
|
for file in deletedfiles:
|
||||||
@ -61,7 +52,7 @@ class KlippyFiles:
|
|||||||
if fullpath not in self.filelist:
|
if fullpath not in self.filelist:
|
||||||
newfiles.append(fullpath)
|
newfiles.append(fullpath)
|
||||||
|
|
||||||
self.run_callbacks(newfiles)
|
self.run_callbacks(newfiles=newfiles)
|
||||||
elif method == "server.files.metadata":
|
elif method == "server.files.metadata":
|
||||||
if "error" in result.keys():
|
if "error" in result.keys():
|
||||||
logging.debug(f"Error in getting metadata for {params['filename']}. Retrying in 6 seconds")
|
logging.debug(f"Error in getting metadata for {params['filename']}. Retrying in 6 seconds")
|
||||||
@ -102,8 +93,6 @@ class KlippyFiles:
|
|||||||
if filename in self.filelist:
|
if filename in self.filelist:
|
||||||
logging.info(f"File already exists: {filename}")
|
logging.info(f"File already exists: {filename}")
|
||||||
self.request_metadata(filename)
|
self.request_metadata(filename)
|
||||||
args = None, None, [filename]
|
|
||||||
GLib.idle_add(self.run_callbacks, *args)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
self.filelist.append(filename)
|
self.filelist.append(filename)
|
||||||
@ -116,10 +105,7 @@ class KlippyFiles:
|
|||||||
self.run_callbacks(newfiles=[filename])
|
self.run_callbacks(newfiles=[filename])
|
||||||
|
|
||||||
def add_file_callback(self, callback):
|
def add_file_callback(self, callback):
|
||||||
try:
|
self.callbacks.append(callback)
|
||||||
self.callbacks.append(callback)
|
|
||||||
except Exception as e:
|
|
||||||
logging.debug(f"Callback not found: {callback}:\n{e}")
|
|
||||||
|
|
||||||
def process_update(self, data):
|
def process_update(self, data):
|
||||||
if 'item' in data and data['item']['root'] != 'gcodes':
|
if 'item' in data and data['item']['root'] != 'gcodes':
|
||||||
@ -140,35 +126,30 @@ class KlippyFiles:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def remove_file_callback(self, callback):
|
def remove_file_callback(self, callback):
|
||||||
if callback in self.callbacks:
|
if callback not in self.callbacks:
|
||||||
self.callbacks.pop(self.callbacks.index(callback))
|
logging.info(f"callback not found {callback}")
|
||||||
|
return
|
||||||
def file_exists(self, filename):
|
logging.info(f"removing callback {callback}")
|
||||||
return filename in self.filelist
|
self.callbacks.remove(callback)
|
||||||
|
|
||||||
def file_metadata_exists(self, filename):
|
def file_metadata_exists(self, filename):
|
||||||
if self.file_exists(filename):
|
return filename in self.filelist and "slicer" in self.files[filename]
|
||||||
return "slicer" in self.files[filename]
|
|
||||||
return False
|
|
||||||
|
|
||||||
def get_thumbnail_location(self, filename, small=False):
|
def get_thumbnail_location(self, filename, small=False):
|
||||||
if small and len(self.files[filename]['thumbnails']) > 1 \
|
if all((
|
||||||
and self.files[filename]['thumbnails'][0]['width'] > self.files[filename]['thumbnails'][1]['width']:
|
small,
|
||||||
|
len(self.files[filename]['thumbnails']) > 1,
|
||||||
|
self.files[filename]['thumbnails'][0]['width'] > self.files[filename]['thumbnails'][1]['width']
|
||||||
|
)):
|
||||||
thumb = self.files[filename]['thumbnails'][1]
|
thumb = self.files[filename]['thumbnails'][1]
|
||||||
else:
|
else:
|
||||||
thumb = self.files[filename]['thumbnails'][0]
|
thumb = self.files[filename]['thumbnails'][0]
|
||||||
if thumb['local'] is False:
|
return ['file', thumb['path']] if thumb['local'] else ['http', thumb['path']]
|
||||||
return ['http', thumb['path']]
|
|
||||||
return ['file', thumb['path']]
|
|
||||||
|
|
||||||
def has_thumbnail(self, filename):
|
def has_thumbnail(self, filename):
|
||||||
if filename not in self.files:
|
return filename in self.files and "thumbnails" in self.files[filename]
|
||||||
return False
|
|
||||||
return "thumbnails" in self.files[filename] and len(self.files[filename]) > 0
|
|
||||||
|
|
||||||
def request_metadata(self, filename):
|
def request_metadata(self, filename):
|
||||||
if filename not in self.filelist:
|
|
||||||
return False
|
|
||||||
self._screen._ws.klippy.get_file_metadata(filename, self._callback)
|
self._screen._ws.klippy.get_file_metadata(filename, self._callback)
|
||||||
|
|
||||||
def refresh_files(self):
|
def refresh_files(self):
|
||||||
@ -177,28 +158,17 @@ class KlippyFiles:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def remove_file(self, filename, notify=True):
|
def remove_file(self, filename, notify=True):
|
||||||
if filename not in self.filelist:
|
if filename in self.filelist:
|
||||||
return
|
self.filelist.remove(filename)
|
||||||
|
if filename in self.files:
|
||||||
self.filelist.remove(filename)
|
self.files.pop(filename, None)
|
||||||
self.files.pop(filename, None)
|
if notify:
|
||||||
|
|
||||||
if notify is True:
|
|
||||||
self.run_callbacks(deletedfiles=[filename])
|
self.run_callbacks(deletedfiles=[filename])
|
||||||
|
|
||||||
def run_callbacks(self, newfiles=None, deletedfiles=None, mods=None):
|
def run_callbacks(self, newfiles=(), deletedfiles=(), mods=()):
|
||||||
if mods is None:
|
args = (newfiles, deletedfiles, mods)
|
||||||
mods = []
|
|
||||||
if deletedfiles is None:
|
|
||||||
deletedfiles = []
|
|
||||||
if newfiles is None:
|
|
||||||
newfiles = []
|
|
||||||
if len(self.callbacks) <= 0:
|
|
||||||
return False
|
|
||||||
for cb in self.callbacks:
|
for cb in self.callbacks:
|
||||||
args = newfiles, deletedfiles, mods
|
|
||||||
GLib.idle_add(cb, *args)
|
GLib.idle_add(cb, *args)
|
||||||
return False
|
|
||||||
|
|
||||||
def get_file_list(self):
|
def get_file_list(self):
|
||||||
return self.filelist
|
return self.filelist
|
||||||
|
@ -338,6 +338,7 @@ class Panel(ScreenPanel):
|
|||||||
if self.flow_timeout is not None:
|
if self.flow_timeout is not None:
|
||||||
GLib.source_remove(self.flow_timeout)
|
GLib.source_remove(self.flow_timeout)
|
||||||
self.flow_timeout = None
|
self.flow_timeout = None
|
||||||
|
self._files.remove_file_callback(self._callback_metadata)
|
||||||
|
|
||||||
def create_buttons(self):
|
def create_buttons(self):
|
||||||
|
|
||||||
@ -448,7 +449,7 @@ class Panel(ScreenPanel):
|
|||||||
self.buttons[arg].set_sensitive(False)
|
self.buttons[arg].set_sensitive(False)
|
||||||
|
|
||||||
def _callback_metadata(self, newfiles, deletedfiles, modifiedfiles):
|
def _callback_metadata(self, newfiles, deletedfiles, modifiedfiles):
|
||||||
if not bool(self.file_metadata) and self.filename in modifiedfiles:
|
if self.filename in modifiedfiles:
|
||||||
self.update_file_metadata()
|
self.update_file_metadata()
|
||||||
self._files.remove_file_callback(self._callback_metadata)
|
self._files.remove_file_callback(self._callback_metadata)
|
||||||
|
|
||||||
@ -798,7 +799,7 @@ class Panel(ScreenPanel):
|
|||||||
if "filament_total" in self.file_metadata:
|
if "filament_total" in self.file_metadata:
|
||||||
self.labels['filament_total'].set_label(f"{float(self.file_metadata['filament_total']) / 1000:.1f} m")
|
self.labels['filament_total'].set_label(f"{float(self.file_metadata['filament_total']) / 1000:.1f} m")
|
||||||
else:
|
else:
|
||||||
self.file_metadata = {}
|
|
||||||
logging.debug("Cannot find file metadata. Listening for updated metadata")
|
logging.debug("Cannot find file metadata. Listening for updated metadata")
|
||||||
self._screen.files.add_file_callback(self._callback_metadata)
|
self._screen.files.add_file_callback(self._callback_metadata)
|
||||||
|
self._files.request_metadata(self.filename)
|
||||||
self.show_file_thumbnail()
|
self.show_file_thumbnail()
|
||||||
|
@ -377,14 +377,16 @@ class Panel(ScreenPanel):
|
|||||||
# Update icon
|
# Update icon
|
||||||
GLib.idle_add(self.image_load, filename)
|
GLib.idle_add(self.image_load, filename)
|
||||||
|
|
||||||
def _callback(self, newfiles, deletedfiles, updatedfiles=None):
|
def _callback(self, newfiles, deletedfiles, modifiedfiles):
|
||||||
for file in newfiles:
|
for file in newfiles:
|
||||||
|
logging.info(f"adding {file}")
|
||||||
self.add_file(file)
|
self.add_file(file)
|
||||||
for file in deletedfiles:
|
for file in deletedfiles:
|
||||||
|
logging.info(f"deleting {file}")
|
||||||
self.delete_file(file)
|
self.delete_file(file)
|
||||||
if updatedfiles is not None:
|
for file in modifiedfiles:
|
||||||
for file in updatedfiles:
|
logging.info(f"updating {file}")
|
||||||
self.update_file(file)
|
self.update_file(file)
|
||||||
self._gtk.Button_busy(self.refresh, False)
|
self._gtk.Button_busy(self.refresh, False)
|
||||||
|
|
||||||
def _refresh_files(self, widget=None):
|
def _refresh_files(self, widget=None):
|
||||||
|
16
screen.py
16
screen.py
@ -1,6 +1,7 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
import gc
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
@ -204,14 +205,13 @@ class KlipperScreen(Gtk.Window):
|
|||||||
|
|
||||||
def connect_printer(self, name):
|
def connect_printer(self, name):
|
||||||
self.connecting_to_printer = name
|
self.connecting_to_printer = name
|
||||||
|
if self.files:
|
||||||
|
self.files.__init__(self)
|
||||||
|
gc.collect()
|
||||||
if self._ws is not None and self._ws.connected:
|
if self._ws is not None and self._ws.connected:
|
||||||
self._ws.close()
|
self._ws.close()
|
||||||
self.connected_printer = None
|
self.connected_printer = None
|
||||||
self.printer.state = "disconnected"
|
self.printer.state = "disconnected"
|
||||||
if self.files:
|
|
||||||
self.files.reset()
|
|
||||||
self.files = None
|
|
||||||
|
|
||||||
self.connecting = True
|
self.connecting = True
|
||||||
self.initialized = False
|
self.initialized = False
|
||||||
|
|
||||||
@ -242,8 +242,8 @@ class KlipperScreen(Gtk.Window):
|
|||||||
self.printers[ind][name]["moonraker_host"],
|
self.printers[ind][name]["moonraker_host"],
|
||||||
self.printers[ind][name]["moonraker_port"],
|
self.printers[ind][name]["moonraker_port"],
|
||||||
)
|
)
|
||||||
|
if self.files is None:
|
||||||
self.files = KlippyFiles(self)
|
self.files = KlippyFiles(self)
|
||||||
self._ws.initial_connect()
|
self._ws.initial_connect()
|
||||||
|
|
||||||
def ws_subscribe(self):
|
def ws_subscribe(self):
|
||||||
@ -660,8 +660,6 @@ class KlipperScreen(Gtk.Window):
|
|||||||
self.printer.state = "disconnected"
|
self.printer.state = "disconnected"
|
||||||
self.connecting = True
|
self.connecting = True
|
||||||
self.connected_printer = None
|
self.connected_printer = None
|
||||||
self.files.reset()
|
|
||||||
self.files = None
|
|
||||||
self.initialized = False
|
self.initialized = False
|
||||||
self.connect_printer(self.connecting_to_printer)
|
self.connect_printer(self.connecting_to_printer)
|
||||||
|
|
||||||
@ -977,7 +975,7 @@ class KlipperScreen(Gtk.Window):
|
|||||||
if len(self.printer.get_temp_devices()) > 0:
|
if len(self.printer.get_temp_devices()) > 0:
|
||||||
self.init_tempstore()
|
self.init_tempstore()
|
||||||
|
|
||||||
self.files.initialize()
|
self.files.set_gcodes_path()
|
||||||
self.files.refresh_files()
|
self.files.refresh_files()
|
||||||
|
|
||||||
logging.info("Printer initialized")
|
logging.info("Printer initialized")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user