1) 分组折起后再展开,信号列表的滚动条消失(筛选态与常规态均可复现)
- 根因:AdvanceGroupAnimations 只在“折起完成”时重建行集合;而“展开完成”那一帧
m_contentHeight 从收起态跳回展开态,却没有任何路径重算滚动条可见性 ⇒ 滚动条停在隐藏。
- 修法:任一方向动画结束都 m_rowsDirty = true + BuildRows(),并每帧 RefreshScrollBar(false)。
⚠️ 动画期间不夹取滚动偏移,避免打断与滚动同步的折起动画(scrollSynced)。
2) 单点信号(finiteCount == 1)默认绘制方式由「点线」改为「散点」
- ApplySinglePointDefaultStyle → DrawMode::SCATTER(仍取最大线宽)。
- 新增 SignalPanel::ModeOptionEnabled:单点信号的「线段」「点线」置灰、不可点、
且不参与悬停高亮(避免“看着能点其实点不动”);样式区的绘制与命中都用它。
- PlotView::UpdateAutoScatterStyles 跳过单点信号,否则“放大自动点线”会把它又改回「点线」。
3) 拖动线宽滑块完全不生效(拖动时线宽不变、松手瞬间变了、再移动鼠标又变回去)
- 根因一:AcquirePolyline 的折线缓存键没有 lineWidth,而 BuildPolyline 把线宽烘进
包络带几何(每个像素列的上下包络各向外扩 max(1,线宽)*scale*0.5,「梳状」判定也依赖它)
⇒ 稠密信号(采样数 > 绘图区宽度)永远复用旧线宽的顶点与包络带。
- 根因二:样式补丁只更新“静态场景缓存 + 后备缓冲区”,而每网格图层(宽基底)仍是旧样式像素,
下一帧命中“宽基底快路径”时把新样式覆盖回旧像素。
- 修法:PolylineCacheEntry 增加 lineWidth 并进比较;
样式补丁之后 QueueLaneRebuild(受影响网格) + RenderPendingLaneRebuilds(1)(沿用每帧至多 1 个的预算)。
4) 「目标」行的 GX 标签复用「所属网格」菜单,并先给 PopupMenu 增加「限高 + 条目区滚动 + 尾部固定项」
- MenuLayoutConstraint::maxHeight(OpenLaneMenu 传客户区高度的 62%);
- 固定区 = 最后一个分隔线及其之后的条目(即「新建网格」)始终钉在菜单底部,其余条目可滚动;
- 滚轮滚动条目区(Application 在菜单内滚动时不再关闭菜单,其余情形保持既有行为);
- 键盘移动悬停项自动滚入可视区(EnsureItemVisible);ItemAtPoint 要求条目同时命中滚动视口;
- 滚动区文本用 UiTextClipped(GDI 文本不遵循 GDI+ SetClip),并跳过完全不可见的条目(性能);
- BuildLayout 不再无条件清零 m_scrollOffset(否则 RebuildLayout 会把滚轮位置吃掉);
- 「目标」行 GX 标签点击**不参与**联动滚动(悬停联动保留)。
5) 点选信号名 ⇒ 绘图区自动把目标网格滚动到可视区内(上百个独立网格时旧有高亮无法定位)
- SignalPanel::RequestPlotLaneScroll / TakePlotLaneScrollRequest;
Application::ApplyPendingPlotLaneScroll(WM_LBUTTONDOWN 的面板分支);
PlotView::ScrollLaneIntoView(在可视区上方就上滚、在下方就下滚、已完整可见则不动)。
- 只有“点击信号名”触发;悬停绝不改变视图;勾选框 / GX 徽标 / 移除 ✕ 也不触发。
验证(全部离屏执行,窗口 SW_HIDE + 只注入合成消息 + 进程与线程 BELOW_NORMAL,
不移动真实光标、不抢焦点、不截屏):
- 新增 .preflight/check(不入库)68/68 通过;
- A/B:五处修复全部回退 ⇒ 17 项如实失败(B 4 / C 4 / D 7 / E 2);“折起后滚动条”需要
逐帧重绘驱动动画才能复现,单独回退时 ⇒ 5 项如实失败;恢复后 68/68;
- make release / make debug 零警告。
其它:
- 按要求删除工作区 Tools/(structcheck 脚本)并移除 Makefile 的 structcheck 目标;
- Documents/agent_mem.md 同步:新增 §9.38、§11.2 第 97–103 条与变更日志一行。
248 lines
7.6 KiB
Makefile
248 lines
7.6 KiB
Makefile
# 目标文件名称
|
||
TARGET_FILE_NAME = Target
|
||
|
||
# 编译目录
|
||
BUILD_DIR = Build
|
||
|
||
# Release 编译子目录
|
||
SUB_DIR_RELEASE = Release
|
||
|
||
# Debug 编译子目录
|
||
SUB_DIR_DEBUG = Debug
|
||
|
||
# Release 优化等级
|
||
RELEASE_OPT = -Os
|
||
|
||
# Debug 优化等级
|
||
DEBUG_OPT = -O0
|
||
|
||
# GUI或CUI编译选项 [0]CUI/Console [1]GUI
|
||
GUI = 1
|
||
|
||
# C编译标准
|
||
C_STD = c17
|
||
|
||
# C++编译标准
|
||
CXX_STD = c++17
|
||
|
||
# 源文件编码定义
|
||
INPUT_CHAR_ENCODING = UTF-8
|
||
|
||
# 编译产物单字节字符(char)编码定义
|
||
OUTPUT_CHAR_ENCODING = GBK
|
||
|
||
# 编译产物宽字符(wchar_t)编码定义
|
||
OUTPUT_WCHAR_ENCODING = UTF-16LE
|
||
|
||
# 编译工具前缀
|
||
COMPLIER_PREFIX = \
|
||
|
||
# C编译工具
|
||
C_COMPLIER = $(strip $(COMPLIER_PREFIX))gcc
|
||
|
||
# C++编译工具
|
||
CXX_COMPLIER = $(strip $(COMPLIER_PREFIX))g++
|
||
|
||
# Windows 资源文件编译工具
|
||
WIN_RES_COMPLIER = windres
|
||
|
||
##################################################################################
|
||
|
||
# 链接库
|
||
LIB_LINK = \
|
||
-lgdi32 \
|
||
-lgdiplus \
|
||
-lcomdlg32 \
|
||
-ld3d11 \
|
||
-ldwmapi \
|
||
-ld3dcompiler \
|
||
|
||
# C定义
|
||
C_DEFS = \
|
||
_UNICODE \
|
||
UNICODE \
|
||
|
||
# C头文件目录
|
||
C_INCLUDES_PATHS = \
|
||
|
||
# C源文件目录
|
||
C_SOURCES_PATHS = \
|
||
|
||
# C额外单个源文件
|
||
C_EXTERA_SOURCES = \
|
||
|
||
# C++定义
|
||
CXX_DEFS = \
|
||
_UNICODE \
|
||
UNICODE \
|
||
|
||
# C++ 头文件目录
|
||
CXX_INCLUDES_PATHS = \
|
||
Utilities/Inc \
|
||
Resources/Inc \
|
||
Components/Main/Inc \
|
||
Components/Shared/Inc \
|
||
Components/Application/Inc \
|
||
Components/TabBar/Inc \
|
||
Components/Toolbar/Inc \
|
||
Components/SignalPanel/Inc \
|
||
Components/PlotView/Inc \
|
||
|
||
# C++源文件目录
|
||
CXX_SOURCES_PATHS = \
|
||
Utilities/Src \
|
||
Components/Main/Src \
|
||
Components/Shared/Src \
|
||
Components/Application/Src \
|
||
Components/TabBar/Src \
|
||
Components/Toolbar/Src \
|
||
Components/SignalPanel/Src \
|
||
Components/PlotView/Src \
|
||
|
||
# C++额外单个源文件
|
||
CXX_EXTERA_SOURCES = \
|
||
|
||
# Windows 资源文件脚本头文件路径
|
||
WIN_RESOURCE_INCLUDES_PATHS = \
|
||
Resources \
|
||
Resources/Inc \
|
||
# Windows 资源文件脚本输入代码页(对应 INPUT_CHAR_ENCODING = UTF-8)
|
||
WIN_RESOURCE_CODEPAGE = 65001
|
||
# Windows 资源文件脚本列表
|
||
WIN_RESOURCE_SCRIPTS = \
|
||
Resources/JustDataInspector.rc \
|
||
|
||
##################################################################################
|
||
|
||
# C编译选项
|
||
CFLAGS = $(foreach text,$(C_DEFS),$(addprefix -D,$(text))) \
|
||
$(foreach path,$(C_INCLUDES_PATHS),$(addprefix -I,$(path))) \
|
||
-std=$(strip $(C_STD)) \
|
||
-finput-charset=$(strip $(INPUT_CHAR_ENCODING)) \
|
||
-fexec-charset=$(strip $(OUTPUT_CHAR_ENCODING)) \
|
||
-fwide-exec-charset=$(strip $(OUTPUT_WCHAR_ENCODING)) \
|
||
-static \
|
||
-Wall \
|
||
-MMD -MP -MF"$(@:%.o=%.d)" \
|
||
|
||
# C++编译选项
|
||
CXXFLAGS = $(foreach text,$(CXX_DEFS),$(addprefix -D,$(text))) \
|
||
$(foreach path,$(CXX_INCLUDES_PATHS),$(addprefix -I,$(path))) \
|
||
-std=$(strip $(CXX_STD)) \
|
||
-finput-charset=$(strip $(INPUT_CHAR_ENCODING)) \
|
||
-fexec-charset=$(strip $(OUTPUT_CHAR_ENCODING)) \
|
||
-fwide-exec-charset=$(strip $(OUTPUT_WCHAR_ENCODING)) \
|
||
-static \
|
||
-Wall \
|
||
-MMD -MP -MF"$(@:%.o=%.d)" \
|
||
-lstdc++ \
|
||
|
||
# 链接选项
|
||
LDFLAGS = -Wl,-Map,$(basename $@).map \
|
||
|
||
##################################################################################
|
||
|
||
# GUI与CUI选项附加
|
||
ifeq ($(GUI), 1)
|
||
LDFLAGS += -mwindows
|
||
else
|
||
LDFLAGS += -mconsole
|
||
endif
|
||
|
||
# C目标文件及索引目录关联
|
||
OBJECTS = $(notdir $(C_EXTERA_SOURCES:.c=.o))
|
||
OBJECTS += $(subst .c,.o,$(notdir $(foreach path,$(C_SOURCES_PATHS),$(wildcard $(path)/*.c))))
|
||
vpath %.c $(sort $(dir $(C_EXTERA_SOURCES))) $(sort $(C_SOURCES_PATHS))
|
||
|
||
# C++目标文件及索引目录关联
|
||
OBJECTS += $(notdir $(CXX_EXTERA_SOURCES:.cpp=.o))
|
||
OBJECTS += $(subst .cpp,.o,$(notdir $(foreach path,$(CXX_SOURCES_PATHS),$(wildcard $(path)/*.cpp))))
|
||
vpath %.cpp $(sort $(dir $(CXX_EXTERA_SOURCES))) $(sort $(CXX_SOURCES_PATHS))
|
||
|
||
# Windows资源文件及索引目录关联
|
||
OBJECTS += $(notdir $(WIN_RESOURCE_SCRIPTS:.rc=.o))
|
||
vpath %.rc $(sort $(dir $(WIN_RESOURCE_SCRIPTS)))
|
||
|
||
|
||
# Release 目标文件
|
||
RELEASE_OBJECTS = $(addprefix $(BUILD_DIR)/$(SUB_DIR_RELEASE)/,$(OBJECTS))
|
||
|
||
# Debug 目标文件
|
||
DEBUG_OBJECTS = $(addprefix $(BUILD_DIR)/$(SUB_DIR_DEBUG)/,$(OBJECTS))
|
||
|
||
##################################################################################
|
||
|
||
# all任务 目标为 release 和 debug 产物
|
||
all: $(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).exe $(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).exe
|
||
@echo ====== [All] Build Procedure Accomplished ======
|
||
|
||
# release任务 目标为 release 产物
|
||
release: $(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).exe
|
||
@echo ====== [Release] Build Procedure Accomplished ======
|
||
|
||
# debug任务 目标为 debug 产物
|
||
debug: $(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).exe
|
||
@echo ====== [Debug] Build Procedure Accomplished ======
|
||
|
||
# 清理任务
|
||
clean: $(BUILD_DIR)
|
||
powershell rm -r $(BUILD_DIR)
|
||
|
||
# 构建目录生成
|
||
$(BUILD_DIR):
|
||
powershell mkdir $@
|
||
|
||
# Release 工作目录生成
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE): | $(BUILD_DIR)
|
||
powershell mkdir $@
|
||
|
||
# Debug 工作目录生成
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG): | $(BUILD_DIR)
|
||
powershell mkdir $@
|
||
|
||
# Release 最终可执行文件编译任务
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).exe: $(RELEASE_OBJECTS)
|
||
@echo ====== [Release] All File Compiled. Now Linking... ======
|
||
$(CXX_COMPLIER) $(RELEASE_OBJECTS) -static -s -o $@ $(LIB_LINK) $(LDFLAGS)
|
||
@echo ====== [Release] Program Link Finished ======
|
||
|
||
# Debug 最终可执行文件编译任务
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).exe: $(DEBUG_OBJECTS)
|
||
@echo ====== [Debug] All File Compiled. Now Linking... ======
|
||
$(CXX_COMPLIER) $(DEBUG_OBJECTS) -static -o $@ $(LIB_LINK) $(LDFLAGS)
|
||
@echo ====== [Debug] Program Link Finished ======
|
||
|
||
# C Release 目标文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE)/%.o: %.c Makefile | $(BUILD_DIR)/$(SUB_DIR_RELEASE)
|
||
@echo ====== [Release] C Source File "$<" Compiling... ======
|
||
$(C_COMPLIER) -c $(CFLAGS) $(RELEASE_OPT) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(notdir $(<:.c=.lst)) $< -o $@
|
||
|
||
# C++ Release 目标文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE)/%.o: %.cpp Makefile | $(BUILD_DIR)/$(SUB_DIR_RELEASE)
|
||
@echo ====== [Release] C++ Source File "$<" Compiling... ======
|
||
$(CXX_COMPLIER) -c $(CXXFLAGS) $(RELEASE_OPT) -Wa,-a,-ad,-ahlms=$(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(notdir $(<:.cpp=.lst)) $< -o $@
|
||
|
||
# Release 资源脚本文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE)/%.o: %.rc Makefile | $(BUILD_DIR)/$(SUB_DIR_RELEASE)
|
||
@echo ====== [Release] Windows Resource Script File "$<" Compiling... ======
|
||
$(WIN_RES_COMPLIER) -c $(WIN_RESOURCE_CODEPAGE) $(foreach path,$(WIN_RESOURCE_INCLUDES_PATHS),$(addprefix -I,$(path))) $< -o $@
|
||
|
||
# C Debug 目标文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG)/%.o: %.c Makefile | $(BUILD_DIR)/$(SUB_DIR_DEBUG)
|
||
@echo ====== [Debug] C Source File "$<" Compiling... ======
|
||
$(C_COMPLIER) -c $(CFLAGS) $(DEBUG_OPT) -g -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(notdir $(<:.c=.lst)) $< -o $@
|
||
|
||
# C++ Debug 目标文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG)/%.o: %.cpp Makefile | $(BUILD_DIR)/$(SUB_DIR_DEBUG)
|
||
@echo ====== [Debug] C++ Source File "$<" Compiling... ======
|
||
$(CXX_COMPLIER) -c $(CXXFLAGS) $(DEBUG_OPT) -g -Wa,-a,-ad,-ahlms=$(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(notdir $(<:.cpp=.lst)) $< -o $@
|
||
|
||
# Debug 资源脚本文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG)/%.o: %.rc Makefile | $(BUILD_DIR)/$(SUB_DIR_DEBUG)
|
||
@echo ====== [Debug] Windows Resource Script File "$<" Compiling... ======
|
||
$(WIN_RES_COMPLIER) -c $(WIN_RESOURCE_CODEPAGE) $(foreach path,$(WIN_RESOURCE_INCLUDES_PATHS),$(addprefix -I,$(path))) $< -o $@
|
||
|
||
|
||
# 依赖关系
|
||
-include $(RELEASE_OBJECTS:.o=.d)
|
||
-include $(DEBUG_OBJECTS:.o=.d) |