From 00803262f83f5f8c0597f39220fa98c361d5d6e7 Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Mon, 21 Jun 2021 12:49:10 +0200 Subject: [PATCH] first try on a file save/reload widget --- kabuki/widgets/__init__.py | 1 + kabuki/widgets/files.py | 81 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 kabuki/widgets/files.py diff --git a/kabuki/widgets/__init__.py b/kabuki/widgets/__init__.py index 123d6b4..98d06bb 100644 --- a/kabuki/widgets/__init__.py +++ b/kabuki/widgets/__init__.py @@ -1,4 +1,5 @@ from .checkbox import Checkbox +from .files import Files diff --git a/kabuki/widgets/files.py b/kabuki/widgets/files.py new file mode 100644 index 0000000..f849ace --- /dev/null +++ b/kabuki/widgets/files.py @@ -0,0 +1,81 @@ +import json +from pathlib import Path +from bokeh.models import AutocompleteInput, Button, Div + +from ..buki import Column, Row +from ..utils import adjust_margin + + +BTN_WIDTH = 100 + + +class Files(Column): + + def __init__(self, folder, title="Files", name=None, sizing_mode="stretch_width"): + self.folder = folder = Path(folder) + self.files = files = [str(i.relative_to(folder)) for i in folder.rglob("*")] + + lbl = Div(text=title) + adjust_margin(lbl, bottom=-10) + + self.ai_fname = ai_fname = AutocompleteInput(value="", completions=files, restrict=False, min_characters=1, sizing_mode=sizing_mode) + + self.btn_save = btn_save = Button(label="⮫🖫 save", width=BTN_WIDTH) + self.btn_load = btn_load = Button(label="🖫⮯ load", width=BTN_WIDTH) + + inner = Row(ai_fname, btn_save, btn_load) + super().__init__(lbl, inner, sizing_mode=sizing_mode) + + + def get_fname(self): + return self.ai_fname.value.strip() + + + def on_click_save(self, handler): + def wrapper(_event): + fn = self.get_fname() + if not fn: + print("empty filename") + return + + self.files.append(fn) + self.ai_fname.completions.append(fn) + + fn = self.folder / fn + + data = handler() + json_save(data, fn) + self.btn_save.on_click(wrapper) + + + def on_click_load(self, handler): + def wrapper(_event): + fn = self.get_fname() + if not fn: + print("empty filename") + return + + fn = self.folder / fn + + data = json_load(fn) + handler(data) + self.btn_load.on_click(wrapper) + + + + + +def json_save(what, filename, *args, indent=4, sort_keys=True, **kwargs): + print("save to", filename) + with open(filename, "w") as f: + json.dump(what, f, *args, indent=indent, sort_keys=sort_keys, **kwargs) + +def json_load(filename, *args, **kwargs): + print("load from", filename) + with open(filename, "r") as f: + return json.load(f, *args, **kwargs) + + + + +