diff --git a/org.kde.desktop/Button.qml b/org.kde.desktop/Button.qml --- a/org.kde.desktop/Button.qml +++ b/org.kde.desktop/Button.qml @@ -22,7 +22,7 @@ import QtQuick 2.6 import QtQuick.Templates @QQC2_VERSION@ as T import org.kde.qqc2desktopstyle.private 1.0 as StylePrivate -import org.kde.kirigami 2.2 as Kirigami +import org.kde.kirigami 2.3 as Kirigami T.Button { id: controlRoot @@ -35,14 +35,23 @@ hoverEnabled: true //Qt.styleHints.useHoverEffects TODO: how to make this work in 5.7? contentItem: Item {} + Kirigami.MnemonicData.enabled: controlRoot.enabled && controlRoot.visible + Kirigami.MnemonicData.controlType: Kirigami.MnemonicData.ActionElement + Kirigami.MnemonicData.label: controlRoot.text + Shortcut { + //in case of explicit & the button manages it by itself + enabled: !(RegExp(/\&[^\&]/).test(controlRoot.text)) + sequence: controlRoot.Kirigami.MnemonicData.sequence + onActivated: controlRoot.clicked() + } background: StylePrivate.StyleItem { id: styleitem control: controlRoot elementType: "button" sunken: controlRoot.pressed || (controlRoot.checkable && controlRoot.checked) raised: !(controlRoot.pressed || (controlRoot.checkable && controlRoot.checked)) hover: controlRoot.hovered - text: controlRoot.text + text: controlRoot.Kirigami.MnemonicData.mnemonicLabel hasFocus: controlRoot.activeFocus activeControl: controlRoot.isDefault ? "default" : "f" properties: { diff --git a/org.kde.desktop/CheckBox.qml b/org.kde.desktop/CheckBox.qml --- a/org.kde.desktop/CheckBox.qml +++ b/org.kde.desktop/CheckBox.qml @@ -23,7 +23,7 @@ import QtQuick 2.6 import QtQuick.Templates @QQC2_VERSION@ as T import QtQuick.Controls @QQC2_VERSION@ -import org.kde.kirigami 2.2 as Kirigami +import org.kde.kirigami 2.3 as Kirigami T.CheckBox { id: controlRoot @@ -50,11 +50,21 @@ control: controlRoot } + Kirigami.MnemonicData.enabled: controlRoot.enabled && controlRoot.visible + Kirigami.MnemonicData.controlType: Kirigami.MnemonicData.ActionElement + Kirigami.MnemonicData.label: controlRoot.text + Shortcut { + //in case of explicit & the button manages it by itself + enabled: !(RegExp(/\&[^\&]/).test(controlRoot.text)) + sequence: controlRoot.Kirigami.MnemonicData.sequence + onActivated: controlRoot.toggle(); + } + contentItem: Label { leftPadding: controlRoot.indicator && !controlRoot.mirrored ? controlRoot.indicator.width + controlRoot.spacing : 0 rightPadding: controlRoot.indicator && controlRoot.mirrored ? controlRoot.indicator.width + controlRoot.spacing : 0 opacity: controlRoot.enabled ? 1 : 0.6 - text: controlRoot.text + text: controlRoot.Kirigami.MnemonicData.richTextLabel font: controlRoot.font elide: Text.ElideRight visible: controlRoot.text diff --git a/org.kde.desktop/DialogButtonBox.qml b/org.kde.desktop/DialogButtonBox.qml --- a/org.kde.desktop/DialogButtonBox.qml +++ b/org.kde.desktop/DialogButtonBox.qml @@ -22,7 +22,7 @@ import QtQuick 2.6 import QtQuick.Templates @QQC2_VERSION@ as T -import org.kde.kirigami 2.2 as Kirigami +import org.kde.kirigami 2.3 as Kirigami T.DialogButtonBox { id: control @@ -36,6 +36,7 @@ delegate: Button { width: Math.min(implicitWidth, control.width / control.count - control.padding - control.spacing * control.count) + Kirigami.MnemonicData.controlType: Kirigami.MnemonicData.DialogButton } contentItem: ListView { diff --git a/org.kde.desktop/MenuBarItem.qml b/org.kde.desktop/MenuBarItem.qml --- a/org.kde.desktop/MenuBarItem.qml +++ b/org.kde.desktop/MenuBarItem.qml @@ -43,6 +43,13 @@ Kirigami.MnemonicData.controlType: Kirigami.MnemonicData.MenuItem Kirigami.MnemonicData.label: controlRoot.text + Shortcut { + //in case of explicit & the button manages it by itself + enabled: !(RegExp(/\&[^\&]/).test(controlRoot.text)) + sequence: controlRoot.Kirigami.MnemonicData.sequence + onActivated: controlRoot.clicked(); + } + contentItem: Label { text: controlRoot.Kirigami.MnemonicData.richTextLabel font: controlRoot.font @@ -52,7 +59,7 @@ horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } -onClicked: print(controlRoot.Kirigami.MnemonicData.richTextLabel) + background: Item { anchors.fill: parent implicitWidth: Kirigami.Units.gridUnit * 8 diff --git a/org.kde.desktop/MenuItem.qml b/org.kde.desktop/MenuItem.qml --- a/org.kde.desktop/MenuItem.qml +++ b/org.kde.desktop/MenuItem.qml @@ -23,7 +23,7 @@ import QtQuick 2.6 import QtQuick.Layouts 1.2 import QtQuick.Templates @QQC2_VERSION@ as T -import org.kde.kirigami 2.2 as Kirigami +import org.kde.kirigami 2.3 as Kirigami T.MenuItem { id: controlRoot @@ -39,6 +39,22 @@ padding: 1 hoverEnabled: !Kirigami.Settings.isMobile + Kirigami.MnemonicData.enabled: controlRoot.enabled && controlRoot.visible + Kirigami.MnemonicData.controlType: Kirigami.MnemonicData.MenuItem + Kirigami.MnemonicData.label: controlRoot.text + Shortcut { + //in case of explicit & the button manages it by itself + enabled: !(RegExp(/\&[^\&]/).test(controlRoot.text)) + sequence: controlRoot.Kirigami.MnemonicData.sequence + onActivated: { + if (controlRoot.checkable) { + controlRoot.toggle(); + } else { + controlRoot.clicked(); + } + } + } + contentItem: RowLayout { Item { Layout.preferredWidth: controlRoot.ListView.view.hasCheckables || controlRoot.checkable ? controlRoot.indicator.width : 0 @@ -58,7 +74,7 @@ Layout.alignment: Qt.AlignVCenter Layout.fillWidth: true - text: controlRoot.text + text: controlRoot.Kirigami.MnemonicData.richTextLabel font: controlRoot.font color: (controlRoot.highlighted || controlRoot.hovered) ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor elide: Text.ElideRight diff --git a/org.kde.desktop/RadioButton.qml b/org.kde.desktop/RadioButton.qml --- a/org.kde.desktop/RadioButton.qml +++ b/org.kde.desktop/RadioButton.qml @@ -23,7 +23,7 @@ import QtQuick 2.6 import QtQuick.Templates @QQC2_VERSION@ as T import QtQuick.Controls @QQC2_VERSION@ -import org.kde.kirigami 2.2 as Kirigami +import org.kde.kirigami 2.3 as Kirigami T.RadioButton { id: control @@ -50,11 +50,20 @@ control: control } + Kirigami.MnemonicData.enabled: control.enabled && control.visible + Kirigami.MnemonicData.controlType: Kirigami.MnemonicData.ActionElement + Kirigami.MnemonicData.label: control.text + Shortcut { + //in case of explicit & the button manages it by itself + enabled: !(RegExp(/\&[^\&]/).test(control.text)) + sequence: control.Kirigami.MnemonicData.sequence + onActivated: control.checked = true + } contentItem: Label { leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0 rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0 opacity: control.enabled ? 1 : 0.6 - text: control.text + text: control.Kirigami.MnemonicData.richTextLabel font: control.font color: Kirigami.Theme.textColor elide: Text.ElideRight diff --git a/org.kde.desktop/Switch.qml b/org.kde.desktop/Switch.qml --- a/org.kde.desktop/Switch.qml +++ b/org.kde.desktop/Switch.qml @@ -22,7 +22,7 @@ import QtQuick 2.6 import QtQuick.Templates @QQC2_VERSION@ as T -import org.kde.kirigami 2.2 as Kirigami +import org.kde.kirigami 2.3 as Kirigami T.CheckBox { id: control @@ -48,11 +48,21 @@ control: control } + Kirigami.MnemonicData.enabled: control.enabled && control.visible + Kirigami.MnemonicData.controlType: Kirigami.MnemonicData.ActionElement + Kirigami.MnemonicData.label: control.text + Shortcut { + //in case of explicit & the button manages it by itself + enabled: !(RegExp(/\&[^\&]/).test(control.text)) + sequence: control.Kirigami.MnemonicData.sequence + onActivated: control.toggle(); + } + contentItem: Label { leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0 rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0 opacity: control.enabled ? 1 : 0.6 - text: control.text + text: control.Kirigami.MnemonicData.richTextLabel font: control.font color: Kirigami.Theme.textColor elide: Text.ElideRight diff --git a/org.kde.desktop/TabButton.qml b/org.kde.desktop/TabButton.qml --- a/org.kde.desktop/TabButton.qml +++ b/org.kde.desktop/TabButton.qml @@ -45,6 +45,15 @@ contentItem: Item {} + Kirigami.MnemonicData.enabled: controlRoot.enabled && controlRoot.visible + Kirigami.MnemonicData.controlType: Kirigami.MnemonicData.SecondaryControl + Kirigami.MnemonicData.label: controlRoot.text + Shortcut { + //in case of explicit & the button manages it by itself + enabled: !(RegExp(/\&[^\&]/).test(controlRoot.text)) + sequence: controlRoot.Kirigami.MnemonicData.sequence + onActivated: controlRoot.checked = true; + } background: StylePrivate.StyleItem { id: styleitem @@ -84,7 +93,7 @@ enabled: controlRoot.enabled selected: controlRoot.checked - text: controlRoot.text + text: controlRoot.Kirigami.MnemonicData.mnemonicLabel hover: controlRoot.hovered hasFocus: controlRoot.activeFocus } diff --git a/org.kde.desktop/ToolButton.qml b/org.kde.desktop/ToolButton.qml --- a/org.kde.desktop/ToolButton.qml +++ b/org.kde.desktop/ToolButton.qml @@ -22,7 +22,7 @@ import QtQuick 2.6 import QtQuick.Templates @QQC2_VERSION@ as T -import org.kde.kirigami 2.2 as Kirigami +import org.kde.kirigami 2.3 as Kirigami import org.kde.qqc2desktopstyle.private 1.0 as StylePrivate T.ToolButton { @@ -37,14 +37,23 @@ flat: true contentItem: Item {} + Kirigami.MnemonicData.enabled: controlRoot.enabled && controlRoot.visible + Kirigami.MnemonicData.controlType: Kirigami.MnemonicData.SecondaryControl + Kirigami.MnemonicData.label: controlRoot.text + Shortcut { + //in case of explicit & the button manages it by itself + enabled: !(RegExp(/\&[^\&]/).test(controlRoot.text)) + sequence: controlRoot.Kirigami.MnemonicData.sequence + onActivated: controlRoot.clicked() + } background: StylePrivate.StyleItem { id: styleitem control: controlRoot elementType: controlRoot.flat ? "toolbutton" : "button" sunken: controlRoot.pressed || (controlRoot.checkable && controlRoot.checked) raised: !(controlRoot.pressed || (controlRoot.checkable && controlRoot.checked)) hover: controlRoot.hovered - text: controlRoot.text + text: controlRoot.Kirigami.MnemonicData.mnemonicLabel hasFocus: false activeControl: controlRoot.isDefault ? "default" : "f" properties: { diff --git a/plugin/kquickstyleitem.cpp b/plugin/kquickstyleitem.cpp --- a/plugin/kquickstyleitem.cpp +++ b/plugin/kquickstyleitem.cpp @@ -1555,10 +1555,29 @@ if (m_control) { m_control->removeEventFilter(this); + disconnect(m_control, 0, this, 0); } m_control = control; - m_control->installEventFilter(this); + + if (m_control) { + m_control->installEventFilter(this); + + if (m_control->window()) { + m_window = m_control->window(); + m_window->installEventFilter(this); + } + connect(m_control, &QQuickItem::windowChanged, this, + [this](QQuickWindow *window) { + if (m_window) { + m_window->removeEventFilter(this); + } + m_window = window; + if (m_window) { + m_window->installEventFilter(this); + } + }); + } emit controlChanged(); } @@ -1616,9 +1635,19 @@ bool KQuickStyleItem::eventFilter(QObject *watched, QEvent *event) { - if (event->type() == QEvent::FocusIn || event->type() == QEvent::FocusOut) { - QFocusEvent *fe = static_cast(event); - m_lastFocusReason = fe->reason(); + if (watched == m_control) { + if (event->type() == QEvent::FocusIn || event->type() == QEvent::FocusOut) { + QFocusEvent *fe = static_cast(event); + m_lastFocusReason = fe->reason(); + } + } else if (watched == m_window.data()) { + if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) { + QKeyEvent *ke = static_cast(event); + if (ke->key() == Qt::Key_Alt) { + updateItem(); + } + + } } return QQuickItem::eventFilter(watched, event); diff --git a/plugin/kquickstyleitem_p.h b/plugin/kquickstyleitem_p.h --- a/plugin/kquickstyleitem_p.h +++ b/plugin/kquickstyleitem_p.h @@ -277,6 +277,7 @@ Kirigami::PlatformTheme *m_theme = nullptr; QStyleOption *m_styleoption; QPointer m_control; + QPointer m_window; Type m_itemType; QString m_type;