SPDX-FileCopyrightText: 2012-2016 Eike Hein <hein@kde.org>
SPDX-FileCopyrightText: 2020 Nate Graham <nate@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
.pragma library
.import org.kde.taskmanager as TaskManager
.import org.kde.plasma.core as PlasmaCore
var taskManagerInstanceCount = 0;
function activateNextPrevTask(anchor, next, wheelSkipMinimized, wheelEnabled, tasks) {
if (wheelEnabled === 2) {
if (!anchor) return;
const anchorModelIndex = anchor.modelIndex(anchor.index);
const winIdList = tasks.tasksModel.data(anchorModelIndex, TaskManager.AbstractTasksModel.WinIdList);
const windowCount = winIdList ? winIdList.length : 0;
if (windowCount === 0) {
return;
}
if (windowCount === 1) {
const isHidden = tasks.tasksModel.data(anchorModelIndex, TaskManager.AbstractTasksModel.IsHidden);
if (!wheelSkipMinimized || !isHidden) {
tasks.tasksModel.requestActivate(anchorModelIndex);
}
return;
}
}
let taskIndexList = [];
const activeTaskIndex = tasks.tasksModel.activeTask;
for (let i = 0; i < tasks.taskList.children.length - 1; ++i) {
const task = tasks.taskList.children[i];
const modelIndex = task.modelIndex(i);
if (!task.model.IsLauncher && !task.model.IsStartup) {
if (task.model.IsGroupParent) {
if (wheelEnabled === 2 && task === anchor) {
taskIndexList = [];
}
for (let j = 0; j < tasks.tasksModel.rowCount(modelIndex); ++j) {
const childModelIndex = tasks.tasksModel.makeModelIndex(i, j);
const childHidden = tasks.tasksModel.data(childModelIndex, TaskManager.AbstractTasksModel.IsHidden);
if (!wheelSkipMinimized || !childHidden) {
taskIndexList.push(childModelIndex);
}
}
if (wheelEnabled === 2 && task === anchor) {
break;
}
} else {
if (!wheelSkipMinimized || !task.model.IsHidden) {
taskIndexList.push(modelIndex);
}
}
}
}
if (!taskIndexList.length) {
return;
}
let target = taskIndexList[0];
for (let i = 0; i < taskIndexList.length; ++i) {
if (taskIndexList[i] === activeTaskIndex)
{
if (next && i < (taskIndexList.length - 1)) {
target = taskIndexList[i + 1];
} else if (!next) {
if (i) {
target = taskIndexList[i - 1];
} else {
target = taskIndexList[taskIndexList.length - 1];
}
}
break;
}
}
tasks.tasksModel.requestActivate(target);
}
function groupTopTask(childTaskList, attribute, tasks) {
let topAttribute = -1;
let topTaskIndex = undefined;
for (let task = 0; task < childTaskList.length; ++task) {
const childTaskModelIndex = childTaskList[task];
const taskAttribute = tasks.tasksModel.data(childTaskModelIndex, attribute);
if (taskAttribute !== undefined && taskAttribute > topAttribute) {
topAttribute = taskAttribute;
topTaskIndex = childTaskModelIndex;
}
}
return topTaskIndex;
}
function activateTask(index, model, modifiers, task, plasmoid, tasks, windowViewAvailable) {
if (modifiers & Qt.ShiftModifier) {
tasks.tasksModel.requestNewInstance(index);
return;
}
if (taskManagerInstanceCount >= 2) {
tasks.tasksModel.requestPublishDelegateGeometry(task.modelIndex(), tasks.backend.globalRect(task), task);
}
if (model.IsGroupParent) {
if (plasmoid.configuration.groupedTaskVisualization === 0) {
let childTaskList = [];
for (let i = 0; i < tasks.tasksModel.rowCount(task.modelIndex(index)); ++i) {
const childTaskModelIndex = tasks.tasksModel.makeModelIndex(task.index, i);
childTaskList.push(childTaskModelIndex);
}
if (childTaskList.some(index => tasks.tasksModel.data(index, TaskManager.AbstractTasksModel.IsActive))) {
for (let j = 0; j < childTaskList.length; ++j) {
const childTask = childTaskList[j];
if (tasks.tasksModel.data(childTask, TaskManager.AbstractTasksModel.IsActive)) {
let nextTask = j + 1;
if (nextTask >= childTaskList.length) {
nextTask = 0;
}
tasks.tasksModel.requestActivate(childTaskList[nextTask]);
break;
}
}
} else {
let topTaskIndex = groupTopTask(childTaskList, TaskManager.AbstractTasksModel.LastActivated, tasks);
if (topTaskIndex === undefined) {
topTaskIndex = groupTopTask(childTaskList, TaskManager.AbstractTasksModel.StackingOrder, tasks)
}
tasks.tasksModel.requestActivate(topTaskIndex);
}
}
else if (plasmoid.configuration.groupedTaskVisualization === 1) {
if (tasks.toolTipOpenedByClick) {
task.hideImmediately();
} else {
tasks.toolTipOpenedByClick = task;
task.updateMainItemBindings();
task.showToolTip();
}
}
else if (plasmoid.configuration.groupedTaskVisualization === 2 && windowViewAvailable) {
task.hideToolTip();
tasks.activateWindowView(model.WinIdList);
}
else {
if (tasks.groupDialog) {
task.hideToolTip();
tasks.groupDialog.visible = false;
} else {
createGroupDialog(task, tasks);
}
}
} else {
if (model.IsMinimized) {
tasks.tasksModel.requestToggleMinimized(index);
tasks.tasksModel.requestActivate(index);
} else if (model.IsActive && plasmoid.configuration.minimizeActiveTaskOnClick) {
tasks.tasksModel.requestToggleMinimized(index);
} else {
tasks.tasksModel.requestActivate(index);
}
}
}
function taskPrefix(prefix, location) {
let effectivePrefix;
switch (location) {
case PlasmaCore.Types.LeftEdge:
effectivePrefix = "west-" + prefix;
break;
case PlasmaCore.Types.TopEdge:
effectivePrefix = "north-" + prefix;
break;
case PlasmaCore.Types.RightEdge:
effectivePrefix = "east-" + prefix;
break;
default:
effectivePrefix = "south-" + prefix;
}
return [effectivePrefix, prefix];
}
function taskPrefixHovered(prefix, location) {
return [
...taskPrefix((prefix || "launcher") + "-hover", location),
...prefix ? taskPrefix("hover", location) : [],
...taskPrefix(prefix, location),
];
}
function createGroupDialog(visualParent, tasks) {
if (!visualParent) {
return;
}
if (tasks.groupDialog) {
tasks.groupDialog.visualParent = visualParent;
return;
}
tasks.groupDialog = tasks.groupDialogComponent.createObject(tasks, { visualParent });
}
function foreachChildTask(callback, modelIndex, tasksModel) {
const childCount = tasksModel.rowCount(modelIndex);
if (childCount > 0) {
for (let i = 0; i < childCount; ++i) {
const childIndex = tasksModel.index(i, 0, modelIndex);
callback(childIndex);
}
} else {
callback(modelIndex);
}
}