feat(interface): 完成队列式记忆模块更新

This commit is contained in:
2026-01-06 20:32:27 +08:00
parent ca7ef92b05
commit 47c14e520b
6 changed files with 32 additions and 15 deletions

View File

@@ -1,6 +1,7 @@
"""队列式记忆工作界面""" """队列式记忆工作界面"""
from enum import Enum, auto from enum import Enum, auto
from typing import Callable
from textual.app import ComposeResult from textual.app import ComposeResult
from textual.containers import Center, ScrollableContainer from textual.containers import Center, ScrollableContainer
@@ -42,15 +43,18 @@ class MemScreen(Screen):
def __init__( def __init__(
self, self,
phaser: Phaser, phaser: Phaser,
save_func: Callable,
name=None, name=None,
id=None, id=None,
classes=None, classes=None,
) -> None: ) -> None:
super().__init__(name, id, classes) super().__init__(name, id, classes)
self.phaser = phaser self.phaser = phaser
self.save_func = save_func
self.update_state() self.update_state()
self.fission: Fission self.fission: Fission
def compose(self) -> ComposeResult: def compose(self) -> ComposeResult:
yield Header(show_clock=True) yield Header(show_clock=True)
with ScrollableContainer(): with ScrollableContainer():
@@ -125,8 +129,9 @@ class MemScreen(Screen):
for i in container.children: for i in container.children:
i.remove() i.remove()
from heurams.interface.widgets.finished import Finished from heurams.interface.widgets.finished import Finished
if config_var.get().get("persist_to_file", 0):
container.mount(Finished()) self.save_func()
container.mount(Finished(is_saved=config_var.get().get("persist_to_file", 0)))
def on_button_pressed(self, event): def on_button_pressed(self, event):
event.stop() event.stop()
@@ -173,8 +178,21 @@ class MemScreen(Screen):
self.mount_puzzle() self.mount_puzzle()
self.update_display() self.update_display()
def atom_reporter(self, quality):
if not self.atom.registry["runtime"]["locked"]:
if not self.atom.registry["electron"].is_activated():
self.atom.registry["electron"].activate()
logger.debug(f"激活原子 {self.atom}")
self.atom.lock(1)
self.atom.minimize(5)
else:
self.atom.minimize(quality)
else:
pass
def forward_atom(self, quality): def forward_atom(self, quality):
logger.debug(f"Quality: {quality}") logger.debug(f"Quality: {quality}")
self.atom_reporter(quality)
if quality <= 3: if quality <= 3:
self.procession.append() self.procession.append()
self.update_state() # 刷新状态 self.update_state() # 刷新状态

View File

@@ -130,8 +130,10 @@ class PreparationScreen(Screen):
import heurams.kernel.reactor as rt import heurams.kernel.reactor as rt
pheser = rt.Phaser(atoms_to_provide) pheser = rt.Phaser(atoms_to_provide)
memscreen = MemScreen(pheser) save_func = self.repo.persist_to_repodir
memscreen = MemScreen(pheser, save_func)
self.app.push_screen(memscreen) self.app.push_screen(memscreen)
elif event.button.id == "precache_button": elif event.button.id == "precache_button":
self.action_precache() self.action_precache()

View File

@@ -7,6 +7,7 @@ class Finished(Widget):
self, self,
*children: Widget, *children: Widget,
alia="", alia="",
is_saved = 0,
name: str | None = None, name: str | None = None,
id: str | None = None, id: str | None = None,
classes: str | None = None, classes: str | None = None,
@@ -14,6 +15,7 @@ class Finished(Widget):
markup: bool = True markup: bool = True
) -> None: ) -> None:
self.alia = alia self.alia = alia
self.is_saved = is_saved
super().__init__( super().__init__(
*children, *children,
name=name, name=name,
@@ -25,6 +27,7 @@ class Finished(Widget):
def compose(self): def compose(self):
yield Label("本次记忆进程结束", id="finished_msg") yield Label("本次记忆进程结束", id="finished_msg")
yield Label(f"算法数据{'已保存' if self.is_saved else "未能保存"}")
yield Button("返回上一级", id="back-to-menu") yield Button("返回上一级", id="back-to-menu")
def on_button_pressed(self, event): def on_button_pressed(self, event):

View File

@@ -107,13 +107,3 @@ class Recognition(BasePuzzleWidget):
if event.button.id == "ok": if event.button.id == "ok":
self.screen.rating = 5 # type: ignore self.screen.rating = 5 # type: ignore
self.handler(5) self.handler(5)
def handler(self, rating):
if not self.atom.registry["runtime"]["locked"]:
if not self.atom.registry["electron"].is_activated():
self.atom.registry["electron"].activate()
logger.debug(f"激活原子 {self.atom}")
self.atom.lock(1)
self.atom.minimize(5)
else:
pass

View File

@@ -16,6 +16,7 @@ class Phaser(Machine):
def __init__(self, atoms: list[pt.Atom]) -> None: def __init__(self, atoms: list[pt.Atom]) -> None:
logger.debug("Phaser.__init__: 原子数量=%d", len(atoms)) logger.debug("Phaser.__init__: 原子数量=%d", len(atoms))
self.atoms = atoms
new_atoms = list() new_atoms = list()
old_atoms = list() old_atoms = list()
@@ -105,6 +106,9 @@ class Phaser(Machine):
def on_finished(self): def on_finished(self):
"""进入FINISHED状态时的回调""" """进入FINISHED状态时的回调"""
for i in self.atoms:
i.lock(1)
i.revise()
logger.debug("Phaser 进入 FINISHED 状态") logger.debug("Phaser 进入 FINISHED 状态")
def current_procession(self): def current_procession(self):

View File

@@ -101,7 +101,7 @@ class Repo:
source = self.source source = self.source
if source == None: if source == None:
raise FileNotFoundError("不存在仓库到文件的映射") raise FileNotFoundError("不存在仓库到文件的映射")
source.mkdir(parents=True, exist_ok=False) source.mkdir(parents=True, exist_ok=True)
for keyname in save_list: for keyname in save_list:
filename = self.file_mapping[keyname] filename = self.file_mapping[keyname]
with open(source / filename, "w") as f: with open(source / filename, "w") as f:
@@ -112,7 +112,7 @@ class Repo:
if filename.endswith("toml"): if filename.endswith("toml"):
toml.dump(dict_data, f) toml.dump(dict_data, f)
elif filename.endswith("json"): elif filename.endswith("json"):
json.dump(dict_data, f) json.dump(dict_data, f, ensure_ascii=False, indent=4)
else: else:
raise ValueError(f"不支持的文件类型: {filename}") raise ValueError(f"不支持的文件类型: {filename}")