1
0
mirror of https://github.com/KDE/latte-dock.git synced 2025-01-10 21:18:19 +03:00

use PositionShortuts Ability for activate/new

This commit is contained in:
Michail Vourlakos 2020-05-22 19:11:10 +03:00
parent dc78257962
commit fa4ffbf521
15 changed files with 202 additions and 84 deletions

View File

@ -302,7 +302,7 @@ bool ContainmentInterface::newInstanceForPlasmaTask(const int index)
for (QQuickItem *item : childItems) { for (QQuickItem *item : childItems) {
if (auto *metaObject = item->metaObject()) { if (auto *metaObject = item->metaObject()) {
int methodIndex{metaObject->indexOfMethod("ewInstanceForTaskAtIndex(QVariant)")}; int methodIndex{metaObject->indexOfMethod("newInstanceForTaskAtIndex(QVariant)")};
if (methodIndex == -1) { if (methodIndex == -1) {
continue; continue;

View File

@ -42,25 +42,25 @@ Ability.PositionShortcutsPrivate {
} }
//! this is called from Latte::View::ContainmentInterface //! this is called from Latte::View::ContainmentInterface
function activateEntryAtIndex(index) { function activateEntryAtIndex(entryIndex) {
if (typeof index !== "number") { if (typeof entryIndex !== "number") {
return; return;
} }
sglActivateEntryAtIndex(index); sglActivateEntryAtIndex(entryIndex);
} }
//! this is called from Latte::View::ContainmentInterface //! this is called from Latte::View::ContainmentInterface
function newInstanceForEntryAtIndex(index) { function newInstanceForEntryAtIndex(entryIndex) {
if (typeof index !== "number") { if (typeof entryIndex !== "number") {
return; return;
} }
sglNewInstanceForEntryAtIndex(index); sglNewInstanceForEntryAtIndex(entryIndex);
} }
//! this is called from Latte::View::ContainmentInterface //! this is called from Latte::View::ContainmentInterface
function appletIdForIndex(index) { function appletIdForIndex(entryIndex) {
return indexer.appletIdForVisibleIndex(index); return indexer.appletIdForVisibleIndex(entryIndex);
} }
} }

View File

@ -19,23 +19,21 @@
import QtQuick 2.7 import QtQuick 2.7
Item { import org.kde.latte.abilities.definitions 0.1 as AbilityDefinition
AbilityDefinition.PositionShortcuts {
id: _shortcutsprivate id: _shortcutsprivate
property Item layouts: null property Item layouts: null
property bool updateIsBlocked: false property bool updateIsBlocked: false
readonly property bool unifiedGlobalShortcuts: appletIdStealingPositionShortcuts === -1 readonly property bool unifiedGlobalShortcuts: appletIdStealingPositionShortcuts === -1
property bool showPositionShortcutBadges: false
property bool showAppletShortcutBadges: false property bool showAppletShortcutBadges: false
property bool showMetaBadge: false property bool showMetaBadge: false
property int applicationLauncherId: -1 property int applicationLauncherId: -1
property int appletIdStealingPositionShortcuts: -1 property int appletIdStealingPositionShortcuts: -1
signal sglActivateEntryAtIndex(int entryIndex);
signal sglNewInstanceForEntryAtIndex(int entryIndex);
Binding { Binding {
target: _shortcutsprivate target: _shortcutsprivate
property: "appletIdStealingPositionShortcuts" property: "appletIdStealingPositionShortcuts"
@ -47,7 +45,7 @@ Item {
if (appletItem if (appletItem
&& appletItem.index>=0 && appletItem.index>=0
&& appletItem.communicator && appletItem.communicator
&& appletItem.communicator.onPositionShortcutsAreSupported && appletItem.communicator.positionShortcutsAreSupported
&& appletItem.communicator.bridge.shortcuts.client.isStealingGlobalPositionShortcuts) { && appletItem.communicator.bridge.shortcuts.client.isStealingGlobalPositionShortcuts) {
return appletItem.index; return appletItem.index;
} }
@ -59,7 +57,7 @@ Item {
if (appletItem if (appletItem
&& appletItem.index>=0 && appletItem.index>=0
&& appletItem.communicator && appletItem.communicator
&& appletItem.communicator.onPositionShortcutsAreSupported && appletItem.communicator.positionShortcutsAreSupported
&& appletItem.communicator.bridge.shortcuts.client.isStealingGlobalPositionShortcuts) { && appletItem.communicator.bridge.shortcuts.client.isStealingGlobalPositionShortcuts) {
return appletItem.index; return appletItem.index;
} }
@ -71,7 +69,7 @@ Item {
if (appletItem if (appletItem
&& appletItem.index>=0 && appletItem.index>=0
&& appletItem.communicator && appletItem.communicator
&& appletItem.communicator.onPositionShortcutsAreSupported && appletItem.communicator.positionShortcutsAreSupported
&& appletItem.communicator.bridge.shortcuts.client.isStealingGlobalPositionShortcuts) { && appletItem.communicator.bridge.shortcuts.client.isStealingGlobalPositionShortcuts) {
return appletItem.index; return appletItem.index;
} }

View File

@ -616,17 +616,17 @@ Item {
target: appletItem.shortcuts target: appletItem.shortcuts
onSglActivateEntryAtIndex: { onSglActivateEntryAtIndex: {
if (parabolicManager.pseudoIndexBelongsToLatteApplet(entryIndex) && appletItem.isLattePlasmoid) { var visibleIndex = appletItem.indexer.visibleIndex(appletItem.index);
latteApplet.activateTaskAtIndex(entryIndex - latteApplet.tasksBaseIndex);
} else if (shortcuts.unifiedGlobalShortcuts && refersEntryIndex(entryIndex)) { if (visibleIndex === entryIndex && !communicator.positionShortcutsAreSupported) {
latteView.extendedInterface.toggleAppletExpanded(applet.id); latteView.extendedInterface.toggleAppletExpanded(applet.id);
} }
} }
onSglNewInstanceForEntryAtIndex: { onSglNewInstanceForEntryAtIndex: {
if (parabolicManager.pseudoIndexBelongsToLatteApplet(entryIndex) && appletItem.isLattePlasmoid) { var visibleIndex = appletItem.indexer.visibleIndex(appletItem.index);
latteApplet.newInstanceForTaskAtIndex(entryIndex - latteApplet.tasksBaseIndex);
} else if (shortcuts.unifiedGlobalShortcuts && refersEntryIndex(entryIndex)) { if (visibleIndex === entryIndex && !communicator.positionShortcutsAreSupported) {
latteView.extendedInterface.toggleAppletExpanded(applet.id); latteView.extendedInterface.toggleAppletExpanded(applet.id);
} }
} }

View File

@ -59,8 +59,8 @@ Item{
//! BEGIN OF ABILITIES SUPPORT //! BEGIN OF ABILITIES SUPPORT
readonly property bool indexerIsSupported: bridge && bridge.indexer.client readonly property bool indexerIsSupported: bridge && bridge.indexer.client
readonly property bool onPositionShortcutsAreSupported: bridge && bridge.shortcuts.client
readonly property bool parabolicEffectIsSupported: bridge && bridge.parabolic.client readonly property bool parabolicEffectIsSupported: bridge && bridge.parabolic.client
readonly property bool positionShortcutsAreSupported: bridge && bridge.shortcuts.client
readonly property Item bridge: bridgeLoader.active ? bridgeLoader.item : null readonly property Item bridge: bridgeLoader.active ? bridgeLoader.item : null
//! END OF ABILITIES SUPPORT //! END OF ABILITIES SUPPORT

View File

@ -0,0 +1,57 @@
/*
* Copyright 2020 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 org.kde.latte.abilities.definitions 0.1 as AbilityDefinition
AbilityDefinition.PositionShortcuts {
id: shortcuts
property Item bridge: null
readonly property bool isActive: bridge !== null
property bool isStealingGlobalPositionShortcuts: false
readonly property bool showPositionShortcutBadges: ref.shortcuts.showPositionShortcutBadges
readonly property AbilityDefinition.ParabolicEffect local: AbilityDefinition.ParabolicEffect {}
Item {
id: ref
readonly property Item shortcuts: bridge ? bridge.shortcuts.host : local
}
onIsActiveChanged: {
if (isActive) {
bridge.shortcuts.client = shortcuts;
}
}
Component.onCompleted: {
if (isActive) {
bridge.shortcuts.client = shortcuts;
}
}
Component.onDestruction: {
if (isActive) {
bridge.shortcuts.client = null;
}
}
}

View File

@ -4,4 +4,5 @@ Animations 0.1 Animations.qml
Indexer 0.1 Indexer.qml Indexer 0.1 Indexer.qml
Metrics 0.1 Metrics.qml Metrics 0.1 Metrics.qml
ParabolicEffect 0.1 ParabolicEffect.qml ParabolicEffect 0.1 ParabolicEffect.qml
PositionShortcuts 0.1 PositionShortcuts.qml
Requirements 0.1 Requirements.qml Requirements 0.1 Requirements.qml

View File

@ -25,4 +25,23 @@ Item {
property Item host: null property Item host: null
property Item client: null property Item client: null
readonly property bool isConnected: host && client
onIsConnectedChanged: {
if (isConnected) {
host.sglActivateEntryAtIndex.connect(client.sglActivateEntryAtIndex);
host.sglNewInstanceForEntryAtIndex.connect(client.sglNewInstanceForEntryAtIndex);
} else {
host.sglActivateEntryAtIndex.disconnect(client.sglActivateEntryAtIndex);
host.sglNewInstanceForEntryAtIndex.disconnect(client.sglNewInstanceForEntryAtIndex);
}
}
Component.onDestruction: {
if (isConnected) {
host.sglActivateEntryAtIndex.disconnect(client.sglActivateEntryAtIndex);
host.sglNewInstanceForEntryAtIndex.disconnect(client.sglNewInstanceForEntryAtIndex);
}
}
} }

View File

@ -0,0 +1,27 @@
/*
* Copyright 2020 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
Item {
property bool showPositionShortcutBadges: false
signal sglActivateEntryAtIndex(int entryIndex);
signal sglNewInstanceForEntryAtIndex(int entryIndex);
}

View File

@ -5,4 +5,5 @@ AppletRequirements 0.1 AppletRequirements.qml
Indexer 0.1 Indexer.qml Indexer 0.1 Indexer.qml
Metrics 0.1 Metrics.qml Metrics 0.1 Metrics.qml
ParabolicEffect 0.1 ParabolicEffect.qml ParabolicEffect 0.1 ParabolicEffect.qml
PositionShortcuts 0.1 PositionShortcuts.qml

View File

@ -155,7 +155,10 @@ AppletAbility.Indexer {
} }
function visibleIndex(taskIndex) { function visibleIndex(taskIndex) {
if (taskIndex < firstVisibleItemIndex || taskIndex>lastVisibleItemIndex) { if (taskIndex<firstVisibleItemIndex
|| taskIndex>lastVisibleItemIndex
|| hidden.indexOf(taskIndex) >= 0
|| separators.indexOf(taskIndex) >= 0) {
return -1; return -1;
} }
@ -166,7 +169,7 @@ AppletAbility.Indexer {
for (var i=0; i<layout.children.length; ++i){ for (var i=0; i<layout.children.length; ++i){
var item = layout.children[i]; var item = layout.children[i];
if (hidden.indexOf(item.itemIndex) >=0 || separators.indexOf(item.itemIndex) >=0) { if (hidden.indexOf(item.itemIndex)>=0 || separators.indexOf(item.itemIndex)>=0) {
continue; continue;
} }

View File

@ -0,0 +1,29 @@
/*
* Copyright 2020 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.7
import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.latte.abilities.applets 0.1 as AppletAbility
AppletAbility.PositionShortcuts {
id: shortcuts
}

View File

@ -75,8 +75,6 @@ Item {
property bool initializationStep: false //true property bool initializationStep: false //true
property bool isHovered: false property bool isHovered: false
property bool showBarLine: plasmoid.configuration.showBarLine property bool showBarLine: plasmoid.configuration.showBarLine
property bool showTaskShortcutBadges: false
property int tasksBaseIndex: 0
property bool useThemePanel: plasmoid.configuration.useThemePanel property bool useThemePanel: plasmoid.configuration.useThemePanel
property bool taskInAnimation: noTasksInAnimation > 0 ? true : false property bool taskInAnimation: noTasksInAnimation > 0 ? true : false
property bool transparentPanel: plasmoid.configuration.transparentPanel property bool transparentPanel: plasmoid.configuration.transparentPanel
@ -139,6 +137,7 @@ Item {
readonly property alias indexer: _indexer readonly property alias indexer: _indexer
readonly property alias metrics: _metrics readonly property alias metrics: _metrics
readonly property alias parabolic: _parabolic readonly property alias parabolic: _parabolic
readonly property alias shortcuts: _shortcuts
readonly property alias containsDrag: mouseHandler.containsDrag readonly property alias containsDrag: mouseHandler.containsDrag
readonly property bool dragAreaEnabled: latteView ? (root.dragSource !== null readonly property bool dragAreaEnabled: latteView ? (root.dragSource !== null
@ -963,6 +962,11 @@ Item {
local.restoreZoomIsBlocked: root.contextMenu || windowsPreviewDlg.containsMouse local.restoreZoomIsBlocked: root.contextMenu || windowsPreviewDlg.containsMouse
} }
Ability.PositionShortcuts {
id: _shortcuts
bridge: latteBridge
}
AppletAbility.Requirements{ AppletAbility.Requirements{
id: _requires id: _requires
bridge: latteBridge bridge: latteBridge
@ -1259,6 +1263,7 @@ Item {
metrics: _metrics metrics: _metrics
parabolic: _parabolic parabolic: _parabolic
requires: _requires requires: _requires
shortcuts: _shortcuts
} }
property int currentSpot : -1000 property int currentSpot : -1000
@ -1629,50 +1634,14 @@ Item {
} }
} }
// This is called by dockcorona in response to a Meta+number shortcut.
function activateTaskAtIndex(index) { function activateTaskAtIndex(index) {
if (typeof index !== "number") { // This is called with Meta+number shortcuts by plasmashell when Tasks are in a plasma panel.
return; shortcuts.sglActivateEntryAtIndex(index);
}
var tasks = icList.contentItem.children;
//! this is used to bypass the internal separators if they exist
var confirmedIndex = parabolicManager.realTaskIndex(index - 1);
for(var i=0; i<tasks.length; ++i){
var task = tasks[i];
if (task.itemIndex === confirmedIndex) {
if (task.isGroupParent) {
task.activateNextTask();
} else {
task.activateTask();
}
break;
}
}
} }
// This is called by dockcorona in response to a Meta+Alt+number shortcut.
function newInstanceForTaskAtIndex(index) { function newInstanceForTaskAtIndex(index) {
if (typeof index !== "number") { // This is called with Meta+Alt+number shortcuts by plasmashell when Tasks are in a plasma panel.
return; shortcuts.sglNewInstanceForEntryAtIndex(index);
}
var tasks = icList.contentItem.children;
//! this is used to bypass the internal separators if they exist
var confirmedIndex = parabolicManager.realTaskIndex(index - 1);
for(var i=0; i<tasks.length; ++i){
var task = tasks[i];
if (task.itemIndex === confirmedIndex) {
TaskTools.activateTask(task.modelIndex(), task.m, Qt.ControlModifier , task);
break;
}
}
} }
function getBadger(identifier) { function getBadger(identifier) {
@ -1810,17 +1779,6 @@ Item {
} }
} }
//! show/hide tasks numbered badges e.g. from global shortcuts
function setShowTaskShortcutBadges(showBadges){
showTaskShortcutBadges = showBadges;
}
//! setup the tasks first index based on the fact that this is a plasmoid
//! and applets could exist before it
function setTasksBaseIndex(base){
tasksBaseIndex = base;
}
function previewContainsMouse() { function previewContainsMouse() {
return windowsPreviewDlg.containsMouse; return windowsPreviewDlg.containsMouse;
} }

View File

@ -25,7 +25,7 @@ import org.kde.latte.components 1.0 as LatteComponents
Loader{ Loader{
id: shorcutBadge id: shorcutBadge
anchors.fill: iconImageBuffer anchors.fill: iconImageBuffer
active: root.showTaskShortcutBadges && !taskItem.isSeparator && fixedIndex>=0 && fixedIndex<20 active: taskItem.shortcuts.showPositionShortcutBadges && !taskItem.isSeparator && !taskItem.isHidden
asynchronous: true asynchronous: true
visible: badgeString !== "" visible: badgeString !== ""
@ -33,10 +33,11 @@ Loader{
property string badgeString: (shorcutBadge.fixedIndex>=1 && shorcutBadge.fixedIndex<20 && root.badgesForActivate.length===19) ? property string badgeString: (shorcutBadge.fixedIndex>=1 && shorcutBadge.fixedIndex<20 && root.badgesForActivate.length===19) ?
root.badgesForActivate[shorcutBadge.fixedIndex-1] : "" root.badgesForActivate[shorcutBadge.fixedIndex-1] : ""
Connections { onActiveChanged: {
target: root if (active && taskItem.shortcuts.showPositionShortcutBadges) {
onShowTaskShortcutBadgesChanged: { fixedIndex = taskItem.indexer.visibleIndex(taskItem.itemIndex);
shorcutBadge.fixedIndex = taskItem.indexer.visibleIndex(taskItem.itemIndex); } else {
fixedIndex = -1;
} }
} }

View File

@ -186,6 +186,7 @@ MouseArea{
property Item metrics: null property Item metrics: null
property Item parabolic: null property Item parabolic: null
property Item requires: null property Item requires: null
property Item shortcuts: null
onModelLauncherUrlChanged: { onModelLauncherUrlChanged: {
if (modelLauncherUrl !== ""){ if (modelLauncherUrl !== ""){
@ -1452,6 +1453,29 @@ MouseArea{
} }
} }
Connections {
target: shortcuts
onSglActivateEntryAtIndex: {
var visibleIndex = taskItem.indexer.visibleIndex(taskItem.itemIndex);
if (visibleIndex === entryIndex) {
if (taskItem.isGroupParent) {
taskItem.activateNextTask();
} else {
taskItem.activateTask();
}
}
}
onSglNewInstanceForEntryAtIndex: {
var visibleIndex = taskItem.indexer.visibleIndex(taskItem.itemIndex);
if (visibleIndex === entryIndex) {
tasksModel.requestNewInstance(taskItem.modelIndex());
}
}
}
Connections { Connections {
target: latteView target: latteView
onDockIsHiddenChanged: { onDockIsHiddenChanged: {