first try on a file save/reload widget
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
|
||||
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