refactor: Optimize font deletion process in DFontPreviewListView#194
Conversation
Reviewer's guide (collapsed on small PRs)Reviewer's GuideRefactors DFontPreviewListView::deleteCurFonts to optimize font deletion performance and improve UI/state updates by using a QSet for file lookups, emitting more granular signals on deletion, and avoiding a full model rebuild. Sequence diagram for optimized deleteCurFonts interaction flowsequenceDiagram
actor User
participant DFontPreviewListView
participant DFontDataThread
participant DFMDBManager
participant SignalManager
participant PerformanceMonitor
User ->> DFontPreviewListView: deleteCurFonts(files, force)
activate DFontPreviewListView
DFontPreviewListView ->> DFontPreviewListView: construct QSet fileSet from files
alt not force
DFontPreviewListView ->> DFontPreviewListView: updateSpinner(Delete, false)
end
DFontPreviewListView ->> DFontDataThread: getFontModelList()
activate DFontDataThread
DFontDataThread -->> DFontPreviewListView: list of DFontPreviewItemData
deactivate DFontDataThread
loop for each itemData in m_fontModelList
DFontPreviewListView ->> DFontPreviewListView: check fileSet.contains(itemData.fontInfo.filePath)
alt file in fileSet
DFontPreviewListView ->> DFontPreviewListView: enableFont(filePath)
DFontPreviewListView ->> DFMDBManager: deleteFontInfo(itemData)
activate DFMDBManager
DFMDBManager -->> DFontPreviewListView: return
deactivate DFMDBManager
DFontPreviewListView ->> DFontDataThread: removePathWatcher(filePath)
DFontPreviewListView ->> DFontDataThread: erase item from m_fontModelList
DFontPreviewListView ->> DFontPreviewListView: m_recoverSelectStateUserfontMultiMap.remove(filePath)
DFontPreviewListView ->> User: itemRemoved(itemData)
else file not in fileSet
DFontPreviewListView ->> DFontPreviewListView: skip item
end
end
DFontPreviewListView ->> DFontPreviewListView: enableFonts()
DFontPreviewListView ->> SignalManager: fontSizeRequestToSlider()
alt m_FontViewHasFocus
DFontPreviewListView ->> DFontPreviewListView: refreshFocuses()
DFontPreviewListView ->> DFontPreviewListView: setFontViewHasFocus(false)
end
DFontPreviewListView ->> User: requestShowSpinner(false, true, Delete)
DFontPreviewListView ->> User: rowCountChanged()
DFontPreviewListView ->> User: deleteFinished()
DFontPreviewListView ->> DFontPreviewListView: syncTabStatus()
DFontPreviewListView ->> DFontPreviewListView: m_recoveryTabFocusState = false
DFontPreviewListView ->> PerformanceMonitor: deleteFontFinish(deleteCount)
activate PerformanceMonitor
PerformanceMonitor -->> DFontPreviewListView: return
deactivate PerformanceMonitor
DFontPreviewListView ->> DFontDataThread: onAutoDirWatchers()
deactivate DFontPreviewListView
Class diagram for updated DFontPreviewListView deleteCurFonts workflowclassDiagram
class DFontPreviewListView {
- DFontDataThread* m_dataThread
- QAbstractItemModel* m_fontPreviewProxyModel
- SignalManager* m_signalManager
- bool m_FontViewHasFocus
- QMultiMap~QString, QVariant~ m_recoverSelectStateUserfontMultiMap
- bool m_recoveryTabFocusState
+ void deleteCurFonts(QStringList& files, bool force)
+ void updateSpinner(DFontSpinnerWidget::Action action, bool show)
+ void enableFont(QString filePath)
+ void enableFonts()
+ void refreshFocuses()
+ void setFontViewHasFocus(bool hasFocus)
+ void syncTabStatus()
<<signal>> void itemRemoved(DFontPreviewItemData itemData)
<<signal>> void requestShowSpinner(bool show, bool delay, DFontSpinnerWidget::Action action)
<<signal>> void rowCountChanged()
<<signal>> void deleteFinished()
<<signal>> void requestUpdateModel(int changedCount, bool needReselect)
}
class DFontDataThread {
+ QList~DFontPreviewItemData~ m_fontModelList
+ QList~DFontPreviewItemData~ getFontModelList()
+ void removePathWatcher(QString filePath)
+ void onAutoDirWatchers()
}
class DFontPreviewItemData {
+ FontInfo fontInfo
}
class FontInfo {
+ QString filePath
}
class DFMDBManager {
+ static DFMDBManager* instance()
+ void deleteFontInfo(DFontPreviewItemData itemData)
}
class SignalManager {
+ void fontSizeRequestToSlider()
}
class PerformanceMonitor {
+ static void deleteFontFinish(int deleteCount)
}
class DFontSpinnerWidget {
<<enumeration>> Action
Delete
}
DFontPreviewListView --> DFontDataThread : uses m_dataThread
DFontPreviewListView --> DFMDBManager : calls deleteFontInfo
DFontPreviewListView --> SignalManager : uses m_signalManager
DFontPreviewListView --> PerformanceMonitor : calls deleteFontFinish
DFontPreviewListView --> DFontSpinnerWidget : uses Delete
DFontDataThread --> DFontPreviewItemData : contains
DFontPreviewItemData --> FontInfo : contains
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Hey - I've left some high level feedback:
- Consider using
Q_EMITconsistently (e.g., form_signalManager->fontSizeRequestToSlider()) to match the existing signal emission style in this class and keep the codebase uniform.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- Consider using `Q_EMIT` consistently (e.g., for `m_signalManager->fontSizeRequestToSlider()`) to match the existing signal emission style in this class and keep the codebase uniform.Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
- Introduced QSet for efficient file existence checks during font deletion. - Emitted additional signals to improve UI responsiveness and state management. - Enhanced performance by avoiding full model rebuild after each deletion. bug: https://pms.uniontech.com/bug-view-351365.html https://pms.uniontech.com/bug-view-321575.html
98de2d8 to
8cb11ba
Compare
deepin pr auto reviewGit Diff 代码审查报告代码变更概述该修改主要针对
代码质量与性能分析1. 性能优化改进优点: const QSet<QString> fileSet(files.begin(), files.end());
// ...
if (fileSet.contains(filePath)) {将
建议:
2. 信号发射与状态管理优点: Q_EMIT itemRemoved(itemData);添加了 潜在问题: Q_EMIT requestShowSpinner(false, true, DFontSpinnerWidget::Delete);
Q_EMIT rowCountChanged();
Q_EMIT deleteFinished();在短时间内发射多个信号可能会造成性能问题,特别是如果这些信号连接到多个槽函数时。 建议:
3. 焦点管理新增代码: if (m_FontViewHasFocus) {
refreshFocuses();
setFontViewHasFocus(false);
}建议:
4. 代码组织建议:
5. 资源管理观察: m_dataThread->removePathWatcher(filePath);在删除字体文件前移除文件监视器是正确的做法,避免了不必要的文件系统事件。 安全性考虑
改进建议代码void DFontPreviewListView::deleteCurFonts(QStringList &files, bool force)
{
qDebug() << __FUNCTION__ << " before delete " << m_dataThread->getFontModelList().size() << m_fontPreviewProxyModel->rowCount();
int deleteCount = files.count();
// 使用 QSet 优化查找性能,时间复杂度从 O(n) 降低到 O(1)
const QSet<QString> fileSet(files.begin(), files.end());
if (!force)
updateSpinner(DFontSpinnerWidget::Delete, false);
for (auto iter = m_dataThread->m_fontModelList.begin(); iter != m_dataThread->m_fontModelList.end();) {
DFontPreviewItemData itemData(*iter);
QString filePath = itemData.fontInfo.filePath;
// 如果字体文件已经不存在,则从t_manager表中删除
if (fileSet.contains(filePath)) {
// 删除字体之前启用字体,防止下次重新安装后就被禁用
enableFont(itemData.fontInfo.filePath);
DFMDBManager::instance()->deleteFontInfo(itemData);
// 移除文件监视器,避免不必要的文件系统事件
m_dataThread->removePathWatcher(filePath);
iter = m_dataThread->m_fontModelList.erase(iter);
m_recoverSelectStateUserfontMultiMap.remove(filePath);
// 通知其他组件字体已删除
Q_EMIT itemRemoved(itemData);
} else {
++iter;
}
}
enableFonts();
// 执行删除后的操作
postDeleteOperations(deleteCount, force);
m_dataThread->onAutoDirWatchers();
qDebug() << "Exiting function: DFontPreviewListView::deleteCurFonts";
}
void DFontPreviewListView::postDeleteOperations(int deleteCount, bool force)
{
// 设置预览大小(与 updateModel 保持一致)
emit m_signalManager->fontSizeRequestToSlider();
// 删除之后设置焦点(与 updateModel 保持一致)
if (m_FontViewHasFocus) {
refreshFocuses();
setFontViewHasFocus(false);
}
// 批量发射信号,减少信号发射次数
Q_EMIT requestShowSpinner(false, true, DFontSpinnerWidget::Delete);
Q_EMIT rowCountChanged();
Q_EMIT deleteFinished();
syncTabStatus();
m_recoveryTabFocusState = false;
PerformanceMonitor::deleteFontFinish(deleteCount);
}总结该代码修改主要优化了字体删除操作的性能,并增强了删除后的状态管理。使用 |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: dengzhongyuan365-dev, lzwind 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 |
|
/forcemerge |
bug: https://pms.uniontech.com/bug-view-351365.html https://pms.uniontech.com/bug-view-321575.html
Summary by Sourcery
Optimize the font deletion workflow in DFontPreviewListView to improve performance and keep the UI state in sync without rebuilding the entire model.
Bug Fixes:
Enhancements: