forked from openkylin/ukui-panel
feat(task-manager):增加应用图标的激活与非激活 UI 状态
This commit is contained in:
parent
d61f21f383
commit
45f8d8a1ec
|
@ -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);
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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 }
|
||||
}
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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
|
|||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {};
|
||||
}
|
||||
|
|
|
@ -45,6 +45,7 @@ public:
|
|||
QuickLauncherIndex, //快速启动按钮位置(从0开始),-1表示无快速启动按钮
|
||||
Actions, //可执行的action,目前只包含desktop action
|
||||
UnreadMessagesNum, //未读消息数量
|
||||
HasActiveWindow,
|
||||
ApplicationMenuServiceName,
|
||||
ApplicationMenuObjectPath
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue