first try on a file save/reload widget
This commit is contained in:
@ -1,4 +1,5 @@
|
|||||||
|
|
||||||
from .checkbox import Checkbox
|
from .checkbox import Checkbox
|
||||||
|
from .files import Files
|
||||||
|
|
||||||
|
|
||||||
|
81
kabuki/widgets/files.py
Normal file
81
kabuki/widgets/files.py
Normal 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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Reference in New Issue
Block a user