diff --git a/widgets/ukui-task-manager/libukui-task-manager_zh_CN.ts b/widgets/ukui-task-manager/libukui-task-manager_zh_CN.ts index 1ad9b28..5b89f8b 100644 --- a/widgets/ukui-task-manager/libukui-task-manager_zh_CN.ts +++ b/widgets/ukui-task-manager/libukui-task-manager_zh_CN.ts @@ -32,32 +32,32 @@ TaskManager::UkuiTaskManager - + Close 关闭 - + Restore 还原 - + Maximize 最大化 - + Minimize 最小化 - + Keep above 置顶 - + Unset keep above 取消置顶 diff --git a/widgets/ukui-task-manager/task-manager-item.cpp b/widgets/ukui-task-manager/task-manager-item.cpp index 13439ad..6ce31e1 100644 --- a/widgets/ukui-task-manager/task-manager-item.cpp +++ b/widgets/ukui-task-manager/task-manager-item.cpp @@ -319,6 +319,59 @@ void TaskManagerItem::windowChanged(const QString &winID) } } +void TaskManagerItem::iconChanged(const QString &windowId) +{ + Q_UNUSED(windowId) + if(!hasLauncher()) { + d->m_icon = WindowManager::windowIcon(winIDs().at(0)); + if(d->m_icon.isNull()) { + d->m_icon = d->m_xdf.icon(); + } + Q_EMIT dataUpdated(QVector{UkuiTaskManager::Icon}); + } +} + +void TaskManagerItem::titleChanged(const QString &windowId) +{ + Q_UNUSED(windowId) + if(!hasLauncher()) { + if (d->m_name.isEmpty()) { + d->m_name = WindowManager::windowTitle(winIDs().at(0)); + } + Q_EMIT dataUpdated(QVector{UkuiTaskManager::Name}); + } +} + +void TaskManagerItem::desktopChanged(const QString &windowId) +{ + if(currentDesktopWinIDs().contains(windowId)) { + if(!WindowManager::isOnAllDesktops(windowId) && !WindowManager::isOnCurrentDesktop(windowId)) { + d->m_winIDsOnCurrentDesktop.removeAll(windowId); + Q_EMIT dataUpdated(QVector{UkuiTaskManager::CurrentDesktopWinIDList}); + } + } else { + if(WindowManager::isOnAllDesktops(windowId) || WindowManager::isOnCurrentDesktop(windowId)) { + d->m_winIDsOnCurrentDesktop.append(windowId); + Q_EMIT dataUpdated(QVector{UkuiTaskManager::CurrentDesktopWinIDList}); + } + } +} + +void TaskManagerItem::demandsAttentionChanged(const QString &windowId) +{ + if(WindowManager::isDemandsAttention(windowId)) { + if(!d->m_demandsAttentionWinIDs.contains(windowId)) { + d->m_demandsAttentionWinIDs.append(windowId); + Q_EMIT dataUpdated(QVector{UkuiTaskManager::DemandsAttentionWinIDList}); + } + } else { + if(d->m_demandsAttentionWinIDs.contains(windowId)) { + d->m_demandsAttentionWinIDs.removeAll(windowId); + Q_EMIT dataUpdated(QVector{UkuiTaskManager::DemandsAttentionWinIDList}); + } + } +} + void TaskManagerItem::refreshWinIdsOnCurrentDesktop() { d->m_winIDsOnCurrentDesktop.clear(); diff --git a/widgets/ukui-task-manager/task-manager-item.h b/widgets/ukui-task-manager/task-manager-item.h index e6605f2..e5e3e81 100644 --- a/widgets/ukui-task-manager/task-manager-item.h +++ b/widgets/ukui-task-manager/task-manager-item.h @@ -47,6 +47,11 @@ public: void addWinID(const QString &winID); void removeWinID(const QString &winID); void windowChanged(const QString &winID); + void iconChanged(const QString& windowId); + void titleChanged(const QString& windowId); + void desktopChanged(const QString& windowId); + void demandsAttentionChanged(const QString& windowId); + const QString &group() const; void setGroup(const QString &group); bool hasLauncher() const; diff --git a/widgets/ukui-task-manager/ukui-task-manager.cpp b/widgets/ukui-task-manager/ukui-task-manager.cpp index af9ea0b..60878fe 100644 --- a/widgets/ukui-task-manager/ukui-task-manager.cpp +++ b/widgets/ukui-task-manager/ukui-task-manager.cpp @@ -56,9 +56,13 @@ public: explicit Private(UkuiTaskManager *q = nullptr); ~Private(); - void onWindowAdded(const QString &windowId); - void onWindowRemoved(const QString &windowId); - void onWindowChanged(const QString& windowId); + void windowAdded(const QString &windowId); + void windowRemoved(const QString &windowId); + void iconChanged(const QString& windowId); + void titleChanged(const QString& windowId); + void desktopChanged(const QString& windowId); + void demandsAttentionChanged(const QString& windowId); + void skipTaskbarChanged(const QString& windowId); void loadSettings(); void save() const; void loadWindows(); @@ -118,7 +122,7 @@ void UkuiTaskManager::Private::loadSettings() m_settings->endGroup(); } -void UkuiTaskManager::Private::onWindowAdded(const QString &windowId) +void UkuiTaskManager::Private::windowAdded(const QString &windowId) { //过滤不需要显示的窗口 if(WindowManager::skipTaskBar(windowId)) { @@ -142,7 +146,7 @@ void UkuiTaskManager::Private::onWindowAdded(const QString &windowId) newItem(windowId); } -void UkuiTaskManager::Private::onWindowRemoved(const QString &windowId) +void UkuiTaskManager::Private::windowRemoved(const QString &windowId) { for (int index = 0; index < m_items.size(); ++index) { auto item = m_items.at(index); @@ -158,7 +162,43 @@ void UkuiTaskManager::Private::onWindowRemoved(const QString &windowId) } } -void UkuiTaskManager::Private::onWindowChanged(const QString &windowId) +void UkuiTaskManager::Private::iconChanged(const QString &windowId) +{ + for(const auto item : m_items) { + if(item->winIDs().contains(windowId)) { + item->iconChanged(windowId); + } + } +} + +void UkuiTaskManager::Private::titleChanged(const QString &windowId) +{ + for(const auto item : m_items) { + if(item->winIDs().contains(windowId)) { + item->titleChanged(windowId); + } + } +} + +void UkuiTaskManager::Private::desktopChanged(const QString &windowId) +{ + for(const auto item : m_items) { + if(item->winIDs().contains(windowId)) { + item->desktopChanged(windowId); + } + } +} + +void UkuiTaskManager::Private::demandsAttentionChanged(const QString &windowId) +{ + for(const auto item : m_items) { + if(item->winIDs().contains(windowId)) { + item->demandsAttentionChanged(windowId); + } + } +} + +void UkuiTaskManager::Private::skipTaskbarChanged(const QString &windowId) { bool skipTaskBar = WindowManager::skipTaskBar(windowId); QString windowGroup = WindowManager::windowGroup(windowId); @@ -173,8 +213,6 @@ void UkuiTaskManager::Private::onWindowChanged(const QString &windowId) delete m_items.takeAt(index); q->endRemoveRows(); } - } else { - item->windowChanged(windowId); } handled = true; break; @@ -194,7 +232,7 @@ void UkuiTaskManager::Private::onWindowChanged(const QString &windowId) void UkuiTaskManager::Private::loadWindows() { for (const QString &winID: WindowManager::windows()) { - onWindowAdded(winID); + windowAdded(winID); } } @@ -280,25 +318,28 @@ UkuiTaskManager::UkuiTaskManager(QObject *parent) : QAbstractListModel(parent), //加载当前打开的窗口 d->loadWindows(); connect(WindowManager::self(), &WindowManager::windowAdded, this, [&](const QString &winId) { - d->onWindowAdded(winId); + d->windowAdded(winId); }); connect(WindowManager::self(), &WindowManager::windowRemoved, this, [&](const QString &winId) { - d->onWindowRemoved(winId); + d->windowRemoved(winId); }); connect(WindowManager::self(), &WindowManager::titleChanged, this, [&](const QString &winId) { - d->onWindowChanged(winId); + d->titleChanged(winId); }); connect(WindowManager::self(), &WindowManager::iconChanged, this, [&](const QString &winId) { - d->onWindowChanged(winId); + d->iconChanged(winId); }); connect(WindowManager::self(), &WindowManager::onAllDesktopsChanged, this, [&](const QString &winId) { - d->onWindowChanged(winId); + d->desktopChanged(winId); + }); + connect(WindowManager::self(), &WindowManager::windowDesktopChanged, this, [&](const QString &winId) { + d->desktopChanged(winId); }); connect(WindowManager::self(), &WindowManager::demandsAttentionChanged, this, [&](const QString &winId) { - d->onWindowChanged(winId); + d->demandsAttentionChanged(winId); }); connect(WindowManager::self(), &WindowManager::skipTaskbarChanged, this, [&](const QString &winId) { - d->onWindowChanged(winId); + d->skipTaskbarChanged(winId); }); auto conn = QDBusConnection::sessionBus(); d->m_watcher = new QDBusServiceWatcher(QStringLiteral("org.freedesktop.Notifications"), diff --git a/widgets/ukui-task-manager/window-manager.cpp b/widgets/ukui-task-manager/window-manager.cpp index f1d6ffa..5fe37d1 100644 --- a/widgets/ukui-task-manager/window-manager.cpp +++ b/widgets/ukui-task-manager/window-manager.cpp @@ -64,6 +64,7 @@ WindowManager::WindowManager(QObject *parent) : QObject(parent) connect(WindowManagerPrivate::interface(), &AbstractWindowManager::iconChanged, this, &WindowManager::iconChanged); connect(WindowManagerPrivate::interface(), &AbstractWindowManager::skipTaskbarChanged, this, &WindowManager::skipTaskbarChanged); connect(WindowManagerPrivate::interface(), &AbstractWindowManager::onAllDesktopsChanged, this, &WindowManager::onAllDesktopsChanged); + connect(WindowManagerPrivate::interface(), &AbstractWindowManager::windowDesktopChanged, this, &WindowManager::windowDesktopChanged); connect(WindowManagerPrivate::interface(), &AbstractWindowManager::demandsAttentionChanged, this, &WindowManager::demandsAttentionChanged); } diff --git a/widgets/ukui-task-manager/window-manager.h b/widgets/ukui-task-manager/window-manager.h index 164e749..568be74 100644 --- a/widgets/ukui-task-manager/window-manager.h +++ b/widgets/ukui-task-manager/window-manager.h @@ -64,6 +64,7 @@ Q_SIGNALS: void iconChanged(QString wid); void skipTaskbarChanged(QString wid); void onAllDesktopsChanged(QString wid); + void windowDesktopChanged(QString wid); void demandsAttentionChanged(QString wid); private: WindowManager(QObject *parent = nullptr);