Skip to content

Commit 6c4cc21

Browse files
committed
feat: add preview follows the system opacity.
as title. PMS-BUG-314371
1 parent 50edcae commit 6c4cc21

File tree

6 files changed

+84
-0
lines changed

6 files changed

+84
-0
lines changed

panels/dock/taskmanager/taskmanager.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,12 @@ bool TaskManager::init()
152152
m_windowFullscreen = isFullscreen;
153153
emit windowFullscreenChanged(isFullscreen);
154154
});
155+
156+
// 设置preview opacity
157+
DS_NAMESPACE::DAppletBridge appearanceBridge("org.deepin.ds.dde-appearance");
158+
auto appearanceApplet = appearanceBridge.applet();
159+
connect(appearanceApplet, SIGNAL(opacityChanged()), this, SLOT(onOpacityChanged()));
160+
155161
return true;
156162
}
157163

@@ -418,6 +424,24 @@ void TaskManager::activateWindow(uint32_t windowID)
418424
#endif
419425
}
420426

427+
void TaskManager::onOpacityChanged()
428+
{
429+
DS_NAMESPACE::DAppletBridge appearanceBridge("org.deepin.ds.dde-appearance");
430+
if (appearanceBridge.isValid()) {
431+
auto appearanceApplet = appearanceBridge.applet();
432+
QVariant opacityVariant = appearanceApplet->property("opacity");
433+
if (opacityVariant.isValid()) {
434+
double opacity = opacityVariant.toReal();
435+
if (m_windowMonitor) {
436+
auto x11Monitor = qobject_cast<X11WindowMonitor*>(m_windowMonitor.data());
437+
if (x11Monitor) {
438+
x11Monitor->setPreviewOpacity(opacity);
439+
}
440+
}
441+
}
442+
}
443+
}
444+
421445
D_APPLET_CLASS(TaskManager)
422446
}
423447

panels/dock/taskmanager/taskmanager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ class TaskManager : public DS_NAMESPACE::DContainment, public AbstractTaskManage
101101
Q_INVOKABLE void setAppItemWindowIconGeometry(const QString& appid, QObject* relativePositionItem, const int& x1, const int& y1, const int& x2, const int& y2);
102102
Q_INVOKABLE void activateWindow(uint32_t windowID);
103103

104+
104105
Q_SIGNALS:
105106
void dataModelChanged();
106107
void windowSplitChanged();
@@ -109,6 +110,7 @@ class TaskManager : public DS_NAMESPACE::DContainment, public AbstractTaskManage
109110

110111
private Q_SLOTS:
111112
void handleWindowAdded(QPointer<AbstractWindow> window);
113+
void onOpacityChanged();
112114

113115
private:
114116
void loadDockedAppItems();

panels/dock/taskmanager/x11preview.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@
3131

3232
#include <DStyle>
3333
#include <DPlatformHandle>
34+
#include <QDBusReply>
3435

3536
#include <DWindowManagerHelper>
3637
#include <DGuiApplicationHelper>
38+
#include <appletbridge.h>
3739

3840
Q_LOGGING_CATEGORY(x11WindowPreview, "dde.shell.dock.taskmanager.x11WindowPreview")
3941

@@ -401,6 +403,7 @@ X11WindowPreviewContainer::X11WindowPreviewContainer(X11WindowMonitor* monitor,
401403
, m_isDockPreviewCount(0)
402404
, m_model(new AppItemWindowModel(this))
403405
, m_titleWidget(new QWidget())
406+
, m_systemOpacity(0.2)
404407
{
405408
m_hideTimer = new QTimer(this);
406409
m_hideTimer->setSingleShot(true);
@@ -518,6 +521,33 @@ void X11WindowPreviewContainer::resizeEvent(QResizeEvent *event)
518521
updatePosition();
519522
}
520523

524+
void X11WindowPreviewContainer::paintEvent(QPaintEvent *event)
525+
{
526+
Q_UNUSED(event)
527+
528+
QPainter painter(this);
529+
painter.setRenderHint(QPainter::Antialiasing);
530+
531+
QColor backgroundColor;
532+
533+
auto themeType = DGuiApplicationHelper::instance()->themeType();
534+
if (themeType == DGuiApplicationHelper::DarkType) {
535+
backgroundColor = QColor(0, 0, 0, static_cast<int>(255 * m_systemOpacity));
536+
} else {
537+
backgroundColor = QColor(255, 255, 255, static_cast<int>(255 * m_systemOpacity));
538+
}
539+
540+
painter.setBrush(backgroundColor);
541+
painter.setPen(Qt::NoPen);
542+
543+
// 获取圆角半径
544+
DStyleHelper dstyle(style());
545+
const int radius = dstyle.pixelMetric(DStyle::PM_FrameRadius);
546+
547+
// 绘制带圆角的背景
548+
painter.drawRoundedRect(rect(), radius, radius);
549+
}
550+
521551
void X11WindowPreviewContainer::updatePosition()
522552
{
523553
auto screenRect = m_baseWindow->screen()->geometry();
@@ -754,4 +784,16 @@ void X11WindowPreviewContainer::updatePreviewIconFromBase64(const QString &base6
754784
m_previewIcon->setPixmap(QIcon::fromTheme(m_previewItem->icon()).pixmap(PREVIEW_TITLE_HEIGHT, PREVIEW_TITLE_HEIGHT));
755785
}
756786
}
787+
788+
double X11WindowPreviewContainer::getOpacity() const
789+
{
790+
return m_systemOpacity;
791+
}
792+
793+
void X11WindowPreviewContainer::setOpacity(double opacity)
794+
{
795+
m_systemOpacity = opacity;
796+
update();
797+
}
798+
757799
}

panels/dock/taskmanager/x11preview.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
#include <DBlurEffectWidget>
1818
#include <DGuiApplicationHelper>
1919
#include <DIconButton>
20+
#include <QDBusInterface>
21+
#include "appletbridge.h"
2022

23+
DS_USE_NAMESPACE
2124
DWIDGET_USE_NAMESPACE
2225

2326
namespace dock {
@@ -68,6 +71,8 @@ class X11WindowPreviewContainer: public DBlurEffectWidget
6871
explicit X11WindowPreviewContainer(X11WindowMonitor* monitor, QWidget *parent = nullptr);
6972
void showPreview(const QPointer<AppItem> &item, const QPointer<QWindow> &window, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction);
7073
void hidePreView();
74+
double getOpacity() const;
75+
void setOpacity(double opacity);
7176

7277
protected:
7378
bool eventFilter(QObject *watched, QEvent *event) override;
@@ -76,6 +81,7 @@ class X11WindowPreviewContainer: public DBlurEffectWidget
7681
void showEvent(QShowEvent *event) override;
7782
void hideEvent(QHideEvent *event) override;
7883
void resizeEvent(QResizeEvent *event) override;
84+
void paintEvent(QPaintEvent *event) override;
7985

8086
private:
8187
inline void updatePreviewTitle(const QString& title);
@@ -114,6 +120,8 @@ private Q_SLOTS:
114120
QPointer<AppItem> m_previewItem;
115121

116122
QString m_previewTitleStr;
123+
124+
double m_systemOpacity;
117125
};
118126

119127
}

panels/dock/taskmanager/x11windowmonitor.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,13 @@ void X11WindowMonitor::cancelPreviewWindow()
141141
.call().waitForFinished();
142142
}
143143

144+
void X11WindowMonitor::setPreviewOpacity(double opacity)
145+
{
146+
if (!m_windowPreview.isNull()) {
147+
m_windowPreview->setOpacity(opacity);
148+
}
149+
}
150+
144151
void X11WindowMonitor::onWindowMapped(xcb_window_t xcb_window)
145152
{
146153
auto window = m_windows.value(xcb_window, nullptr);

panels/dock/taskmanager/x11windowmonitor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class X11WindowMonitor : public AbstractWindowMonitor
4141
virtual void hideItemPreview() override;
4242
void previewWindow(uint32_t winId);
4343
void cancelPreviewWindow();
44+
void setPreviewOpacity(double opacity);
4445

4546
Q_SIGNALS:
4647
void windowMapped(xcb_window_t window);

0 commit comments

Comments
 (0)