QStyleHints: Add menuSelectionWraps

This lifts QStyle::SH_Menu_SelectionWrap to Qt GUI so it
can also be honored from Qt Quick Controls.

Change-Id: I78eb2dd9fe6ad9329d40f7962bf7ad5f07dd4685
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
This commit is contained in:
Kai Uwe Broulik 2025-01-30 18:10:28 +01:00
parent 9afc899a30
commit acb8252d0a
7 changed files with 31 additions and 5 deletions

View File

@ -122,6 +122,11 @@ QT_BEGIN_NAMESPACE
\value ContextMenuOnMouseRelease (bool) Whether the context menu should be shown on mouse release. \value ContextMenuOnMouseRelease (bool) Whether the context menu should be shown on mouse release.
\value MenuSelectionWraps (bool) Determines whether menu selection wraps. That is, whether key navigation moves
the selection to the first menu item again after the last menu item has been
reached, and vice versa.
This enum value was added in Qt 6.10.
\value TouchDoubleTapDistance (int) The maximum distance in logical pixels which a touchpoint can travel \value TouchDoubleTapDistance (int) The maximum distance in logical pixels which a touchpoint can travel
between taps in order for the tap sequence to be handled as a double tap. between taps in order for the tap sequence to be handled as a double tap.
The default value is double the MouseDoubleClickDistance, or 10 logical pixels The default value is double the MouseDoubleClickDistance, or 10 logical pixels
@ -684,6 +689,8 @@ QVariant QPlatformTheme::defaultThemeHint(ThemeHint hint)
return true; return true;
case PreferFileIconFromTheme: case PreferFileIconFromTheme:
return false; return false;
case MenuSelectionWraps:
return true;
} }
return QVariant(); return QVariant();

View File

@ -99,6 +99,7 @@ public:
UnderlineShortcut, UnderlineShortcut,
ShowIconsInMenus, ShowIconsInMenus,
PreferFileIconFromTheme, PreferFileIconFromTheme,
MenuSelectionWraps,
}; };
Q_ENUM(ThemeHint) Q_ENUM(ThemeHint)

View File

@ -476,6 +476,20 @@ void QStyleHints::setContextMenuTrigger(Qt::ContextMenuTrigger contextMenuTrigge
emit contextMenuTriggerChanged(contextMenuTrigger); emit contextMenuTriggerChanged(contextMenuTrigger);
} }
/*!
\property QStyleHints::menuSelectionWraps
\since 6.10
\brief menu selection wraps around.
Returns \c true if menu selection wraps. That is, whether key navigation moves
the selection to the first menu item again after the last menu item has been
reached, and vice versa.
*/
bool QStyleHints::menuSelectionWraps() const
{
return themeableHint(QPlatformTheme::MenuSelectionWraps).toBool();
}
/*! /*!
\property QStyleHints::passwordMaskDelay \property QStyleHints::passwordMaskDelay
\brief the time, in milliseconds, a typed letter is displayed unshrouded \brief the time, in milliseconds, a typed letter is displayed unshrouded

View File

@ -56,6 +56,7 @@ class Q_GUI_EXPORT QStyleHints : public QObject
Q_PROPERTY(int touchDoubleTapDistance READ touchDoubleTapDistance STORED false CONSTANT FINAL) Q_PROPERTY(int touchDoubleTapDistance READ touchDoubleTapDistance STORED false CONSTANT FINAL)
Q_PROPERTY(Qt::ColorScheme colorScheme READ colorScheme WRITE setColorScheme Q_PROPERTY(Qt::ColorScheme colorScheme READ colorScheme WRITE setColorScheme
RESET unsetColorScheme NOTIFY colorSchemeChanged FINAL) RESET unsetColorScheme NOTIFY colorSchemeChanged FINAL)
Q_PROPERTY(bool menuSelectionWraps READ menuSelectionWraps STORED false CONSTANT FINAL REVISION(6, 10))
public: public:
void setMouseDoubleClickInterval(int mouseDoubleClickInterval); void setMouseDoubleClickInterval(int mouseDoubleClickInterval);
@ -84,6 +85,7 @@ public:
void setShowShortcutsInContextMenus(bool showShortcutsInContextMenus); void setShowShortcutsInContextMenus(bool showShortcutsInContextMenus);
Qt::ContextMenuTrigger contextMenuTrigger() const; Qt::ContextMenuTrigger contextMenuTrigger() const;
void setContextMenuTrigger(Qt::ContextMenuTrigger contextMenuTrigger); void setContextMenuTrigger(Qt::ContextMenuTrigger contextMenuTrigger);
bool menuSelectionWraps() const;
int passwordMaskDelay() const; int passwordMaskDelay() const;
QChar passwordMaskCharacter() const; QChar passwordMaskCharacter() const;
qreal fontSmoothingGamma() const; qreal fontSmoothingGamma() const;

View File

@ -466,6 +466,8 @@ QVariant QCocoaTheme::themeHint(ThemeHint hint) const
return 1.0 / NSEvent.keyRepeatInterval; return 1.0 / NSEvent.keyRepeatInterval;
case QPlatformTheme::ShowIconsInMenus: case QPlatformTheme::ShowIconsInMenus:
return false; return false;
case QPlatformTheme::MenuSelectionWraps:
return false;
default: default:
break; break;
} }

View File

@ -2526,9 +2526,6 @@ int QMacStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget *w
case SH_DialogButtonBox_ButtonsHaveIcons: case SH_DialogButtonBox_ButtonsHaveIcons:
ret = 0; ret = 0;
break; break;
case SH_Menu_SelectionWrap:
ret = false;
break;
case SH_Menu_KeyboardSearch: case SH_Menu_KeyboardSearch:
ret = true; ret = true;
break; break;

View File

@ -5192,9 +5192,12 @@ int QCommonStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget
ret = 75; ret = 75;
break; break;
case SH_Menu_SelectionWrap: case SH_Menu_SelectionWrap: {
ret = true; const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme();
ret = theme ? theme->themeHint(QPlatformTheme::MenuSelectionWraps).toInt()
: QPlatformTheme::defaultThemeHint(QPlatformTheme::MenuSelectionWraps).toInt();
break; break;
}
case SH_Menu_FillScreenWithScroll: case SH_Menu_FillScreenWithScroll:
ret = true; ret = true;