fix: 仪表盘改进

This commit is contained in:
2025-12-08 01:06:19 +08:00
parent c98f3a4418
commit 853511b861
7 changed files with 69 additions and 30 deletions

View File

@@ -20,7 +20,8 @@ try:
print('已加载自定义用户配置') print('已加载自定义用户配置')
except: except:
print('未能加载自定义用户配置') print('未能加载自定义用户配置')
runtime_var: ContextVar = ContextVar('runtime_var', default=dict()) # 运行时共享数据
#runtime_var: ContextVar = ContextVar('runtime_var', default=dict()) # 运行时共享数据
class ConfigContext: class ConfigContext:
""" """

View File

@@ -1,14 +1,14 @@
import heurams.context as cxt from heurams.context import rootdir, workdir, config_var
from textual.app import App, ComposeResult
from textual.widgets import Button, Header, Label, Footer from textual.app import App
from textual.widgets import Button
from .screens.dashboard import DashboardScreen from .screens.dashboard import DashboardScreen
from .screens.preparation import PreparationScreen
from .screens.memorizor import MemScreen
from .screens.nucleon_creator import NucleonCreatorScreen from .screens.nucleon_creator import NucleonCreatorScreen
from .screens.precache import PrecachingScreen from .screens.precache import PrecachingScreen
class HeurAMSApp(App): class HeurAMSApp(App):
TITLE = "潜进" TITLE = "潜进"
#CSS_PATH = str(cxt.rootdir / "interface" / "css" / "main.css")
SUB_TITLE = "启发式先进记忆调度器" SUB_TITLE = "启发式先进记忆调度器"
BINDINGS = [("q", "quit", "退出"), BINDINGS = [("q", "quit", "退出"),
("d", "toggle_dark", "改变色调"), ("d", "toggle_dark", "改变色调"),
@@ -30,7 +30,7 @@ class HeurAMSApp(App):
def environment_check(): def environment_check():
from pathlib import Path from pathlib import Path
for i in cxt.config_var.get()["paths"].values(): for i in config_var.get()["paths"].values():
i = Path(i) i = Path(i)
if not i.exists(): if not i.exists():
print(f"创建 {i}") print(f"创建 {i}")

View File

@@ -34,16 +34,44 @@ class DashboardScreen(Screen):
) )
yield Footer() yield Footer()
def item_desc_generator(self, path) -> dict: def item_desc_generator(self, filename) -> dict:
"""简单分析以生成项目项显示文本
Returns:
dict: 以数字为列表, 分别呈现单行字符串
"""
res = dict() res = dict()
path = pathlib.Path(path) filestem = pathlib.Path(filename).stem
res[0] = f"{path.name}\0" res[0] = f"{filename}\0"
res[1] = f"" from heurams.kernel.particles.loader import load_electron
res[1] = " 尚未激活" import heurams.kernel.particles as pt
electron_file_path = (pathlib.Path(config_var.get()["paths"]["electron_dir"]) / (filestem + ".json"))
if electron_file_path.exists(): # 未找到则创建电子文件 (json)
pass
else:
electron_file_path.touch()
with open(electron_file_path, 'w') as f:
f.write("{}")
electron_dict = load_electron(path=electron_file_path) # TODO: 取消硬编码扩展名
is_due = 0
is_activated = 0
nextdate = 0x3f3f3f3f
for i in electron_dict.values():
i: pt.Electron
if i.is_due():
is_due = 1
if i.is_activated():
is_activated = 1
nextdate = min(nextdate, i.nextdate())
res[1] = f"下一次复习: {nextdate}\n"
res[1] += f"{is_due if "需要复习" else "当前无需复习"}"
if not is_activated:
res[1] = " 尚未激活"
return res return res
def on_mount(self) -> None: def on_mount(self) -> None:
union_list_widget = self.query_one("#union-list", ListView) union_list_widget = self.query_one("#union-list", ListView)
probe = probe_all(0) probe = probe_all(0)
if len(probe["nucleon"]): if len(probe["nucleon"]):
@@ -66,31 +94,25 @@ class DashboardScreen(Screen):
if "未找到任何 .toml 文件" in str(selected_label.renderable): if "未找到任何 .toml 文件" in str(selected_label.renderable):
return return
selected_filename = pathlib.Path(str(selected_label.renderable).partition('\0')[0].replace('*', "")) selected_filename = pathlib.Path(str(selected_label.renderable)
.partition('\0')[0] # 文件名末尾截断, 保留文件名
.replace('*', "")) # 去除markdown加粗
nucleon_file_path = pathlib.Path(config_var.get()["paths"]["nucleon_dir"]) / selected_filename nucleon_file_path = pathlib.Path(config_var.get()["paths"]["nucleon_dir"]) / selected_filename
electron_file_path = pathlib.Path(config_var.get()["paths"]["electron_dir"]) / (str(selected_filename.stem) + ".json") electron_file_path = pathlib.Path(config_var.get()["paths"]["electron_dir"]) / (str(selected_filename.stem) + ".json")
if electron_file_path.exists():
pass
else:
electron_file_path.touch()
with open(electron_file_path, 'w') as f:
f.write("{}")
self.app.push_screen(PreparationScreen(nucleon_file_path, electron_file_path)) self.app.push_screen(PreparationScreen(nucleon_file_path, electron_file_path))
def on_button_pressed(self, event) -> None: def on_button_pressed(self, event) -> None:
if event.button.id == "new_nucleon_button": if event.button.id == "new_nucleon_button":
# 切换到创建单元
from .nucleon_creator import NucleonCreatorScreen from .nucleon_creator import NucleonCreatorScreen
newscr = NucleonCreatorScreen() newscr = NucleonCreatorScreen()
self.app.push_screen(newscr) self.app.push_screen(newscr)
elif event.button.id == "precache_all_button": elif event.button.id == "precache_all_button":
self.action_precache_all() # 切换到缓存管理器
from .precache import PrecachingScreen
def action_precache_all(self): precache_screen = PrecachingScreen()
"""预缓存所有单元集的音频""" self.app.push_screen(precache_screen)
from .precache import PrecachingScreen
precache_screen = PrecachingScreen()
self.app.push_screen(precache_screen)
def action_quit_app(self) -> None: def action_quit_app(self) -> None:
self.app.exit() self.app.exit()

View File

@@ -77,5 +77,5 @@ class SM2Algorithm(BaseAlgorithm):
return str(algodata[cls.algo_name]['efactor']) return str(algodata[cls.algo_name]['efactor'])
@classmethod @classmethod
def nextdate(cls, algodata): def nextdate(cls, algodata) -> int:
return algodata[cls.algo_name]['next_date'] return algodata[cls.algo_name]['next_date']

View File

@@ -50,7 +50,7 @@ class Electron:
"评价" "评价"
return self.algo.rate(self.algodata) return self.algo.rate(self.algodata)
def nextdate(self): def nextdate(self) -> int:
return self.algo.nextdate(self.algodata) return self.algo.nextdate(self.algodata)
def revisor(self, quality: int = 5, is_new_activation: bool = False): def revisor(self, quality: int = 5, is_new_activation: bool = False):

View File

@@ -32,10 +32,19 @@ def load_nucleon(path: pathlib.Path, fmt = "toml"):
return lst return lst
def load_electron(path: pathlib.Path, fmt = "json") -> dict: def load_electron(path: pathlib.Path, fmt = "json") -> dict:
"""从文件路径加载电子对象
Args:
path (pathlib.Path): 路径
fmt (str): 文件格式(可选, 默认 json)
Returns:
dict: 键名是电子对象名称, 值是电子对象
"""
with open(path, "r") as f: with open(path, "r") as f:
dictdata = dict() dictdata = dict()
dictdata = json.load(f) # type: ignore dictdata = json.load(f) # type: ignore
dic = dict() dic = dict()
for item, attr in dictdata.items(): for item, attr in dictdata.items():
dic["item"] = (Electron(hasher.hash(item), attr)) dic[item] = (Electron(hasher.hash(item), attr))
return dic return dic

View File

@@ -14,7 +14,14 @@ def probe_by_filename(filename):
return result return result
def probe_all(is_stem = 1): def probe_all(is_stem = 1):
"""依据目录探测所有信息""" """依据目录探测所有信息
Args:
is_stem (boolean): 是否**删除**文件扩展名
Returns:
dict: 有三项, 每一项的键名都是文件组类型, 值都是文件组列表, 只包含文件名
"""
paths: dict = config_var.get().get("paths") paths: dict = config_var.get().get("paths")
result = {} result = {}
for item, attr in paths.items(): for item, attr in paths.items():