first try on a file save/reload widget

This commit is contained in:
2021-06-21 12:49:10 +02:00
parent 66fe3b6c7d
commit 00803262f8
2 changed files with 82 additions and 0 deletions

View File

@ -1,4 +1,5 @@
from .checkbox import Checkbox
from .files import Files

81
kabuki/widgets/files.py Normal file
View File

@ -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)