/*SPDX-FileCopyrightText: 2011 Martin GrΓ€Γlin <mgraesslin@kde.org>SPDX-FileCopyrightText: 2012 Marco Martin <mart@kde.org>SPDX-FileCopyrightText: 2015-2018 Eike Hein <hein@kde.org>SPDX-FileCopyrightText: 2021 Mikel Johnson <mikel5764@gmail.com>SPDX-FileCopyrightText: 2021 Noah Davis <noahadvs@gmail.com>SPDX-License-Identifier: GPL-2.0-or-later*/pragma ComponentBehavior: Boundimport QtQuickimport QtQuick.Layoutsimport QtQuick.Templates as Timport org.kde.ksvg as KSvgimport org.kde.plasma.plasmoidimport org.kde.plasma.workspace.trianglemousefilterFocusScope {id: rootproperty real preferredSideBarWidth: implicitSideBarWidthproperty real preferredSideBarHeight: implicitSideBarHeight// default for first run, to fit everything on the default sidebar// Plasma only resizes based on implicit size on first runproperty real initialSideBarHeight: {const sB = sideBarLoader.item as KickoffListViewreturn sB.calculateTotalHeightForContentHeight(sB.view.contentHeight)}property alias sideBarComponent: sideBarLoader.sourceComponentproperty alias sideBarItem: sideBarLoader.itemproperty alias contentAreaComponent: contentAreaLoader.sourceComponentproperty alias contentAreaItem: contentAreaLoader.itemproperty alias implicitSideBarWidth: sideBarLoader.implicitWidthproperty alias implicitSideBarHeight: sideBarLoader.implicitHeightimplicitWidth: preferredSideBarWidth + separator.implicitWidth + contentAreaLoader.implicitWidthimplicitHeight: Math.max(preferredSideBarHeight, contentAreaLoader.implicitHeight, Math.min(initialSideBarHeight, Math.round(Screen.desktopAvailableHeight * 0.75)))Component.onCompleted: {// break binding so later category changes on first run don't change kickoff's sizeinitialSideBarHeight = initialSideBarHeight}TriangleMouseFilter {id: sideBarFilteractive: Plasmoid.configuration.switchCategoryOnHoveranchors {top: parent.topleft: parent.leftbottom: parent.bottom}LayoutMirroring.enabled: kickoff.sideBarOnRightimplicitWidth: root.preferredSideBarWidthimplicitHeight: root.preferredSideBarHeightedge: kickoff.sideBarOnRight ? Qt.LeftEdge : Qt.RightEdgeblockFirstEnter: trueLoader {id: sideBarLoaderanchors.fill: parent// When positioned after the content area, Tab should go to the start of the footer focus chainKeys.onTabPressed: event => {(kickoff.paneSwap ? kickoff.footer.nextItemInFocusChain() : contentAreaLoader).forceActiveFocus(Qt.TabFocusReason);}Keys.onBacktabPressed: event => {(kickoff.paneSwap ? contentAreaLoader : kickoff.header.pinButton).forceActiveFocus(Qt.BacktabFocusReason);}Keys.onLeftPressed: event => {if (kickoff.sideBarOnRight) {contentAreaLoader.forceActiveFocus();}}Keys.onRightPressed: event => {if (!kickoff.sideBarOnRight) {contentAreaLoader.forceActiveFocus();}}Keys.onUpPressed: event => {kickoff.header.nextItemInFocusChain().forceActiveFocus(Qt.BacktabFocusReason);}Keys.onDownPressed: event => {(kickoff.paneSwap ? kickoff.footer.leaveButtons.nextItemInFocusChain() : kickoff.footer.tabBar).forceActiveFocus(Qt.TabFocusReason);}}}KSvg.SvgItem {id: separatoranchors {top: parent.topleft: sideBarFilter.rightbottom: parent.bottom}LayoutMirroring.enabled: kickoff.sideBarOnRightimplicitWidth: naturalSize.widthimplicitHeight: implicitWidthelementId: "vertical-line"svg: KickoffSingleton.lineSvg}Loader {id: contentAreaLoaderfocus: trueanchors {top: parent.topleft: separator.rightright: parent.rightbottom: parent.bottom}LayoutMirroring.enabled: kickoff.sideBarOnRight// When positioned after the sidebar, Tab should go to the start of the footer focus chainKeys.onTabPressed: event => {(kickoff.paneSwap ? sideBarLoader : kickoff.footer.nextItemInFocusChain()).forceActiveFocus(Qt.TabFocusReason)}Keys.onBacktabPressed: event => {(kickoff.paneSwap ? kickoff.header.avatar : sideBarLoader).forceActiveFocus(Qt.BacktabFocusReason)}Keys.onLeftPressed: event => {if (!kickoff.sideBarOnRight) {sideBarLoader.forceActiveFocus();}}Keys.onRightPressed: event => {if (kickoff.sideBarOnRight) {sideBarLoader.forceActiveFocus();}}Keys.onUpPressed: event => {kickoff.searchField.forceActiveFocus(Qt.BacktabFocusReason);}Keys.onDownPressed: event => {(kickoff.paneSwap ? kickoff.footer.tabBar : kickoff.footer.leaveButtons.nextItemInFocusChain()).forceActiveFocus(Qt.TabFocusReason)}}}