/* * 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 . * */ import QtQml 2.12 import QtQuick 2.12 import QtQuick.Layouts 1.12 import QtQuick.Controls 2.5 import AppControls2 1.0 as AppControls2 import org.ukui.menu.core 1.0 import org.ukui.menu.utils 1.0 Item { ColumnLayout { anchors.fill: parent anchors.topMargin: 12 spacing: 0 Row { Layout.fillWidth: true Layout.preferredHeight: 40 Layout.rightMargin: 12 Layout.leftMargin: 16 ListView { id: extensionListView width: parent.width - 34 height: parent.height clip: true spacing: 24 interactive: false orientation: ListView.Horizontal model: extensionManager.extensionModel() delegate: headerDelegate function send(data) { if (currentItem !== null) { model.send(currentIndex, data); } } onCurrentIndexChanged: { if (currentItem !== null) { currentItem.select(); } } } AppControls2.StyleBackground { width: 34; height: width radius: 4 useStyleTransparent: false alpha: buttonMouseArea.containsPress ? 0.65 : buttonMouseArea.containsMouse ? 0.40 : 0.00 borderColor: Palette.Highlight border.width: buttonMouseArea.activeFocus ? 2 : 0 ThemeIcon { anchors.centerIn: parent width: parent.width / 2; height: width source: "image://appicon/view-fullscreen-symbolic" MouseArea { id: buttonMouseArea hoverEnabled: true anchors.fill: parent onClicked: mainWindow.isFullScreen = true activeFocusOnTab: true Keys.onPressed: { if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) { mainWindow.isFullScreen = true; } } } } } } Item { Layout.fillWidth: true Layout.fillHeight: true Loader { id: extensionLoader anchors.fill: parent clip: true onLoaded: { item.send.connect(extensionListView.send); } } } Row { Layout.fillWidth: true Layout.preferredHeight: 40 Layout.rightMargin: 12 layoutDirection: Qt.RightToLeft AppControls2.StyleBackground { width: 32 height: 32 paletteRole: Palette.Base useStyleTransparent: false alpha: powerButtonArea.containsPress ? 0.85 : powerButtonArea.containsMouse ? 0.65 : 0 radius: height / 2 borderColor: Palette.Highlight border.width: powerButtonArea.activeFocus ? 2 : 0 PowerButton { id: powerButtonBase } Image { anchors.centerIn: parent width: Math.floor(parent.width / 2) height: width source: powerButtonBase.icon } MouseArea { id: powerButtonArea anchors.fill: parent hoverEnabled: true ToolTip.visible: containsMouse ToolTip.text: powerButtonBase.toolTip acceptedButtons: Qt.LeftButton | Qt.RightButton property int spacingFromMenu: 16 activeFocusOnTab: true Keys.onPressed: { if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) { powerButtonBase.clicked(true, 0, 0, mainWindow.isFullScreen); } } onClicked: { var buttonPosition = powerButtonArea.mapToGlobal(width, height); powerButtonBase.clicked(mouse.button === Qt.LeftButton, buttonPosition.x + spacingFromMenu, buttonPosition.y + spacingFromMenu, mainWindow.isFullScreen); } } } } } Component { id: headerDelegate AppControls2.StyleBackground { id: headerDelegateItem useStyleTransparent: false paletteRole: Palette.Highlight alpha: 0 radius: 4 borderColor: Palette.Highlight border.width: headerDelegateItem.activeFocus ? 2 : 0 property var extensionData: model.data width: styleText.width height: ListView.view ? ListView.view.height : 0 activeFocusOnTab: true Keys.onPressed: { if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) { ListView.view.currentIndex = model.index; } } onExtensionDataChanged: { if (extensionLoader.source === model.url) { extensionLoader.item.extensionData = extensionData; } } function select() { if (extensionLoader.source !== model.url) { extensionLoader.setSource(model.url, {extensionData: extensionData}); } } AppControls2.StyleText { height: parent.height id: styleText verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter font.bold: parent.ListView.isCurrentItem wrapMode: Text.ElideRight paletteRole: parent.ListView.isCurrentItem ? Palette.Highlight: Palette.Text text: model.name } MouseArea { anchors.fill: parent onClicked: { parent.ListView.view.currentIndex = model.index; } } } } Component.onCompleted: { if (extensionListView.count > 0) { extensionListView.currentIndex = 0; } } }