Skip to content

Commit eebd341

Browse files
committed
fix: skip in-use font when disabling via D-Bus StandardFont query
log: Query org.deepin.dde.Appearance1 StandardFont property via D-Bus to detect the system font set through dde-control-center. Skip currently in-use user fonts during multi-select disable and show the font name in the warning message. pms: bug-347233
1 parent 3a2efbe commit eebd341

1 file changed

Lines changed: 81 additions & 8 deletions

File tree

deepin-font-manager/interfaces/dfontpreviewlistview.cpp

Lines changed: 81 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
#include <QFocusEvent>
2727
#include <QSet>
2828

29+
#include <QDBusInterface>
30+
#include <QDBusReply>
31+
#include <QDBusConnection>
32+
2933
DWIDGET_USE_NAMESPACE
3034

3135
DFontPreviewListView::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

Comments
 (0)