2626#include < QFocusEvent>
2727#include < QSet>
2828
29+ #include < QDBusInterface>
30+ #include < QDBusReply>
31+ #include < QDBusConnection>
32+
2933DWIDGET_USE_NAMESPACE
3034
3135DFontPreviewListView::DFontPreviewListView (QWidget *parent)
@@ -1955,9 +1959,26 @@ void DFontPreviewListView::onEnableBtnClicked(QModelIndexList &itemIndexes, int
19551959 // qDebug() << __FUNCTION__ << " before " << currModelIndex().row() << currentIndex().row();
19561960 bool needShowTips = false ;
19571961 int count = 0 ;
1958- QMutexLocker locker (&m_mutex);
1962+ int skippedInUse = 0 ;
1963+ QString skippedInUseFontName;
19591964 QString fontName;
19601965
1966+ // 通过 D-Bus 查询 DDE 外观服务设置的当前系统字体(放在锁外,避免同步 IPC 阻塞其他线程)
1967+ QString ddeStandardFont;
1968+ {
1969+ QDBusInterface iface (QStringLiteral (" org.deepin.dde.Appearance1" ),
1970+ QStringLiteral (" /org/deepin/dde/Appearance1" ),
1971+ QStringLiteral (" org.freedesktop.DBus.Properties" ),
1972+ QDBusConnection::sessionBus ());
1973+ QDBusReply<QVariant> reply = iface.call (QStringLiteral (" Get" ),
1974+ QStringLiteral (" org.deepin.dde.Appearance1" ),
1975+ QStringLiteral (" StandardFont" ));
1976+ if (reply.isValid ())
1977+ ddeStandardFont = reply.value ().toString ();
1978+ }
1979+
1980+ QMutexLocker locker (&m_mutex);
1981+
19611982#if QT_VERSION_MAJOR > 5
19621983 if (isFromActiveFont)
19631984 std::sort (itemIndexes.begin (), itemIndexes.end (), std::greater<QModelIndex>());
@@ -1999,6 +2020,7 @@ void DFontPreviewListView::onEnableBtnClicked(QModelIndexList &itemIndexes, int
19992020 DFontPreviewProxyModel *filterModel = getFontPreviewProxyModel ();
20002021 int oldFilterGroup = filterModel->getFilterGroup (); // 保存当前字体组
20012022 filterModel->setFilterGroup (DSplitListWidget::UserFont); // 只有用户字体才能被禁用
2023+ QString appFontFamily = qApp->font ().family (); // 循环内不变,提前获取
20022024 for (int i = 0 ; i < filterModel->rowCount (); ++i) {
20032025 QModelIndex index = filterModel->index (i, 0 );
20042026 FontData fdata = qvariant_cast<FontData>(m_fontPreviewProxyModel->data (index));
@@ -2008,7 +2030,23 @@ void DFontPreviewListView::onEnableBtnClicked(QModelIndexList &itemIndexes, int
20082030 if (setValue) {
20092031 enableFont (itemData.fontInfo .filePath );
20102032 } else {
2011- if (systemCnt > 0 || curCnt > 0 ) {
2033+ // 正在使用的字体不被禁用,跳过并提示
2034+ QStringList fontFamilies = DFontInfoManager::instance ()->getFontFamilyStyle (itemData.fontInfo .filePath );
2035+ bool isInUse = (itemData.fontData == m_curFontData) ||
2036+ (itemData.fontInfo .filePath == m_dataThread->getFontData (m_curFontData).fontInfo .filePath ) ||
2037+ (itemData.fontInfo .familyName == appFontFamily) ||
2038+ fontFamilies.contains (appFontFamily) ||
2039+ (!ddeStandardFont.isEmpty () && itemData.fontInfo .familyName == ddeStandardFont) ||
2040+ (!ddeStandardFont.isEmpty () && fontFamilies.contains (ddeStandardFont));
2041+ if (isInUse) {
2042+ skippedInUse++;
2043+ if (skippedInUseFontName.isEmpty ())
2044+ skippedInUseFontName = itemData.fontData .strFontName ;
2045+ needShowTips = true ;
2046+ continue ;
2047+ }
2048+
2049+ if (systemCnt > 0 ) {
20122050 needShowTips = true ;
20132051 }
20142052
@@ -2028,6 +2066,14 @@ void DFontPreviewListView::onEnableBtnClicked(QModelIndexList &itemIndexes, int
20282066 }
20292067 filterModel->setFilterGroup (oldFilterGroup); // 恢复原字体组
20302068
2069+ // 若 selectedFonts() 已检测到正在使用的字体但被正确排除在 disableIndexList 外,
2070+ // 同样计入提示计数
2071+ if (curCnt > 0 ) {
2072+ if (skippedInUse == 0 ) {
2073+ skippedInUse = curCnt;
2074+ }
2075+ needShowTips = true ;
2076+ }
20312077
20322078 DFMDBManager::instance ()->commitUpdateFontInfo ();
20332079
@@ -2052,9 +2098,14 @@ void DFontPreviewListView::onEnableBtnClicked(QModelIndexList &itemIndexes, int
20522098 if (needShowTips) {
20532099 qDebug () << " Need show tips" ;
20542100 // 不可禁用字体
2055- if (curCnt > 0 && systemCnt == 0 ) {
2056- message = QApplication::translate (" MessageManager" , " %1 is in use, so you cannot disable it" ).arg (m_curFontData.strFontName );
2057- } else if (curCnt > 0 && systemCnt > 0 ) {
2101+ if (skippedInUse > 0 && systemCnt == 0 ) {
2102+ QString inUseName = skippedInUseFontName;
2103+ if (inUseName.isEmpty ())
2104+ inUseName = m_curFontData.strFontName ;
2105+ if (inUseName.isEmpty () && !ddeStandardFont.isEmpty ())
2106+ inUseName = ddeStandardFont;
2107+ message = QApplication::translate (" MessageManager" , " %1 is in use, so you cannot disable it" ).arg (inUseName);
2108+ } else if (skippedInUse > 0 && systemCnt > 0 ) {
20582109 message = QApplication::translate (" MessageManager" , " You cannot disable system fonts and the fonts in use" );
20592110 } else {
20602111 message = QApplication::translate (" MessageManager" , " You cannot disable system fonts" );
@@ -2068,7 +2119,7 @@ void DFontPreviewListView::onEnableBtnClicked(QModelIndexList &itemIndexes, int
20682119 }
20692120 }
20702121 // 禁用字体大于零
2071- if (count > 0 )
2122+ if (count > 0 || needShowTips )
20722123 DMessageManager::instance ()->sendMessage (this ->m_parentWidget , QIcon (" ://ok.svg" ), message);
20732124
20742125 qDebug () << __FUNCTION__ << " after " << currModelIndex ().row () << currentIndex ().row ();
@@ -2564,6 +2615,20 @@ void DFontPreviewListView::selectedFonts(const DFontPreviewItemData &curData,
25642615 curCollected = curData.fontData .isCollected ();
25652616 }
25662617
2618+ // 通过 D-Bus 查询 DDE 外观服务设置的当前系统字体
2619+ QString ddeStandardFont;
2620+ {
2621+ QDBusInterface iface (QStringLiteral (" org.deepin.dde.Appearance1" ),
2622+ QStringLiteral (" /org/deepin/dde/Appearance1" ),
2623+ QStringLiteral (" org.freedesktop.DBus.Properties" ),
2624+ QDBusConnection::sessionBus ());
2625+ QDBusReply<QVariant> reply = iface.call (QStringLiteral (" Get" ),
2626+ QStringLiteral (" org.deepin.dde.Appearance1" ),
2627+ QStringLiteral (" StandardFont" ));
2628+ if (reply.isValid ())
2629+ ddeStandardFont = reply.value ().toString ();
2630+ }
2631+
25672632 for (QModelIndex &index : list) {
25682633 // qDebug() << "Calculate item";
25692634 QVariant varModel = m_fontPreviewProxyModel->data (index, Qt::DisplayRole);
@@ -2597,8 +2662,15 @@ void DFontPreviewListView::selectedFonts(const DFontPreviewItemData &curData,
25972662 *systemCnt += 1 ;
25982663 if (calCollect && (curCollected == itemData.fontData .isCollected ()))
25992664 *allIndexList << index;
2600- } else if ((itemData.fontData == m_curFontData) ||
2601- (itemData.fontInfo .filePath == m_dataThread->getFontData (m_curFontData).fontInfo .filePath )) {
2665+ } else {
2666+ const QStringList fontFamilies = DFontInfoManager::instance ()->getFontFamilyStyle (itemData.fontInfo .filePath );
2667+ if ((itemData.fontData == m_curFontData) ||
2668+ (itemData.fontInfo .filePath == m_dataThread->getFontData (m_curFontData).fontInfo .filePath ) ||
2669+ (itemData.fontInfo .familyName == qApp->font ().family ()) ||
2670+ fontFamilies.contains (qApp->font ().family ()) ||
2671+ (!ddeStandardFont.isEmpty () &&
2672+ (itemData.fontInfo .familyName == ddeStandardFont ||
2673+ fontFamilies.contains (ddeStandardFont)))) {
26022674 // qDebug() << "Calculate current font";
26032675 // 选中字体与当前使用的字体为同一字体文件
26042676 // ttc字体集,即使不是同一个字体,也是同一个字体文件
@@ -2632,6 +2704,7 @@ void DFontPreviewListView::selectedFonts(const DFontPreviewItemData &curData,
26322704 *allIndexList << index;
26332705 }
26342706 }
2707+ }
26352708 }
26362709
26372710 if (delFontList && deleteCnt)
0 commit comments