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
2 changes: 2 additions & 0 deletions panels/dock/workspaceitem/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ add_library(dock-workspaceitem SHARED
workspacemodel.cpp
xworkspaceworker.h
xworkspaceworker.cpp
desktops.h
desktops.cpp
)

target_link_libraries(dock-workspaceitem PRIVATE
Expand Down
51 changes: 51 additions & 0 deletions panels/dock/workspaceitem/desktops.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "desktops.h"

const QDBusArgument &operator<<(QDBusArgument &argument, const DBusDesktopDataStruct &desk)
{
argument.beginStructure();
argument << desk.position;
argument << desk.id;
argument << desk.name;
argument.endStructure();
return argument;
}
// Retrieve
const QDBusArgument &operator>>(const QDBusArgument &argument, DBusDesktopDataStruct &desk)
{
argument.beginStructure();
argument >> desk.position;
argument >> desk.id;
argument >> desk.name;
argument.endStructure();
return argument;
}

const QDBusArgument &operator<<(QDBusArgument &argument, const DBusDesktopDataVector &deskVector)
{
argument.beginArray(qMetaTypeId<DBusDesktopDataStruct>());
for (int i = 0; i < deskVector.size(); ++i) {
argument << deskVector[i];
}
argument.endArray();
return argument;
}

const QDBusArgument &operator>>(const QDBusArgument &argument, DBusDesktopDataVector &deskVector)
{
argument.beginArray();
deskVector.clear();

while (!argument.atEnd()) {
DBusDesktopDataStruct element;
argument >> element;
deskVector.append(element);
}

argument.endArray();

return argument;
}

29 changes: 29 additions & 0 deletions panels/dock/workspaceitem/desktops.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later
#ifndef DESKTOPS_H
#define DESKTOPS_H

#include <QtDBus>

struct DBusDesktopDataStruct {
uint position;
QString id;
QString name;
DBusDesktopDataStruct() {
position = 0;
}
};
typedef QVector<DBusDesktopDataStruct> DBusDesktopDataVector;

const QDBusArgument &operator<<(QDBusArgument &argument, const DBusDesktopDataStruct &desk);
const QDBusArgument &operator>>(const QDBusArgument &argument, DBusDesktopDataStruct &desk);

Q_DECLARE_METATYPE(DBusDesktopDataStruct)

const QDBusArgument &operator<<(QDBusArgument &argument, const DBusDesktopDataVector &deskVector);
const QDBusArgument &operator>>(const QDBusArgument &argument, DBusDesktopDataVector &deskVector);

Q_DECLARE_METATYPE(DBusDesktopDataVector)

#endif // DESKTOPS_H
17 changes: 17 additions & 0 deletions panels/dock/workspaceitem/package/workspaceitem.qml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ AppletItem {
component WorkspaceDelegate: Item {
id: content
required property int index
required property string workspaceName
required property string screenImage
property bool isCurrent: content.ListView.view.currentIndex === content.index

Expand All @@ -57,13 +58,29 @@ AppletItem {
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
onClicked: {
Applet.dataModel.currentIndex = content.index
}
onEntered: {
var point = content.mapToItem(null, content.width / 2, 0)
toolTip.toolTipX = point.x
toolTip.toolTipY = point.y
toolTip.text = workspaceName
toolTip.open()
}

onExited: {
toolTip.close()
}
}
}
}

PanelToolTip {
id: toolTip
}

Rectangle {
anchors.fill: parent
color: "transparent"
Expand Down
5 changes: 4 additions & 1 deletion panels/dock/workspaceitem/workspacemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ QVariant WorkspaceModel::data(const QModelIndex &index, int role) const

auto item = m_items[index.row()];
switch (role) {
case WorkspaceModel::NameRole:
return item->name();
case WorkspaceModel::ImageRole:
return item->image();
}
Expand All @@ -40,7 +42,8 @@ QVariant WorkspaceModel::data(const QModelIndex &index, int role) const
QHash<int, QByteArray> WorkspaceModel::roleNames() const
{
return {
{WorkspaceModel::ImageRole, "screenImage"},
{WorkspaceModel::NameRole, "workspaceName"},
{WorkspaceModel::ImageRole, "screenImage"},
};
}

Expand Down
14 changes: 9 additions & 5 deletions panels/dock/workspaceitem/workspacemodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,27 @@
#ifndef WORKSPACEMODEL_H
#define WORKSPACEMODEL_H

#include "dsglobal.h"

#include <QAbstractListModel>
#include <QPointer>
namespace dock {

class WorkSpaceData
{
public:
WorkSpaceData(QString image)
: m_image(image)
WorkSpaceData(QString name, QString image)
: m_name(name)
, m_image(image)
{

}
QString name() {
return m_name;
}
QString image() {
return m_image;
}
private:
QString m_name;
QString m_image;
};

Expand All @@ -30,7 +33,8 @@ class WorkspaceModel : public QAbstractListModel
Q_OBJECT
public:
enum Roles {
ImageRole = Qt::UserRole + 1,
NameRole = Qt::UserRole + 1,
ImageRole,
};
Q_ENUM(Roles)

Expand Down
83 changes: 43 additions & 40 deletions panels/dock/workspaceitem/xworkspaceworker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,6 @@
#include "xworkspaceworker.h"
#include "workspacemodel.h"

#include <QDBusReply>
#include <QGuiApplication>
#include <QScreen>
#include <QMetaMethod>
#include <QDBusConnectionInterface>
#include <QTimer>
#include <QLoggingCategory>

Q_LOGGING_CATEGORY(workspaceItem, "dde.shell.dock.workspaceItem")
Expand All @@ -18,9 +12,12 @@ namespace dock {

XWorkspaceWorker::XWorkspaceWorker(WorkspaceModel *model)
: QObject(model)
, m_inter(new QDBusInterface("com.deepin.wm", "/com/deepin/wm", "com.deepin.wm"))
, m_interKwinProp(new QDBusInterface("org.kde.KWin", "/VirtualDesktopManager", "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus(), this))
, m_model(model)
, m_currentIndex(0)
{
qDBusRegisterMetaType<DBusDesktopDataStruct>();
qDBusRegisterMetaType<DBusDesktopDataVector>();
updateData();

QDBusConnection bus = QDBusConnection::sessionBus();
Expand All @@ -29,56 +26,62 @@ XWorkspaceWorker::XWorkspaceWorker(WorkspaceModel *model)
return;
}

bus.connect("com.deepin.wm", "/com/deepin/wm", "com.deepin.wm", "workspaceCountChanged", this, SLOT(updateData()));
bus.connect("com.deepin.wm", "/com/deepin/wm", "com.deepin.wm", "WorkspaceSwitched", this, SLOT(updateData()));
bus.connect("com.deepin.wm", "/com/deepin/wm", "com.deepin.wm", "WorkspaceBackgroundChangedForMonitor", this, SLOT(updateData()));
bus.connect("com.deepin.wm", "/com/deepin/wm", "com.deepin.wm", "WorkspaceBackgroundChanged", this, SLOT(updateData()));
bus.connect("org.kde.KWin", "/VirtualDesktopManager", "org.kde.KWin.VirtualDesktopManager", "currentChanged", this, SLOT(updateData()));
bus.connect("org.kde.KWin", "/VirtualDesktopManager", "org.kde.KWin.VirtualDesktopManager", "desktopsChanged", this, SLOT(updateData()));
bus.connect("org.deepin.dde.Appearance1", "/org/deepin/dde/Appearance1", "org.deepin.dde.Appearance1", "Changed", this, SLOT(appearanceChanged(const QString,const QString)));
connect(m_model, &WorkspaceModel::currentIndexChanged, this, &XWorkspaceWorker::setIndex);
}

void XWorkspaceWorker::setIndex(int index)
{
QDBusReply<int> resIndex = m_inter->call("GetCurrentWorkspace");
if (resIndex.error().message().isEmpty() && m_model->currentIndex() + 1 != resIndex.value()) {
m_inter->call("SetCurrentWorkspace", index + 1);
} else {
qCWarning(workspaceItem) << "GetCurrentWorkspace failed:" << resIndex.error().message();
return;
}
if (m_desktops.count() > index && m_currentIndex != index)
m_interKwinProp->call("Set", "org.kde.KWin.VirtualDesktopManager", "current", QVariant::fromValue(QDBusVariant(m_desktops[index].id)));
}

void XWorkspaceWorker::appearanceChanged(const QString &changedStr, const QString &value)
{
if ("allwallpaperuris" == changedStr)
updateData();
}

void XWorkspaceWorker::updateData()
{
int count = 0;
QDBusReply<int> resCount = m_inter->call("WorkspaceCount");
if (resCount.error().message().isEmpty()) {
count = resCount.value();
QDBusMessage reply = m_interKwinProp->call("Get", "org.kde.KWin.VirtualDesktopManager", "desktops");
if (reply.type() == QDBusMessage::ReplyMessage) {
QVariant result = reply.arguments().at(0);
m_desktops = qdbus_cast<DBusDesktopDataVector>(result.value<QDBusVariant>().variant().value<QDBusArgument>());
} else {
qCWarning(workspaceItem) << "WorkspaceCount failed:" << resCount.error().message();
return;
qCWarning(workspaceItem) << "Error calling desktops";
}

reply = m_interKwinProp->call("Get", "org.kde.KWin.VirtualDesktopManager", "current");

if (reply.type() == QDBusMessage::ReplyMessage) {
QVariant result = reply.arguments().at(0);
m_currentId = result.value<QDBusVariant>().variant().toString();
} else {
qCWarning(workspaceItem) << "Error calling current";
}



QList<WorkSpaceData*> items;
for (int i = 1; i <= count; ++i) {
for (int i = 0; i < m_desktops.count(); ++i) {
QString image;
QDBusReply<QString> res = m_inter->call("GetWorkspaceBackgroundForMonitor", i, QGuiApplication::primaryScreen()->name());
if (res.error().message().isEmpty()) {
image = res.value();
} else {
qCWarning(workspaceItem) << "GetWorkspaceBackgroundForMonitor failed:" << res.error().message();
return;
if (m_desktops[i].id == m_currentId) {
m_currentIndex = i;
QDBusReply<QString> res = QDBusInterface("org.deepin.dde.Appearance1", "/org/deepin/dde/Appearance1", "org.deepin.dde.Appearance1").call("GetCurrentWorkspaceBackground");
if (res.error().message().isEmpty()) {
image = res.value();
} else {
qCWarning(workspaceItem) << "GetWorkspaceBackgroundForMonitor failed:" << res.error().message();
return;
}
}
auto item = new WorkSpaceData(image);
auto item = new WorkSpaceData(m_desktops[i].name, image);
items.append(item);
}
m_model->setItems(items);
QDBusReply<int> index = m_inter->call("GetCurrentWorkspace");
if (index.error().message().isEmpty()) {
qWarning() << "m_model->setCurrentIndex(index.value() - 1) " << index.value();
m_model->setCurrentIndex(index.value() - 1);
} else {
qCWarning(workspaceItem) << "GetCurrentWorkspace failed:" << index.error().message();
return;
}
m_model->setCurrentIndex(m_currentIndex);
}
}
10 changes: 7 additions & 3 deletions panels/dock/workspaceitem/xworkspaceworker.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@
#ifndef XWORKSPACEWORKER_H
#define XWORKSPACEWORKER_H

#include "dsglobal.h"
#include "desktops.h"

#include <QObject>
#include <QDBusInterface>
namespace dock {
class WorkspaceModel;
class XWorkspaceWorker : public QObject
Expand All @@ -19,11 +18,16 @@ class XWorkspaceWorker : public QObject
public slots:
void updateData();
void setIndex(int index);
void appearanceChanged(const QString &changedStr, const QString &value);
signals:

private:
QDBusInterface *m_inter;
QDBusInterface *m_interKwinProp;
WorkspaceModel *m_model;

DBusDesktopDataVector m_desktops;
QString m_currentId;
int m_currentIndex;
};
}
#endif // XWORKSPACEWORKER_H