124 lines
4.4 KiB
Python
124 lines
4.4 KiB
Python
"""记忆准备界面"""
|
|
|
|
from textual.app import ComposeResult
|
|
from textual.containers import ScrollableContainer
|
|
from textual.reactive import reactive
|
|
from textual.screen import Screen
|
|
from textual.widget import Widget
|
|
from textual.widgets import Button, Footer, Header, Label, Markdown, Static
|
|
|
|
import heurams.kernel.particles as pt
|
|
import heurams.services.hasher as hasher
|
|
from heurams.context import *
|
|
from heurams.context import config_var
|
|
from heurams.services.logger import get_logger
|
|
from heurams.kernel.repolib import *
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
class PreparationScreen(Screen):
|
|
|
|
SUB_TITLE = "准备记忆集"
|
|
|
|
BINDINGS = [
|
|
("q", "go_back", "返回"),
|
|
("p", "precache", "预缓存音频"),
|
|
("d", "toggle_dark", ""),
|
|
("0,1,2,3", "app.push_screen('about')", ""),
|
|
]
|
|
|
|
scheduled_num = reactive(config_var.get()["scheduled_num"])
|
|
|
|
def __init__(self, repo: Repo, repostat: dict) -> None:
|
|
super().__init__(name=None, id=None, classes=None)
|
|
self.repo = repo
|
|
self.repostat = repostat
|
|
|
|
def compose(self) -> ComposeResult:
|
|
yield Header(show_clock=True)
|
|
with ScrollableContainer(id="vice_container"):
|
|
yield Label(f"准备就绪: [b]{self.repostat['title']}[/b]\n")
|
|
yield Label(
|
|
f"仓库路径: {config_var.get()['paths']['data']}/repo/[b]{self.repostat['dirname']}[/b]"
|
|
)
|
|
yield Label(f"\n单元数量: {len(self.repo)}\n")
|
|
yield Label(f"单次记忆数量: {self.scheduled_num}", id="schnum_label")
|
|
|
|
yield Button(
|
|
"开始记忆",
|
|
id="start_memorizing_button",
|
|
variant="primary",
|
|
classes="start-button",
|
|
)
|
|
yield Button(
|
|
"预缓存音频",
|
|
id="precache_button",
|
|
variant="success",
|
|
classes="precache-button",
|
|
)
|
|
|
|
yield Static(f"\n单元预览:\n")
|
|
yield Markdown(self._get_full_content().replace("/", ""), classes="full")
|
|
yield Footer()
|
|
|
|
# def watch_scheduled_num(self, old_scheduled_num, new_scheduled_num):
|
|
# logger.debug("响应", old_scheduled_num, "->", new_scheduled_num)
|
|
# try:
|
|
# one = self.query_one("#schnum_label")
|
|
# one.update(f"单次记忆数量: {new_scheduled_num}") # type: ignore
|
|
# except:
|
|
# pass
|
|
|
|
def _get_full_content(self):
|
|
content = ""
|
|
for i in self.repo.ident_index:
|
|
n = pt.Nucleon.create_on_nucleonic_data(nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(i))
|
|
content += f"- {n['content']} \n"
|
|
return content
|
|
|
|
def action_go_back(self):
|
|
self.app.pop_screen()
|
|
|
|
def action_precache(self):
|
|
from ..screens.precache import PrecachingScreen
|
|
|
|
lst = list()
|
|
for i in self.repo.ident_index:
|
|
lst.append(pt.Nucleon.create_on_nucleonic_data(self.repo.nucleonic_data_lict.get_itemic_unit(i)))
|
|
precache_screen = PrecachingScreen(nucleons=lst, desc=self.repo.manifest["title"])
|
|
self.app.push_screen(precache_screen)
|
|
|
|
def action_quit_app(self):
|
|
self.app.exit()
|
|
|
|
def on_button_pressed(self, event: Button.Pressed) -> None:
|
|
event.stop()
|
|
logger.debug("按下按钮")
|
|
if event.button.id == "start_memorizing_button":
|
|
atoms = list()
|
|
for i in self.repo.ident_index:
|
|
n = pt.Nucleon.create_on_nucleonic_data(nucleonic_data=self.repo.nucleonic_data_lict.get_itemic_unit(i))
|
|
e = pt.Electron.create_on_electonic_data(electronic_data=self.repo.electronic_data_lict.get_itemic_unit(i))
|
|
a = pt.Atom(n, e, self.repo.orbitic_data)
|
|
atoms.append(a)
|
|
|
|
atoms_to_provide = list()
|
|
left_new = self.scheduled_num
|
|
for i in atoms:
|
|
i: pt.Atom
|
|
if i.registry['electron'].is_activated():
|
|
if i.registry["electron"].is_due():
|
|
atoms_to_provide.append(i)
|
|
else:
|
|
left_new -= 1
|
|
if left_new >= 0:
|
|
atoms_to_provide.append(i)
|
|
from .memoqueue import MemScreen
|
|
|
|
memscreen = MemScreen(atoms_to_provide)
|
|
self.app.push_screen(memscreen)
|
|
|
|
elif event.button.id == "precache_button":
|
|
self.action_precache()
|