From 34f80ce4aa4815437b2de1834e557dbde07bb02a Mon Sep 17 00:00:00 2001 From: alfrix Date: Sat, 23 Dec 2023 16:38:00 -0300 Subject: [PATCH] print: fix directory dates fixes #1199 --- ks_includes/KlippyWebsocket.py | 9 +++++++++ ks_includes/files.py | 13 +++++++++++++ panels/print.py | 31 ++++++++++++++++--------------- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/ks_includes/KlippyWebsocket.py b/ks_includes/KlippyWebsocket.py index 2e2e48a8..adf50f5f 100644 --- a/ks_includes/KlippyWebsocket.py +++ b/ks_includes/KlippyWebsocket.py @@ -211,6 +211,15 @@ class MoonrakerApi: *args ) + def get_dir_info(self, callback=None, directory='gcodes', *args): + logging.debug("Sending server.files.get_directory") + return self._ws.send_method( + "server.files.get_directory", + {"path": directory}, + callback, + *args + ) + def get_file_metadata(self, filename, callback=None, *args): return self._ws.send_method( "server.files.metadata", diff --git a/ks_includes/files.py b/ks_includes/files.py index 3e2190a8..4af3dc27 100644 --- a/ks_includes/files.py +++ b/ks_includes/files.py @@ -13,6 +13,7 @@ class KlippyFiles: self.callbacks = [] self.files = {} self.filelist = [] + self.directories = [] self.gcodes_path = None def initialize(self): @@ -27,6 +28,7 @@ class KlippyFiles: self.callbacks = None self.files = None self.filelist = None + self.directories = None self.gcodes_path = None def _callback(self, result, method, params): @@ -85,6 +87,13 @@ class KlippyFiles: fdir = os.path.dirname(params['filename']) thumbnail['path'] = os.path.join(fdir, thumbnail['relative_path']) self.run_callbacks(mods=[params['filename']]) + elif method == "server.files.get_directory": + if 'result' not in result or 'dirs' not in result['result']: + return + for x in result['result']['dirs']: + if x not in self.directories: + self.directories.append(x) + self.get_dir_info(x['dirname']) def add_file(self, item, notify=True): if 'filename' not in item and 'path' not in item: @@ -166,6 +175,7 @@ class KlippyFiles: def refresh_files(self): self._screen._ws.klippy.get_file_list(self._callback) + self._screen._ws.klippy.get_dir_info(self._callback) return False def remove_file(self, filename, notify=True): @@ -199,3 +209,6 @@ class KlippyFiles: if filename not in self.files: return {"path": None, "modified": 0, "size": 0} return self.files[filename] + + def get_dir_info(self, directory): + self._screen._ws.klippy.get_dir_info(self._callback, directory=directory) diff --git a/panels/print.py b/panels/print.py index 1f5c9e35..7c3c82a6 100644 --- a/panels/print.py +++ b/panels/print.py @@ -82,8 +82,13 @@ class Panel(ScreenPanel): def add_directory(self, directory, show=True): parent_dir = os.path.dirname(directory) + modified = 0 + for x in self._files.directories: + if x['dirname'] == os.path.split(directory)[-1]: + modified = x['modified'] + break if directory not in self.filelist: - self.filelist[directory] = {'directories': [], 'files': [], 'modified': 0} + self.filelist[directory] = {'directories': [], 'files': [], 'modified': modified} self.filelist[parent_dir]['directories'].append(directory) if directory not in self.labels['directories']: @@ -114,22 +119,22 @@ class Panel(ScreenPanel): curdir = os.path.join(*d[:i]) newdir = os.path.join(*d[:i + 1]) if newdir not in self.filelist[curdir]['directories']: - if d[i].startswith("."): + if newdir.startswith("."): return self.add_directory(newdir) if filename not in self.filelist[directory]['files']: for i in range(1, len(d)): curdir = os.path.join(*d[:i + 1]) - if curdir != "gcodes" and fileinfo['modified'] > self.filelist[curdir]['modified']: - self.filelist[curdir]['modified'] = fileinfo['modified'] - if self.time_24: - time = f':{self.space}{datetime.fromtimestamp(fileinfo["modified"]):%Y/%m/%d %H:%M}' - else: - time = f':{self.space}{datetime.fromtimestamp(fileinfo["modified"]):%Y/%m/%d %I:%M %p}' - info = _("Modified") + time - info += "\n" + _("Size") + f':{self.space}{self.format_size(fileinfo["size"])}' - self.labels['directories'][curdir]['info'].set_markup(info) + if self.time_24: + time = f":{self.space}" \ + f"{datetime.fromtimestamp(self.filelist[curdir]['modified']):%Y/%m/%d %H:%M}" + else: + time = f":{self.space}" \ + f"{datetime.fromtimestamp(self.filelist[curdir]['modified']):%Y/%m/%d %I:%M %p}" + info = _("Modified") + time + info += "\n" + _("Size") + f':{self.space}{self.format_size(fileinfo["size"])}' + self.labels['directories'][curdir]['info'].set_markup(info) self.filelist[directory]['files'].append(filename) if filepath not in self.files: @@ -394,21 +399,17 @@ class Panel(ScreenPanel): logging.debug(f"Cannot update file, file not in labels: {filename}") return - logging.info(f"Updating file {filename}") self.labels['files'][filename]['info'].set_markup(self.get_file_info_str(filename)) # Update icon GLib.idle_add(self.image_load, filename) def _callback(self, newfiles, deletedfiles, updatedfiles=None): - logging.debug(f"newfiles: {newfiles}") for file in newfiles: self.add_file(file) - logging.debug(f"deletedfiles: {deletedfiles}") for file in deletedfiles: self.delete_file(file) if updatedfiles is not None: - logging.debug(f"updatefiles: {updatedfiles}") for file in updatedfiles: self.update_file(file) return False