shift-shell/containments/taskpanel/package/contents/ui/main.qml

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

124 lines
5.1 KiB
QML
Raw Normal View History

/*
2021-03-01 20:03:25 +00:00
* SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
2021-10-18 03:50:59 +00:00
* SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org>
*
2021-03-01 20:03:25 +00:00
* SPDX-License-Identifier: GPL-2.0-or-later
*/
import QtQuick 2.4
import QtQuick.Layouts 1.1
import QtQuick.Window 2.15
2023-03-03 05:48:24 +00:00
import Qt5Compat.GraphicalEffects
import org.kde.taskmanager 0.1 as TaskManager
import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.kquickcontrolsaddons 2.0
import org.kde.plasma.private.nanoshell 2.0 as NanoShell
import org.kde.plasma.private.mobileshell.shellsettingsplugin as ShellSettings
import org.kde.plasma.private.mobileshell.windowplugin as WindowPlugin
2020-07-22 15:17:10 +00:00
2015-06-18 23:31:26 +00:00
PlasmaCore.ColorScope {
id: root
2023-03-03 06:11:51 +00:00
Plasmoid.backgroundHints: PlasmaCore.Types.NoBackground
width: 480
height: PlasmaCore.Units.gridUnit * 2
// toggle visibility of navigation bar (show, or use gestures only)
Binding {
target: plasmoid.Window.window // assumed to be plasma-workspace "PanelView" component
property: "visibilityMode"
// 0 - VisibilityMode.NormalPanel
// 2 - VisibilityMode.LetWindowsCover HACK: TODO one day we make delete the panel component instead of making it invisible in gesture-only mode
value: ShellSettings.Settings.navigationPanelEnabled ? 0 : 2
2023-03-03 06:11:51 +00:00
}
// we have the following scenarios:
// - system is in landscape orientation & nav panel is enabled (panel on right)
// - system is in landscape orientation & gesture mode is enabled (panel on bottom)
// - system is in portrait orientation (panel on bottom)
readonly property bool inLandscape: Screen.width > Screen.height;
readonly property bool isInLandscapeNavPanelMode: inLandscape && ShellSettings.Settings.navigationPanelEnabled
2023-03-03 06:11:51 +00:00
readonly property real navigationPanelHeight: PlasmaCore.Units.gridUnit * 2
readonly property real intendedWindowThickness: navigationPanelHeight
2023-03-03 06:11:51 +00:00
readonly property real intendedWindowLength: isInLandscapeNavPanelMode ? Screen.height : Screen.width
readonly property real intendedWindowOffset: isInLandscapeNavPanelMode ? Components.Constants.topPanelHeight : 0; // offset for top panel
2023-03-03 06:11:51 +00:00
readonly property int intendedWindowLocation: isInLandscapeNavPanelMode ? PlasmaCore.Types.RightEdge : PlasmaCore.Types.BottomEdge
onIntendedWindowLengthChanged: maximizeTimer.restart() // ensure it always takes up the full length of the screen
onIntendedWindowOffsetChanged: plasmoid.Window.window.offset = intendedWindowOffset
onIntendedWindowLocationChanged: locationChangeTimer.restart()
// use a timer so we don't have to maximize for every single pixel
// - improves performance if the shell is run in a window, and can be resized
Timer {
id: maximizeTimer
running: false
interval: 100
onTriggered: {
// maximize first, then we can apply offsets (otherwise they are overridden)
plasmoid.Window.window.maximize()
plasmoid.Window.window.offset = intendedWindowOffset;
}
}
// use a timer so that rotation events are faster (offload the panel movement to later, after everything is figured out)
Timer {
id: locationChangeTimer
running: false
interval: 100
onTriggered: plasmoid.Window.window.location = intendedWindowLocation
}
function setWindowProperties() {
// plasmoid.Window.window is assumed to be plasma-workspace "PanelView" component
if (plasmoid) {
plasmoid.Window.window.maximize(); // maximize first, then we can apply offsets (otherwise they are overridden)
plasmoid.Window.window.offset = intendedWindowOffset;
plasmoid.Window.window.thickness = navigationPanelHeight;
plasmoid.Window.window.location = intendedWindowLocation;
}
2023-03-03 06:11:51 +00:00
}
Connections {
target: plasmoid.Window.window
// HACK: There seems to be some component that overrides our initial bindings for the panel,
// which is particularly problematic on first start (since the panel is misplaced)
// - We set an event to override any attempts to override our bindings.
function onLocationChanged() {
if (plasmoid.Window.window.location !== root.intendedWindowLocation) {
root.setWindowProperties();
}
}
function onThicknessChanged() {
if (plasmoid.Window.window.thickness !== root.intendedWindowThickness) {
root.setWindowProperties();
}
}
}
Component.onCompleted: setWindowProperties();
// only opaque if there are no maximized windows on this screen
readonly property bool opaqueBar: WindowPlugin.WindowMaximizedTracker.showingWindow
2023-03-03 06:11:51 +00:00
// contrasting colour
colorGroup: opaqueBar ? PlasmaCore.Theme.NormalColorGroup : PlasmaCore.Theme.ComplementaryColorGroup
// load appropriate system navigation component
Loader {
id: navigationLoader
active: ShellSettings.Settings.navigationPanelEnabled
2023-03-03 06:11:51 +00:00
anchors.fill: parent
sourceComponent: NavigationPanelComponent {
opaqueBar: root.opaqueBar
}
2023-03-03 06:11:51 +00:00
}
}