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; };
