91 lines
3.0 KiB
Python
91 lines
3.0 KiB
Python
#!/usr/bin/env python3
|
|
from textual.app import ComposeResult
|
|
from textual.widgets import (
|
|
Header,
|
|
Footer,
|
|
Label,
|
|
Input,
|
|
Select,
|
|
Button,
|
|
Markdown,
|
|
)
|
|
from textual.containers import ScrollableContainer
|
|
from textual.screen import Screen
|
|
|
|
from heurams.services.version import ver
|
|
|
|
|
|
class NucleonCreatorScreen(Screen):
|
|
BINDINGS = [("q", "go_back", "返回")]
|
|
|
|
def __init__(self) -> None:
|
|
super().__init__(name=None, id=None, classes=None)
|
|
|
|
def search_templates(self):
|
|
from pathlib import Path
|
|
from heurams.context import config_var
|
|
|
|
template_dir = Path(config_var.get()["paths"]["template_dir"])
|
|
templates = list()
|
|
for i in template_dir.iterdir():
|
|
if i.name.endswith(".toml"):
|
|
try:
|
|
import toml
|
|
|
|
with open(i, "r") as f:
|
|
dic = toml.load(f)
|
|
desc = dic["__metadata__.attribution"]["desc"]
|
|
templates.append(desc + " (" + i.name + ")")
|
|
except Exception as e:
|
|
templates.append(f"无描述模板 ({i.name})")
|
|
print(e)
|
|
print(templates)
|
|
return templates
|
|
|
|
def compose(self) -> ComposeResult:
|
|
yield Header(show_clock=True)
|
|
with ScrollableContainer(id="vice_container"):
|
|
yield Label(f"[b]空白单元集创建向导\n")
|
|
yield Markdown(
|
|
"> 提示: 你可能注意到当选中文本框时底栏和操作按键绑定将被覆盖 \n只需选中(使用鼠标或 Tab)选择框即可恢复底栏功能"
|
|
)
|
|
yield Markdown("1. 键入单元集名称")
|
|
yield Input(placeholder="单元集名称")
|
|
yield Markdown(
|
|
"> 单元集名称不应与现有单元集重复. \n> 新的单元集文件将创建在 ./nucleon/你输入的名称.toml"
|
|
)
|
|
yield Label(f"\n")
|
|
yield Markdown("2. 选择单元集模板")
|
|
LINES = self.search_templates()
|
|
"""带有宏支持的空白单元集 ({ver})
|
|
古诗词模板单元集 ({ver})
|
|
英语词汇和短语模板单元集 ({ver})
|
|
"""
|
|
yield Select.from_values(LINES, prompt="选择类型")
|
|
yield Markdown("> 新单元集的版本号将和主程序版本保持同步")
|
|
yield Label(f"\n")
|
|
yield Markdown("3. 输入常见附加元数据 (可选)")
|
|
yield Input(placeholder="作者")
|
|
yield Input(placeholder="内容描述")
|
|
yield Button(
|
|
"新建空白单元集",
|
|
id="submit_button",
|
|
variant="primary",
|
|
classes="start-button",
|
|
)
|
|
yield Footer()
|
|
|
|
def on_mount(self):
|
|
self.query_one("#submit_button").focus()
|
|
|
|
def action_go_back(self):
|
|
self.app.pop_screen()
|
|
|
|
def action_quit_app(self):
|
|
self.app.exit()
|
|
|
|
def on_button_pressed(self, event) -> None:
|
|
event.stop()
|
|
if event.button.id == "submit_button":
|
|
pass
|