feat(task-manager):增加应用图标的激活与非激活 UI 状态

This commit is contained in:
iaom 2023-12-19 15:37:12 +08:00
parent d61f21f383
commit 45f8d8a1ec
13 changed files with 91 additions and 15 deletions

View File

@ -70,6 +70,7 @@ Q_SIGNALS:
void onAllDesktopsChanged(QString wid);
void demandsAttentionChanged(QString wid);
void geometryChanged(QString wid);
void activeWindowChanged(QString id);
//xcb only
void windowStateChanged(QString wid);

View File

@ -164,6 +164,7 @@ ListView {
property var currentWinIdList: model.CurrentWinIdList
property var modelIcon: model.Icon
property var demandsAttentionWinIdList: model.DemandsAttentionWinIdList
property var hasActiveWindow: model.HasActiveWindow
sourceComponent: isMergeApp ? appIconComponent : applistComponent
onCurrentWinIdListChanged: {

View File

@ -48,7 +48,8 @@ Item {
anchors.verticalCenter: backgroud.bottom
anchors.horizontalCenter: parent.horizontalCenter
useStyleTransparency: false
paletteRole: Items.Theme.Highlight
paletteRole: hasActiveWindow? Items.Theme.Highlight : Items.Theme.BrightText
alpha: hasActiveWindow? 1 : 0.3
Behavior on width {
NumberAnimation { duration: 200 }
}

View File

@ -5,6 +5,7 @@
#include "task-manager-filter-model.h"
#include <QDebug>
#include "ukui-task-manager.h"
#include "window-manager.h"
namespace TaskManager {
TaskManagerFilterModel::TaskManagerFilterModel(QObject *parent) : QSortFilterProxyModel(parent)
{
@ -15,23 +16,19 @@ void TaskManagerFilterModel::setSourceModel(QAbstractItemModel *sourceModel)
{
m_sourceModel = qobject_cast<TaskManagerModel*>(sourceModel);
QSortFilterProxyModel::setSourceModel(sourceModel);
connect(sourceModel, &QAbstractItemModel::dataChanged, this, [&](const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>()){
Q_EMIT dataChanged(mapFromSource(topLeft), mapFromSource(bottomRight), roles);
});
connect(sourceModel, &QAbstractItemModel::dataChanged, this, &TaskManagerFilterModel::onDataChanged);
m_sourceModel->sort(0, Qt::AscendingOrder);
}
QVariant TaskManagerFilterModel::data(const QModelIndex &index, int role) const
{
if(role == UkuiTaskManager::CurrentWinIdList && m_screen) {
QStringList wins;
auto winIdOnScreen = mapToSource(index).data(UkuiTaskManager::WinIdsOnScreens).value<QMap<QString, QScreen *>>();
for(const QString &wid : mapToSource(index).data(UkuiTaskManager::CurrentDesktopWinIdList).toStringList()) {
if(m_screen == winIdOnScreen.value(wid)) {
wins.append(wid);
}
if(role == UkuiTaskManager::CurrentWinIdList && m_screen) {
return currentWinIdList(index);
} else if(role == UkuiTaskManager::HasActiveWindow) {
if(m_screen && mapToSource(index).data(role).toBool()) {
return currentWinIdList(index).contains(WindowManager::currentActiveWindow());
}
return wins;
return false;
}
return sourceModel()->data(mapToSource(index), role);
}
@ -100,7 +97,6 @@ void TaskManagerFilterModel::openMenu(const Actions &modelActions, const QModelI
menu->addAction(action->internalAction());
}
if (menu->actions().isEmpty()) {
delete menu;
return;
@ -108,4 +104,25 @@ void TaskManagerFilterModel::openMenu(const Actions &modelActions, const QModelI
m_contextMenu = menu;
menu->popup(QCursor::pos());
}
QStringList TaskManagerFilterModel::currentWinIdList(const QModelIndex &index) const
{
QStringList wins;
auto winIdOnScreen = mapToSource(index).data(UkuiTaskManager::WinIdsOnScreens).value<QMap<QString, QScreen *>>();
for(const QString &wid : mapToSource(index).data(UkuiTaskManager::CurrentDesktopWinIdList).toStringList()) {
if(m_screen == winIdOnScreen.value(wid)) {
wins.append(wid);
}
}
return wins;
}
void TaskManagerFilterModel::onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight,
const QVector<int> &roles)
{
Q_EMIT dataChanged(mapFromSource(topLeft), mapFromSource(bottomRight), roles);
if(roles.contains(UkuiTaskManager::CurrentDesktopWinIdList) || roles.contains(UkuiTaskManager::WinIdsOnScreens)) {
Q_EMIT dataChanged(mapFromSource(topLeft), mapFromSource(bottomRight), {UkuiTaskManager::HasActiveWindow});
}
}
}

View File

@ -38,7 +38,8 @@ protected:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
private:
QStringList currentWinIdList(const QModelIndex &index) const;
void onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>());
TaskManagerModel *m_sourceModel = nullptr;
QScreen *m_screen = nullptr;
QPointer<QMenu> m_contextMenu;

View File

@ -48,6 +48,7 @@ public:
uint m_unreadMessagesNum = 0;
QStringList m_demandsAttentionWinIDs;
QMap<QString, QScreen *> m_widToScreen;
bool m_hasActiveWindow;
};
TaskManagerItem::TaskManagerItem(QObject *parent) : QObject(parent), d(new TaskManagerItemPrivate)
@ -59,6 +60,7 @@ TaskManagerItem::TaskManagerItem(const QString &appID, QObject *parent): QObject
d->m_ID = appID;
d->m_xdf.load(appID);
}
TaskManagerItem::TaskManagerItem(const QStringList &winIDs, QObject *parent) : QObject(parent), d(new TaskManagerItemPrivate)
{
d->m_winIDs = winIDs;
@ -199,6 +201,19 @@ void TaskManagerItem::removeWinID(const QString &winID)
}
}
void TaskManagerItem::setHasActiveWindow(bool has)
{
if(d->m_hasActiveWindow != has) {
d->m_hasActiveWindow = has;
Q_EMIT dataUpdated(QVector<int>{UkuiTaskManager::HasActiveWindow});
}
}
bool TaskManagerItem::hasActiveWindow()
{
return d->m_hasActiveWindow;
}
const QString &TaskManagerItem::group() const
{
return d->m_group;
@ -445,4 +460,3 @@ const QMap<QString, QScreen *> &TaskManagerItem::winIdOnScreens() const

View File

@ -53,6 +53,8 @@ public:
void demandsAttentionChanged(const QString& windowId);
void geometryChanged(const QString& windowId);
void setHasActiveWindow(bool has);
bool hasActiveWindow();
const QString &group() const;
void setGroup(const QString &group);
bool hasLauncher() const;

View File

@ -60,6 +60,7 @@ public:
void windowAdded(const QString &windowId);
void windowRemoved(const QString &windowId);
void skipTaskbarChanged(const QString& windowId);
void activeWindowChanged(const QString& windowId);
void loadSettings();
void save() const;
void loadWindows();
@ -76,6 +77,7 @@ public:
QTranslator *m_translator = nullptr;
QDBusServiceWatcher *m_watcher = nullptr;
bool m_connectedToNotificationServer = false;
QString m_activeWindow;
private:
UkuiTaskManager *q = nullptr;
@ -190,6 +192,22 @@ void UkuiTaskManager::Private::skipTaskbarChanged(const QString &windowId)
}
}
void UkuiTaskManager::Private::activeWindowChanged(const QString &windowId)
{
if(windowId == m_activeWindow) {
return;
}
for(auto item : m_items) {
if(item->currentDesktopWinIDs().contains(m_activeWindow)) {
item->setHasActiveWindow(false);
}
if(item->currentDesktopWinIDs().contains(windowId)) {
item->setHasActiveWindow(true);
}
}
m_activeWindow = windowId;
}
void UkuiTaskManager::Private::loadWindows()
{
for (const QString &winID: WindowManager::windows()) {
@ -290,6 +308,11 @@ UkuiTaskManager::UkuiTaskManager(QObject *parent) : QAbstractListModel(parent),
connect(WindowManager::self(), &WindowManager::windowStateChanged, this, [&](const QString &winId) {
d->skipTaskbarChanged(winId);
});
connect(WindowManager::self(), &WindowManager::activeWindowChanged, this, [&](const QString &winId){
d->activeWindowChanged(winId);
});
d->m_activeWindow = WindowManager::currentActiveWindow();
auto conn = QDBusConnection::sessionBus();
d->m_watcher = new QDBusServiceWatcher(QStringLiteral("org.freedesktop.Notifications"),
conn,
@ -358,6 +381,8 @@ QVariant UkuiTaskManager::data(const QModelIndex &index, int role) const
return QVariant::fromValue(item->actions());
case UnreadMessagesNum:
return item->unReadMessagesNum();
case HasActiveWindow:
return item->hasActiveWindow();
default:
return {};
}

View File

@ -45,6 +45,7 @@ public:
QuickLauncherIndex, //快速启动按钮位置从0开始-1表示无快速启动按钮
Actions, //可执行的action目前只包含desktop action
UnreadMessagesNum, //未读消息数量
HasActiveWindow,
ApplicationMenuServiceName,
ApplicationMenuObjectPath
};

View File

@ -35,6 +35,14 @@ WaylandWindowManager::WaylandWindowManager(QObject *parent) : AbstractWindowMana
QObject::connect(m_registry, &KWayland::Client::Registry::plasmaWindowManagementAnnounced, [&](quint32 name, quint32 version){
m_windowManagement = m_registry->createPlasmaWindowManagement(name, version, this);
connect(m_windowManagement, &KWayland::Client::PlasmaWindowManagement::windowCreated, this, &WaylandWindowManager::addWindow);
connect(m_windowManagement, &KWayland::Client::PlasmaWindowManagement::activeWindowChanged, [&](){
auto w = m_windowManagement->activeWindow();
if(w) {
Q_EMIT activeWindowChanged(w->uuid());
} else {
Q_EMIT activeWindowChanged("");
}
});
});
connect(m_registry, &KWayland::Client::Registry::plasmaVirtualDesktopManagementAnnounced, [&](quint32 name, quint32 version){
m_virtualDesktopManagement = m_registry->createPlasmaVirtualDesktopManagement(name, version, this);

View File

@ -67,6 +67,7 @@ WindowManager::WindowManager(QObject *parent) : QObject(parent)
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::windowDesktopChanged, this, &WindowManager::windowDesktopChanged);
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::demandsAttentionChanged, this, &WindowManager::demandsAttentionChanged);
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::geometryChanged, this, &WindowManager::geometryChanged);
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::activeWindowChanged, this, &WindowManager::activeWindowChanged);
connect(WindowManagerPrivate::interface(), &AbstractWindowManager::windowStateChanged, this, &WindowManager::windowStateChanged);
}

View File

@ -68,6 +68,7 @@ Q_SIGNALS:
void windowDesktopChanged(QString wid);
void demandsAttentionChanged(QString wid);
void geometryChanged(QString wid);
void activeWindowChanged(QString id);
//xcb only
void windowStateChanged(QString wid);

View File

@ -36,6 +36,9 @@ XcbWindowManager::XcbWindowManager(QObject *parent): AbstractWindowManager(paren
connect(KWindowSystem::self(), &KWindowSystem::currentDesktopChanged, this, &AbstractWindowManager::currentDesktopChanged);
connect(KWindowSystem::self(), QOverload<WId, NET::Properties, NET::Properties2>::of(&KWindowSystem::windowChanged)
, this, &XcbWindowManager::windowChangedProxy);
connect(KWindowSystem::self(), &KWindowSystem::activeWindowChanged, this, [=](WId wid){
Q_EMIT activeWindowChanged(QString::number(wid));
});
}
XcbWindowManager::~XcbWindowManager()