mirror of
https://github.com/Youzini-afk/ST-Bionic-Memory-Ecology.git
synced 2026-05-15 22:30:38 +08:00
ui: add floor number search to memory browser (task + graph tabs)
This commit is contained in:
58
ui/panel.js
58
ui/panel.js
@@ -1550,6 +1550,36 @@ function _getMemoryNodeTypeClass(type) {
|
||||
}
|
||||
}
|
||||
|
||||
function _parseFloorFilter(raw) {
|
||||
const text = String(raw || "").trim();
|
||||
if (!text) return null;
|
||||
const ranges = [];
|
||||
for (const part of text.split(/[,,\s]+/)) {
|
||||
const rangeParts = part.split(/[-~]/);
|
||||
if (rangeParts.length === 2) {
|
||||
const lo = parseInt(rangeParts[0], 10);
|
||||
const hi = parseInt(rangeParts[1], 10);
|
||||
if (!Number.isNaN(lo) && !Number.isNaN(hi)) {
|
||||
ranges.push([Math.min(lo, hi), Math.max(lo, hi)]);
|
||||
}
|
||||
} else {
|
||||
const n = parseInt(part, 10);
|
||||
if (!Number.isNaN(n)) ranges.push([n, n]);
|
||||
}
|
||||
}
|
||||
return ranges.length ? ranges : null;
|
||||
}
|
||||
|
||||
function _matchesFloorFilter(node, ranges) {
|
||||
const seq = node.seq ?? -1;
|
||||
const seqLo = node.seqRange?.[0] ?? seq;
|
||||
const seqHi = node.seqRange?.[1] ?? seq;
|
||||
for (const [lo, hi] of ranges) {
|
||||
if (seqHi >= lo && seqLo <= hi) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function _refreshTaskMemoryBrowser() {
|
||||
const el = document.getElementById("bme-task-memory");
|
||||
if (!el) return;
|
||||
@@ -1565,6 +1595,7 @@ function _refreshTaskMemoryBrowser() {
|
||||
.trim()
|
||||
.toLowerCase();
|
||||
const currentFilter = document.getElementById("bme-task-memory-filter")?.value || "all";
|
||||
const currentFloorQuery = String(document.getElementById("bme-task-memory-floor")?.value || "").trim();
|
||||
|
||||
let nodes = Array.isArray(graph.nodes)
|
||||
? graph.nodes.filter((node) => !node?.archived)
|
||||
@@ -1587,6 +1618,13 @@ function _refreshTaskMemoryBrowser() {
|
||||
});
|
||||
}
|
||||
|
||||
if (currentFloorQuery) {
|
||||
const floorFilter = _parseFloorFilter(currentFloorQuery);
|
||||
if (floorFilter) {
|
||||
nodes = nodes.filter((node) => _matchesFloorFilter(node, floorFilter));
|
||||
}
|
||||
}
|
||||
|
||||
const sorted = nodes.slice().sort((a, b) => {
|
||||
const importanceDiff = (b.importance || 5) - (a.importance || 5);
|
||||
if (importanceDiff !== 0) return importanceDiff;
|
||||
@@ -1624,6 +1662,7 @@ function _refreshTaskMemoryBrowser() {
|
||||
<div class="bme-memory-list-panel">
|
||||
<div class="bme-memory-list-filters">
|
||||
<input type="text" class="bme-search-input" id="bme-task-memory-search" placeholder="搜索记忆节点..." value="${_escHtml(currentQuery)}" />
|
||||
<input type="text" class="bme-search-input bme-floor-input" id="bme-task-memory-floor" placeholder="楼层 (如 4, 3-10)" value="${_escHtml(currentFloorQuery)}" />
|
||||
<select class="bme-filter-select" id="bme-task-memory-filter">
|
||||
<option value="all"${currentFilter === "all" ? " selected" : ""}>全部</option>
|
||||
<option value="scope:objective"${currentFilter === "scope:objective" ? " selected" : ""}>客观</option>
|
||||
@@ -1648,6 +1687,7 @@ function _refreshTaskMemoryBrowser() {
|
||||
_bindTaskMemoryListClick();
|
||||
|
||||
const searchInput = document.getElementById("bme-task-memory-search");
|
||||
const floorInput = document.getElementById("bme-task-memory-floor");
|
||||
const filterSelect = document.getElementById("bme-task-memory-filter");
|
||||
if (searchInput) {
|
||||
let timer = null;
|
||||
@@ -1655,6 +1695,10 @@ function _refreshTaskMemoryBrowser() {
|
||||
clearTimeout(timer);
|
||||
timer = setTimeout(() => _refreshTaskMemoryBrowser(), 180);
|
||||
});
|
||||
floorInput?.addEventListener("input", () => {
|
||||
clearTimeout(timer);
|
||||
timer = setTimeout(() => _refreshTaskMemoryBrowser(), 180);
|
||||
});
|
||||
}
|
||||
filterSelect?.addEventListener("change", () => _refreshTaskMemoryBrowser());
|
||||
}
|
||||
@@ -3300,6 +3344,7 @@ function _refreshMemoryBrowser() {
|
||||
|
||||
const searchInput = document.getElementById("bme-memory-search");
|
||||
const regionInput = document.getElementById("bme-memory-region-filter");
|
||||
const floorInput = document.getElementById("bme-memory-floor-filter");
|
||||
const filterSelect = document.getElementById("bme-memory-filter");
|
||||
const listEl = document.getElementById("bme-memory-list");
|
||||
if (!listEl) return;
|
||||
@@ -3307,6 +3352,7 @@ function _refreshMemoryBrowser() {
|
||||
const canRenderGraph = _canRenderGraphData(loadInfo);
|
||||
if (searchInput) searchInput.disabled = !canRenderGraph;
|
||||
if (regionInput) regionInput.disabled = !canRenderGraph;
|
||||
if (floorInput) floorInput.disabled = !canRenderGraph;
|
||||
if (filterSelect) filterSelect.disabled = !canRenderGraph;
|
||||
|
||||
if (!canRenderGraph && loadInfo.loadState !== "empty-confirmed") {
|
||||
@@ -3347,6 +3393,14 @@ function _refreshMemoryBrowser() {
|
||||
});
|
||||
}
|
||||
|
||||
const floorQuery = String(floorInput?.value || "").trim();
|
||||
if (floorQuery) {
|
||||
const floorFilter = _parseFloorFilter(floorQuery);
|
||||
if (floorFilter) {
|
||||
nodes = nodes.filter((node) => _matchesFloorFilter(node, floorFilter));
|
||||
}
|
||||
}
|
||||
|
||||
nodes.sort((a, b) => {
|
||||
const importanceDiff = (b.importance || 5) - (a.importance || 5);
|
||||
if (importanceDiff !== 0) return importanceDiff;
|
||||
@@ -3451,6 +3505,10 @@ function _refreshMemoryBrowser() {
|
||||
clearTimeout(timer);
|
||||
timer = setTimeout(() => _refreshMemoryBrowser(), 200);
|
||||
});
|
||||
floorInput?.addEventListener("input", () => {
|
||||
clearTimeout(timer);
|
||||
timer = setTimeout(() => _refreshMemoryBrowser(), 200);
|
||||
});
|
||||
filterSelect?.addEventListener("change", () => _refreshMemoryBrowser());
|
||||
searchInput._bmeBound = true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user