mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-26 14:23:09 +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;
|
||||
QList<ApplicationData> unorderedList;
|
||||
|
||||
int i = 0; // for default bookmarks
|
||||
|
||||
// Iterate over all entries in the group
|
||||
while (!subGroupList.isEmpty()) {
|
||||
KSycocaEntry::Ptr groupEntry = subGroupList.first();
|
||||
|
|
@ -141,8 +143,12 @@ void ApplicationListModel::loadApplications()
|
|||
|
||||
auto it = m_appPositions.constFind(service->storageId());
|
||||
if (it != m_appPositions.constEnd()) {
|
||||
//TODO: proper bookmarks
|
||||
data.favorite = (*it) < 6;
|
||||
orderedList[*it] = data;
|
||||
} else {
|
||||
//TODO: proper bookmarks
|
||||
data.favorite = ++i + m_appPositions.size() < 6;
|
||||
unorderedList << data;
|
||||
}
|
||||
}
|
||||
|
|
@ -184,6 +190,8 @@ QVariant ApplicationListModel::data(const QModelIndex &index, int role) const
|
|||
return index.row();
|
||||
case ApplicationOnDesktopRole:
|
||||
return m_applicationList.at(index.row()).desktop;
|
||||
case ApplicationFavoriteRole:
|
||||
return m_applicationList.at(index.row()).favorite;
|
||||
|
||||
default:
|
||||
return QVariant();
|
||||
|
|
@ -222,6 +230,7 @@ void ApplicationListModel::setFavoriteItem(int row, bool favorite)
|
|||
return;
|
||||
}
|
||||
|
||||
setDesktopItem(row, false);
|
||||
data.favorite = favorite;
|
||||
|
||||
emit dataChanged(index(row, 0), index(row, 0));
|
||||
|
|
@ -238,8 +247,9 @@ void ApplicationListModel::setDesktopItem(int row, bool desktop)
|
|||
return;
|
||||
}
|
||||
|
||||
setFavoriteItem(row, false);
|
||||
data.desktop = desktop;
|
||||
qWarning()<<m_applicationList[row].desktop;
|
||||
|
||||
emit dataChanged(index(row, 0), index(row, 0));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -83,6 +83,9 @@ ContainmentLayoutManager.ItemContainer {
|
|||
newRow = Math.floor((pos.x + dragCenter.x) / delegate.width);
|
||||
before = favoriteStrip.flow.childAt(delegate.x + dragCenter.x, delegate.y + dragCenter.y);
|
||||
|
||||
plasmoid.nativeInterface.applicationListModel.setFavoriteItem(index, true);
|
||||
|
||||
|
||||
// Put it on desktop
|
||||
} else if (appletsLayout.contains(appletsLayout.mapFromItem(delegate, dragCenter.x, dragCenter.y))) {
|
||||
var pos = appletsLayout.mapFromItem(delegate, 0, 0);
|
||||
|
|
@ -94,6 +97,9 @@ ContainmentLayoutManager.ItemContainer {
|
|||
|
||||
// Put it in the general view
|
||||
} 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;
|
||||
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
|
||||
|
||||
|
||||
Controls.Control {
|
||||
LauncherContainer {
|
||||
id: root
|
||||
|
||||
property alias flow: applicationsFlow
|
||||
|
||||
property Controls.Control launcherGrid
|
||||
readonly property int count: applicationsFlow.width / launcherGrid.cellWidth
|
||||
|
||||
function forceLayout() {
|
||||
applicationsFlow.forceLayout();
|
||||
}
|
||||
readonly property int count: flow.width / launcherGrid.cellWidth
|
||||
|
||||
function showSpacerBefore(item) {
|
||||
spacer.parent = applicationsFlow
|
||||
plasmoid.nativeInterface.orderItems(spacer, item);
|
||||
}
|
||||
flow.flow: Flow.TopToBottom
|
||||
|
||||
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
|
||||
|
||||
Controls.Control {
|
||||
LauncherContainer {
|
||||
id: root
|
||||
|
||||
property alias flow: applicationsFlow
|
||||
|
||||
readonly property bool dragging: applicationsFlow.dragData
|
||||
readonly property bool dragging: root.flow.dragData
|
||||
property bool reorderingApps: false
|
||||
|
||||
property int availableCellHeight: units.iconSizes.huge + reservedSpaceForLabel
|
||||
|
||||
readonly property int reservedSpaceForLabel: metrics.height
|
||||
|
||||
readonly property int cellWidth: applicationsFlow.width / Math.floor(applicationsFlow.width / ((availableCellHeight - reservedSpaceForLabel) + units.smallSpacing*4))
|
||||
readonly property int cellWidth: root.flow.width / Math.floor(root.flow.width / ((availableCellHeight - reservedSpaceForLabel) + units.smallSpacing*4))
|
||||
readonly property int cellHeight: availableCellHeight - topPadding
|
||||
|
||||
property ContainmentLayoutManager.AppletsLayout appletsLayout
|
||||
property FavoriteStrip favoriteStrip
|
||||
|
||||
signal externalDragStarted
|
||||
signal dragPositionChanged(point pos)
|
||||
|
||||
function forceLayout() {
|
||||
applicationsFlow.forceLayout();
|
||||
}
|
||||
|
||||
function showSpacerBefore(item) {
|
||||
spacer.parent = applicationsFlow
|
||||
plasmoid.nativeInterface.orderItems(spacer, item);
|
||||
}
|
||||
|
||||
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"
|
||||
Repeater {
|
||||
model: plasmoid.nativeInterface.applicationListModel
|
||||
delegate: Delegate {
|
||||
id: delegate
|
||||
width: root.cellWidth
|
||||
height: root.cellHeight
|
||||
container: {
|
||||
if (model.ApplicationOnDesktopRole) {
|
||||
return null;
|
||||
}
|
||||
if (index < favoriteStrip.count) {
|
||||
return favoriteStrip;
|
||||
}
|
||||
return root;
|
||||
}
|
||||
|
||||
Repeater {
|
||||
model: plasmoid.nativeInterface.applicationListModel
|
||||
delegate: Delegate {
|
||||
width: root.cellWidth
|
||||
height: root.cellHeight
|
||||
container: {
|
||||
if (model.ApplicationOnDesktopRole) {
|
||||
return null;
|
||||
}
|
||||
if (index < favoriteStrip.count) {
|
||||
return favoriteStrip;
|
||||
}
|
||||
return root;
|
||||
}
|
||||
parent: {
|
||||
if (model.ApplicationOnDesktopRole) {
|
||||
return appletsLayout;
|
||||
}
|
||||
if (index < favoriteStrip.count) {
|
||||
if (editMode) {
|
||||
return favoriteStrip.contentItem;
|
||||
} else {
|
||||
return favoriteStrip.flow;
|
||||
}
|
||||
}
|
||||
if (editMode) {
|
||||
return flowParent;
|
||||
} else {
|
||||
return applicationsFlow;
|
||||
}
|
||||
parent: {
|
||||
if (model.ApplicationOnDesktopRole) {
|
||||
var pos = appletsLayout.mapFromItem(delegate, 0, 0);
|
||||
x = pos.x;
|
||||
y = pos.y;
|
||||
return appletsLayout;
|
||||
}
|
||||
if (model.ApplicationFavoriteRole) {
|
||||
if (editMode) {
|
||||
var pos = favoriteStrip.contentItem.mapFromItem(delegate, 0, 0);
|
||||
x = pos.x;
|
||||
y = pos.y;
|
||||
return favoriteStrip.contentItem;
|
||||
} else {
|
||||
var pos = favoriteStrip.flow.mapFromItem(delegate, 0, 0);
|
||||
x = pos.x;
|
||||
y = pos.y;
|
||||
return favoriteStrip.flow;
|
||||
}
|
||||
}
|
||||
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 {
|
||||
id: favoriteStrip
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
width: Math.min(root.width, units.gridUnit * 30)
|
||||
width: Math.min(root.width, implicitWidth)
|
||||
launcherGrid: launcher
|
||||
y: Math.max(0, root.height - height - mainFlickable.contentY)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue