#!/usr/bin/env python3 from textual.app import ComposeResult from textual.widgets import ( Header, Footer, Label, ListView, ListItem, Button, Static, ) from textual.containers import Container from textual.screen import Screen from heurams.kernel.particles import * from heurams.context import * import heurams.services.version as version import heurams.services.timer as timer from .preparation import PreparationScreen from .about import AboutScreen import pathlib class DashboardScreen(Screen): def compose(self) -> ComposeResult: yield Header(show_clock=True) yield Container( Label(f'欢迎使用 "潜进" 启发式先进记忆调度器', classes="title-label"), Label(f"当前 UNIX 日时间戳: {timer.get_daystamp()}"), Label(f'时区修正: UTC+{config_var.get()["timezone_offset"] / 3600}'), Label("选择待学习或待修改的记忆单元集:", classes="title-label"), ListView(id="union-list", classes="union-list-view"), Label(f'"潜进" 开放源代码软件项目 | 版本 {version.ver} {version.codename.capitalize()} | Wang Zhiyu 2025'), ) yield Footer() def item_desc_generator(self, filename) -> dict: """简单分析以生成项目项显示文本 Returns: dict: 以数字为列表, 分别呈现单行字符串 """ res = dict() filestem = pathlib.Path(filename).stem res[0] = f"{filename}\0" from heurams.kernel.particles.loader import load_electron 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 def on_mount(self) -> None: union_list_widget = self.query_one("#union-list", ListView) probe = probe_all(0) if len(probe["nucleon"]): for file in probe["nucleon"]: text = self.item_desc_generator(file) union_list_widget.append(ListItem( Label(text[0] + '\n' + text[1]), )) else: union_list_widget.append( ListItem(Static("在 ./nucleon/ 中未找到任何内容源数据文件.\n请放置文件后重启应用.\n或者新建空的单元集.")) ) union_list_widget.disabled = True def on_list_view_selected(self, event) -> None: if not isinstance(event.item, ListItem): return selected_label = event.item.query_one(Label) if "未找到任何 .toml 文件" in str(selected_label.renderable): return 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 electron_file_path = pathlib.Path(config_var.get()["paths"]["electron_dir"]) / (str(selected_filename.stem) + ".json") self.app.push_screen(PreparationScreen(nucleon_file_path, electron_file_path)) def on_button_pressed(self, event) -> None: if event.button.id == "new_nucleon_button": # 切换到创建单元 from .nucreator import NucleonCreatorScreen newscr = NucleonCreatorScreen() self.app.push_screen(newscr) elif event.button.id == "precache_all_button": # 切换到缓存管理器 from .precache import PrecachingScreen precache_screen = PrecachingScreen() self.app.push_screen(precache_screen) elif event.button.id == "about_button": from .about import AboutScreen about_screen = AboutScreen() self.app.push_screen(about_screen) def action_quit_app(self) -> None: self.app.exit()