feat(interface): 完成队列式记忆模块更新
This commit is contained in:
@@ -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() # 刷新状态
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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}")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user