153 lines
7.1 KiB
QML

/*
* SPDX-FileCopyrightText: 2024 Anton Kharuzhy <publicantroids@gmail.com>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
import QtQuick
import org.kde.taskmanager as TaskManager
TaskManager.TasksModel {
id: tasksModel
enum ActiveTaskSource {
ActiveTask,
LastActiveTask,
LastActiveMaximized
}
signal activeWindowUpdated
property ActiveWindow activeWindow
property bool hasActiveWindow: activeTaskIndex.valid
property TaskManager.VirtualDesktopInfo virtualDesktopInfo
property TaskManager.ActivityInfo activityInfo
property Repeater filteredTasksRepeater
property var activeTaskIndex: getInvalidIndex()
property Loader showingDesktopStateListener: Loader {
property bool showingDesktop: false
source: "KWindowSystemAdapter.qml"
onStatusChanged: function () {
if (status == Loader.Ready) {
showingDesktop = Qt.binding(function () {
return item.showingDesktop;
});
} else {
showingDesktop = false;
}
}
onShowingDesktopChanged: updateActiveTaskIndex()
}
function getInvalidIndex() {
return index(-1, -1);
}
function getFirstRowIndex() {
return index(0, 0);
}
function updateActiveTaskIndex() {
if (showingDesktopStateListener.showingDesktop) {
activeTaskIndex = getInvalidIndex();
} else {
switch (plasmoid.configuration.widgetActiveTaskSource) {
case ActiveTasksModel.ActiveTaskSource.ActiveTask:
activeTaskIndex = filterTask(activeTask) ? activeTask : getInvalidIndex();
break;
case ActiveTasksModel.ActiveTaskSource.LastActiveTask:
case ActiveTasksModel.ActiveTaskSource.LastActiveMaximized:
activeTaskIndex = hasIndex(0, 0) && filterTask(getFirstRowIndex()) ? getFirstRowIndex() : getInvalidIndex();
break;
}
}
activeWindow.update();
}
function filterTask(index) {
if (!index || !index.valid)
return false;
if (plasmoid.configuration.widgetActiveTaskFilterNotMaximized)
return tasksModel.data(index, TaskManager.AbstractTasksModel.IsMaximized) || false;
return true;
}
screenGeometry: plasmoid.containment.screenGeometry
activity: activityInfo.currentActivity
virtualDesktop: virtualDesktopInfo.currentDesktop
filterByActivity: plasmoid.configuration.widgetActiveTaskFilterByActivity
filterByScreen: plasmoid.configuration.widgetActiveTaskFilterByScreen
filterByVirtualDesktop: plasmoid.configuration.widgetActiveTaskFilterByVirtualDesktop
filterHidden: true
filterMinimized: true
filterNotMaximized: plasmoid.configuration.widgetActiveTaskSource == ActiveTasksModel.ActiveTaskSource.LastActiveMaximized
onDataChanged: function (from, to, roles) {
if (hasActiveWindow && activeTaskIndex >= from && activeTaskIndex <= to)
updateActiveTaskIndex();
else if (!hasActiveWindow && getFirstRowIndex() >= from && getFirstRowIndex() <= to)
updateActiveTaskIndex();
}
onActiveTaskChanged: updateActiveTaskIndex()
onCountChanged: updateActiveTaskIndex()
sortMode: TaskManager.TasksModel.SortLastActivated
groupMode: TaskManager.TasksModel.GroupDisabled
Component.onCompleted: updateActiveTaskIndex()
virtualDesktopInfo: TaskManager.VirtualDesktopInfo {}
activityInfo: TaskManager.ActivityInfo {
readonly property string nullUuid: "00000000-0000-0000-0000-000000000000"
}
activeWindow: ActiveWindow {
function update() {
minimizable = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsMinimizable) || false;
maximizable = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsMaximizable) || false;
closable = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsClosable) || false;
movable = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsMovable) || false;
minimized = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsMinimized) || false;
maximized = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsMaximized) || false;
shadeable = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsShadeable) || false;
shaded = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsShaded) || false;
keepAbove = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsKeepAbove) || false;
keepBelow = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsKeepBelow) || false;
hasAppMenu = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.ApplicationMenuServiceName) || false;
onAllVirtualDesktops = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsOnAllVirtualDesktops) || false;
fullScreenable = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsFullScreenable) || false;
fullScreen = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsFullScreen) || false;
resizable = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsResizable) || false;
active = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsActive) || false;
appName = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.AppName);
genericAppName = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.GenericAppName);
decoration = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.Decoration);
icon = tasksModel.data(activeTaskIndex, Qt.DecorationRole);
tasksModel.activeWindowUpdated();
}
onActionCall: function (action) {
switch (action) {
case ActiveWindow.Action.Close:
return tasksModel.requestClose(activeTaskIndex);
case ActiveWindow.Action.Minimize:
return tasksModel.requestToggleMinimized(activeTaskIndex);
case ActiveWindow.Action.Maximize:
return tasksModel.requestToggleMaximized(activeTaskIndex);
case ActiveWindow.Action.Move:
return tasksModel.requestMove(activeTaskIndex);
case ActiveWindow.Action.KeepAbove:
return tasksModel.requestToggleKeepAbove(activeTaskIndex);
case ActiveWindow.Action.KeepBelow:
return tasksModel.requestToggleKeepBelow(activeTaskIndex);
case ActiveWindow.Action.Shade:
return tasksModel.requestToggleShaded(activeTaskIndex);
case ActiveWindow.Action.Activate:
return tasksModel.requestActivate(activeTaskIndex);
case ActiveWindow.Action.FullScreen:
return tasksModel.requestToggleFullScreen(activeTaskIndex);
case ActiveWindow.Action.Resize:
return tasksModel.requestResize(activeTaskIndex);
}
}
}
}