From 3ba25dd33d02a62e5e69472c2436fff376d22a63 Mon Sep 17 00:00:00 2001 From: apa420 <17131426+apa420@users.noreply.github.com> Date: Sun, 13 Apr 2025 10:34:25 +0000 Subject: [PATCH] Feat: (Linux) Themes allow transparency on chat windows background (#6137) --- CHANGELOG.md | 1 + src/widgets/Window.cpp | 6 +++++ src/widgets/splits/SplitContainer.cpp | 33 ++++++++++++++++++++------- src/widgets/splits/SplitContainer.hpp | 1 + 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77f4e0eb..702187ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Minor: Add an option for the reduced opacity of message history. (#6121) - Minor: Make paused chat indicator more visible, and fix its zoom behavior. (#6123) - Minor: Added WebSocket API for plugins. (#6076) +- Minor: Allow for themes to set transparent values for window background on Linux. (#6137) - Minor: Popup overlay now only draws an outline when being interacted with. (#6140) - Bugfix: Don't create native messaging manifest file if browser directory doesn't exist. (#6116) - Bugfix: Fixed scrolling now working on inputs in the settings. (#6128) diff --git a/src/widgets/Window.cpp b/src/widgets/Window.cpp index 92b85c72..bac800b5 100644 --- a/src/widgets/Window.cpp +++ b/src/widgets/Window.cpp @@ -75,6 +75,12 @@ Window::Window(WindowType type, QWidget *parent) if (type == WindowType::Main) { this->resize(int(600 * this->scale()), int(500 * this->scale())); +#ifdef Q_OS_LINUX + if (this->theme->window.background.alpha() != 255) + { + this->setAttribute(Qt::WA_TranslucentBackground); + } +#endif } else { diff --git a/src/widgets/splits/SplitContainer.cpp b/src/widgets/splits/SplitContainer.cpp index 430098f0..4049e300 100644 --- a/src/widgets/splits/SplitContainer.cpp +++ b/src/widgets/splits/SplitContainer.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -613,6 +614,29 @@ void SplitContainer::mouseReleaseEvent(QMouseEvent *event) } } +void SplitContainer::paintSplitBorder(Node *node, QPainter *painter) +{ + switch (node->type_) + { + case Node::Type::Split: { + QRectF nodeRect = node->geometry_; + painter->setPen(this->theme->tabs.dividerLine); + QPainterPath p = QPainterPath(); + p.addRect(nodeRect); + painter->strokePath(p, painter->pen()); + } + break; + case Node::Type::VerticalContainer: + case Node::Type::HorizontalContainer: { + for (std::unique_ptr &child : node->children_) + { + paintSplitBorder(child.get(), painter); + } + } + break; + } +} + void SplitContainer::paintEvent(QPaintEvent * /*event*/) { QPainter painter(this); @@ -643,14 +667,7 @@ void SplitContainer::paintEvent(QPaintEvent * /*event*/) } else { - if (getApp()->getThemes()->isLightTheme()) - { - painter.fillRect(rect(), QColor("#999")); - } - else - { - painter.fillRect(rect(), QColor("#555")); - } + this->paintSplitBorder(this->getBaseNode(), &painter); } for (DropRect &dropRect : this->dropRects_) diff --git a/src/widgets/splits/SplitContainer.hpp b/src/widgets/splits/SplitContainer.hpp index 9e4a6cc7..933be935 100644 --- a/src/widgets/splits/SplitContainer.hpp +++ b/src/widgets/splits/SplitContainer.hpp @@ -246,6 +246,7 @@ private: void selectSplitRecursive(Node *node, SplitDirection direction); void focusSplitRecursive(Node *node); void setPreferedTargetRecursive(Node *node); + void paintSplitBorder(Node *node, QPainter *painter); void addSplit(Split *split);