mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-26 14:23:09 +00:00
add type annotations to taskswitcher QML and do more explicit typing
This commit is contained in:
parent
2689913bc2
commit
5d33295443
7 changed files with 45 additions and 43 deletions
|
|
@ -1,4 +1,5 @@
|
|||
// SPDX-FileCopyrightText: 2021-2023 Devin Lin <devin@kde.org>
|
||||
// SPDX-FileCopyrightText: 2025 Luis Büchi <luis.buechi@kdemail.net>
|
||||
// SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
|
||||
import QtQuick
|
||||
|
|
@ -65,7 +66,7 @@ Flickable {
|
|||
}
|
||||
}
|
||||
|
||||
function resetPosition() {
|
||||
function resetPosition(): void {
|
||||
oldContentX = startContentX;
|
||||
contentX = startContentX;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2015 Marco Martin <notmart@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2021-2023 Devin Lin <devin@kde.org>
|
||||
// SPDX-FileCopyrightText: 2024 Luis Büchi <luis.buechi@kdemail.net>
|
||||
// SPDX-FileCopyrightText: 2024-2025 Luis Büchi <luis.buechi@kdemail.net>
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
import QtQuick
|
||||
|
|
@ -41,18 +41,18 @@ Item {
|
|||
opacity: 1 - dragOffset / taskSwitcher.height
|
||||
|
||||
//BEGIN functions
|
||||
function closeApp() {
|
||||
function closeApp(): void {
|
||||
delegate.window.closeWindow();
|
||||
}
|
||||
|
||||
function activateApp() {
|
||||
function activateApp(): void {
|
||||
if (!ShellSettings.Settings.convergenceModeEnabled) {
|
||||
delegate.window.setMaximize(true, true);
|
||||
}
|
||||
taskSwitcherHelpers.openApp(model.index);
|
||||
}
|
||||
|
||||
function minimizeApp() {
|
||||
function minimizeApp(): void {
|
||||
delegate.window.minimized = true;
|
||||
}
|
||||
//END functions
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
// SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org>
|
||||
// SPDX-FileCopyrightText: 2025 Luis Büchi <luis.buechi@kdemail.net>
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
import QtQuick
|
||||
|
|
@ -41,17 +42,17 @@ MouseArea {
|
|||
return taskYBase - trackFingerYOffsetClamped;
|
||||
}
|
||||
|
||||
function getTaskAt(index) {
|
||||
function getTaskAt(index: int): Task {
|
||||
return repeater.itemAt(index);
|
||||
}
|
||||
|
||||
function closeAll() {
|
||||
function closeAll(): void {
|
||||
for (let i = 0; i < repeater.count; i++) {
|
||||
repeater.itemAt(i).closeApp();
|
||||
}
|
||||
}
|
||||
|
||||
function minimizeAll() {
|
||||
function minimizeAll(): void {
|
||||
for (let i = 0; i < repeater.count; i++) {
|
||||
let item = repeater.itemAt(i);
|
||||
|
||||
|
|
@ -62,7 +63,7 @@ MouseArea {
|
|||
}
|
||||
}
|
||||
|
||||
function jumpToFirstVisibleWindow() {
|
||||
function jumpToFirstVisibleWindow(): void {
|
||||
for (let i = 0; i < repeater.count; i++) {
|
||||
let item = repeater.itemAt(i);
|
||||
|
||||
|
|
@ -94,7 +95,7 @@ MouseArea {
|
|||
}
|
||||
|
||||
// dynamic task offset animation duration based off of the touch position and task scale
|
||||
function dynamicDuration(left = true) {
|
||||
function dynamicDuration(left = true): int {
|
||||
// if the close animation is running, use the standard long duration time for consistency
|
||||
let duration = Kirigami.Units.longDuration * 1.75
|
||||
if (!taskSwitcherHelpers.closeAnim.running && taskSwitcherHelpers.notHomeScreenState && taskSwitcherHelpers.gestureState != TaskSwitcherHelpers.GestureStates.HorizontalSwipe && !taskSwitcherHelpers.isInTaskScrubMode) {
|
||||
|
|
@ -117,7 +118,7 @@ MouseArea {
|
|||
property bool setOffsetDurationImmediately: true
|
||||
|
||||
// set the task offset value with an animation unless specified otherwise
|
||||
function setTaskOffsetValue(value, immediately = false, taskEasing = ((taskSwitcherHelpers.notHomeScreenState || (value != 0)) && (baseTaskOffset != taskSwitcherHelpers.taskOffsetValue)) ? Easing.InOutQuart : Easing.OutQuart) {
|
||||
function setTaskOffsetValue(value: int, immediately = false, taskEasing = ((taskSwitcherHelpers.notHomeScreenState || (value != 0)) && (baseTaskOffset != taskSwitcherHelpers.taskOffsetValue)) ? Easing.InOutQuart : Easing.OutQuart): void {
|
||||
if (baseTaskOffset == value && immediately) {
|
||||
baseTaskOffset = value + 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// SPDX-FileCopyrightText: 2015 Marco Martin <notmart@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2021-2024 Devin Lin <devin@kde.org>
|
||||
// SPDX-FileCopyrightText: 2024 Luis Büchi <luis.buechi@kdemail.net>
|
||||
// SPDX-FileCopyrightText: 2024-2025 Luis Büchi <luis.buechi@kdemail.net>
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
import QtQuick
|
||||
|
|
@ -46,7 +46,7 @@ FocusScope {
|
|||
id: haptics
|
||||
}
|
||||
|
||||
property var tasksModel: TaskSwitcherPlugin.TaskFilterModel {
|
||||
property TaskSwitcherPlugin.TaskFilterModel tasksModel: TaskSwitcherPlugin.TaskFilterModel {
|
||||
screenName: root.targetScreen.name
|
||||
windowModel: root.state.taskModel
|
||||
}
|
||||
|
|
@ -87,7 +87,7 @@ FocusScope {
|
|||
initialSetup();
|
||||
}
|
||||
|
||||
function initialSetup() {
|
||||
function initialSetup(): void {
|
||||
taskSwitcherHelpers.cancelAnimations();
|
||||
state.updateWasInActiveTask(KWinComponents.Workspace.activeWindow);
|
||||
|
||||
|
|
@ -143,15 +143,15 @@ FocusScope {
|
|||
}
|
||||
|
||||
// called by c++ plugin
|
||||
function hideAnimation() {
|
||||
function hideAnimation(): void {
|
||||
closeAnim.restart();
|
||||
}
|
||||
|
||||
function instantHide() {
|
||||
function instantHide(): void {
|
||||
root.state.deactivate(true);
|
||||
}
|
||||
|
||||
function hide() {
|
||||
function hide(): void {
|
||||
root.state.deactivate(false);
|
||||
}
|
||||
|
||||
|
|
@ -159,7 +159,7 @@ FocusScope {
|
|||
target: root.state
|
||||
|
||||
// task scrub mode allows scrubbing through a number of tasks with a mostly horizontal motion
|
||||
function taskScrubMode() {
|
||||
function taskScrubMode(): void {
|
||||
taskList.setTaskOffsetValue(0, false, Easing.OutQuart);
|
||||
if (!taskSwitcherHelpers.isInTaskScrubMode) {
|
||||
backgroundColorOpacity = 1;
|
||||
|
|
@ -180,7 +180,7 @@ FocusScope {
|
|||
}
|
||||
}
|
||||
|
||||
function onTouchPositionChanged() {
|
||||
function onTouchPositionChanged(): void {
|
||||
let unmodifiedYposition = Math.abs(state.touchYPosition)
|
||||
if (taskSwitcherHelpers.isInTaskScrubMode || // once in scrub mode, let's not allow to go out, that can result in inconsistent UX
|
||||
(Math.abs(state.xVelocity) > Math.abs(state.yVelocity) * 3 && // gesture needs to be almost completely horizontal
|
||||
|
|
@ -220,7 +220,7 @@ FocusScope {
|
|||
}
|
||||
}
|
||||
|
||||
function updateTaskSwitcherState() {
|
||||
function updateTaskSwitcherState(): void {
|
||||
let unmodifiedYposition = Math.abs(state.touchYPosition)
|
||||
|
||||
// if the touch is above heightThreshold, set reachedHeightThreshold to true
|
||||
|
|
@ -309,13 +309,13 @@ FocusScope {
|
|||
|
||||
// returns to the currently centered app. usually used to "back out" of the switcher
|
||||
// if accidentally invoked, but can also be used to switch to an adjacent app and then open it
|
||||
function returnToApp() {
|
||||
function returnToApp(): void {
|
||||
let newIndex = taskSwitcherHelpers.getNearestTaskIndex();
|
||||
taskSwitcherHelpers.openApp(newIndex);
|
||||
}
|
||||
|
||||
// diagonal quick switch gesture logic
|
||||
function quickSwitch() {
|
||||
function quickSwitch(): void {
|
||||
// should "quick switch" to adjacent app in task switcher, but only if we were in an app before
|
||||
let unmodifiedYposition = Math.abs(state.touchYPosition)
|
||||
let newIndex = state.currentTaskIndex;
|
||||
|
|
@ -361,7 +361,7 @@ FocusScope {
|
|||
}
|
||||
|
||||
// Logic for deciding how to handle the end of a gesture input
|
||||
function onGestureInProgressChanged() {
|
||||
function onGestureInProgressChanged(): void {
|
||||
taskSwitcherHelpers.fromButton = false;
|
||||
if (state.gestureInProgress) {
|
||||
taskSwitcherHelpers.currentDisplayTask = state.currentTaskIndex;
|
||||
|
|
@ -409,11 +409,11 @@ FocusScope {
|
|||
}
|
||||
}
|
||||
|
||||
function onVelocityChanged() {
|
||||
function onVelocityChanged(): void {
|
||||
|
||||
}
|
||||
|
||||
function onXPositionChanged() {
|
||||
function onXPositionChanged(): void {
|
||||
taskSwitcherHelpers.updateTaskIndex();
|
||||
}
|
||||
}
|
||||
|
|
@ -425,7 +425,7 @@ FocusScope {
|
|||
onTriggered: taskSwitcherHelpers.taskSwitchCanLaunch = true;
|
||||
}
|
||||
|
||||
function setTaskDrawerState(value) {
|
||||
function setTaskDrawerState(value: int): void {
|
||||
if (taskSwitcherHelpers.gestureState != TaskSwitcherHelpers.GestureStates.TaskSwitcher && value == TaskSwitcherHelpers.GestureStates.TaskSwitcher) {
|
||||
// vibrate only if switching to task drawer
|
||||
if (!taskSwitcherHelpers.hasVibrated) {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
// SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org>
|
||||
// SPDX-FileCopyrightText: 2024 Luis Büchi <luis.buechi@kdemail.net>
|
||||
// SPDX-FileCopyrightText: 2024-2025 Luis Büchi <luis.buechi@kdemail.net>
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
import QtQuick 2.15
|
||||
|
|
@ -175,7 +175,7 @@ QtObject {
|
|||
xAnim.stop();
|
||||
}
|
||||
|
||||
function getTaskIndexFromWindow(window) {
|
||||
function getTaskIndexFromWindow(window: KWinComponents.Window): int {
|
||||
for (let i = 0; i < taskSwitcher.tasksModel.rowCount(); i++) {
|
||||
const modelWindow = taskSwitcher.tasksModel.data(taskSwitcher.tasksModel.index(i, 0), Qt.DisplayRole);
|
||||
if (modelWindow == window) {
|
||||
|
|
@ -185,20 +185,20 @@ QtObject {
|
|||
return 0;
|
||||
}
|
||||
|
||||
function getTaskIndexFromXPosition() {
|
||||
function getTaskIndexFromXPosition(): int {
|
||||
let candidateIndex = Math.round(-root.state.xPosition / (taskSpacing + taskWidth));
|
||||
return Math.max(0, Math.min(taskSwitcher.tasksCount - 1, candidateIndex));
|
||||
}
|
||||
|
||||
// TODO either use updateTaskIndex to always have the "newest current task index" in the state var or use "getNearestTaskIndex", not both it's redundant
|
||||
function updateTaskIndex() {
|
||||
function updateTaskIndex(): void {
|
||||
// only set if not gesture currently in progress to prevent glitching
|
||||
if (!(state.gestureInProgress || root.closeAnim.running || root.openAppAnim.running) || root.isInTaskScrubMode) {
|
||||
root.state.currentTaskIndex = getTaskIndexFromXPosition();
|
||||
}
|
||||
}
|
||||
|
||||
function open() {
|
||||
function open(): void {
|
||||
root.gestureState = TaskSwitcherHelpers.GestureStates.TaskSwitcher;
|
||||
openAnim.restart();
|
||||
|
||||
|
|
@ -206,7 +206,7 @@ QtObject {
|
|||
taskList.setTaskOffsetValue(0, false, Easing.OutQuart);
|
||||
}
|
||||
|
||||
function close() {
|
||||
function close(): void {
|
||||
// update the task offset position
|
||||
taskList.setTaskOffsetValue(homeOffsetValue + 0.25, false, Easing.Linear);
|
||||
|
||||
|
|
@ -218,7 +218,7 @@ QtObject {
|
|||
closeFactorAnim.restart();
|
||||
}
|
||||
|
||||
function openApp(index, duration = Kirigami.Units.shortDuration, horizontalEasing = Easing.OutBack) {
|
||||
function openApp(index: int, duration = Kirigami.Units.shortDuration, horizontalEasing = Easing.OutBack): void {
|
||||
// cancel any opening animations ongoing
|
||||
openAnim.stop();
|
||||
cancelAnimations();
|
||||
|
|
@ -229,24 +229,24 @@ QtObject {
|
|||
}
|
||||
|
||||
// get the xPosition where the task will be centered on the screen
|
||||
function xPositionFromTaskIndex(index) {
|
||||
function xPositionFromTaskIndex(index: int): int {
|
||||
return -index * (taskWidth + taskSpacing);
|
||||
}
|
||||
|
||||
// instantly go to the task index
|
||||
function goToTaskIndex(index) {
|
||||
function goToTaskIndex(index: int): void {
|
||||
root.state.xPosition = xPositionFromTaskIndex(index);
|
||||
}
|
||||
|
||||
// go to the task index, animated
|
||||
function animateGoToTaskIndex(index, duration = Kirigami.Units.longDuration * 2, easing = Easing.OutExpo) {
|
||||
function animateGoToTaskIndex(index: int, duration = Kirigami.Units.longDuration * 2, easing = Easing.OutExpo): void {
|
||||
xAnimDuration = duration;
|
||||
xAnimEasingType = easing;
|
||||
xAnim.to = xPositionFromTaskIndex(index) - (gestureState == TaskSwitcherHelpers.GestureStates.HorizontalSwipe && !state.gestureInProgress && notHomeScreenState ? taskSpacing / 2 : 0);
|
||||
xAnim.restart();
|
||||
}
|
||||
|
||||
function getNearestTaskIndex() {
|
||||
function getNearestTaskIndex(): int {
|
||||
let newTaskIndex = getTaskIndexFromXPosition();
|
||||
let currentTaskIndexPosition = xPositionFromTaskIndex(root.state.currentTaskIndex);
|
||||
if (root.state.xPosition > currentTaskIndexPosition) {
|
||||
|
|
@ -269,14 +269,14 @@ QtObject {
|
|||
}
|
||||
}
|
||||
}
|
||||
function snapToNearestTask() {
|
||||
function snapToNearestTask(): void {
|
||||
let index = getNearestTaskIndex();
|
||||
animateGoToTaskIndex(index);
|
||||
}
|
||||
|
||||
// This is a workaround for flickable not actually flicking, so we just snap to the next task
|
||||
// based on old movement direction, ignoring momentum (because flickable doesn't give us any momentum)
|
||||
function snapToNearestTaskWorkaround(movingRight) {
|
||||
function snapToNearestTaskWorkaround(movingRight: bool): void {
|
||||
let currentTaskIndexPosition = xPositionFromTaskIndex(root.state.currentTaskIndex);
|
||||
if (root.state.xPosition > currentTaskIndexPosition) {
|
||||
if (movingRight) {
|
||||
|
|
|
|||
|
|
@ -48,12 +48,12 @@ class MobileTaskSwitcherState : public QObject
|
|||
Q_PROPERTY(qreal yPosition READ yPosition WRITE setYPosition NOTIFY yPositionChanged)
|
||||
|
||||
Q_PROPERTY(bool gestureInProgress READ gestureInProgress NOTIFY gestureInProgressChanged)
|
||||
Q_PROPERTY(Status status READ status WRITE setStatus NOTIFY statusChanged)
|
||||
Q_PROPERTY(KWin::MobileTaskSwitcherState::Status status READ status WRITE setStatus NOTIFY statusChanged)
|
||||
|
||||
Q_PROPERTY(qint64 elapsedTimeSinceStart READ getElapsedTimeSinceStart)
|
||||
Q_PROPERTY(qint64 doubleClickInterval READ getDoubleClickInterval) // is there a better way than to forward this?
|
||||
|
||||
Q_PROPERTY(TaskModel *taskModel READ taskModel CONSTANT)
|
||||
Q_PROPERTY(KWin::TaskModel *taskModel READ taskModel CONSTANT)
|
||||
QML_ELEMENT
|
||||
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ namespace KWin
|
|||
class TaskFilterModel : public QSortFilterProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(TaskModel *windowModel READ windowModel WRITE setWindowModel NOTIFY windowModelChanged)
|
||||
Q_PROPERTY(KWin::TaskModel *windowModel READ windowModel WRITE setWindowModel NOTIFY windowModelChanged)
|
||||
Q_PROPERTY(QString screenName READ screenName WRITE setScreenName NOTIFY screenNameChanged)
|
||||
QML_ELEMENT
|
||||
|
||||
|
|
@ -28,7 +28,7 @@ public:
|
|||
explicit TaskFilterModel(QObject *parent = nullptr);
|
||||
|
||||
TaskModel *windowModel() const;
|
||||
void setWindowModel(TaskModel *taskModel);
|
||||
void setWindowModel(KWin::TaskModel *taskModel);
|
||||
|
||||
QString screenName() const;
|
||||
void setScreenName(const QString &screenName);
|
||||
|
|
|
|||
Loading…
Reference in a new issue