ukui-menu/qml/AppUI/PluginSelectMenu.qml

144 lines
4.7 KiB
QML

/*
* Copyright (C) 2023, KylinSoft Co., Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
import QtQuick 2.12
import QtQuick.Layouts 1.12
import QtQuick.Controls 2.12
import AppControls2 1.0 as AppControls2
import org.ukui.menu.core 1.0
import org.ukui.menu.utils 1.0
RowLayout {
id: pluginSelectMenuRoot
property var model: appPageHeaderUtils.model(PluginGroup.SortMenuItem)
spacing: 2
function resetFocus() {
if(!mainWindow.isFullScreen) {
normalUI.focusToFalse();
}
}
AppControls2.RoundButton {
id: pluginSelectButton
Layout.fillHeight: true
Layout.fillWidth: true
Layout.maximumWidth: height
activeFocusOnTab: true
highlight: mainWindow.isFullScreen
autoHighLight: !mainWindow.isFullScreen
buttonIcon: "image://appicon/ukui-selected"
onClicked: {
resetFocus();
pluginSelectMenuRoot.model.autoSwitchProvider();
}
Keys.onPressed: {
if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
pluginSelectMenuRoot.model.autoSwitchProvider();
}
}
}
MouseArea {
id: sortMenuMouseArea
Layout.alignment: Qt.AlignVCenter
Layout.fillWidth: true
Layout.fillHeight: true
Layout.maximumWidth: 16
Layout.maximumHeight: 16
activeFocusOnTab: true
Keys.onPressed: {
if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
sortMenuClicked();
}
}
onClicked: {
resetFocus();
sortMenuClicked();
}
function sortMenuClicked() {
if(sortMenuSelector.state === "sortMenuClose") {
sortMenuSelector.state = "sortMenuOpen";
}
var pressY = sortMenuMouseArea.mapToGlobal(0, 0).y;
var pressX = sortMenuMouseArea.mapToGlobal(0, 0).x;
pluginSelectMenuRoot.model.openMenu(pluginSelectButton.height - y - mouseY + 8, pressX, pressY);
}
AppControls2.StyleBackground {
anchors.fill: parent
useStyleTransparent: false
paletteRole: Palette.Highlight
alpha: 0
borderColor: Palette.Highlight
border.width: sortMenuMouseArea.activeFocus ? 2 : 0
}
ThemeIcon {
id: sortMenuSelector
anchors.fill: parent
source: "image://appicon/ukui-up-symbolic"
opacity: 0.5
highLight: mainWindow.isFullScreen
state: "sortMenuClose"
states: [
State {
name: "sortMenuOpen"
PropertyChanges { target: sortMenuSelector; rotation: 0 }
},
State {
name: "sortMenuClose"
PropertyChanges { target: sortMenuSelector; rotation: 180 }
}
]
transitions: [
Transition {
to: "sortMenuOpen"
RotationAnimation { duration: 100; direction: RotationAnimation.Counterclockwise}
},
Transition {
to: "sortMenuClose"
RotationAnimation { duration: 100; direction: RotationAnimation.Clockwise }
}
]
Component.onCompleted: {
updateProviderIcon();
pluginSelectMenuRoot.model.currentIndexChanged.connect(updateProviderIcon);
pluginSelectMenuRoot.model.menuClosed.connect(changeMenuStatus);
}
Component.onDestruction: {
pluginSelectMenuRoot.model.currentIndexChanged.disconnect(updateProviderIcon);
pluginSelectMenuRoot.model.menuClosed.disconnect(changeMenuStatus);
}
function updateProviderIcon() {
pluginSelectButton.buttonIcon = pluginSelectMenuRoot.model.currentProviderIcon();
}
function changeMenuStatus() {
sortMenuSelector.state = "sortMenuClose";
}
}
}
}