fix: persist and restore mark color highlights across sessions - #524
fix: persist and restore mark color highlights across sessions#524LiHua000 wants to merge 1 commit into
Conversation
1. 新增隐藏配置项 advance.editor.markcolor 用于按文件路径持久化标记颜色信息; 2. 在 StartManager 中新增 initMarkColor/saveMarkColor/recordMarkColor/findMarkColor,仿书签范式实现标记颜色的启动读取、关窗/会话保存、变更缓存与按路径查找; 3. 在会话保存(autoBackupFile)与关闭标签页(closeTab)处记录当前标记颜色,在关窗与周期备份处落盘; 4. 在 TextEdit 中新增 getMarkColorInfo/setMarkColorList,复用既有 MarkReplaceInfo/convertMarkToReplace/manualUpdateAllMark 模型,用当前文档光标重建选中区间后恢复内存标记并刷新显示; 5. 在 EditWrapper::handleFileLoadFinished 文件内容加载完成后按路径恢复标记颜色,解决位置型数据需待内容就绪的时序问题; ===================================== 1. added hidden config option advance.editor.markcolor to persist mark color info keyed by file path; 2. added initMarkColor/saveMarkColor/recordMarkColor/findMarkColor in StartManager, mirroring the bookmark pattern for startup load, close/session save, change cache and path-based lookup; 3. record current mark color on session save (autoBackupFile) and on tab close (closeTab), persist on window close and periodic backup; 4. added getMarkColorInfo/setMarkColorList in TextEdit, reusing the existing MarkReplaceInfo/convertMarkToReplace/manualUpdateAllMark model, rebuilding selections with the live document cursor before restoring in-memory marks and refreshing display; 5. restore mark color in EditWrapper::handleFileLoadFinished after content is loaded, fixing the timing requirement that position-based data needs the content ready; Log: 修复文本编辑器标记颜色无法保存的问题,新增标记颜色的持久化与重开恢复机制,标记颜色在保存关闭后重开文件可正确恢复 Bug: https://pms.uniontech.com/bug-view-328067.html
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: LiHua000 The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
Reviewer's GuidePersist and restore text editor mark color highlights across sessions by adding StartManager-backed serialization of mark metadata, plumbing capture on save/close, and restoring after file load via TextEdit helpers. Sequence diagram for persisting and restoring mark color highlightssequenceDiagram
actor User
participant Window
participant EditWrapper
participant TextEdit
participant StartManager
participant Settings
%% Persist marks when closing a tab
User->>Window: closeTab(filePath)
Window->>TextEdit: textEditor()->getMarkColorInfo()
TextEdit-->>Window: QList<MarkReplaceInfo>
Window->>TextEdit: textEditor()->getTruePath()
TextEdit-->>Window: markLocalPath
Window->>StartManager: recordMarkColor(markLocalPath, markColorInfo)
%% Periodic/session save of marks
StartManager->>StartManager: autoBackupFile()
StartManager->>TextEdit: wrapper->textEditor()->getMarkColorInfo()
TextEdit-->>StartManager: QList<MarkReplaceInfo>
StartManager->>StartManager: recordMarkColor(localPath, markColorList)
StartManager->>StartManager: saveMarkColor()
StartManager->>Settings: option(s_markColorKey)->setValue(recordInfo)
%% App start: load cached marks
StartManager->>StartManager: initMarkColor()
StartManager->>Settings: value(s_markColorKey)
Settings-->>StartManager: QStringList
StartManager->>StartManager: m_markColorTable.insert(filePath, markList)
%% File reopen: restore marks after content load
User->>EditWrapper: open file
EditWrapper->>TextEdit: handleFileLoadFinished(...)
EditWrapper->>TextEdit: m_pTextEdit->getTruePath()
TextEdit-->>EditWrapper: markLocalPath
EditWrapper->>StartManager: findMarkColor(markLocalPath)
StartManager-->>EditWrapper: QList<MarkReplaceInfo>
EditWrapper->>TextEdit: setMarkColorList(markColorInfo)
TextEdit->>TextEdit: manualUpdateAllMark(markList)
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
deepin pr auto review★ 总体评分:60分■ 【总体评价】
■ 【详细分析】
■ 【改进建议代码示例】 // 在 StartManager::initMarkColor 函数中增加数组大小校验
void StartManager::initMarkColor()
{
// 定义单文件允许的最大标记数量,防止恶意配置导致内存耗尽
const int maxMarksPerFile = 10000;
// 遍历标记颜色信息列表
QStringList markColorInfoList = Settings::instance()->settings->value(s_markColorKey).toStringList();
for (const QString &markColorInfo : markColorInfoList) {
QJsonParseError readError;
QJsonDocument doc = QJsonDocument::fromJson(markColorInfo.toUtf8(), &readError);
if (QJsonParseError::NoError == readError.error
&& !doc.isNull()) {
QJsonObject obj = doc.object();
QString filePath = obj.value("localPath").toString();
// 判断文件是否仍存在,若不存在,则不保留标记颜色信息
if (!filePath.isEmpty()
&& QFileInfo::exists(filePath)) {
QJsonArray marksArray = obj.value("marks").toArray();
// 增加安全校验:限制单文件标记数量,防止内存耗尽
if (marksArray.size() > maxMarksPerFile) {
continue;
}
QList<TextEdit::MarkReplaceInfo> markList;
for (const QJsonValue &markValue : marksArray) {
QJsonObject markObj = markValue.toObject();
TextEdit::MarkReplaceInfo info;
info.opt.type = static_cast<TextEdit::MarkOperationType>(markObj.value("type").toInt());
info.opt.color = markObj.value("color").toString();
info.opt.matchText = markObj.value("matchText").toString();
info.start = markObj.value("start").toInt();
info.end = markObj.value("end").toInt();
info.time = static_cast<qint64>(markObj.value("time").toDouble());
markList.append(info);
}
if (!markList.isEmpty()) {
// 文件存在且标记颜色非空,缓存标记颜色信息
m_markColorTable.insert(filePath, markList);
}
}
}
}
} |
|
@LiHua000: The following test failed, say
Full PR test history. Your PR dashboard. DetailsInstructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here. |
根因分析
PMS 328067「文本编辑器无法保存标记颜色」——标记颜色功能在「数据模型 / 保存路径 / 恢复路径」三层均未接入持久化:
TextEdit内存容器m_markOperations(src/editor/dtextedit.h:641)/m_wordMarkSelections(dtextedit.h:639),随对象销毁消失,无序列化出口;TextFileSaver::saveToFile(src/common/text_file_saver.cpp:132)经document->toPlainText()只落盘纯文本,丢弃所有 ExtraSelection 颜色;src/startmanager.cpp:162-205)与启动恢复(startmanager.cpp:318-372)均无标记颜色键,重开仅恢复书签与焦点;startmanager.cpp:28/822/862/894)作为「可做而未做」的直接对照。根因已通过独立复核(✅ 高置信)。
修复方案
仿书签持久化范式(方案 A)补全标记颜色的「序列化 / 保存触发 / 打开恢复」三层:
advance.editor.markcolor,按文件路径持久化标记颜色({localPath, marks:[{start,end,color,type,matchText,time}]})。StartManager新增initMarkColor/saveMarkColor/recordMarkColor/findMarkColor与m_markColorTable:启动读取、关窗/会话保存、变更缓存、按路径查找——与书签逐环节对应。autoBackupFile与关闭标签页closeTab处记录当前标记颜色;slotCloseWindow与autoBackupFile处落盘。TextEdit新增getMarkColorInfo(复用既有convertMarkToReplace)与setMarkColorList(用当前文档光标重建选中区间后调既有manualUpdateAllMark恢复内存标记并renderAllSelections)。EditWrapper::handleFileLoadFinished文件内容加载完成后按路径findMarkColor+setMarkColorList恢复——位置型数据需待内容就绪,故不能像行号型书签那样在openFile后同步调用。复用既有
MarkReplaceInfo/convertMarkToReplace/manualUpdateAllMark模型,未修改任何既有函数签名或函数体,纯新增。改动安全评估
低风险。纯新增 192 行、0 删除,不修改任何函数签名/公开成员,不触碰既有函数体;被复用的
manualUpdateAllMark/convertMarkToReplace仅作只读入口调用,既有撤销/重做调用方(changemarkcommand.cpp)零影响;setMarkColorList用qBound夹紧位置避免文件被外部修改后越界。详见change-safety.md。测试建议
关联
7458207c3bbb08c92fe9cf0902c7b8c0d3767263Summary by Sourcery
Persist and restore per-file text mark color highlights across editor sessions using a new configuration-backed store and integration with startup, auto-backup, tab closing, and file load flows.
New Features:
Enhancements: