mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-08-03 18:24:46 +00:00
generalize LauncherContainer
This commit is contained in:
parent
20b1f1e863
commit
1fd5e92794
6 changed files with 166 additions and 160 deletions
|
|
@ -103,6 +103,8 @@ void ApplicationListModel::loadApplications()
|
||||||
QMap<int, ApplicationData> orderedList;
|
QMap<int, ApplicationData> orderedList;
|
||||||
QList<ApplicationData> unorderedList;
|
QList<ApplicationData> unorderedList;
|
||||||
|
|
||||||
|
int i = 0; // for default bookmarks
|
||||||
|
|
||||||
// Iterate over all entries in the group
|
// Iterate over all entries in the group
|
||||||
while (!subGroupList.isEmpty()) {
|
while (!subGroupList.isEmpty()) {
|
||||||
KSycocaEntry::Ptr groupEntry = subGroupList.first();
|
KSycocaEntry::Ptr groupEntry = subGroupList.first();
|
||||||
|
|
@ -141,8 +143,12 @@ void ApplicationListModel::loadApplications()
|
||||||
|
|
||||||
auto it = m_appPositions.constFind(service->storageId());
|
auto it = m_appPositions.constFind(service->storageId());
|
||||||
if (it != m_appPositions.constEnd()) {
|
if (it != m_appPositions.constEnd()) {
|
||||||
|
//TODO: proper bookmarks
|
||||||
|
data.favorite = (*it) < 6;
|
||||||
orderedList[*it] = data;
|
orderedList[*it] = data;
|
||||||
} else {
|
} else {
|
||||||
|
//TODO: proper bookmarks
|
||||||
|
data.favorite = ++i + m_appPositions.size() < 6;
|
||||||
unorderedList << data;
|
unorderedList << data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -184,6 +190,8 @@ QVariant ApplicationListModel::data(const QModelIndex &index, int role) const
|
||||||
return index.row();
|
return index.row();
|
||||||
case ApplicationOnDesktopRole:
|
case ApplicationOnDesktopRole:
|
||||||
return m_applicationList.at(index.row()).desktop;
|
return m_applicationList.at(index.row()).desktop;
|
||||||
|
case ApplicationFavoriteRole:
|
||||||
|
return m_applicationList.at(index.row()).favorite;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return QVariant();
|
return QVariant();
|
||||||
|
|
@ -222,6 +230,7 @@ void ApplicationListModel::setFavoriteItem(int row, bool favorite)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setDesktopItem(row, false);
|
||||||
data.favorite = favorite;
|
data.favorite = favorite;
|
||||||
|
|
||||||
emit dataChanged(index(row, 0), index(row, 0));
|
emit dataChanged(index(row, 0), index(row, 0));
|
||||||
|
|
@ -238,8 +247,9 @@ void ApplicationListModel::setDesktopItem(int row, bool desktop)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setFavoriteItem(row, false);
|
||||||
data.desktop = desktop;
|
data.desktop = desktop;
|
||||||
qWarning()<<m_applicationList[row].desktop;
|
|
||||||
emit dataChanged(index(row, 0), index(row, 0));
|
emit dataChanged(index(row, 0), index(row, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,9 @@ ContainmentLayoutManager.ItemContainer {
|
||||||
newRow = Math.floor((pos.x + dragCenter.x) / delegate.width);
|
newRow = Math.floor((pos.x + dragCenter.x) / delegate.width);
|
||||||
before = favoriteStrip.flow.childAt(delegate.x + dragCenter.x, delegate.y + dragCenter.y);
|
before = favoriteStrip.flow.childAt(delegate.x + dragCenter.x, delegate.y + dragCenter.y);
|
||||||
|
|
||||||
|
plasmoid.nativeInterface.applicationListModel.setFavoriteItem(index, true);
|
||||||
|
|
||||||
|
|
||||||
// Put it on desktop
|
// Put it on desktop
|
||||||
} else if (appletsLayout.contains(appletsLayout.mapFromItem(delegate, dragCenter.x, dragCenter.y))) {
|
} else if (appletsLayout.contains(appletsLayout.mapFromItem(delegate, dragCenter.x, dragCenter.y))) {
|
||||||
var pos = appletsLayout.mapFromItem(delegate, 0, 0);
|
var pos = appletsLayout.mapFromItem(delegate, 0, 0);
|
||||||
|
|
@ -94,6 +97,9 @@ ContainmentLayoutManager.ItemContainer {
|
||||||
|
|
||||||
// Put it in the general view
|
// Put it in the general view
|
||||||
} else {
|
} else {
|
||||||
|
plasmoid.nativeInterface.applicationListModel.setFavoriteItem(index, false);
|
||||||
|
plasmoid.nativeInterface.applicationListModel.setDesktopItem(index, false);
|
||||||
|
|
||||||
newRow = Math.round(applicationsFlow.width / delegate.width) * Math.floor((delegate.y + dragCenter.y) / delegate.height) + Math.floor((delegate.x + dragCenter.x) / delegate.width) + favoriteStrip.count;
|
newRow = Math.round(applicationsFlow.width / delegate.width) * Math.floor((delegate.y + dragCenter.y) / delegate.height) + Math.floor((delegate.x + dragCenter.x) / delegate.width) + favoriteStrip.count;
|
||||||
before = applicationsFlow.childAt(delegate.x + dragCenter.x, delegate.y + dragCenter.y);
|
before = applicationsFlow.childAt(delegate.x + dragCenter.x, delegate.y + dragCenter.y);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,65 +26,16 @@ import org.kde.plasma.components 2.0 as PlasmaComponents
|
||||||
import org.kde.kquickcontrolsaddons 2.0
|
import org.kde.kquickcontrolsaddons 2.0
|
||||||
|
|
||||||
|
|
||||||
Controls.Control {
|
LauncherContainer {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property alias flow: applicationsFlow
|
|
||||||
|
|
||||||
property Controls.Control launcherGrid
|
property Controls.Control launcherGrid
|
||||||
readonly property int count: applicationsFlow.width / launcherGrid.cellWidth
|
|
||||||
|
|
||||||
function forceLayout() {
|
readonly property int count: flow.width / launcherGrid.cellWidth
|
||||||
applicationsFlow.forceLayout();
|
|
||||||
}
|
|
||||||
|
|
||||||
function showSpacerBefore(item) {
|
flow.flow: Flow.TopToBottom
|
||||||
spacer.parent = applicationsFlow
|
|
||||||
plasmoid.nativeInterface.orderItems(spacer, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
function hideSpacer() {
|
|
||||||
spacer.parent = flowParent;
|
|
||||||
}
|
|
||||||
|
|
||||||
implicitHeight: applicationsFlow.implicitHeight + frame.margins.top + frame.margins.bottom
|
implicitWidth: launcherGrid.cellWidth * 5 + leftPadding + rightPadding//applicationsFlow.count
|
||||||
|
|
||||||
leftPadding: frame.margins.left
|
|
||||||
topPadding: frame.margins.top
|
|
||||||
rightPadding: frame.margins.right
|
|
||||||
bottomPadding: frame.margins.bottom
|
|
||||||
|
|
||||||
background: PlasmaCore.FrameSvgItem {
|
|
||||||
id: frame
|
|
||||||
imagePath: "widgets/background"
|
|
||||||
anchors.fill: parent
|
|
||||||
}
|
|
||||||
|
|
||||||
contentItem: Item {
|
|
||||||
id: flowParent
|
|
||||||
|
|
||||||
implicitWidth: applicationsFlow.implicitWidth
|
|
||||||
implicitHeight: applicationsFlow.implicitHeight
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: spacer
|
|
||||||
width: units.gridUnit * 4
|
|
||||||
height: width
|
|
||||||
}
|
|
||||||
|
|
||||||
Flow {
|
|
||||||
id: applicationsFlow
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
spacing: 0
|
|
||||||
|
|
||||||
move: Transition {
|
|
||||||
NumberAnimation {
|
|
||||||
duration: units.longDuration
|
|
||||||
easing.type: Easing.InOutQuad
|
|
||||||
properties: "x,y"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,98 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2019 Marco Martin <mart@kde.org>
|
||||||
|
*
|
||||||
|
* This program 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.
|
||||||
|
*
|
||||||
|
* This program 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import QtQuick 2.4
|
||||||
|
import QtQuick.Layouts 1.1
|
||||||
|
import QtQuick.Controls 2.3 as Controls
|
||||||
|
|
||||||
|
import org.kde.plasma.plasmoid 2.0
|
||||||
|
import org.kde.plasma.core 2.0 as PlasmaCore
|
||||||
|
import org.kde.plasma.components 2.0 as PlasmaComponents
|
||||||
|
import org.kde.kquickcontrolsaddons 2.0
|
||||||
|
|
||||||
|
|
||||||
|
Controls.Control {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
readonly property int reservedSpaceForLabel: metrics.height
|
||||||
|
property int availableCellHeight: units.iconSizes.huge + reservedSpaceForLabel
|
||||||
|
|
||||||
|
property alias flow: applicationsFlow
|
||||||
|
|
||||||
|
function forceLayout() {
|
||||||
|
applicationsFlow.forceLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showSpacerBefore(item) {
|
||||||
|
spacer.parent = applicationsFlow
|
||||||
|
plasmoid.nativeInterface.orderItems(spacer, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideSpacer() {
|
||||||
|
spacer.parent = flowParent;
|
||||||
|
}
|
||||||
|
|
||||||
|
implicitWidth: contentItem.implicitWidth + frame.margins.top + frame.margins.bottom
|
||||||
|
implicitHeight: contentItem.implicitHeight + frame.margins.top + frame.margins.bottom
|
||||||
|
|
||||||
|
leftPadding: frame.margins.left
|
||||||
|
topPadding: frame.margins.top
|
||||||
|
rightPadding: frame.margins.right
|
||||||
|
bottomPadding: frame.margins.bottom
|
||||||
|
|
||||||
|
background: PlasmaCore.FrameSvgItem {
|
||||||
|
id: frame
|
||||||
|
imagePath: "widgets/background"
|
||||||
|
anchors.fill: parent
|
||||||
|
}
|
||||||
|
|
||||||
|
contentItem: Item {
|
||||||
|
id: flowParent
|
||||||
|
|
||||||
|
implicitWidth: applicationsFlow.implicitWidth
|
||||||
|
implicitHeight: applicationsFlow.implicitHeight
|
||||||
|
|
||||||
|
//NOTE: TextMetrics can't handle multi line
|
||||||
|
Controls.Label {
|
||||||
|
id: metrics
|
||||||
|
text: "M\nM"
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: spacer
|
||||||
|
width: units.gridUnit * 4
|
||||||
|
height: width
|
||||||
|
}
|
||||||
|
|
||||||
|
Flow {
|
||||||
|
id: applicationsFlow
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
spacing: 0
|
||||||
|
|
||||||
|
move: Transition {
|
||||||
|
NumberAnimation {
|
||||||
|
duration: units.longDuration
|
||||||
|
easing.type: Easing.InOutQuad
|
||||||
|
properties: "x,y"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -27,127 +27,68 @@ import org.kde.kquickcontrolsaddons 2.0
|
||||||
|
|
||||||
import org.kde.plasma.private.containmentlayoutmanager 1.0 as ContainmentLayoutManager
|
import org.kde.plasma.private.containmentlayoutmanager 1.0 as ContainmentLayoutManager
|
||||||
|
|
||||||
Controls.Control {
|
LauncherContainer {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property alias flow: applicationsFlow
|
readonly property bool dragging: root.flow.dragData
|
||||||
|
|
||||||
readonly property bool dragging: applicationsFlow.dragData
|
|
||||||
property bool reorderingApps: false
|
property bool reorderingApps: false
|
||||||
|
|
||||||
property int availableCellHeight: units.iconSizes.huge + reservedSpaceForLabel
|
|
||||||
|
|
||||||
readonly property int reservedSpaceForLabel: metrics.height
|
readonly property int cellWidth: root.flow.width / Math.floor(root.flow.width / ((availableCellHeight - reservedSpaceForLabel) + units.smallSpacing*4))
|
||||||
|
|
||||||
readonly property int cellWidth: applicationsFlow.width / Math.floor(applicationsFlow.width / ((availableCellHeight - reservedSpaceForLabel) + units.smallSpacing*4))
|
|
||||||
readonly property int cellHeight: availableCellHeight - topPadding
|
readonly property int cellHeight: availableCellHeight - topPadding
|
||||||
|
|
||||||
property ContainmentLayoutManager.AppletsLayout appletsLayout
|
property ContainmentLayoutManager.AppletsLayout appletsLayout
|
||||||
property FavoriteStrip favoriteStrip
|
property FavoriteStrip favoriteStrip
|
||||||
|
|
||||||
signal externalDragStarted
|
|
||||||
signal dragPositionChanged(point pos)
|
|
||||||
|
|
||||||
function forceLayout() {
|
Repeater {
|
||||||
applicationsFlow.forceLayout();
|
model: plasmoid.nativeInterface.applicationListModel
|
||||||
}
|
delegate: Delegate {
|
||||||
|
id: delegate
|
||||||
function showSpacerBefore(item) {
|
width: root.cellWidth
|
||||||
spacer.parent = applicationsFlow
|
height: root.cellHeight
|
||||||
plasmoid.nativeInterface.orderItems(spacer, item);
|
container: {
|
||||||
}
|
if (model.ApplicationOnDesktopRole) {
|
||||||
|
return null;
|
||||||
function hideSpacer() {
|
|
||||||
spacer.parent = flowParent;
|
|
||||||
}
|
|
||||||
|
|
||||||
implicitHeight: applicationsFlow.implicitHeight + frame.margins.top + frame.margins.bottom
|
|
||||||
|
|
||||||
leftPadding: frame.margins.left
|
|
||||||
topPadding: frame.margins.top
|
|
||||||
rightPadding: frame.margins.right
|
|
||||||
bottomPadding: frame.margins.bottom
|
|
||||||
|
|
||||||
background: PlasmaCore.FrameSvgItem {
|
|
||||||
id: frame
|
|
||||||
imagePath: "widgets/background"
|
|
||||||
anchors.fill: parent
|
|
||||||
}
|
|
||||||
|
|
||||||
contentItem: Item {
|
|
||||||
id: flowParent
|
|
||||||
//NOTE: TextMetrics can't handle multi line
|
|
||||||
Controls.Label {
|
|
||||||
id: metrics
|
|
||||||
text: "M\nM"
|
|
||||||
visible: false
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: spacer
|
|
||||||
width: units.gridUnit * 4
|
|
||||||
height: width
|
|
||||||
visible:parent == applicationsFlow
|
|
||||||
}
|
|
||||||
Flow {
|
|
||||||
id: applicationsFlow
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
spacing: 0
|
|
||||||
|
|
||||||
property var dragData
|
|
||||||
property int startContentYDrag
|
|
||||||
property bool viewHasBeenDragged
|
|
||||||
|
|
||||||
|
|
||||||
NumberAnimation {
|
|
||||||
id: scrollAnim
|
|
||||||
target: applicationsFlow
|
|
||||||
properties: "contentY"
|
|
||||||
duration: units.longDuration
|
|
||||||
easing.type: Easing.InOutQuad
|
|
||||||
}
|
|
||||||
move: Transition {
|
|
||||||
NumberAnimation {
|
|
||||||
duration: units.longDuration
|
|
||||||
easing.type: Easing.InOutQuad
|
|
||||||
properties: "x,y"
|
|
||||||
}
|
}
|
||||||
|
if (index < favoriteStrip.count) {
|
||||||
|
return favoriteStrip;
|
||||||
|
}
|
||||||
|
return root;
|
||||||
}
|
}
|
||||||
|
parent: {
|
||||||
Repeater {
|
if (model.ApplicationOnDesktopRole) {
|
||||||
model: plasmoid.nativeInterface.applicationListModel
|
var pos = appletsLayout.mapFromItem(delegate, 0, 0);
|
||||||
delegate: Delegate {
|
x = pos.x;
|
||||||
width: root.cellWidth
|
y = pos.y;
|
||||||
height: root.cellHeight
|
return appletsLayout;
|
||||||
container: {
|
}
|
||||||
if (model.ApplicationOnDesktopRole) {
|
if (model.ApplicationFavoriteRole) {
|
||||||
return null;
|
if (editMode) {
|
||||||
}
|
var pos = favoriteStrip.contentItem.mapFromItem(delegate, 0, 0);
|
||||||
if (index < favoriteStrip.count) {
|
x = pos.x;
|
||||||
return favoriteStrip;
|
y = pos.y;
|
||||||
}
|
return favoriteStrip.contentItem;
|
||||||
return root;
|
} else {
|
||||||
}
|
var pos = favoriteStrip.flow.mapFromItem(delegate, 0, 0);
|
||||||
parent: {
|
x = pos.x;
|
||||||
if (model.ApplicationOnDesktopRole) {
|
y = pos.y;
|
||||||
return appletsLayout;
|
return favoriteStrip.flow;
|
||||||
}
|
|
||||||
if (index < favoriteStrip.count) {
|
|
||||||
if (editMode) {
|
|
||||||
return favoriteStrip.contentItem;
|
|
||||||
} else {
|
|
||||||
return favoriteStrip.flow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (editMode) {
|
|
||||||
return flowParent;
|
|
||||||
} else {
|
|
||||||
return applicationsFlow;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (editMode) {
|
||||||
|
var pos = flowParent.mapFromItem(delegate, 0, 0);
|
||||||
|
x = pos.x;
|
||||||
|
y = pos.y;
|
||||||
|
return flowParent;
|
||||||
|
} else {
|
||||||
|
var pos = root.flow.mapFromItem(delegate, 0, 0);
|
||||||
|
x = pos.x;
|
||||||
|
y = pos.y;
|
||||||
|
return root.flow;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -164,7 +164,7 @@ Text {
|
||||||
Launcher.FavoriteStrip {
|
Launcher.FavoriteStrip {
|
||||||
id: favoriteStrip
|
id: favoriteStrip
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
width: Math.min(root.width, units.gridUnit * 30)
|
width: Math.min(root.width, implicitWidth)
|
||||||
launcherGrid: launcher
|
launcherGrid: launcher
|
||||||
y: Math.max(0, root.height - height - mainFlickable.contentY)
|
y: Math.max(0, root.height - height - mainFlickable.contentY)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue