Commit 1fd5e927 authored by Marco Martin's avatar Marco Martin

generalize LauncherContainer

parent 20b1f1e8
......@@ -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();
}
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
implicitWidth: applicationsFlow.implicitWidth
implicitHeight: applicationsFlow.implicitHeight
readonly property int count: flow.width / launcherGrid.cellWidth
Item {
id: spacer
width: units.gridUnit * 4
height: width
}
flow.flow: Flow.TopToBottom
Flow {
id: applicationsFlow
anchors.fill: parent
spacing: 0
implicitWidth: launcherGrid.cellWidth * 5 + leftPadding + rightPadding//applicationsFlow.count
move: Transition {
NumberAnimation {
duration: units.longDuration
easing.type: Easing.InOutQuad
properties: "x,y"
}
}
}
}
}
/*
* 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)
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment