Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 81 additions & 8 deletions deepin-font-manager/interfaces/dfontpreviewlistview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,13 @@
#include <QMenu>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QFocusEvent>

Check warning on line 26 in deepin-font-manager/interfaces/dfontpreviewlistview.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QFocusEvent> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <QSet>

Check warning on line 27 in deepin-font-manager/interfaces/dfontpreviewlistview.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QSet> not found. Please note: Cppcheck does not need standard library headers to get proper results.

#include <QDBusInterface>

Check warning on line 29 in deepin-font-manager/interfaces/dfontpreviewlistview.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QDBusInterface> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <QDBusReply>

Check warning on line 30 in deepin-font-manager/interfaces/dfontpreviewlistview.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QDBusReply> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <QDBusConnection>

Check warning on line 31 in deepin-font-manager/interfaces/dfontpreviewlistview.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QDBusConnection> not found. Please note: Cppcheck does not need standard library headers to get proper results.

DWIDGET_USE_NAMESPACE

DFontPreviewListView::DFontPreviewListView(QWidget *parent)
Expand Down Expand Up @@ -1955,9 +1959,26 @@
// qDebug() << __FUNCTION__ << " before " << currModelIndex().row() << currentIndex().row();
bool needShowTips = false;
int count = 0;
QMutexLocker locker(&m_mutex);
int skippedInUse = 0;
QString skippedInUseFontName;
QString fontName;

// 通过 D-Bus 查询 DDE 外观服务设置的当前系统字体(放在锁外,避免同步 IPC 阻塞其他线程)
QString ddeStandardFont;
{
QDBusInterface iface(QStringLiteral("org.deepin.dde.Appearance1"),
QStringLiteral("/org/deepin/dde/Appearance1"),
QStringLiteral("org.freedesktop.DBus.Properties"),
QDBusConnection::sessionBus());
QDBusReply<QVariant> reply = iface.call(QStringLiteral("Get"),
QStringLiteral("org.deepin.dde.Appearance1"),
QStringLiteral("StandardFont"));
if (reply.isValid())
ddeStandardFont = reply.value().toString();
}

QMutexLocker locker(&m_mutex);

#if QT_VERSION_MAJOR > 5
if (isFromActiveFont)
std::sort(itemIndexes.begin(), itemIndexes.end(), std::greater<QModelIndex>());
Expand Down Expand Up @@ -1999,6 +2020,7 @@
DFontPreviewProxyModel *filterModel = getFontPreviewProxyModel();
int oldFilterGroup = filterModel->getFilterGroup(); // 保存当前字体组
filterModel->setFilterGroup(DSplitListWidget::UserFont); // 只有用户字体才能被禁用
QString appFontFamily = qApp->font().family(); // 循环内不变,提前获取
for (int i = 0; i < filterModel->rowCount(); ++i) {
QModelIndex index = filterModel->index(i, 0);
FontData fdata = qvariant_cast<FontData>(m_fontPreviewProxyModel->data(index));
Expand All @@ -2008,7 +2030,23 @@
if (setValue) {
enableFont(itemData.fontInfo.filePath);
} else {
if (systemCnt > 0 || curCnt > 0) {
// 正在使用的字体不被禁用,跳过并提示
QStringList fontFamilies = DFontInfoManager::instance()->getFontFamilyStyle(itemData.fontInfo.filePath);
bool isInUse = (itemData.fontData == m_curFontData) ||
(itemData.fontInfo.filePath == m_dataThread->getFontData(m_curFontData).fontInfo.filePath) ||
(itemData.fontInfo.familyName == appFontFamily) ||
fontFamilies.contains(appFontFamily) ||
(!ddeStandardFont.isEmpty() && itemData.fontInfo.familyName == ddeStandardFont) ||
(!ddeStandardFont.isEmpty() && fontFamilies.contains(ddeStandardFont));
if (isInUse) {
skippedInUse++;
if (skippedInUseFontName.isEmpty())
skippedInUseFontName = itemData.fontData.strFontName;
needShowTips = true;
continue;
}

if (systemCnt > 0) {
needShowTips = true;
}

Expand All @@ -2028,6 +2066,14 @@
}
filterModel->setFilterGroup(oldFilterGroup); // 恢复原字体组

// 若 selectedFonts() 已检测到正在使用的字体但被正确排除在 disableIndexList 外,
// 同样计入提示计数
if (curCnt > 0) {
if (skippedInUse == 0) {
skippedInUse = curCnt;
}
needShowTips = true;
}

DFMDBManager::instance()->commitUpdateFontInfo();

Expand All @@ -2052,9 +2098,14 @@
if (needShowTips) {
qDebug() << "Need show tips";
//不可禁用字体
if (curCnt > 0 && systemCnt == 0) {
message = QApplication::translate("MessageManager", "%1 is in use, so you cannot disable it").arg(m_curFontData.strFontName);
} else if (curCnt > 0 && systemCnt > 0) {
if (skippedInUse > 0 && systemCnt == 0) {
QString inUseName = skippedInUseFontName;
if (inUseName.isEmpty())
inUseName = m_curFontData.strFontName;
if (inUseName.isEmpty() && !ddeStandardFont.isEmpty())
inUseName = ddeStandardFont;
message = QApplication::translate("MessageManager", "%1 is in use, so you cannot disable it").arg(inUseName);
} else if (skippedInUse > 0 && systemCnt > 0) {
message = QApplication::translate("MessageManager", "You cannot disable system fonts and the fonts in use");
} else {
message = QApplication::translate("MessageManager", "You cannot disable system fonts");
Expand All @@ -2068,7 +2119,7 @@
}
}
//禁用字体大于零
if (count > 0)
if (count > 0 || needShowTips)
DMessageManager::instance()->sendMessage(this->m_parentWidget, QIcon("://ok.svg"), message);

qDebug() << __FUNCTION__ << " after " << currModelIndex().row() << currentIndex().row();
Expand Down Expand Up @@ -2564,6 +2615,20 @@
curCollected = curData.fontData.isCollected();
}

// 通过 D-Bus 查询 DDE 外观服务设置的当前系统字体
QString ddeStandardFont;
{
QDBusInterface iface(QStringLiteral("org.deepin.dde.Appearance1"),
QStringLiteral("/org/deepin/dde/Appearance1"),
QStringLiteral("org.freedesktop.DBus.Properties"),
QDBusConnection::sessionBus());
QDBusReply<QVariant> reply = iface.call(QStringLiteral("Get"),
QStringLiteral("org.deepin.dde.Appearance1"),
QStringLiteral("StandardFont"));
if (reply.isValid())
ddeStandardFont = reply.value().toString();
}

for (QModelIndex &index : list) {
// qDebug() << "Calculate item";
QVariant varModel = m_fontPreviewProxyModel->data(index, Qt::DisplayRole);
Expand Down Expand Up @@ -2597,8 +2662,15 @@
*systemCnt += 1;
if (calCollect && (curCollected == itemData.fontData.isCollected()))
*allIndexList << index;
} else if ((itemData.fontData == m_curFontData) ||
(itemData.fontInfo.filePath == m_dataThread->getFontData(m_curFontData).fontInfo.filePath)) {
} else {
const QStringList fontFamilies = DFontInfoManager::instance()->getFontFamilyStyle(itemData.fontInfo.filePath);
if ((itemData.fontData == m_curFontData) ||
(itemData.fontInfo.filePath == m_dataThread->getFontData(m_curFontData).fontInfo.filePath) ||
(itemData.fontInfo.familyName == qApp->font().family()) ||
fontFamilies.contains(qApp->font().family()) ||
(!ddeStandardFont.isEmpty() &&
(itemData.fontInfo.familyName == ddeStandardFont ||
fontFamilies.contains(ddeStandardFont)))) {
// qDebug() << "Calculate current font";
// 选中字体与当前使用的字体为同一字体文件
// ttc字体集,即使不是同一个字体,也是同一个字体文件
Expand Down Expand Up @@ -2632,6 +2704,7 @@
*allIndexList << index;
}
}
}
}

if (delFontList && deleteCnt)
Expand Down
1 change: 1 addition & 0 deletions libdeepin-font-manager/dfontinfomanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -874,6 +874,7 @@ QStringList DFontInfoManager::getFontFamilyStyle(const QString &filePah)
const FcChar8 *format = reinterpret_cast<const FcChar8 *>("%{=fclist}");
FcObjectSet *os = FcObjectSetBuild(FC_FAMILY, FC_STYLE, FC_FILE, nullptr);
FcPattern *pat = FcPatternCreate();
FcPatternAddString(pat, FC_FILE, reinterpret_cast<const FcChar8 *>(filePah.toUtf8().data()));
FcFontSet *fs = FcFontList(nullptr, pat, os);

if (os)
Expand Down
Loading