refactor: 开始翻新状态机

This commit is contained in:
2026-04-21 12:52:30 +08:00
parent e53e905e1b
commit fc70aa07f6
19 changed files with 111 additions and 135 deletions

View File

@@ -0,0 +1,4 @@
#puzzle_container > * {
height: auto;
width: auto;
}

View File

@@ -5,14 +5,14 @@ from pathlib import Path
from typing import Callable
from textual.app import ComposeResult
from textual.containers import Center, ScrollableContainer
from textual.containers import Center, ScrollableContainer, Container
from textual.reactive import reactive
from textual.screen import Screen
from textual.widgets import Button, Footer, Header, Label, Static
import heurams.kernel.particles as pt
import heurams.kernel.puzzles as pz
from heurams.context import config_var
from heurams.context import config_var, rootdir
from heurams.kernel.reactor import *
from heurams.services.favorite_service import favorite_manager
from heurams.services.logger import get_logger
@@ -28,8 +28,13 @@ class MemScreen(Screen):
("d", "toggle_dark", ""),
("v", "play_voice", "朗读"),
("*", "toggle_favorite", "收藏"),
("n", "block_prompt"),
("s", "block_prompt"),
("z", "block_prompt"),
]
CSS_PATH = rootdir / 'interface' / 'css' / 'screens' / 'memoqueue.tcss'
if config_var.get()["interface"]["global"]["quick_pass"]:
BINDINGS.append(("k", "quick_pass", "正确应答"))
BINDINGS.append(("f", "quick_fail", "错误应答"))
@@ -38,17 +43,17 @@ class MemScreen(Screen):
def __init__(
self,
phaser: Phaser,
router: Router,
repo=None,
name=None,
id=None,
classes=None,
) -> None:
super().__init__(name, id, classes)
self.phaser = phaser
self.router = router
self.repo = repo
self.update_state()
self.fission: Fission
self.expander: Expander
def compose(self) -> ComposeResult:
yield Header(show_clock=True)
@@ -59,17 +64,17 @@ class MemScreen(Screen):
def update_state(self):
"""更新状态机"""
self.procession: Procession = self.phaser.current_procession() # type: ignore
self.procession: Procession = self.router.current_procession() # type: ignore
self.atom: pt.Atom = self.procession.current_atom # type: ignore
def on_mount(self):
self.fission = self.procession.get_fission()
self.expander = self.procession.get_expander()
self.mount_puzzle()
self.update_display()
def puzzle_widget(self):
try:
puzzle = self.fission.get_current_puzzle_inf()
puzzle = self.expander.get_current_puzzle_inf()
return shim.puzzle2widget[puzzle["puzzle"]]( # type: ignore
atom=self.atom, alia=puzzle["alia"] # type: ignore
)
@@ -93,7 +98,7 @@ class MemScreen(Screen):
def mount_puzzle(self):
"""挂载当前谜题组件"""
if self.procession.phase == PhaserState.FINISHED:
if self.procession.phase == RouterState.FINISHED:
self.mount_finished_widget()
return
container = self.query_one("#puzzle_container")
@@ -139,10 +144,10 @@ class MemScreen(Screen):
if new_rating == -1: # 安全值
return
self.update_state()
if self.procession.phase == PhaserState.FINISHED:
if self.procession.phase == RouterState.FINISHED:
rating = -1
return
self.fission.report(new_rating)
self.expander.report(new_rating)
self.forward(new_rating)
self.rating = -1
@@ -150,9 +155,9 @@ class MemScreen(Screen):
self.update_state()
allow_forward = 1 if rating >= 4 else 0
if allow_forward:
self.fission.forward()
if self.fission.state == "retronly":
self.forward_atom(self.fission.get_quality())
self.expander.forward()
if self.expander.state == "retronly":
self.forward_atom(self.expander.get_quality())
self.update_state()
self.mount_puzzle()
self.update_display()
@@ -177,7 +182,7 @@ class MemScreen(Screen):
self.update_state() # 刷新状态
self.procession.forward(1)
self.update_state() # 刷新状态
self.fission = self.procession.get_fission()
self.expander = self.procession.get_expander()
def action_go_back(self):
self.app.pop_screen()
@@ -224,3 +229,6 @@ class MemScreen(Screen):
self.app.notify(f"已收藏:{ident}", severity="information")
# 更新显示(如果需要)
self.update_display()
def action_block_prompt(self):
self.app.notify("功能在记忆界面中不可用, 完成或返回后再试", severity="error")

View File

@@ -181,6 +181,6 @@ def launch(repo, app, scheduled_num):
from .memoqueue import MemScreen
pheser = rt.Phaser(atoms_to_provide)
memscreen = MemScreen(pheser, repo=repo)
router = rt.Router(atoms_to_provide)
memscreen = MemScreen(router=router, repo=repo)
app.push_screen(memscreen)

View File

@@ -2,7 +2,7 @@ import copy
import random
from typing import TypedDict
from textual.containers import Container
from textual.containers import Container, ScrollableContainer
from textual.message import Message
from textual.widget import Widget
from textual.widgets import Button, Label, Markdown
@@ -68,7 +68,7 @@ class ClozePuzzle(BasePuzzleWidget):
yield Label(self.puzzle.wording, id="sentence")
yield Markdown(f"> {self.listprint(self.inputlist)}", id="inputpreview")
# 渲染当前问题的选项
with Container(id="btn-container"):
with ScrollableContainer(id="btn-container"):
for i in self.ans:
h = str(hash(i))
self.hashmap[h] = i

View File

@@ -28,7 +28,7 @@ class Finished(Widget):
def compose(self):
yield Label("本次记忆进程结束", id="finished_msg")
yield Label(f"算法数据{'已保存' if self.is_saved else "未能保存"}")
yield Button("返回上一级", id="back-to-menu")
yield Button("返回上一级", flat=True, id="back-to-menu")
def on_button_pressed(self, event):
button_id = event.button.id

View File

@@ -75,7 +75,7 @@ class MCQPuzzle(BasePuzzleWidget):
yield Label(f"当前输入: {self.inputlist}", id="inputpreview")
# 渲染当前问题的选项
with Container(id="btn-container"):
with ScrollableContainer(id="btn-container"):
for i in current_options:
self.hashmap[str(hash(i))] = i
btnid = f"sel{str(self.cursor).zfill(3)}-{hash(i)}"