You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
latte-dock/plasmoid/contents/ui/main.qml

1216 lines
44 KiB
QML

/*
* Copyright 2016 Smith AR <audoban@openmailbox.org>
* Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of Latte-Dock
*
* Latte-Dock is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* Latte-Dock is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.0
import QtQuick.Layouts 1.1
import QtGraphicalEffects 1.0
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 2.0 as PlasmaComponents
import org.kde.plasma.plasmoid 2.0
import org.kde.taskmanager 0.1 as TaskManager
import org.kde.plasma.private.taskmanager 0.1 as TaskManagerApplet
import org.kde.activities 0.1 as Activities
import org.kde.latte 0.1 as Latte
import "../code/tools.js" as TaskTools
import "../code/activitiesTools.js" as ActivitiesTools
Item {
id:root
Layout.fillHeight: userPanelPosition === 0 ? true : false
Layout.fillWidth: userPanelPosition === 0 ? true : false
///IMPORTANT: These values must be tested when the Now Dock Panel support
///also the four new anchors. A small issue is shown between the animation
/// of the now dock plasmoid and the neighbour widgets...
Layout.minimumWidth: (userPanelPosition !== 0)&&(!latteDock) ? clearWidth : -1
Layout.minimumHeight: (userPanelPosition !== 0)&&(!latteDock) ? clearHeight : -1
Layout.preferredWidth: (userPanelPosition !== 0)&&(!latteDock) ? tasksWidth : -1
Layout.preferredHeight: (userPanelPosition !== 0)&&(!latteDock) ? tasksHeight : -1
property bool debugLocation: false
property bool globalDirectRender: false //it is used to check both the applet and the containment for direct render
property bool editMode: plasmoid.userConfiguring
property bool disableRestoreZoom: false //blocks restore animation in rightClick
property bool dropNewLauncher: false
property bool initializationStep: false //true
property bool initializatedBuffers: true // noInitCreatedBuffers >= tasksStarting ? true : false
property bool isHovered: false
property bool showBarLine: plasmoid.configuration.showBarLine
property bool useThemePanel: plasmoid.configuration.useThemePanel
property bool taskInAnimation: noTasksInAnimation > 0 ? true : false
property bool transparentPanel: plasmoid.configuration.transparentPanel
property bool vertical: ((root.position === PlasmaCore.Types.LeftPositioned) ||
(root.position === PlasmaCore.Types.RightPositioned)) ? true : false
property int clearWidth
property int clearHeight
property int newLocationDebugUse: PlasmaCore.Types.BottomPositioned
property int newDroppedPosition: -1
property int noInitCreatedBuffers: 0
property int noTasksInAnimation: 0
property int themePanelSize: plasmoid.configuration.panelSize
property int position : PlasmaCore.Types.BottomPositioned
property int tasksStarting: 0
property int realSize: iconSize + iconMargin
property real textColorLuma: 0.2126*theme.textColor.r + 0.7152*theme.textColor.g + 0.0722*theme.textColor.b
property variant launchersOnActivities: []
property QtObject contextMenuComponent: Qt.createComponent("ContextMenu.qml");
property Item dragSource: null
property color minimizedDotColor: textColorLuma > 0.5 ? Qt.darker(theme.textColor, 1+ (1-textColorLuma)) : Qt.lighter(theme.textColor, 1+(1-textColorLuma))
//BEGIN Now Dock Panel properties
property bool directRender: icList.directRender
property bool enableShadows: latteDock ? latteDock.enableShadows > 0 : plasmoid.configuration.showShadows
property bool forceHidePanel: false
property bool disableLeftSpacer: false
property bool disableRightSpacer: false
property bool dockIsHidden: latteDock ? latteDock.dockIsHidden : false
property bool highlightWindows: latteDock ? latteDock.highlightWindows: plasmoid.configuration.highlightWindows
property bool reverseLinesPosition: latteDock ? latteDock.reverseLinesPosition : plasmoid.configuration.reverseLinesPosition
property bool dotsOnActive: latteDock ? latteDock.dotsOnActive : plasmoid.configuration.dotsOnActive
property bool showGlow: latteDock ? latteDock.showGlow : plasmoid.configuration.showGlow
property bool showOnlyCurrentScreen: latteDock ? latteDock.showOnlyCurrentScreen : plasmoid.configuration.showOnlyCurrentScreen
property bool showOnlyCurrentDesktop: latteDock ? latteDock.showOnlyCurrentDesktop : plasmoid.configuration.showOnlyCurrentDesktop
property bool showOnlyCurrentActivity: latteDock ? latteDock.showOnlyCurrentActivity : plasmoid.configuration.showOnlyCurrentActivity
property bool showPreviews: latteDock ? latteDock.showToolTips : plasmoid.configuration.showToolTips
property bool showWindowActions: latteDock ? latteDock.showWindowActions : plasmoid.configuration.showWindowActions
property bool smartLaunchersEnabled: latteDock ? latteDock.smartLaunchersEnabled : plasmoid.configuration.smartLaunchersEnabled
property bool threeColorsWindows: latteDock ? latteDock.threeColorsWindows : plasmoid.configuration.threeColorsWindows
property int durationTime: latteDock ? latteDock.durationTime : plasmoid.configuration.durationTime
property int iconMargin: latteDock ? latteDock.iconMargin : 0.12*iconSize
property int iconSize: latteDock ? latteDock.iconSize : Math.max(plasmoid.configuration.iconSize, 16)
property int statesLineSize: latteDock ? latteDock.statesLineSize : Math.ceil( root.iconSize/13 )
property int tasksHeight: mouseHandler.height
property int tasksWidth: mouseHandler.width
property int userPanelPosition: latteDock ? latteDock.panelAlignment : plasmoid.configuration.plasmoidPosition
property real zoomFactor: latteDock ? latteDock.zoomFactor : ( 1 + (plasmoid.configuration.zoomLevel / 20) )
property alias tasksCount: tasksModel.count
property alias hoveredIndex: icList.hoveredIndex
property Item latteDock: null
//END Now Dock Panel properties
Plasmoid.preferredRepresentation: Plasmoid.fullRepresentation
Plasmoid.backgroundHints: PlasmaCore.Types.NoBackground
signal clearZoomSignal();
signal draggingFinished();
signal mouseWasEntered(int delegateIndex, bool value);
signal presentWindows(variant winIds);
signal requestLayout;
signal signalActionsBlockHiding(int value);
signal signalAnimationsNeedBothAxis(int value);
signal signalAnimationsNeedLength(int value);
signal signalAnimationsNeedThickness(int value);
//signal signalDraggingState(bool value);
signal showPreviewForTasks(QtObject group);
//trigger updating scaling of neighbour delegates of zoomed delegate
signal updateScale(int delegateIndex, real newScale, real step)
signal publishTasksGeometries();
signal windowsHovered(variant winIds, bool hovered)
//onAnimationsChanged: console.log(animations);
/* Rectangle{
anchors.fill: parent
border.width: 1
border.color: "red"
color: "white"
} */
onLatteDockChanged: {
if (latteDock)
plasmoid.configuration.isInLatteDock = true;
else
plasmoid.configuration.isInLatteDock = false;
}
Connections {
target: plasmoid
onLocationChanged: {
root.updatePosition();
iconGeometryTimer.start();
}
}
Connections {
target: plasmoid.configuration
// onLaunchersChanged: tasksModel.launcherList = plasmoid.configuration.launchers
onGroupingAppIdBlacklistChanged: tasksModel.groupingAppIdBlacklist = plasmoid.configuration.groupingAppIdBlacklist;
onGroupingLauncherUrlBlacklistChanged: tasksModel.groupingLauncherUrlBlacklist = plasmoid.configuration.groupingLauncherUrlBlacklist;
}
Connections {
target: latteDock
onDirectRenderChanged: {
root.globalDirectRender = latteDock.directRender || icList.directRender;
}
}
Connections {
target: icList
onDirectRenderChanged: {
root.globalDirectRender = latteDock ? latteDock.directRender || icList.directRender : icList.directRender;
}
}
/////
PlasmaCore.ColorScope{
id: colorScopePalette
}
/////
onDragSourceChanged: {
if (dragSource == null) {
root.draggingFinished();
root.signalActionsBlockHiding(-1);
//root.signalDraggingState(false);
tasksModel.syncLaunchers();
} else {
root.signalActionsBlockHiding(1);
//root.signalDraggingState(true);
}
}
/////Winwow previews///////////
ToolTipDelegate2 {
id: toolTipDelegate
visible: false
}
////BEGIN interfaces
PlasmaCore.Dialog{
id: windowsPreviewDlg
// hideOnWindowDeactivate: false
type: PlasmaCore.Dialog.Tooltip
flags: Qt.WindowStaysOnTopHint | Qt.WindowDoesNotAcceptFocus | Qt.ToolTip
location: plasmoid.location
mainItem: toolTipDelegate
visible: false
property bool contextMenu: false
property bool signalSent: false
property Item activeItem: null
function hide(debug){
//console.log("on hide event called: "+debug);
if (latteDock && signalSent) {
//it is used to unblock dock hiding
root.signalActionsBlockHiding(-1);
signalSent = false;
//root.signalDraggingState(false);
}
windowsPreviewDlg.activeItem = null;
toolTipDelegate.containsMouse = false;
toolTipDelegate.parentTask = null;
toolTipDelegate.parentIndex = -1;
toolTipDelegate.windows = [];
toolTipDelegate.isGroup = false;
if (!contextMenu)
root.disableRestoreZoom = false;
visible = false;
}
function show(taskItem){
//console.log("preview show called...");
if (!activeItem || (activeItem !== taskItem) && !taskItem.contextMenu) {
//console.log("preview show called: accepted...");
//used to initialize windows previews buffers from task to task
visible = false;
activeItem = taskItem;
toolTipDelegate.parentTask = taskItem;
if (latteDock && !signalSent) {
//it is used to block dock hiding
root.signalActionsBlockHiding(1);
signalSent = true;
//root.signalDraggingState(true);
}
//small delay to show in order to not mess up with the buffers clearing
//from previous visible:false
initializePreviewComponent.createObject(windowsPreviewDlg);
}
}
}
//A Timer to delay to show in order to not mess up with the buffers clearing
//from previous visible:false
Component {
id: initializePreviewComponent
Timer {
id: initializePreviewTimer
interval: 100
repeat: false
onTriggered: {
windowsPreviewDlg.visible = true;
initializePreviewTimer.destroy();
}
Component.onCompleted: initializePreviewTimer.start()
}
}
/////Window Previews/////////
TaskManager.TasksModel {
id: tasksModel
virtualDesktop: virtualDesktopInfo.currentDesktop
screenGeometry: plasmoid.screenGeometry
// comment in order to support LTS Plasma 5.8
// screen: plasmoid.screen
activity: activityInfo.currentActivity
filterByVirtualDesktop: root.showOnlyCurrentDesktop
filterByScreen: root.showOnlyCurrentScreen
filterByActivity: root.showOnlyCurrentActivity
launchInPlace: true
separateLaunchers: false
groupInline: false
groupMode: TaskManager.TasksModel.GroupApplications
sortMode: TaskManager.TasksModel.SortManual
onActivityChanged: {
ActivitiesTools.currentActivity = activity;
// console.log("Updated :"+activity);
launcherList = ActivitiesTools.restoreLaunchers();
//root.updateImplicits();
//panelGeometryTimer.start();
}
// onCountChanged: {
// updateImplicits();
// }
onLauncherListChanged: {
// plasmoid.configuration.launchers = launcherList;
ActivitiesTools.updateLaunchers(launcherList);
}
onGroupingAppIdBlacklistChanged: {
plasmoid.configuration.groupingAppIdBlacklist = groupingAppIdBlacklist;
}
onGroupingLauncherUrlBlacklistChanged: {
plasmoid.configuration.groupingLauncherUrlBlacklist = groupingLauncherUrlBlacklist;
}
onAnyTaskDemandsAttentionChanged: {
if (anyTaskDemandsAttention){
plasmoid.status = PlasmaCore.Types.RequiresAttentionStatus;
attentionTimerComponent.createObject(root);
}
}
Component.onCompleted: {
ActivitiesTools.launchersOnActivities = root.launchersOnActivities
ActivitiesTools.currentActivity = activityInfo.currentActivity;
ActivitiesTools.plasmoid = plasmoid;
launcherList = ActivitiesTools.restoreLaunchers();
groupingAppIdBlacklist = plasmoid.configuration.groupingAppIdBlacklist;
groupingLauncherUrlBlacklist = plasmoid.configuration.groupingLauncherUrlBlacklist;
icList.model = tasksModel;
tasksStarting = count;
}
}
TaskManagerApplet.Backend {
id: backend
taskManagerItem: root
toolTipItem: toolTipDelegate
highlightWindows:root.highlightWindows
onAddLauncher: {
tasksModel.requestAddLauncher(url);
}
}
TaskManagerApplet.DragHelper {
id: dragHelper
dragIconSize: units.iconSizes.medium
}
TaskManager.VirtualDesktopInfo {
id: virtualDesktopInfo
}
TaskManager.ActivityInfo {
id: activityInfo
}
PlasmaCore.DataSource {
id: mpris2Source
engine: "mpris2"
connectedSources: sources
function sourceNameForLauncherUrl(launcherUrl) {
if (!launcherUrl) {
return "";
}
// MPRIS spec explicitly mentions that "DesktopEntry" is with .desktop extension trimmed
// Moreover, remove URL parameters, like wmClass (part after the question mark)
var desktopFileName = launcherUrl.toString().split('/').pop().split('?')[0].replace(".desktop", "")
for (var i = 0, length = sources.length; i < length; ++i) {
var source = sources[i];
var sourceData = data[source];
if (sourceData && sourceData.DesktopEntry === desktopFileName) {
return source
}
}
return ""
}
function startOperation(source, op) {
var service = serviceForSource(source)
var operation = service.operationDescription(op)
return service.startOperationCall(operation)
}
function goPrevious(source) {
startOperation(source, "Previous");
}
function goNext(source) {
startOperation(source, "Next");
}
function playPause(source) {
startOperation(source, "PlayPause");
}
function stop(source) {
startOperation(source, "Stop");
}
function raise(source) {
startOperation(source, "Raise");
}
function quit(source) {
startOperation(source, "Quit");
}
}
/* IconsModel{
id: iconsmdl
}*/
Component{
id: attentionTimerComponent
Timer{
id: attentionTimer
interval:6500
onTriggered: {
plasmoid.status = PlasmaCore.Types.PassiveStatus;
destroy();
}
Component.onCompleted: {
start();
}
}
}
//Timer to check if the mouse is still inside the ListView
Timer{
id:checkListHovered
repeat:false;
interval: 120
property int normalInterval: Math.max(120, 2 * (root.durationTime * 1.2 * units.shortDuration) + 50)
onTriggered: {
if (!root.containsMouse()) {
root.clearZoom();
if (latteDock && !root.disableRestoreZoom)
latteDock.clearZoom();
}
interval = normalInterval;
}
function startNormal(){
interval = normalInterval;
start();
}
function startDuration( duration){
interval = duration;
start();
}
}
///Red Liner!!! show the upper needed limit for annimations
Rectangle{
anchors.horizontalCenter: !root.vertical ? parent.horizontalCenter : undefined
anchors.verticalCenter: root.vertical ? parent.verticalCenter : undefined
width: root.vertical ? 1 : 2 * root.iconSize
height: root.vertical ? 2 * root.iconSize : 1
color: "red"
x: (root.position === PlasmaCore.Types.LeftPositioned) ? neededSpace : parent.width - neededSpace
y: (root.position === PlasmaCore.Types.TopPositioned) ? neededSpace : parent.height - neededSpace
visible: plasmoid.configuration.zoomHelper
property int neededSpace: zoomFactor*(iconSize+iconMargin) + statesLineSize
}
Item{
id:barLine
opacity: (tasksModel.count > 0) && root.initializatedBuffers ? 1 : 0
/* anchors.bottom: (root.position === PlasmaCore.Types.BottomPositioned) ? parent.bottom : undefined
anchors.top: (root.position === PlasmaCore.Types.TopPositioned) ? parent.top : undefined
anchors.left: (root.position === PlasmaCore.Types.LeftPositioned) ? parent.left : undefined
anchors.right: (root.position === PlasmaCore.Types.RightPositioned) ? parent.right : undefined
anchors.horizontalCenter: !parent.vertical ? parent.horizontalCenter : undefined
anchors.verticalCenter: parent.vertical ? parent.verticalCenter : undefined */
width: ( icList.orientation === Qt.Horizontal ) ? icList.width + spacing : smallSize
height: ( icList.orientation === Qt.Vertical ) ? icList.height + spacing : smallSize
property int spacing: root.iconSize / 2
property int smallSize: Math.max(3.7*root.statesLineSize, 16)
Behavior on opacity{
NumberAnimation { duration: root.durationTime*units.longDuration }
}
/// plasmoid's default panel
BorderImage{
anchors.fill:parent
source: "../images/panel-west.png"
border { left:8; right:8; top:8; bottom:8 }
opacity: (plasmoid.configuration.showBarLine && !plasmoid.configuration.useThemePanel && !root.forceHidePanel) ? 1 : 0
visible: (opacity == 0) ? false : true
horizontalTileMode: BorderImage.Stretch
verticalTileMode: BorderImage.Stretch
Behavior on opacity{
NumberAnimation { duration: root.durationTime*units.longDuration }
}
}
/// item which is used as anchors for the plasma's theme
Item{
id:belower
width: (root.position === PlasmaCore.Types.LeftPositioned) ? shadowsSvgItem.margins.left : shadowsSvgItem.margins.right
height: (root.position === PlasmaCore.Types.BottomPositioned)? shadowsSvgItem.margins.bottom : shadowsSvgItem.margins.top
anchors.top: (root.position === PlasmaCore.Types.BottomPositioned) ? parent.bottom : undefined
anchors.bottom: (root.position === PlasmaCore.Types.TopPositioned) ? parent.top : undefined
anchors.right: (root.position === PlasmaCore.Types.LeftPositioned) ? parent.left : undefined
anchors.left: (root.position === PlasmaCore.Types.RightPositioned) ? parent.right : undefined
}
/// the current theme's panel
PlasmaCore.FrameSvgItem{
id: shadowsSvgItem
anchors.bottom: (root.position === PlasmaCore.Types.BottomPositioned) ? belower.bottom : undefined
anchors.top: (root.position === PlasmaCore.Types.TopPositioned) ? belower.top : undefined
anchors.left: (root.position === PlasmaCore.Types.LeftPositioned) ? belower.left : undefined
anchors.right: (root.position === PlasmaCore.Types.RightPositioned) ? belower.right : undefined
anchors.horizontalCenter: !root.vertical ? parent.horizontalCenter : undefined
anchors.verticalCenter: root.vertical ? parent.verticalCenter : undefined
width: root.vertical ? panelSize + margins.left + margins.right: parent.width
height: root.vertical ? parent.height : panelSize + margins.top + margins.bottom
imagePath: "translucent/widgets/panel-background"
prefix:"shadow"
opacity: (plasmoid.configuration.showBarLine && plasmoid.configuration.useThemePanel && !root.forceHidePanel) ? 1 : 0
visible: (opacity == 0) ? false : true
property int panelSize: ((root.position === PlasmaCore.Types.BottomPositioned) ||
(root.position === PlasmaCore.Types.TopPositioned)) ?
plasmoid.configuration.panelSize + belower.height:
plasmoid.configuration.panelSize + belower.width
Behavior on opacity{
NumberAnimation { duration: root.durationTime*units.longDuration }
}
PlasmaCore.FrameSvgItem{
anchors.margins: belower.width-1
anchors.fill:parent
imagePath: plasmoid.configuration.transparentPanel ? "translucent/widgets/panel-background" :
"widgets/panel-background"
}
}
MouseHandler {
id: mouseHandler
anchors.bottom: (root.position === PlasmaCore.Types.BottomPositioned) ? icList.bottom : undefined
anchors.top: (root.position === PlasmaCore.Types.TopPositioned) ? icList.top : undefined
anchors.left: (root.position === PlasmaCore.Types.LeftPositioned) ? icList.left : undefined
anchors.right: (root.position === PlasmaCore.Types.RightPositioned) ? icList.right : undefined
anchors.horizontalCenter: !root.vertical ? icList.horizontalCenter : undefined
anchors.verticalCenter: root.vertical ? icList.verticalCenter : undefined
width: root.vertical ? maxSize : icList.width
height: root.vertical ? icList.height : maxSize
target: icList
property int maxSize: (root.hoveredIndex>=0 && !root.dragSource) ?
root.statesLineSize + root.zoomFactor * (root.iconSize + root.iconMargin) - 1 :
root.statesLineSize + root.iconSize + root.iconMargin - 1
onUrlsDropped: {
// If all dropped URLs point to application desktop files, we'll add a launcher for each of them.
var createLaunchers = urls.every(function (item) {
return backend.isApplication(item)
});
if (createLaunchers) {
urls.forEach(function (item) {
addLauncher(item);
});
return;
}
if (!hoveredItem) {
return;
}
// DeclarativeMimeData urls is a QJsonArray but requestOpenUrls expects a proper QList<QUrl>.
var urlsList = backend.jsonArrayToUrlList(urls);
// Otherwise we'll just start a new instance of the application with the URLs as argument,
// as you probably don't expect some of your files to open in the app and others to spawn launchers.
tasksModel.requestOpenUrls(hoveredItem.modelIndex(), urlsList);
}
}
ListView {
id:icList
property int currentSpot : -1000
property int hoveredIndex : -1
property int previousCount : 0
property int tasksCount: contentItem.children.length
property bool delayingRemoval: false
property bool directRender: false
onTasksCountChanged: updateImplicits();
// property int count: children ? children.length : 0
/* anchors.bottom: (root.position === PlasmaCore.Types.BottomPositioned) ? parent.bottom : undefined
anchors.top: (root.position === PlasmaCore.Types.TopPositioned) ? parent.top : undefined
anchors.left: (root.position === PlasmaCore.Types.LeftPositioned) ? parent.left : undefined
anchors.right: (root.position === PlasmaCore.Types.RightPositioned) ? parent.right : undefined
anchors.horizontalCenter: !root.vertical ? parent.horizontalCenter : undefined
anchors.verticalCenter: root.vertical ? parent.verticalCenter : undefined */
width: contentWidth
height: contentHeight
orientation: Qt.Horizontal
delegate: TaskDelegate{}
/*Rectangle{
anchors.fill: parent
border.width: 1
border.color: "red"
color: "transparent"
}*/
//the duration of this animation should be as small as possible
//it fixes a small issue with the dragging an item to change it's
//position, if the duration is too big there is a point in the
//list that an item is going back and forth too fast
//more of a trouble
moveDisplaced: Transition {
NumberAnimation { properties: "x,y"; duration: root.durationTime*units.shortDuration; easing.type: Easing.Linear }
}
///this transition can not be used with dragging !!!! I breaks
///the lists indexes !!!!!
/* move: Transition {
NumberAnimation { properties: "x,y"; duration: units.longDuration; easing.type: Easing.Linear }
} */
function childAtPos(x, y){
var tasks = icList.contentItem.children;
for(var i=0; i<tasks.length; ++i){
var task = tasks[i];
var choords = mapFromItem(task,0, 0);
if(choords.y < 0)
choords.y = 0;
if(choords.x < 0)
choords.x = 0;
if( (x>=choords.x) && (x<=choords.x+task.width)
&& (y>=choords.y) && (y<=choords.y+task.height)){
return task
}
}
return null;
}
}
VisualAddItem{
id: newDroppedLauncherVisual
anchors.fill: mouseHandler
visible: opacity == 0 ? false : true
opacity: root.dropNewLauncher && mouseHandler.onlyLaunchers && (root.dragSource == null)? 1 : 0
}
}
//// helpers
Timer {
id: iconGeometryTimer
// INVESTIGATE: such big interval but unfortunately it doesnot work otherwise
interval: 500
repeat: false
onTriggered: {
// console.debug("Found children: "+icList.contentItem.children.length);
TaskTools.publishIconGeometries(icList.contentItem.children);
}
}
//this timer adds a delay into enabling direct rendering...
//it gives the time to neighbour tasks to complete their animation
//during first hovering phase
Timer {
id: enableDirectRenderTimer
interval: 4 * root.durationTime * units.shortDuration
onTriggered: icList.directRender = true;
}
////Activities List
////it can be used to cleanup the launchers from garbage-deleted activities....
Item{
id: activityModelInstance
property int count: activityModelRepeater.count
Repeater {
id:activityModelRepeater
model: Activities.ActivityModel {
id: activityModel
// shownStates: "Running"
}
delegate: Item {
visible: false
property string activityId: model.id
property string activityName: model.name
}
}
function activities(){
var activitiesResult = [];
for(var i=0; i<activityModelInstance.count; ++i){
console.log(children[i].activityId);
activitiesResult.push(children[i].activityId);
}
return activitiesResult;
}
onCountChanged: {
if(activityInfo.currentActivity != "00000000-0000-0000-0000-000000000000"){
console.log("----------- Latte Plasmoid Signal: Activities number was changed ---------");
var allActivities = activities();
ActivitiesTools.cleanupRecords(allActivities);
console.log("----------- Latte Plasmoid Signal End ---------");
}
}
}
/////////
//// functions
function movePanel(obj, newPosition){
var bLine = obj;
if (newPosition === PlasmaCore.Types.BottomPositioned){
bLine.anchors.horizontalCenter = bLine.parent.horizontalCenter;
bLine.anchors.verticalCenter = undefined;
bLine.anchors.bottom = bLine.parent.bottom;
bLine.anchors.top = undefined;
bLine.anchors.left = undefined;
bLine.anchors.right = undefined;
}
else if (newPosition === PlasmaCore.Types.TopPositioned){
bLine.anchors.horizontalCenter = bLine.parent.horizontalCenter;
bLine.anchors.verticalCenter = undefined;
bLine.anchors.bottom = undefined;
bLine.anchors.top = bLine.parent.top;
bLine.anchors.left = undefined;
bLine.anchors.right = undefined;
}
else if (newPosition === PlasmaCore.Types.LeftPositioned){
bLine.anchors.horizontalCenter = undefined;
bLine.anchors.verticalCenter = bLine.parent.verticalCenter;
bLine.anchors.bottom = undefined;
bLine.anchors.top = undefined;
bLine.anchors.left = bLine.parent.left;
bLine.anchors.right = undefined;
}
else if (newPosition === PlasmaCore.Types.RightPositioned){
bLine.anchors.horizontalCenter = undefined;
bLine.anchors.verticalCenter = bLine.parent.verticalCenter;
bLine.anchors.bottom = undefined;
bLine.anchors.top = undefined;
bLine.anchors.left =undefined;
bLine.anchors.right = bLine.parent.right;
}
}
property int ncounter:0
function updateImplicits(){
if(icList.previousCount !== icList.count){
icList.previousCount = icList.count;
var zoomedLength = Math.floor( 1.2 * (iconSize+iconMargin) * (root.zoomFactor));
var bigAxis = (tasksModel.count-1) * (iconSize+iconMargin) + zoomedLength;
var smallAxis = zoomedLength + statesLineSize;
var clearBigAxis = tasksModel.count * (iconSize+iconMargin) + (barLine.spacing/2);
var clearSmallAxis = (iconSize+iconMargin)+statesLineSize;
// debugging code
// ncounter++;
// console.log("Implicits______ "+ncounter+". - "+tasksModel.count);
if (root.vertical){
root.implicitWidth = smallAxis;
root.implicitHeight = bigAxis;
root.clearWidth = clearSmallAxis;
root.clearHeight = clearBigAxis;
}
else{
root.implicitWidth = bigAxis;
root.implicitHeight = smallAxis;
root.clearWidth = clearBigAxis;
root.clearHeight = clearSmallAxis;
}
iconGeometryTimer.restart();
}
}
PlasmaComponents.Button{
id: orientationBtn
text:"Orientation"
anchors.centerIn: parent
visible: root.debugLocation
onClicked:{
switch(root.position){
case PlasmaCore.Types.BottomPositioned:
root.newLocationDebugUse = PlasmaCore.Types.LeftEdge;
break;
case PlasmaCore.Types.LeftPositioned:
root.newLocationDebugUse = PlasmaCore.Types.TopEdge;
break;
case PlasmaCore.Types.TopPositioned:
root.newLocationDebugUse = PlasmaCore.Types.RightEdge;
break;
case PlasmaCore.Types.RightPositioned:
root.newLocationDebugUse = PlasmaCore.Types.BottomEdge;
break;
}
updatePosition();
}
}
function updatePosition(){
var newPosition;
var tempVertical=false;
var positionUsed;
if (root.debugLocation)
positionUsed = root.newLocationDebugUse;
else
positionUsed = plasmoid.location;
switch (positionUsed) {
case PlasmaCore.Types.LeftEdge:
newPosition = PlasmaCore.Types.LeftPositioned;
tempVertical = true;
break;
case PlasmaCore.Types.RightEdge:
newPosition = PlasmaCore.Types.RightPositioned;
tempVertical = true;
break;
case PlasmaCore.Types.TopEdge:
newPosition = PlasmaCore.Types.TopPositioned;
break;
default:
newPosition = PlasmaCore.Types.BottomPositioned;
break
}
movePanel(barLine,newPosition);
movePanel(icList,newPosition);
if(tempVertical)
icList.orientation = Qt.Vertical;
else
icList.orientation = Qt.Horizontal;
root.position = newPosition;
}
function outsideContainsMouse(){
//console.log("disable restore zoom:"+disableRestoreZoom);
if (disableRestoreZoom) {
return true;
}
var tasks = icList.contentItem.children;
if(toolTipDelegate && toolTipDelegate.containsMouse && toolTipDelegate.parentTask) {
return true;
} else {
windowsPreviewDlg.hide(4);
}
for(var i=0; i<tasks.length; ++i){
var task = tasks[i];
// console.log("Checking "+i+" - "+task.index+" - "+task.containsMouse);
if(task && task.containsMouse){
return true;
}
}
return false;
}
function containsMouse(){
//console.log("s1...");
if (disableRestoreZoom) {
return;
}
var result = root.outsideContainsMouse();
//console.log("s2... outsideContainsMouse:"+result);
if (result)
return true;
//console.log("s3...");
if (!result && latteDock && latteDock.outsideContainsMouse())
return true;
//console.log("s4...");
return false;
}
function clearZoom(){
//console.log("Plasmoid clear...");
if (disableRestoreZoom) {
return;
}
if (enableDirectRenderTimer.running)
enableDirectRenderTimer.stop();
icList.directRender = false;
icList.currentSpot = -1000;
icList.hoveredIndex = -1;
root.clearZoomSignal();
}
function hasLauncher(url) {
return tasksModel.launcherPosition(url) != -1;
}
function addLauncher(url) {
//workaround to protect in case the launcher contains the iconData
var pos = url.indexOf("?iconData=");
if (pos>0) {
url = url.substring( 0, url.indexOf("?iconData=" ) );
}
tasksModel.requestAddLauncher(url);
}
function resetDragSource() {
dragSource = null;
}
function createContextMenu(task) {
var menu = root.contextMenuComponent.createObject(task);
menu.visualParent = task;
menu.mpris2Source = mpris2Source;
menu.activitiesCount = activityModelInstance.count;
return menu;
}
Component.onCompleted: {
updatePosition();
root.presentWindows.connect(backend.presentWindows);
root.windowsHovered.connect(backend.windowsHovered);
// mouseHandler.urlDropped.connect(backend.urlDropped);
dragHelper.dropped.connect(resetDragSource);
}
//BEGIN states
//user set Panel Positions
// 0-Center, 1-Left, 2-Right, 3-Top, 4-Bottom
states: [
///Bottom Edge
State {
name: "bottomCenter"
when: (root.position === PlasmaCore.Types.BottomPosition && userPanelPosition===Latte.Dock.Center)
AnchorChanges {
target: barLine
anchors{ top:undefined; bottom:parent.bottom; left:undefined; right:undefined; horizontalCenter:parent.horizontalCenter; verticalCenter:undefined}
}
AnchorChanges {
target: icList
anchors{ top:undefined; bottom:parent.bottom; left:undefined; right:undefined; horizontalCenter:parent.horizontalCenter; verticalCenter:undefined}
}
},
State {
name: "bottomLeft"
when: (root.position === PlasmaCore.Types.BottomPosition && userPanelPosition===Latte.Dock.Left)
AnchorChanges {
target: barLine
anchors{ top:undefined; bottom:parent.bottom; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:undefined}
}
AnchorChanges {
target: icList
anchors{ top:undefined; bottom:parent.bottom; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:undefined}
}
},
State {
name: "bottomRight"
when: (root.position === PlasmaCore.Types.BottomPosition && userPanelPosition===Latte.Dock.Right)
AnchorChanges {
target: barLine
anchors{ top:undefined; bottom:parent.bottom; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:undefined}
}
AnchorChanges {
target: icList
anchors{ top:undefined; bottom:parent.bottom; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:undefined}
}
},
///Top Edge
State {
name: "topCenter"
when: (root.position === PlasmaCore.Types.TopPosition && userPanelPosition===Latte.Dock.Center)
AnchorChanges {
target: barLine
anchors{ top:parent.top; bottom:undefined; left:undefined; right:undefined; horizontalCenter:parent.horizontalCenter; verticalCenter:undefined}
}
AnchorChanges {
target: icList
anchors{ top:parent.top; bottom:undefined; left:undefined; right:undefined; horizontalCenter:parent.horizontalCenter; verticalCenter:undefined}
}
},
State {
name: "topLeft"
when: (root.position === PlasmaCore.Types.TopPosition && userPanelPosition===Latte.Dock.Left)
AnchorChanges {
target: barLine
anchors{ top:parent.top; bottom:undefined; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:undefined}
}
AnchorChanges {
target: icList
anchors{ top:parent.top; bottom:undefined; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:undefined}
}
},
State {
name: "topRight"
when: (root.position === PlasmaCore.Types.TopPosition && userPanelPosition===Latte.Dock.Right)
AnchorChanges {
target: barLine
anchors{ top:parent.top; bottom:undefined; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:undefined}
}
AnchorChanges {
target: icList
anchors{ top:parent.top; bottom:undefined; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:undefined}
}
},
////Left Edge
State {
name: "leftCenter"
when: (root.position === PlasmaCore.Types.LeftPosition && userPanelPosition===Latte.Dock.Center)
AnchorChanges {
target: barLine
anchors{ top:undefined; bottom:undefined; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:parent.verticalCenter}
}
AnchorChanges {
target: icList
anchors{ top:undefined; bottom:undefined; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:parent.verticalCenter}
}
},
State {
name: "leftTop"
when: (root.position === PlasmaCore.Types.LeftPosition && userPanelPosition===Latte.Dock.Top)
AnchorChanges {
target: barLine
anchors{ top:parent.top; bottom:undefined; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:undefined}
}
AnchorChanges {
target: icList
anchors{ top:parent.top; bottom:undefined; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:undefined}
}
},
State {
name: "leftBottom"
when: (root.position === PlasmaCore.Types.LeftPosition && userPanelPosition===Latte.Dock.Bottom)
AnchorChanges {
target: barLine
anchors{ top:undefined; bottom:parent.bottom; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:undefined}
}
AnchorChanges {
target: icList
anchors{ top:undefined; bottom:parent.bottom; left:parent.left; right:undefined; horizontalCenter:undefined; verticalCenter:undefined}
}
},
///Right Edge
State {
name: "rightCenter"
when: (root.position === PlasmaCore.Types.RightPosition && userPanelPosition===Latte.Dock.Center)
AnchorChanges {
target: barLine
anchors{ top:undefined; bottom:undefined; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:parent.verticalCenter}
}
AnchorChanges {
target: icList
anchors{ top:undefined; bottom:undefined; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:parent.verticalCenter}
}
},
State {
name: "rightTop"
when: (root.position === PlasmaCore.Types.RightPosition && userPanelPosition===Latte.Dock.Top)
AnchorChanges {
target: barLine
anchors{ top:parent.top; bottom:undefined; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:undefined}
}
AnchorChanges {
target: icList
anchors{ top:parent.top; bottom:undefined; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:undefined}
}
},
State {
name: "rightBottom"
when: (root.position === PlasmaCore.Types.RightPosition && userPanelPosition===Latte.Dock.Bottom)
AnchorChanges {
target: barLine
anchors{ top:undefined; bottom:parent.bottom; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:undefined}
}
AnchorChanges {
target: icList
anchors{ top:undefined; bottom:parent.bottom; left:undefined; right:parent.right; horizontalCenter:undefined; verticalCenter:undefined}
}
}
]
//END states
}