修 Inspect 被日志覆盖:setStatus 改为只追加一行日志(不再触发整表重排),日志块用 logBlockStarted 标记
This commit is contained in:
1 parent
8fefcb76c4
commit
0ec33d90ae
1 file changed
+31
-10
@@ -42,7 +42,7 @@ public final class ObjectPanel {
|
|||||||
Object nameField;
|
Object nameField;
|
||||||
final java.util.Deque<String> log = new java.util.ArrayDeque<String>();
|
final java.util.Deque<String> log = new java.util.ArrayDeque<String>();
|
||||||
boolean rendering;
|
boolean rendering;
|
||||||
Runnable logPanelRefresh;
|
boolean logBlockStarted;
|
||||||
List<Object> objects = new ArrayList<Object>();
|
List<Object> objects = new ArrayList<Object>();
|
||||||
Object target;
|
Object target;
|
||||||
}
|
}
|
||||||
@@ -112,12 +112,6 @@ public final class ObjectPanel {
|
|||||||
cell = call(root, Obf.TABLE_ADD, new Class<?>[] {actorClass}, cellClass, scroll);
|
cell = call(root, Obf.TABLE_ADD, new Class<?>[] {actorClass}, cellClass, scroll);
|
||||||
layoutCell(cell, Obf.CELL_TOP, Obf.CELL_EXPAND, Obf.CELL_FILL);
|
layoutCell(cell, Obf.CELL_TOP, Obf.CELL_EXPAND, Obf.CELL_FILL);
|
||||||
|
|
||||||
state.logPanelRefresh = new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
refreshList(state);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
wire(loader, refresh, new Runnable() {
|
wire(loader, refresh, new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -188,13 +182,37 @@ public final class ObjectPanel {
|
|||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 只往内容表格末尾追加**一行**日志(必要时先补一行分隔标记)。 */
|
||||||
|
private static void appendLogRow(State state, String text) {
|
||||||
|
try {
|
||||||
|
Class<?> cellClass = Class.forName(Obf.CELL, true, state.loader);
|
||||||
|
Class<?> actorClass = Class.forName(Obf.ACTOR, true, state.loader);
|
||||||
|
if (!state.logBlockStarted) {
|
||||||
|
Object cell = call(state.listTable, Obf.TABLE_ADD, new Class<?>[] {actorClass},
|
||||||
|
cellClass, label(state.loader, state.skin, LOG_SEPARATOR));
|
||||||
|
layoutCell(cell, Obf.CELL_LEFT);
|
||||||
|
call(state.listTable, Obf.TABLE_ROW, new Class<?>[0], cellClass);
|
||||||
|
state.logBlockStarted = true;
|
||||||
|
}
|
||||||
|
Object cell = call(state.listTable, Obf.TABLE_ADD, new Class<?>[] {actorClass},
|
||||||
|
cellClass, label(state.loader, state.skin, text));
|
||||||
|
layoutCell(cell, Obf.CELL_LEFT);
|
||||||
|
call(state.listTable, Obf.TABLE_ROW, new Class<?>[0], cellClass);
|
||||||
|
invalidateList(state);
|
||||||
|
} catch (Throwable error) {
|
||||||
|
System.err.println("[panel] 日志行追加失败: " + error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String LOG_SEPARATOR = "---------- log ----------";
|
||||||
|
|
||||||
/** 在内容表格末尾追加"日志块"(分隔行 + 最近几条消息)。 */
|
/** 在内容表格末尾追加"日志块"(分隔行 + 最近几条消息)。 */
|
||||||
private static void appendLogRows(State state) {
|
private static void appendLogRows(State state) {
|
||||||
try {
|
try {
|
||||||
Class<?> cellClass = Class.forName(Obf.CELL, true, state.loader);
|
Class<?> cellClass = Class.forName(Obf.CELL, true, state.loader);
|
||||||
Class<?> actorClass = Class.forName(Obf.ACTOR, true, state.loader);
|
Class<?> actorClass = Class.forName(Obf.ACTOR, true, state.loader);
|
||||||
Object cell = call(state.listTable, Obf.TABLE_ADD, new Class<?>[] {actorClass},
|
Object cell = call(state.listTable, Obf.TABLE_ADD, new Class<?>[] {actorClass},
|
||||||
cellClass, label(state.loader, state.skin, "---------- log ----------"));
|
cellClass, label(state.loader, state.skin, LOG_SEPARATOR));
|
||||||
layoutCell(cell, Obf.CELL_LEFT);
|
layoutCell(cell, Obf.CELL_LEFT);
|
||||||
call(state.listTable, Obf.TABLE_ROW, new Class<?>[0], cellClass);
|
call(state.listTable, Obf.TABLE_ROW, new Class<?>[0], cellClass);
|
||||||
synchronized (state.log) {
|
synchronized (state.log) {
|
||||||
@@ -205,6 +223,7 @@ public final class ObjectPanel {
|
|||||||
call(state.listTable, Obf.TABLE_ROW, new Class<?>[0], cellClass);
|
call(state.listTable, Obf.TABLE_ROW, new Class<?>[0], cellClass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
state.logBlockStarted = true;
|
||||||
} catch (Throwable error) {
|
} catch (Throwable error) {
|
||||||
System.err.println("[panel] 日志块追加失败: " + error);
|
System.err.println("[panel] 日志块追加失败: " + error);
|
||||||
}
|
}
|
||||||
@@ -242,6 +261,7 @@ public final class ObjectPanel {
|
|||||||
try {
|
try {
|
||||||
// Table.clearChildren()(载荷名 `SourceFile()V`):把列表里的行全清掉重建。
|
// Table.clearChildren()(载荷名 `SourceFile()V`):把列表里的行全清掉重建。
|
||||||
call(state.listTable, Obf.TABLE_CLEAR_CHILDREN, new Class<?>[0], void.class);
|
call(state.listTable, Obf.TABLE_CLEAR_CHILDREN, new Class<?>[0], void.class);
|
||||||
|
state.logBlockStarted = false;
|
||||||
Class<?> cellClass = Class.forName(Obf.CELL, true, state.loader);
|
Class<?> cellClass = Class.forName(Obf.CELL, true, state.loader);
|
||||||
Class<?> actorClass = Class.forName(Obf.ACTOR, true, state.loader);
|
Class<?> actorClass = Class.forName(Obf.ACTOR, true, state.loader);
|
||||||
for (int i = 0; i < objects.size() && i < 300; i++) {
|
for (int i = 0; i < objects.size() && i < 300; i++) {
|
||||||
@@ -402,6 +422,7 @@ public final class ObjectPanel {
|
|||||||
private static void fillTextRows(final State state, List<String> lines) {
|
private static void fillTextRows(final State state, List<String> lines) {
|
||||||
try {
|
try {
|
||||||
call(state.listTable, Obf.TABLE_CLEAR_CHILDREN, new Class<?>[0], void.class);
|
call(state.listTable, Obf.TABLE_CLEAR_CHILDREN, new Class<?>[0], void.class);
|
||||||
|
state.logBlockStarted = false;
|
||||||
Class<?> cellClass = Class.forName(Obf.CELL, true, state.loader);
|
Class<?> cellClass = Class.forName(Obf.CELL, true, state.loader);
|
||||||
Class<?> actorClass = Class.forName(Obf.ACTOR, true, state.loader);
|
Class<?> actorClass = Class.forName(Obf.ACTOR, true, state.loader);
|
||||||
for (String line : lines) {
|
for (String line : lines) {
|
||||||
@@ -436,8 +457,8 @@ public final class ObjectPanel {
|
|||||||
state.log.addLast(text);
|
state.log.addLast(text);
|
||||||
while (state.log.size() > LOG_LINES) state.log.removeFirst();
|
while (state.log.size() > LOG_LINES) state.log.removeFirst();
|
||||||
}
|
}
|
||||||
// 没在渲染中就立刻把日志块刷出来(渲染中则由那次渲染带上,避免递归重排)
|
// 只追加一行日志:千万不要在这里重跑列表渲染,否则 Inspect 写好的字段清单会被覆盖
|
||||||
if (!state.rendering && state.logPanelRefresh != null) state.logPanelRefresh.run();
|
if (!state.rendering) appendLogRow(state, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** TextField 里的文字(名字被混淆了,按"无参 + 返回 String"取)。 */
|
/** TextField 里的文字(名字被混淆了,按"无参 + 返回 String"取)。 */
|
||||||
|
|||||||
Reference in new issue
Block a user