Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package union6 for openSUSE:Factory checked 
in at 2026-08-09 21:33:32
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/union6 (Old)
 and      /work/SRC/openSUSE:Factory/.union6.new.16738 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "union6"

Sun Aug  9 21:33:32 2026 rev:5 rq:1369918 version:6.7.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/union6/union6.changes    2026-07-17 
01:42:43.663739106 +0200
+++ /work/SRC/openSUSE:Factory/.union6.new.16738/union6.changes 2026-08-09 
21:35:13.873959792 +0200
@@ -1,0 +2,31 @@
+Tue Aug  4 11:27:10 UTC 2026 - Fabian Vogt <[email protected]>
+
+- Update to 6.7.4:
+  * New bugfix release
+  * For more details see https://kde.org/announcements/plasma/6/6.7.4
+- Changes since 6.7.3:
+  * output/quick: Align icon to device pixels
+  * output/quick: Limit maximum width of text in tooltips to 70 characters 
(kde#521855)
+  * input/css/breeze: Add focus outline to delegates (kde#522860)
+  * Check path exists when loading StyleCache data (kde#523013)
+  * output/quick: Handle some more undefined values in MenuItem
+  * output/quick: Don't crash if Icon doesn't have a control assigned yet
+  * input/css: Add padding to pane/frame/groupbox
+  * output/quick: Ensure TabBar doesn't try to squeeze TabButton too small
+  * input/css: Add some padding around tab buttons
+  * output/quick: Don't produce an error if SpinBox text color is not set
+  * output/quick: Don't crash in Positioner if an element has no matching rules
+  * output/quick: Complete incompleted ancestors on QuickElement completion
+  * output/widgets: Guard unguarded background/text property access
+  * Install missing headers for core library so things can actually use it 
(kde#522925)
+  * input/css: Look for files rather than directories in CssLoader
+  * output/kirigami: Use animationSpeedMultiplier to adjust Units animation 
speeds
+  * platform/plasma: Implement animationSpeedMultiplier to return Plasma's 
value
+  * platform/plasma: Refactor KDE globals reading to use KConfig(Watcher)
+  * Add a smoothScrollChanged signal to PlatformPlugin
+  * Add animationSpeedMultiplier() to PlatformPlugin
+  * output/quick: Set smooth to true for BusyIndicator icon
+  * output/quick: Use linear filtering for icons when smooth is enabled
+  * Update version for new release 6.7.4
+
+-------------------------------------------------------------------

Old:
----
  union-6.7.3.tar.xz
  union-6.7.3.tar.xz.sig

New:
----
  union-6.7.4.tar.xz
  union-6.7.4.tar.xz.sig

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ union6.spec ++++++
--- /var/tmp/diff_new_pack.G0CR9i/_old  2026-08-09 21:35:14.305974528 +0200
+++ /var/tmp/diff_new_pack.G0CR9i/_new  2026-08-09 21:35:14.309974664 +0200
@@ -26,7 +26,7 @@
 %{!?_plasma6_version: %define _plasma6_version %(echo %{_plasma6_bugfix} | awk 
-F. '{print $1"."$2}')}
 %bcond_without released
 Name:           union6
-Version:        6.7.3
+Version:        6.7.4
 Release:        0
 Summary:        Qt style supporting both QtQuick and QtWidgets
 License:        LGPL-2.1-or-later


++++++ union-6.7.3.tar.xz -> union-6.7.4.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/CMakeLists.txt 
new/union-6.7.4/CMakeLists.txt
--- old/union-6.7.3/CMakeLists.txt      2026-07-14 13:03:47.000000000 +0200
+++ new/union-6.7.4/CMakeLists.txt      2026-08-04 11:29:30.000000000 +0200
@@ -3,7 +3,7 @@
 
 cmake_minimum_required(VERSION 3.27)
 
-set(PROJECT_VERSION "6.7.3") # handled by release scripts
+set(PROJECT_VERSION "6.7.4") # handled by release scripts
 set(KF6_MIN_VERSION "6.26.0") # handled by release scripts
 
 project(Union VERSION ${PROJECT_VERSION})
@@ -68,7 +68,8 @@
 endif()
 
 if (BUILD_WITH_KDEFRAMEWORKS)
-    find_package(KF6 ${KF6_MIN_VERSION} REQUIRED COMPONENTS CoreAddons 
GuiAddons IconThemes ColorScheme)
+    find_package(KF6 ${KF6_MIN_VERSION} REQUIRED COMPONENTS CoreAddons 
GuiAddons Config IconThemes ColorScheme)
+    set_package_properties(KF6Config PROPERTIES TYPE REQUIRED PURPOSE "KConfig 
is used for reading global Plasma configuration")
     set_package_properties(KF6IconThemes PROPERTIES TYPE REQUIRED PURPOSE 
"KIconThemes is used for icon recoloring")
     set_package_properties(KF6ColorScheme PROPERTIES TYPE REQUIRED PURPOSE 
"KColorScheme is used to read system colors")
 endif()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/CMakeLists.txt 
new/union-6.7.4/src/CMakeLists.txt
--- old/union-6.7.3/src/CMakeLists.txt  2026-07-14 13:03:47.000000000 +0200
+++ new/union-6.7.4/src/CMakeLists.txt  2026-08-04 11:29:30.000000000 +0200
@@ -21,6 +21,9 @@
 
 target_sources(Union PUBLIC
     FILE_SET HEADERS
+    BASE_DIRS
+    ${CMAKE_CURRENT_BINARY_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}
     FILES
     StyleRegistry.h
     Style.h
@@ -61,6 +64,13 @@
     EXCLUDE_DEPRECATED_BEFORE_AND_AT ${EXCLUDE_DEPRECATED_BEFORE_AND_AT}
 )
 
+target_sources(Union PUBLIC
+    FILE_SET HEADERS
+    FILES
+    ${CMAKE_CURRENT_BINARY_DIR}/union_export.h
+    ${CMAKE_CURRENT_BINARY_DIR}/union_logging.h
+)
+
 set_target_properties(Union PROPERTIES
     VERSION ${PROJECT_VERSION}
     SOVERSION ${PROJECT_VERSION_MAJOR}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/PlatformPlugin.cpp 
new/union-6.7.4/src/PlatformPlugin.cpp
--- old/union-6.7.3/src/PlatformPlugin.cpp      2026-07-14 13:03:47.000000000 
+0200
+++ new/union-6.7.4/src/PlatformPlugin.cpp      2026-08-04 11:29:30.000000000 
+0200
@@ -26,4 +26,9 @@
 bool PlatformPlugin::smoothScroll()
 {
     return true;
-}
\ No newline at end of file
+}
+
+qreal PlatformPlugin::animationSpeedMultiplier()
+{
+    return 1.0;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/PlatformPlugin.h 
new/union-6.7.4/src/PlatformPlugin.h
--- old/union-6.7.3/src/PlatformPlugin.h        2026-07-14 13:03:47.000000000 
+0200
+++ new/union-6.7.4/src/PlatformPlugin.h        2026-08-04 11:29:30.000000000 
+0200
@@ -52,6 +52,23 @@
      * Enables/disables tweened scrollbars and inertial scrolling. Defaults to 
true
      */
     virtual bool smoothScroll();
+    /*!
+     * Emitted whenever smoothScroll changes.
+     */
+    Q_SIGNAL void smoothScrollChanged();
+    /*!
+     * Returns a multiplier to globally change the animation speed.
+     *
+     * This value should be used with animation speeds to ensure a platform's
+     * preferences with regards to animation speed is respected.
+     *
+     * By default this will return 1.0.
+     */
+    virtual qreal animationSpeedMultiplier();
+    /*!
+     * Emitted whenever animationSpeedMultiplier changes.
+     */
+    Q_SIGNAL void animationSpeedMultiplierChanged();
 };
 
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/StyleCache.cpp 
new/union-6.7.4/src/StyleCache.cpp
--- old/union-6.7.3/src/StyleCache.cpp  2026-07-14 13:03:47.000000000 +0200
+++ new/union-6.7.4/src/StyleCache.cpp  2026-08-04 11:29:30.000000000 +0200
@@ -135,6 +135,12 @@
 
     for (int i = 0; i < result->cachePaths.size(); ++i) {
         auto path = result->cachePaths.at(i);
+
+        if (!fs::exists(path)) {
+            qCDebug(UNION_GENERAL) << "Ignoring cache file" << path.string() 
<< "original file no longer exists";
+            return nullptr;
+        }
+
         auto cachedModificationTime = result->modificationTimes.at(i);
         auto currentModificationTime = fs::last_write_time(path);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/input/css/CssLoader.cpp 
new/union-6.7.4/src/input/css/CssLoader.cpp
--- old/union-6.7.3/src/input/css/CssLoader.cpp 2026-07-14 13:03:47.000000000 
+0200
+++ new/union-6.7.4/src/input/css/CssLoader.cpp 2026-08-04 11:29:30.000000000 
+0200
@@ -371,14 +371,19 @@
 
 bool CssLoader::load(Style::Ptr theme)
 {
-    auto cssPath = 
fs::path(QStandardPaths::locate(QStandardPaths::GenericDataLocation, 
u"union/css"_s, QStandardPaths::LocateDirectory).toStdString());
+    QString relativeStylePath = u"union/css/styles/"_s + theme->name() + 
u"/style.css"_s;
+    m_stylePath = 
fs::path(QStandardPaths::locate(QStandardPaths::GenericDataLocation, 
relativeStylePath, QStandardPaths::LocateFile).toStdString());
 
-    m_stylePath = cssPath / "styles"s / theme->name().toStdString();
-    cssparser::StyleSheet styleSheet(m_stylePath / "style.css"s);
+    if (!fs::exists(m_stylePath)) {
+        qCWarning(UNION_CSS) << theme->name() << "does not exist!";
+        return false;
+    }
+
+    cssparser::StyleSheet styleSheet(m_stylePath);
 
     auto defaultsPath =
-        fs::path(QStandardPaths::locate(QStandardPaths::GenericDataLocation, 
u"union/css/defaults"_s, QStandardPaths::LocateDirectory).toStdString());
-    styleSheet.import(defaultsPath / "default.css"s);
+        fs::path(QStandardPaths::locate(QStandardPaths::GenericDataLocation, 
u"union/css/defaults/default.css"_s, QStandardPaths::LocateFile).toStdString());
+    styleSheet.import(defaultsPath);
     styleSheet.parse();
 
     const auto paths = styleSheet.paths();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/union-6.7.3/src/input/css/styles/breeze/application.css 
new/union-6.7.4/src/input/css/styles/breeze/application.css
--- old/union-6.7.3/src/input/css/styles/breeze/application.css 2026-07-14 
13:03:47.000000000 +0200
+++ new/union-6.7.4/src/input/css/styles/breeze/application.css 2026-08-04 
11:29:30.000000000 +0200
@@ -144,10 +144,16 @@
     }
 }
 
+pane
+{
+    padding: var(--large-spacing);
+}
+
 frame,
 groupbox
 {
     padding: var(--small-spacing);
+    padding: var(--large-spacing);
     border: 1px solid var(--window-border-color);
     border-radius: var(--corner-radius);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/input/css/styles/breeze/button.css 
new/union-6.7.4/src/input/css/styles/breeze/button.css
--- old/union-6.7.3/src/input/css/styles/breeze/button.css      2026-07-14 
13:03:47.000000000 +0200
+++ new/union-6.7.4/src/input/css/styles/breeze/button.css      2026-08-04 
11:29:30.000000000 +0200
@@ -285,7 +285,7 @@
     width: var(--button-default-size);
     height: var(--button-default-size);
     spacing: 0px;
-    padding: 0px;
+    padding: var(--small-spacing);
     border-radius: var(--corner-radius);
     background-color: var(--tab-background-color);
     border: 1px solid var(--tab-background-color);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/input/css/styles/breeze/delegate.css 
new/union-6.7.4/src/input/css/styles/breeze/delegate.css
--- old/union-6.7.3/src/input/css/styles/breeze/delegate.css    2026-07-14 
13:03:47.000000000 +0200
+++ new/union-6.7.4/src/input/css/styles/breeze/delegate.css    2026-08-04 
11:29:30.000000000 +0200
@@ -56,6 +56,13 @@
         background-color: var(--highlight-hover-color);
     }
 
+    &:active-focus
+    {
+        border: 1px solid var(--highlight-color);
+        background-color: var(--highlight-hover-color);
+        outline: 2px solid var(--focus-color);
+    }
+
     &:pressed,
     &:highlighted
     {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/output/kirigami/Units.cpp 
new/union-6.7.4/src/output/kirigami/Units.cpp
--- old/union-6.7.3/src/output/kirigami/Units.cpp       2026-07-14 
13:03:47.000000000 +0200
+++ new/union-6.7.4/src/output/kirigami/Units.cpp       2026-08-04 
11:29:30.000000000 +0200
@@ -4,6 +4,7 @@
 #include "Units.h"
 
 #include "ElementQuery.h"
+#include "StyleRegistry.h"
 
 using namespace Qt::StringLiterals;
 
@@ -19,10 +20,18 @@
     // query.setElements({unitsElement});
     // query.execute();
 
-    setVeryShortDuration(50);
-    setShortDuration(100);
-    setLongDuration(200);
-    setVeryLongDuration(400);
+    auto platform = Union::StyleRegistry::instance()->platform();
+    connect(platform.get(), 
&Union::PlatformPlugin::animationSpeedMultiplierChanged, this, 
&Units::setAnimationSpeeds);
+    setAnimationSpeeds();
+}
+
+void Units::setAnimationSpeeds()
+{
+    auto multiplier = 
Union::StyleRegistry::instance()->platform()->animationSpeedMultiplier();
+    setVeryShortDuration(50 * multiplier);
+    setShortDuration(100 * multiplier);
+    setLongDuration(200 * multiplier);
+    setVeryLongDuration(400 * multiplier);
 }
 
 #include "moc_Units.cpp"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/output/kirigami/Units.h 
new/union-6.7.4/src/output/kirigami/Units.h
--- old/union-6.7.3/src/output/kirigami/Units.h 2026-07-14 13:03:47.000000000 
+0200
+++ new/union-6.7.4/src/output/kirigami/Units.h 2026-08-04 11:29:30.000000000 
+0200
@@ -10,4 +10,7 @@
     Q_OBJECT
 public:
     explicit Units(QObject *parent = nullptr);
+
+private:
+    void setAnimationSpeeds();
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/output/qtquick/plugin/Icon.cpp 
new/union-6.7.4/src/output/qtquick/plugin/Icon.cpp
--- old/union-6.7.3/src/output/qtquick/plugin/Icon.cpp  2026-07-14 
13:03:47.000000000 +0200
+++ new/union-6.7.4/src/output/qtquick/plugin/Icon.cpp  2026-08-04 
11:29:30.000000000 +0200
@@ -46,6 +46,8 @@
     : QQuickItem(parent)
 {
     setFlag(QQuickItem::ItemHasContents, true);
+    setFlag(QQuickItem::ItemObservesViewport, true);
+    setSmooth(false);
 }
 
 QString Icon::name() const
@@ -172,15 +174,6 @@
 
     auto imageNode = static_cast<QSGImageNode *>(node);
 
-    auto bounds = boundingRect();
-
-    imageNode->setRect(QRectF{std::round(bounds.x() + (bounds.width() - 
m_iconSize.width()) / 2.0),
-                              std::round(bounds.y() + (bounds.height() - 
m_iconSize.height()) / 2.0),
-                              qreal(m_iconSize.width()),
-                              qreal(m_iconSize.height())});
-    imageNode->setOwnsTexture(true);
-    imageNode->setFiltering(QSGTexture::Nearest);
-
     auto renderWindow = QQuickRenderControl::renderWindowFor(window());
     if (!renderWindow) {
         renderWindow = window();
@@ -188,11 +181,25 @@
 
     auto dpr = renderWindow->devicePixelRatio();
 
+    auto bounds = boundingRect();
+    auto centerPos = mapToScene(QPointF{std::round(bounds.x() + 
(bounds.width() - m_iconSize.width()) / 2.0), //
+                                        std::round(bounds.y() + 
(bounds.height() - m_iconSize.height()) / 2.0)});
+    auto correctedPos = mapFromScene(QPointF{std::round(centerPos.x() * dpr) / 
dpr, std::round(centerPos.y() * dpr) / dpr});
+    imageNode->setRect(QRectF{correctedPos, m_iconSize.toSizeF()});
+    imageNode->setOwnsTexture(true);
+
+    if (smooth()) {
+        imageNode->setFiltering(QSGTexture::Linear);
+    } else {
+        imageNode->setFiltering(QSGTexture::Nearest);
+    }
+
     if (m_iconChanged || !imageNode->texture() || !qFuzzyCompare(m_iconDpr, 
dpr)) {
         const auto mode = isEnabled() ? QIcon::Mode::Normal : 
QIcon::Mode::Disabled;
         auto image = m_icon.pixmap(m_iconSize, dpr, mode).toImage();
         imageNode->setTexture(window()->createTextureFromImage(image, 
QQuickWindow::TextureCanUseAtlas));
         m_iconChanged = false;
+        m_iconDpr = dpr;
     }
 
     return node;
@@ -215,6 +222,10 @@
         update();
     }
 
+    if (change == QQuickItem::ItemChange::ItemTransformHasChanged) {
+        update();
+    }
+
     QQuickItem::itemChange(change, value);
 }
 
@@ -248,6 +259,10 @@
     static auto sourceProperty = 
iconType->property(iconType->indexOfProperty("source"));
     static auto colorProperty = 
iconType->property(iconType->indexOfProperty("color"));
 
+    if (!m_control) {
+        return;
+    }
+
     auto icon = m_control->property("icon");
     if (!icon.isValid()) {
         return;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/union-6.7.3/src/output/qtquick/plugin/QuickElement.cpp 
new/union-6.7.4/src/output/qtquick/plugin/QuickElement.cpp
--- old/union-6.7.3/src/output/qtquick/plugin/QuickElement.cpp  2026-07-14 
13:03:47.000000000 +0200
+++ new/union-6.7.4/src/output/qtquick/plugin/QuickElement.cpp  2026-08-04 
11:29:30.000000000 +0200
@@ -436,6 +436,20 @@
     updateHints();
     updateAttributes();
     update();
+
+    // It is possible that `QQuickAttachedPropertyPropagator::initialize()`
+    // creates QuickElement instances that are not attached to a QQuickItem for
+    // which `componentComplete()` does not get called. So go through our
+    // ancestors once and ensure `componentComplete()` is called at least once
+    // for these elements, otherwise they are in a defunct state and do not 
work
+    // properly.
+    auto element = parentElement();
+    while (element) {
+        if (!element->m_completed && !qobject_cast<QQuickItem 
*>(element->parent())) {
+            element->componentComplete();
+        }
+        element = element->parentElement();
+    }
 }
 
 void QuickElement::setActiveStates(Union::Element::States newActiveStates)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/union-6.7.3/src/output/qtquick/plugin/positioner/PositionerLayout.cpp 
new/union-6.7.4/src/output/qtquick/plugin/positioner/PositionerLayout.cpp
--- old/union-6.7.3/src/output/qtquick/plugin/positioner/PositionerLayout.cpp   
2026-07-14 13:03:47.000000000 +0200
+++ new/union-6.7.4/src/output/qtquick/plugin/positioner/PositionerLayout.cpp   
2026-08-04 11:29:30.000000000 +0200
@@ -207,7 +207,7 @@
         }
 
         auto query = qobject_cast<QuickStyle 
*>(qmlAttachedPropertiesObject<QuickStyle>(item, true))->query();
-        if (!query) {
+        if (!query || !query->properties()) {
             // Apparently the item has not completed yet, abort layouting and
             // try again the next frame.
             polish();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/union-6.7.3/src/output/qtquick/style/BusyIndicator.qml 
new/union-6.7.4/src/output/qtquick/style/BusyIndicator.qml
--- old/union-6.7.3/src/output/qtquick/style/BusyIndicator.qml  2026-07-14 
13:03:47.000000000 +0200
+++ new/union-6.7.4/src/output/qtquick/style/BusyIndicator.qml  2026-08-04 
11:29:30.000000000 +0200
@@ -38,6 +38,7 @@
             name: Union.Style.properties.icon.name
             color: Union.Style.properties.icon.color
             opacity: control.running ? 1 : 0
+            smooth: true
 
             RotationAnimator on rotation {
                 running: control.running
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/output/qtquick/style/MenuItem.qml 
new/union-6.7.4/src/output/qtquick/style/MenuItem.qml
--- old/union-6.7.3/src/output/qtquick/style/MenuItem.qml       2026-07-14 
13:03:47.000000000 +0200
+++ new/union-6.7.4/src/output/qtquick/style/MenuItem.qml       2026-08-04 
11:29:30.000000000 +0200
@@ -106,7 +106,7 @@
 
             text: control.Union.Mnemonics.richTextLabel ?? control.text
             font: control.font
-            color: Union.Style.properties.text.color
+            color: Union.Style.properties.text.color ?? control.palette.text
             elide: Text.ElideRight
 
             horizontalAlignment: Text.AlignLeft
@@ -125,7 +125,7 @@
                 highlighted: control.highlighted
             }
 
-            readonly property real spacing: 
Union.Style.properties.layout.spacing
+            readonly property real spacing: 
Union.Style.properties.layout.spacing ?? 0.0
 
             anchors {
                 fill: parent
@@ -140,7 +140,7 @@
 
             text: visible ? itemShortcut.nativeText : ""
             font: control.font
-            color: Union.Style.properties.text.color
+            color: Union.Style.properties.text.color ?? control.palette.text
             horizontalAlignment: Text.AlignRight
             verticalAlignment: Text.AlignVCenter
             visible: control.action && control.action.shortcut !== undefined
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/output/qtquick/style/SpinBox.qml 
new/union-6.7.4/src/output/qtquick/style/SpinBox.qml
--- old/union-6.7.3/src/output/qtquick/style/SpinBox.qml        2026-07-14 
13:03:47.000000000 +0200
+++ new/union-6.7.4/src/output/qtquick/style/SpinBox.qml        2026-08-04 
11:29:30.000000000 +0200
@@ -62,7 +62,7 @@
         clip: true
         text: control.displayText
         font: control.font
-        color: Union.Style.properties.text.color
+        color: Union.Style.properties.text.color ?? control.palette.text
 
         horizontalAlignment: 
Union.Alignment.toQtHorizontal(Union.Style.properties.text.alignment.horizontal)
         verticalAlignment: 
Union.Alignment.toQtVertical(Union.Style.properties.text.alignment.vertical)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/output/qtquick/style/TabButton.qml 
new/union-6.7.4/src/output/qtquick/style/TabButton.qml
--- old/union-6.7.3/src/output/qtquick/style/TabButton.qml      2026-07-14 
13:03:47.000000000 +0200
+++ new/union-6.7.4/src/output/qtquick/style/TabButton.qml      2026-08-04 
11:29:30.000000000 +0200
@@ -37,6 +37,11 @@
     implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
                              Union.Positioner.implicitHeight)
 
+    // TabBar divides the space between buttons equally, which leads to
+    // weirdness when relying on implicit sizes. So explicitly set the width
+    // to tabbar doesn't try to divide up things.
+    width: implicitWidth
+
     hoverEnabled: Application.styleHints.useHoverEffects
 
     leftPadding: Union.Style.properties.layout.padding.left
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/output/qtquick/style/ToolTip.qml 
new/union-6.7.4/src/output/qtquick/style/ToolTip.qml
--- old/union-6.7.3/src/output/qtquick/style/ToolTip.qml        2026-07-14 
13:03:47.000000000 +0200
+++ new/union-6.7.4/src/output/qtquick/style/ToolTip.qml        2026-08-04 
11:29:30.000000000 +0200
@@ -22,7 +22,7 @@
     y: -implicitHeight
 
     implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
-                            implicitContentWidth + leftPadding + rightPadding)
+                            Math.min(implicitContentWidth, 
contentItem.maximumWidth) + leftPadding + rightPadding)
     implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
                              implicitContentHeight + topPadding + 
bottomPadding)
 
@@ -55,12 +55,23 @@
     popupType: T.Popup.Item
 
     contentItem: Text {
+        // A maximum width for the contents of the tooltip. This is calculated 
to
+        // fit 70 characters which is usually considered a good line length.
+        //
+        // TODO: Add max-width and em support so this can be expressed in CSS.
+        readonly property real maximumWidth: metrics.averageCharacterWidth * 70
+
         text: control.text
         font: control.font
         wrapMode: Text.Wrap
         color: Union.Style.properties.text.color ?? control.palette.text
         horizontalAlignment: 
Union.Alignment.toQtHorizontal(Union.Style.properties.text.alignment.horizontal)
         verticalAlignment: 
Union.Alignment.toQtVertical(Union.Style.properties.text.alignment.vertical)
+
+        FontMetrics {
+            id: metrics
+            font: control.font
+        }
     }
 
     background: Union.StyledRectangle {}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/output/qtwidgets/UnionStyle.cpp 
new/union-6.7.4/src/output/qtwidgets/UnionStyle.cpp
--- old/union-6.7.3/src/output/qtwidgets/UnionStyle.cpp 2026-07-14 
13:03:47.000000000 +0200
+++ new/union-6.7.4/src/output/qtwidgets/UnionStyle.cpp 2026-08-04 
11:29:30.000000000 +0200
@@ -61,7 +61,9 @@
         drawBackground(painter, rect, properties);
 
         QStyleOptionButton labelOption(*buttonOption);
-        labelOption.palette.setColor(QPalette::ButtonText, 
properties->text()->color().value().toQColor());
+        if (properties->text() && properties->text()->color()) {
+            labelOption.palette.setColor(QPalette::ButtonText, 
properties->text()->color().value().toQColor());
+        }
 
         // Draw label
         // TODO: union-ize better
@@ -123,7 +125,9 @@
     const auto properties = matches.first()->properties();
 
     QPalette palette;
-    palette.setColor(QPalette::Window, 
properties->background()->color().value().toQColor());
+    if (properties->background() && properties->background()->color()) {
+        palette.setColor(QPalette::Window, 
properties->background()->color().value().toQColor());
+    }
 
     application->setPalette(palette);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/union-6.7.3/src/platform/plasma/CMakeLists.txt 
new/union-6.7.4/src/platform/plasma/CMakeLists.txt
--- old/union-6.7.3/src/platform/plasma/CMakeLists.txt  2026-07-14 
13:03:47.000000000 +0200
+++ new/union-6.7.4/src/platform/plasma/CMakeLists.txt  2026-08-04 
11:29:30.000000000 +0200
@@ -7,7 +7,7 @@
     PlasmaPlatformPlugin.h
 )
 
-target_link_libraries(union-platform-plasma PRIVATE Union KF6::CoreAddons 
KF6::IconThemes Qt6::DBus)
+target_link_libraries(union-platform-plasma PRIVATE Union KF6::CoreAddons 
KF6::ConfigCore KF6::IconThemes Qt6::DBus)
 
 set_target_properties(union-platform-plasma PROPERTIES
     LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/union
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/union-6.7.3/src/platform/plasma/PlasmaPlatformPlugin.cpp 
new/union-6.7.4/src/platform/plasma/PlasmaPlatformPlugin.cpp
--- old/union-6.7.3/src/platform/plasma/PlasmaPlatformPlugin.cpp        
2026-07-14 13:03:47.000000000 +0200
+++ new/union-6.7.4/src/platform/plasma/PlasmaPlatformPlugin.cpp        
2026-08-04 11:29:30.000000000 +0200
@@ -17,21 +17,23 @@
 
 PlasmaPlatformPlugin::PlasmaPlatformPlugin(QObject *parent)
     : Union::PlatformPlugin(parent)
+    , m_kdeGlobalsWatcher(KConfigWatcher::create(KSharedConfig::openConfig()))
 {
-    const QString configPath = 
QStandardPaths::locate(QStandardPaths::ConfigLocation, 
QStringLiteral("kdeglobals"));
-    if (QFile::exists(configPath)) {
-        QSettings globals(configPath, QSettings::IniFormat);
-        globals.beginGroup(QStringLiteral("KDE"));
-        m_smoothScroll = globals.value(QStringLiteral("SmoothScroll"), 
true).toBool();
-    }
-
-    // Listen to smooth scroll changed events
-    QDBusConnection::sessionBus().connect(QString(),
-                                          QStringLiteral("/SmoothScroll"),
-                                          
QStringLiteral("org.kde.SmoothScroll"),
-                                          QStringLiteral("notifyChange"),
-                                          this,
-                                          SLOT(setSmoothScroll(bool)));
+    KConfigGroup generalCfg = KConfigGroup(KSharedConfig::openConfig(), 
u"KDE"_s);
+    m_smoothScroll = generalCfg.readEntry(u"SmoothScroll"_s, true);
+    m_animationSpeedMultiplier = std::max<double>(0.0, 
generalCfg.readEntry(u"AnimationDurationFactor"_s, 1.0));
+
+    connect(m_kdeGlobalsWatcher.data(), &KConfigWatcher::configChanged, this, 
[this](const KConfigGroup &group, const QByteArrayList &names) {
+        if (group.name() == "KDE"_L1) {
+            if (names.contains("AnimationDurationFactor"_ba)) {
+                setAnimationSpeedMultiplier(std::max<double>(0.0, 
group.readEntry(u"AnimationDurationFactor"_s, 1.0)));
+            }
+
+            if (names.contains("SmoothScroll"_ba)) {
+                setSmoothScroll(group.readEntry(u"SmoothScroll"_s, true));
+            }
+        }
+    });
 }
 
 QString PlasmaPlatformPlugin::defaultInputPlugin()
@@ -79,5 +81,25 @@
 
 void PlasmaPlatformPlugin::setSmoothScroll(bool enabled)
 {
+    if (enabled == m_smoothScroll) {
+        return;
+    }
+
     m_smoothScroll = enabled;
-}
\ No newline at end of file
+    Q_EMIT smoothScrollChanged();
+}
+
+qreal PlasmaPlatformPlugin::animationSpeedMultiplier()
+{
+    return m_animationSpeedMultiplier;
+}
+
+void PlasmaPlatformPlugin::setAnimationSpeedMultiplier(qreal multiplier)
+{
+    if (qFuzzyCompare(multiplier, m_animationSpeedMultiplier)) {
+        return;
+    }
+
+    m_animationSpeedMultiplier = multiplier;
+    Q_EMIT animationSpeedMultiplierChanged();
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/union-6.7.3/src/platform/plasma/PlasmaPlatformPlugin.h 
new/union-6.7.4/src/platform/plasma/PlasmaPlatformPlugin.h
--- old/union-6.7.3/src/platform/plasma/PlasmaPlatformPlugin.h  2026-07-14 
13:03:47.000000000 +0200
+++ new/union-6.7.4/src/platform/plasma/PlasmaPlatformPlugin.h  2026-08-04 
11:29:30.000000000 +0200
@@ -3,6 +3,8 @@
 
 #pragma once
 
+#include <KConfigWatcher>
+
 #include <PlatformPlugin.h>
 
 class PlasmaPlatformPlugin : public Union::PlatformPlugin
@@ -20,9 +22,13 @@
 
     bool smoothScroll() override;
 
-private:
-    bool m_smoothScroll = true;
+    qreal animationSpeedMultiplier() override;
 
-private Q_SLOTS:
+private:
     void setSmoothScroll(bool enabled);
+    void setAnimationSpeedMultiplier(qreal multiplier);
+
+    bool m_smoothScroll = true;
+    qreal m_animationSpeedMultiplier = 1.0;
+    KConfigWatcher::Ptr m_kdeGlobalsWatcher;
 };

Reply via email to