melawy-plasma-plasmoid-Menu.../com.github.adhec.Menu11/contents/ui/MenuRepresentation.qml

589 lines
21 KiB
QML

/***************************************************************************
* Copyright (C) 2014 by Weng Xuetian <wengxt@gmail.com>
* Copyright (C) 2013-2017 by Eike Hein <hein@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 02110-1301 USA . *
***************************************************************************/
import QtQuick 2.4
import QtQuick.Layouts 1.1
import QtQuick.Controls 2.12
import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 3.0 as PC3
import org.kde.plasma.extras 2.0 as PlasmaExtras
import org.kde.plasma.private.kicker 0.1 as Kicker
import org.kde.kquickcontrolsaddons 2.0
import org.kde.plasma.private.quicklaunch 1.0
import org.kde.kirigami as Kirigami
PlasmaCore.Dialog {
id: root
objectName: "popupWindow"
//flags: Qt.Dialog | Qt.FramelessWindowHint
flags: Qt.WindowStaysOnTopHint
location:{
if (Plasmoid.configuration.displayPosition === 1)
return PlasmaCore.Types.Floating
else if (Plasmoid.configuration.displayPosition === 2)
return PlasmaCore.Types.BottomEdge
else
return Plasmoid.location
}
hideOnWindowDeactivate: true
property int iconSize:{ switch(Plasmoid.configuration.appsIconSize){
case 0: return Kirigami.Units.iconSizes.smallMedium;
case 1: return Kirigami.Units.iconSizes.medium;
case 2: return Kirigami.Units.iconSizes.large;
case 3: return Kirigami.Units.iconSizes.huge;
default: return 64
}
}
property int docsIconSize:{ switch(Plasmoid.configuration.docsIconSize){
case 0: return Kirigami.Units.iconSizes.smallMedium;
case 1: return Kirigami.Units.iconSizes.medium;
case 2: return Kirigami.Units.iconSizes.large;
case 3: return Kirigami.Units.iconSizes.huge;
default: return Kirigami.Units.iconSizes.medium;
}
}
property int cellSizeHeight: iconSize
+ Kirigami.Units.gridUnit * 2
+ (2 * Math.max(highlightItemSvg.margins.top + highlightItemSvg.margins.bottom,
highlightItemSvg.margins.left + highlightItemSvg.margins.right))
property int cellSizeWidth: cellSizeHeight + Kirigami.Units.gridUnit
property bool searching: (searchField.text != "")
onSearchingChanged: {
if(searching)
view.currentIndex = 2
else
view.currentIndex = 0
}
onVisibleChanged: {
if (visible) {
var pos = popupPosition(width, height);
x = pos.x;
y = pos.y;
reset();
}else{
view.currentIndex = 0
}
}
onHeightChanged: {
var pos = popupPosition(width, height);
x = pos.x;
y = pos.y;
}
onWidthChanged: {
var pos = popupPosition(width, height);
x = pos.x;
y = pos.y;
}
function toggle(){
root.visible = !root.visible
}
function reset() {
searchField.text = "";
searchField.focus = true
view.currentIndex = 0
globalFavoritesGrid.currentIndex = -1
documentsGrid.currentIndex = -1
allAppsGrid.currentIndex = -1
}
function popupPosition(width, height) {
var screenAvail = kicker.availableScreenRect;
var screen = kicker.screenGeometry;
var panelH = kicker.height
var panelW = kicker.width
var horizMidPoint = screen.x + (screen.width / 2);
var vertMidPoint = screen.y + (screen.height / 2);
var appletTopLeft = parent.mapToGlobal(0, 0);
var offset = Kirigami.Units.smallSpacing * 2;
if (Plasmoid.configuration.displayPosition === 1) {
horizMidPoint = screen.x + (screen.width / 2);
vertMidPoint = screen.y + (screen.height / 2);
x = horizMidPoint - width / 2;
y = vertMidPoint - height / 2;
}
else if (Plasmoid.configuration.displayPosition === 2) {
horizMidPoint = screen.x + (screen.width / 2);
vertMidPoint = screen.y + (screen.height / 2);
x = horizMidPoint - width / 2;
y = screen.y + screen.height - height - offset - panelH - Kirigami.Units.gridUnit;
}
else {
switch (plasmoid.location) {
case PlasmaCore.Types.BottomEdge:
var y = appletTopLeft.y - height - offset
var x = appletTopLeft.x
break;
case PlasmaCore.Types.TopEdge:
x = appletTopLeft.x < screen.width - width ? appletTopLeft.x + panelW - Kirigami.Units.gridUnit / 3 : screen.width - width;
y = appletTopLeft.y + kicker.height + Kirigami.Units.gridUnit
break;
case PlasmaCore.Types.LeftEdge:
x = appletTopLeft.x + panelW + Kirigami.Units.gridUnit / 2;
y = appletTopLeft.y < screen.height - height ? appletTopLeft.y : appletTopLeft.y - height + iconUser.height / 2;
break;
case PlasmaCore.Types.RightEdge:
x = appletTopLeft.x - width - Kirigami.Units.gridUnit / 2;
y = appletTopLeft.y < screen.height - height ? appletTopLeft.y : screen.height - height - Kirigami.Units.gridUnit / 5;
break;
default:
return;
}
}
return Qt.point(x, y);
}
function colorWithAlpha(color: color, alpha: real): color {
return Qt.rgba(color.r, color.g, color.b, alpha)
}
mainItem: FocusScope {
id: rootItem
property int widthComputed: root.cellSizeWidth * Plasmoid.configuration.numberColumns + Kirigami.Units.gridUnit*2
width: rootItem.widthComputed+ Kirigami.Units.gridUnit*2
Layout.minimumWidth: width
Layout.maximumWidth: width
Layout.minimumHeight: view.height + searchField.height + footer.height + Kirigami.Units.gridUnit * 3
Layout.maximumHeight: view.height + searchField.height + footer.height + Kirigami.Units.gridUnit * 3
focus: true
onFocusChanged: searchField.focus = true
Kirigami.Heading {
id: dummyHeading
visible: false
width: 0
level: 5
}
TextMetrics {
id: headingMetrics
font: dummyHeading.font
}
PC3.TextField {
id: searchField
anchors{
top: parent.top
topMargin: Kirigami.Units.gridUnit
left: parent.left
leftMargin: Kirigami.Units.gridUnit
right: parent.right
rightMargin: Kirigami.Units.gridUnit
}
focus: true
placeholderText: i18n("Type here to search ...")
topPadding: 10
bottomPadding: 10
leftPadding: Kirigami.Units.gridUnit + Kirigami.Units.iconSizes.small
text: ""
font.pointSize: Kirigami.Theme.defaultFont.pointSize
background: Rectangle {
color: Kirigami.Theme.backgroundColor
radius: 3
border.width: 1
border.color: colorWithAlpha(Kirigami.Theme.textColor,0.05)
}
onTextChanged: runnerModel.query = text;
Keys.onPressed: (event)=> {
if (event.key === Qt.Key_Escape) {
event.accepted = true;
if(root.searching){
searchField.clear()
} else {
root.toggle()
}
}
if (event.key === Qt.Key_Down || event.key === Qt.Key_Tab || event.key === Qt.Key_Backtab) {
event.accepted = true;
view.currentItem.forceActiveFocus()
view.currentItem.tryActivate(0,0)
}
}
function backspace() {
if (!root.visible) {
return;
}
focus = true;
text = text.slice(0, -1);
}
function appendText(newText) {
if (!root.visible) {
return;
}
focus = true;
text = text + newText;
}
Kirigami.Icon {
source: 'search'
anchors {
left: searchField.left
verticalCenter: searchField.verticalCenter
leftMargin: Kirigami.Units.smallSpacing * 2
}
height: Kirigami.Units.iconSizes.small
width: height
}
}
Rectangle{
height: 2
width: searchField.width - 2
anchors.bottom: searchField.bottom
anchors.horizontalCenter: parent.horizontalCenter
color: Kirigami.Theme.highlightColor
}
//
//
//
//
//
SwipeView {
id: view
interactive: false
currentIndex: 0
clip: true
anchors.top: searchField.bottom
anchors.topMargin: Kirigami.Units.gridUnit
anchors.left: parent.left
anchors.leftMargin: Kirigami.Units.gridUnit
onCurrentIndexChanged: {
globalFavoritesGrid.currentIndex = -1
documentsGrid.currentIndex = -1
}
width: rootItem.widthComputed
height: (root.cellSizeHeight * Plasmoid.configuration.numberRows) + (topRow.height*2) + ((docsIconSize + Kirigami.Units.largeSpacing)*3) + (3*Kirigami.Units.largeSpacing)
//
// PAGE 1
//
Column{
width: rootItem.widthComputed
height: view.height
spacing: Kirigami.Units.largeSpacing
function tryActivate(row, col) {
globalFavoritesGrid.tryActivate(row, col);
}
RowLayout{
id: topRow
width: rootItem.widthComputed
height: butttonActionAllApps.implicitHeight
Kirigami.Icon {
source: 'favorite'
implicitHeight: Kirigami.Units.iconSizes.smallMedium
implicitWidth: Kirigami.Units.iconSizes.smallMedium
}
PlasmaExtras.Heading {
id: headLabelFavorites
color: colorWithAlpha(Kirigami.Theme.textColor, 0.8)
level: 5
text: i18n("Pinned")
font.weight: Font.Bold
}
Item{ Layout.fillWidth: true }
AToolButton {
id: butttonActionAllApps
flat: false
iconName: "go-next"
text: i18n("All apps")
onClicked: {
view.currentIndex = 1
}
}
}
ItemGridView {
id: globalFavoritesGrid
width: rootItem.widthComputed
height: root.cellSizeHeight * Plasmoid.configuration.numberRows
itemColumns: 1
dragEnabled: true
dropEnabled: true
cellWidth: root.cellSizeWidth
cellHeight: root.cellSizeHeight
iconSize: root.iconSize
onKeyNavUp: {
globalFavoritesGrid.focus = false
searchField.focus = true;
}
onKeyNavDown: {
globalFavoritesGrid.focus = false
documentsGrid.tryActivate(0,0)
}
Keys.onPressed:(event)=> {
if (event.key === Qt.Key_Tab) {
event.accepted = true;
searchField.focus = true
globalFavoritesGrid.focus = false
}
}
}
RowLayout{
width: rootItem.widthComputed
height: butttonActionAllApps.implicitHeight
Kirigami.Icon {
source: 'tag-recents'
implicitHeight: Kirigami.Units.iconSizes.smallMedium
implicitWidth: Kirigami.Units.iconSizes.smallMedium
}
PlasmaExtras.Heading {
color: colorWithAlpha(Kirigami.Theme.textColor, 0.8)
level: 5
text: i18n("Recent documents")
Layout.leftMargin: Kirigami.Units.smallSpacing
font.weight: Font.Bold
}
Item{ Layout.fillWidth: true }
//AToolButton {
// flat: false
// iconName: "list-add"
// text: i18n("More")
// onClicked: {
// //view.currentIndex = 1
//
// }
//}
}
ItemGridView {
id: documentsGrid
width: rootItem.widthComputed
height: cellHeight * 3
itemColumns: 2
dragEnabled: true
dropEnabled: true
cellWidth: rootItem.widthComputed * 0.48
cellHeight: docsIconSize + Kirigami.Units.largeSpacing
iconSize: docsIconSize
clip: true
onKeyNavUp: {globalFavoritesGrid.tryActivate(0,0);
documentsGrid.focus = false
}
Keys.onPressed:(event)=> {
if (event.key === Qt.Key_Tab) {
event.accepted = true;
searchField.focus = true
documentsGrid.focus = false
}
}
}
}
//
// PAGE 2
//
Column{
width: rootItem.widthComputed
height: view.height
spacing: Kirigami.Units.largeSpacing
function tryActivate(row, col) {
allAppsGrid.tryActivate(row, col);
}
RowLayout{
width: rootItem.widthComputed
height: butttonActionAllApps.implicitHeight
Kirigami.Icon {
source: 'application-menu'
implicitHeight: Kirigami.Units.iconSizes.smallMedium
implicitWidth: Kirigami.Units.iconSizes.smallMedium
}
PlasmaExtras.Heading {
color: colorWithAlpha(Kirigami.Theme.textColor, 0.8)
level: 5
text: i18n("All apps")
Layout.leftMargin: Kirigami.Units.smallSpacing
font.weight: Font.Bold
}
Item{ Layout.fillWidth: true }
AToolButton {
flat: false
iconName: 'go-previous'
text: i18n("Pinned")
mirror: true
onClicked: {
view.currentIndex = 0
}
}
}
ItemGridView {
id: allAppsGrid
width: rootItem.widthComputed
height: Math.floor((view.height-topRow.height-Kirigami.Units.largeSpacing)/cellHeight)* cellHeight
itemColumns: 3
dragEnabled: false
dropEnabled: false
cellWidth: rootItem.widthComputed - Kirigami.Units.gridUnit * 2
cellHeight: root.iconSize + Kirigami.Units.largeSpacing
iconSize: root.iconSize
clip: true
onKeyNavUp: {
searchField.focus = true
allAppsGrid.focus = false
}
Keys.onPressed:(event)=> {
if (event.key === Qt.Key_Tab) {
event.accepted = true;
searchField.focus = true
allAppsGrid.focus = false
}
}
}
}
//
// PAGE 3
//
ItemMultiGridView {
id: runnerGrid
width: rootItem.widthComputed
height: view.height
itemColumns: 3
cellWidth: rootItem.widthComputed - Kirigami.Units.gridUnit * 2
cellHeight: root.iconSize + Kirigami.Units.smallSpacing
model: runnerModel
grabFocus: false
onKeyNavUp: {
runnerGrid.focus = false
searchField.focus = true
}
}
}
PlasmaExtras.PlasmoidHeading {
id: footer
contentWidth: parent.width
contentHeight: Kirigami.Units.gridUnit * 3
anchors.bottom: parent.bottom
position: PC3.ToolBar.Footer
Footer{
anchors.fill: parent
anchors.leftMargin: Kirigami.Units.gridUnit
anchors.rightMargin: Kirigami.Units.gridUnit
}
}
Keys.onPressed: (event)=> {
if(event.modifiers & Qt.ControlModifier ||event.modifiers & Qt.ShiftModifier){
searchField.focus = true;
return
}
if (event.key === Qt.Key_Escape) {
event.accepted = true;
if (root.searching) {
reset();
} else {
root.visible = false;
}
return;
}
if (searchField.focus) {
return;
}
if (event.key === Qt.Key_Backspace) {
event.accepted = true;
searchField.backspace();
} else if (event.text !== "") {
event.accepted = true;
searchField.appendText(event.text);
}
searchField.focus = true
}
}
function setModels(){
globalFavoritesGrid.model = globalFavorites
allAppsGrid.model = rootModel.modelForRow(2);
documentsGrid.model = rootModel.modelForRow(1)
}
Component.onCompleted: {
rootModel.refreshed.connect(setModels)
reset();
rootModel.refresh();
}
}