This commit is contained in:
Valeria Fadeeva 2025-07-13 20:35:57 +05:00
parent 21a9e576af
commit 8965ccefe9
23 changed files with 666 additions and 459 deletions

View File

@ -42,7 +42,7 @@
</entry> </entry>
<entry name="numberColumns" type="Int"> <entry name="numberColumns" type="Int">
<default>6</default> <default>7</default>
</entry> </entry>
<entry name="numberRows" type="Int"> <entry name="numberRows" type="Int">
@ -91,6 +91,5 @@
<entry name="viewUser" type="Bool"> <entry name="viewUser" type="Bool">
<default>true</default> <default>true</default>
</entry> </entry>
</group> </group>
</kcfg> </kcfg>

View File

@ -1,21 +1,23 @@
import QtQuick 2.4 import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts 1.1 import QtQuick.Layouts
import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.core as PlasmaCore
import org.kde.kirigami as Kirigami import org.kde.kirigami as Kirigami
Rectangle{ Rectangle{
id:item id:item
implicitHeight: Math.floor( Kirigami.Units.gridUnit * 1.8) property int buttonHeight: Math.floor(Kirigami.Units.gridUnit * 2)
width: Math.floor(lb.implicitWidth + Kirigami.Units.smallSpacing * 5 + icon.width) implicitHeight: buttonHeight
implicitWidth: row.implicitWidth + (Kirigami.Units.mediumSpacing * 2)
border.width: mouseItem.containsMouse || focus || activeFocus ? 2 : 1 border.width: mouseItem.containsMouse || focus || activeFocus ? 2 : 1
border.color: mouseItem.containsMouse || focus || activeFocus ? Kirigami.Theme.highlightColor : colorWithAlpha(Kirigami.Theme.textColor,0.2) border.color: Qt.rgba(0.5, 0.5, 0.5, 0.6) // Gray border always
radius: 3
color: Kirigami.Theme.backgroundColor radius: 5
color: mouseItem.containsMouse ? Qt.rgba(0.7, 0.7, 0.7, 0.3) : Kirigami.Theme.backgroundColor
smooth: true // Plasmoid.configuration.iconSmooth smooth: true // Plasmoid.configuration.iconSmooth
focus: true focus: true
@ -29,23 +31,26 @@ Rectangle{
//Keys.onEnterPressed: item.clicked() //Keys.onEnterPressed: item.clicked()
Keys.onSpacePressed: item.clicked() Keys.onSpacePressed: item.clicked()
RowLayout{ RowLayout {
id: row id: row
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Kirigami.Units.smallSpacing * 2 anchors.margins: Kirigami.Units.smallSpacing
anchors.rightMargin: Kirigami.Units.smallSpacing * 2 anchors.topMargin: Kirigami.Units.smallSpacing / 2
anchors.bottomMargin: Kirigami.Units.smallSpacing / 2
spacing: Kirigami.Units.smallSpacing spacing: Kirigami.Units.smallSpacing
LayoutMirroring.enabled: mirror LayoutMirroring.enabled: mirror
Label{ Label {
id: lb id: lb
color: Kirigami.Theme.textColor color: Kirigami.Theme.textColor
Layout.leftMargin: Kirigami.Units.smallSpacing
} }
Kirigami.Icon { Kirigami.Icon {
id: icon id: icon
implicitHeight: Kirigami.Units.gridUnit implicitHeight: Kirigami.Units.gridUnit
implicitWidth: implicitHeight implicitWidth: implicitHeight
smooth: true // Plasmoid.configuration.iconSmooth smooth: true
} }
} }

View File

@ -5,9 +5,9 @@
SPDX-License-Identifier: GPL-2.0-or-later SPDX-License-Identifier: GPL-2.0-or-later
*/ */
import QtQuick 2.15 import QtQuick
import org.kde.plasma.extras 2.0 as PlasmaExtras import org.kde.plasma.extras as PlasmaExtras
Item { Item {
id: root id: root

View File

@ -17,11 +17,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
***************************************************************************/ ***************************************************************************/
import QtQuick 2.0 import QtQuick
import QtQuick.Layouts 1.1 import QtQuick.Layouts
import org.kde.plasma.plasmoid import org.kde.plasma.plasmoid
import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.core as PlasmaCore
import org.kde.kirigami as Kirigami import org.kde.kirigami as Kirigami
Item { Item {

View File

@ -17,26 +17,26 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
***************************************************************************/ ***************************************************************************/
//import QtQuick 2.15 //import QtQuick
//import QtQuick.Controls 2.15 //import QtQuick.Controls
//import QtQuick.Dialogs 1.2 //import QtQuick.Dialogs
//import QtQuick.Layouts 1.0 //import QtQuick.Layouts
//import org.kde.plasma.core 2.0 as PlasmaCore //import org.kde.plasma.core as PlasmaCore
//import org.kde.plasma.components 2.0 as PlasmaComponents //import org.kde.plasma.components as PlasmaComponents
//import org.kde.kquickcontrolsaddons 2.0 as KQuickAddons //import org.kde.kquickcontrolsaddons as KQuickAddons
//import org.kde.draganddrop 2.0 as DragDrop //import org.kde.draganddrop as DragDrop
//import org.kde.kirigami 2.4 as Kirigami //import org.kde.kirigami as Kirigami
import QtQuick 2.15 import QtQuick
import QtQuick.Layouts 1.0 import QtQuick.Layouts
import QtQuick.Controls 2.15 import QtQuick.Controls
import org.kde.draganddrop 2.0 as DragDrop import org.kde.draganddrop as DragDrop
import org.kde.kirigami 2.5 as Kirigami import org.kde.kirigami as Kirigami
import org.kde.iconthemes as KIconThemes import org.kde.iconthemes as KIconThemes
import org.kde.plasma.core as PlasmaCore import org.kde.plasma.core as PlasmaCore
import org.kde.kirigami 2.20 as Kirigami import org.kde.kirigami as Kirigami
import org.kde.ksvg 1.0 as KSvg import org.kde.ksvg as KSvg
import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.plasmoid
import org.kde.kcmutils as KCM import org.kde.kcmutils as KCM

View File

@ -1,32 +1,31 @@
import QtQuick 2.4 import QtQuick
import QtQuick.Layouts 1.1 import QtQuick.Layouts
import QtQuick.Controls 2.12 import QtQuick.Controls
import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.plasmoid
import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.extras 2.0 as PlasmaExtras import org.kde.plasma.extras as PlasmaExtras
import org.kde.plasma.private.kicker 0.1 as Kicker import org.kde.plasma.private.kicker 0.1 as Kicker
import org.kde.coreaddons 1.0 as KCoreAddons // kuser import org.kde.coreaddons 1.0 as KCoreAddons // kuser
import org.kde.plasma.private.shell 2.0 import org.kde.plasma.private.shell 2.0
import org.kde.kwindowsystem 1.0 import org.kde.kwindowsystem
import Qt5Compat.GraphicalEffects import Qt5Compat.GraphicalEffects
import org.kde.kquickcontrolsaddons 2.0 import org.kde.kquickcontrolsaddons
import org.kde.plasma.components 3.0 as PlasmaComponents3 import org.kde.plasma.components as PlasmaComponents3
import org.kde.plasma.private.quicklaunch 1.0 import org.kde.plasma.private.quicklaunch
import org.kde.kirigami as Kirigami import org.kde.kirigami as Kirigami
import org.kde.plasma.plasma5support 2.0 as P5Support import org.kde.plasma.plasma5support as P5Support
import org.kde.plasma.private.sessions as Sessions import org.kde.plasma.private.sessions as Sessions
import org.kde.ksvg 1.0 as KSvg import org.kde.ksvg as KSvg
import org.kde.kcmutils as KCM import org.kde.kcmutils as KCM
import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.plasmoid
RowLayout{ RowLayout{
@ -35,6 +34,14 @@ RowLayout{
KCoreAddons.KUser { id: kuser } KCoreAddons.KUser { id: kuser }
Logic { id: logic } Logic { id: logic }
Sessions.SessionManagement {
id: sessionManager
}
Sessions.SessionsModel {
id: sessionsModel
}
P5Support.DataSource { P5Support.DataSource {
id: pmEngine id: pmEngine
engine: "powermanagement" engine: "powermanagement"
@ -103,63 +110,91 @@ RowLayout{
text: qsTr(kuser.fullName) text: qsTr(kuser.fullName)
} }
PlasmaComponents3.ToolButton {
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onClicked: logic.openUrl("file:///usr/share/applications/org.kde.dolphin.desktop")
}
icon.width: 24
icon.height: 24
icon.name: "user-home"
Layout.leftMargin: 10
PlasmaComponents3.ToolTip.delay: 1000
PlasmaComponents3.ToolTip.timeout: 1000
PlasmaComponents3.ToolTip.visible: hovered
PlasmaComponents3.ToolTip.text: i18n("User Home")
}
PlasmaComponents3.ToolButton {
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onClicked: logic.openUrl("file:///usr/share/applications/systemsettings.desktop")
}
icon.width: 24
icon.height: 24
icon.name: "configure"
Layout.leftMargin: 10
PlasmaComponents3.ToolTip.delay: 1000
PlasmaComponents3.ToolTip.timeout: 1000
PlasmaComponents3.ToolTip.visible: hovered
PlasmaComponents3.ToolTip.text: i18n("System Preferences")
}
Item{ Item{
Layout.fillWidth: true Layout.fillWidth: true
} }
Sessions.SessionManagement {
id: sm
}
Sessions.SessionsModel {
id: sessionsModel
}
PlasmaComponents3.ToolButton {
icon.name: "user-home"
onClicked: logic.openUrl("file:///usr/share/applications/org.kde.dolphin.desktop")
ToolTip.delay: 200
ToolTip.timeout: 1000
ToolTip.visible: hovered
ToolTip.text: i18n("User Home")
}
PlasmaComponents3.ToolButton {
icon.name: "configure"
onClicked: logic.openUrl("file:///usr/share/applications/systemsettings.desktop")
ToolTip.delay: 1000
ToolTip.timeout: 1000
ToolTip.visible: hovered
ToolTip.text: i18n("System Preferences")
}
PlasmaComponents3.ToolButton { PlasmaComponents3.ToolButton {
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
//onClicked: pmEngine.performOperation("lockScreen")
//enabled: pmEngine.data["Sleep States"]["LockScreen"]
onClicked: sessionManager.lock()
}
icon.width: 24
icon.height: 24
icon.name: "system-lock-screen" icon.name: "system-lock-screen"
//onClicked: pmEngine.performOperation("lockScreen") Layout.rightMargin: 10
//enabled: pmEngine.data["Sleep States"]["LockScreen"] PlasmaComponents3.ToolTip.delay: 1000
onClicked: sm.lock() PlasmaComponents3.ToolTip.timeout: 1000
ToolTip.delay: 200 PlasmaComponents3.ToolTip.visible: hovered
ToolTip.timeout: 1000 PlasmaComponents3.ToolTip.text: i18n("Lock Screen")
ToolTip.visible: hovered
ToolTip.text: i18n("Lock Screen")
} }
PlasmaComponents3.ToolButton { PlasmaComponents3.ToolButton {
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onClicked: sessionManager.switchUser()
}
icon.width: 24
icon.height: 24
icon.name: "system-switch-user" icon.name: "system-switch-user"
onClicked: sm.switchUser() Layout.rightMargin: 10
ToolTip.delay: 200 PlasmaComponents3.ToolTip.delay: 1000
ToolTip.timeout: 1000 PlasmaComponents3.ToolTip.timeout: 1000
ToolTip.visible: hovered PlasmaComponents3.ToolTip.visible: hovered
ToolTip.text: i18n("Switch User") PlasmaComponents3.ToolTip.text: i18n("Switch User")
} }
PlasmaComponents3.ToolButton { PlasmaComponents3.ToolButton {
icon.name: "system-shutdown" MouseArea {
// onClicked: sm.requestShutdown() cursorShape: Qt.PointingHandCursor
onClicked: sm.requestLogoutPrompt() anchors.fill: parent
ToolTip.delay: 200 // onClicked: sessionManager.requestShutdown()
ToolTip.timeout: 1000 onClicked: sessionManager.requestLogoutPrompt()
ToolTip.visible: hovered }
ToolTip.text: i18n("Shutdown") icon.width: 24
icon.height: 24
icon.name: "system-shutdown"
Layout.rightMargin: 10
PlasmaComponents3.ToolTip.delay: 1000
PlasmaComponents3.ToolTip.timeout: 1000
PlasmaComponents3.ToolTip.visible: hovered
PlasmaComponents3.ToolTip.text: i18n("Shutdown")
} }
} }

View File

@ -6,10 +6,10 @@
import QtQuick import QtQuick
import org.kde.plasma.components 3.0 as PlasmaComponents3 import org.kde.plasma.components as PlasmaComponents3
import org.kde.plasma.core as PlasmaCore import org.kde.plasma.core as PlasmaCore
import org.kde.kirigami 2.20 as Kirigami import org.kde.kirigami as Kirigami
import QtQuick.Layouts 1.1 import QtQuick.Layouts
import "code/tools.js" as Tools import "code/tools.js" as Tools
Item { Item {
@ -50,6 +50,14 @@ Item {
} }
} }
WheelHandler {
acceptedDevices: PointerDevice.Mouse
onWheel: {
if (typeof scrollFlickable !== "undefined" && scrollFlickable) {
scrollFlickable.contentY -= wheel.angleDelta.y
}
}
}
Kirigami.Icon { Kirigami.Icon {
id: icon id: icon

View File

@ -6,10 +6,10 @@
import QtQuick import QtQuick
import org.kde.plasma.components 3.0 as PlasmaComponents3 import org.kde.plasma.components as PlasmaComponents3
import org.kde.plasma.core as PlasmaCore import org.kde.plasma.core as PlasmaCore
import org.kde.kirigami 2.20 as Kirigami import org.kde.kirigami as Kirigami
import QtQuick.Layouts 1.1 import QtQuick.Layouts
import "code/tools.js" as Tools import "code/tools.js" as Tools
Item { Item {

View File

@ -6,10 +6,10 @@
import QtQuick import QtQuick
import org.kde.plasma.components 3.0 as PlasmaComponents3 import org.kde.plasma.components as PlasmaComponents3
import org.kde.plasma.core as PlasmaCore import org.kde.plasma.core as PlasmaCore
import org.kde.kirigami 2.20 as Kirigami import org.kde.kirigami as Kirigami
import QtQuick.Layouts 1.1 import QtQuick.Layouts
import "code/tools.js" as Tools import "code/tools.js" as Tools
Item { Item {

View File

@ -4,13 +4,13 @@
SPDX-License-Identifier: GPL-2.0-or-later SPDX-License-Identifier: GPL-2.0-or-later
*/ */
import QtQuick 2.15 import QtQuick
import org.kde.kquickcontrolsaddons 2.0 import org.kde.kquickcontrolsaddons
import org.kde.ksvg 1.0 as KSvg import org.kde.ksvg as KSvg
import org.kde.plasma.components as PlasmaComponents import org.kde.plasma.components as PlasmaComponents
import org.kde.plasma.extras 2.0 as PlasmaExtras import org.kde.plasma.extras as PlasmaExtras
import org.kde.kirigami 2.20 as Kirigami import org.kde.kirigami as Kirigami
FocusScope { FocusScope {
id: itemGrid id: itemGrid
@ -38,8 +38,8 @@ FocusScope {
property int iconSize property int iconSize
property var horizontalScrollBarPolicy: PlasmaComponents.ScrollBar.AlwaysOff property var horizontalScrollBarPolicy: PlasmaComponents.ScrollBar.AlwaysOff
property var verticalScrollBarPolicy: PlasmaComponents.ScrollBar.AlwaysOn property var verticalScrollBarPolicy: PlasmaComponents.ScrollBar.AlwaysOff
property bool bypassArrowNav: false
onDropEnabledChanged: { onDropEnabledChanged: {
if (!dropEnabled && "dropPlaceHolderIndex" in model) { if (!dropEnabled && "dropPlaceHolderIndex" in model) {
model.dropPlaceHolderIndex = -1; model.dropPlaceHolderIndex = -1;
@ -255,7 +255,7 @@ FocusScope {
boundsBehavior: Flickable.StopAtBounds boundsBehavior: Flickable.StopAtBounds
delegate: itemColumns == 1 ? aItemGridDelegate : aItemGridDelegate2 delegate: itemColumns == 1 ? aItemGridDelegate : aItemGridDelegate2
highlight: Rectangle { color: colorWithAlpha(Kirigami.Theme.highlightColor,0.5); radius: 6 } highlight: Rectangle { color: Qt.rgba(0.9, 0.9, 0.9, 0.1); radius: 6 }
highlightFollowsCurrentItem: true highlightFollowsCurrentItem: true
highlightMoveDuration: 0 highlightMoveDuration: 0
@ -277,6 +277,7 @@ FocusScope {
} }
Keys.onLeftPressed: event => { Keys.onLeftPressed: event => {
console.log("ItemGridView navLeft")
if (itemGrid.currentCol() !== 0) { if (itemGrid.currentCol() !== 0) {
event.accepted = true; event.accepted = true;
moveCurrentIndexLeft(); moveCurrentIndexLeft();
@ -286,40 +287,50 @@ FocusScope {
} }
Keys.onRightPressed: event => { Keys.onRightPressed: event => {
var columns = Math.floor(width / cellWidth); var columns = Math.floor(width / cellWidth);
console.log("ItemGridView navRight")
if (itemGrid.currentCol() !== columns - 1 && currentIndex !== count -1) { if (itemGrid.currentCol() !== columns - 1 && currentIndex !== count -1) {
event.accepted = true;
moveCurrentIndexRight();
} else {
itemGrid.keyNavRight();
}
}
Keys.onUpPressed: event => {
if (itemGrid.currentRow() !== 0) {
event.accepted = true;
moveCurrentIndexUp();
positionViewAtIndex(currentIndex, GridView.Contain);
} else {
itemGrid.keyNavUp();
}
}
Keys.onDownPressed: event => {
if (itemGrid.currentRow() < itemGrid.lastRow()) {
// Fix moveCurrentIndexDown()'s lack of proper spatial nav down
// into partial columns.
event.accepted = true; event.accepted = true;
var columns = Math.floor(width / cellWidth); moveCurrentIndexRight();
var newIndex = currentIndex + columns;
currentIndex = Math.min(newIndex, count - 1);
positionViewAtIndex(currentIndex, GridView.Contain);
} else { } else {
itemGrid.keyNavDown(); itemGrid.keyNavRight();
} }
} }
Keys.onUpPressed: event => {
if (bypassArrowNav) {
console.log("Bypass navup")
keyNavUp()
event.accepted = true
} else if (currentRow() !== 0) {
console.log("navup")
moveCurrentIndexUp()
event.accepted = true
} else {
keyNavUp()
}
}
Keys.onDownPressed: event => {
if (bypassArrowNav) {
console.log("Bypass navdown")
keyNavDown()
event.accepted = true
} else if (currentRow() < lastRow()) {
console.log("navdown")
var columns = Math.floor(width / cellWidth)
var newIndex = currentIndex + columns
currentIndex = Math.min(newIndex, count - 1)
positionViewAtIndex(currentIndex, GridView.Contain)
event.accepted = true
} else {
keyNavDown()
}
}
onItemContainsMouseChanged: containsMouse => { onItemContainsMouseChanged: containsMouse => {
if (!containsMouse) { if (!containsMouse) {
if (!actionMenu.opened) { if (!actionMenu.opened) {
@ -339,6 +350,7 @@ FocusScope {
MouseArea { MouseArea {
id: hoverArea id: hoverArea
cursorShape: gridView.currentIndex !== -1 ? Qt.PointingHandCursor : Qt.ArrowCursor
//anchors.fill: parent //anchors.fill: parent
width: itemGrid.width - Kirigami.Units.gridUnit width: itemGrid.width - Kirigami.Units.gridUnit

View File

@ -1,16 +1,16 @@
/* /*
SPDX-FileCopyrightText: 2015 Eike Hein <hein@kde.org> SPDX-FileCopyrightText: 2015 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later SPDX-License-Identifier: GPL-2.0-or-later
*/ */
import QtQuick import QtQuick
import org.kde.ksvg 1.0 as KSvg import org.kde.ksvg as KSvg
import org.kde.plasma.components as PlasmaComponents import org.kde.plasma.components as PlasmaComponents
import org.kde.plasma.extras 2.0 as PlasmaExtras import org.kde.plasma.extras as PlasmaExtras
import org.kde.kirigami 2.20 as Kirigami import org.kde.kirigami as Kirigami
import org.kde.plasma.private.kicker 0.1 as Kicker import org.kde.plasma.private.kicker as Kicker
import org.kde.plasma.plasmoid import org.kde.plasma.plasmoid
PlasmaComponents.ScrollView { PlasmaComponents.ScrollView {
@ -24,10 +24,10 @@ PlasmaComponents.ScrollView {
implicitHeight: itemColumn.implicitHeight implicitHeight: itemColumn.implicitHeight
signal keyNavLeft(int subGridIndex) //signal keyNavLeft(int subGridIndex)
signal keyNavRight(int subGridIndex) //signal keyNavRight(int subGridIndex)
signal keyNavUp() signal keyNavUp
signal keyNavDown() signal keyNavDown
property bool grabFocus: false property bool grabFocus: false
@ -53,7 +53,7 @@ PlasmaComponents.ScrollView {
for (var i = 0; i < repeater.count; i++) { for (var i = 0; i < repeater.count; i++) {
var grid = subGridAt(i); var grid = subGridAt(i);
if(grid.count > 0 ){ if (grid.count > 0) {
if (rows <= row) { if (rows <= row) {
target = grid; target = grid;
rows += grid.lastRow() + 2; // Header counts as one. rows += grid.lastRow() + 2; // Header counts as one.
@ -95,8 +95,8 @@ PlasmaComponents.ScrollView {
delegate: Item { delegate: Item {
id: itemTest id: itemTest
width: itemColumn.width width: itemColumn.width
height: gridView.height + gridViewLabel.height + Kirigami.Units.largeSpacing * 2 height: gridView.height + gridViewLabel.height + Kirigami.Units.largeSpacing * 2
visible: gridView.count > 0 visible: gridView.count > 0
property Item itemGrid: gridView property Item itemGrid: gridView
@ -118,7 +118,7 @@ PlasmaComponents.ScrollView {
textFormat: Text.PlainText textFormat: Text.PlainText
} }
Rectangle{ Rectangle {
anchors.right: parent.right anchors.right: parent.right
anchors.left: gridViewLabel.right anchors.left: gridViewLabel.right
anchors.leftMargin: Kirigami.Units.largeSpacing anchors.leftMargin: Kirigami.Units.largeSpacing
@ -138,6 +138,56 @@ PlasmaComponents.ScrollView {
ItemGridView { ItemGridView {
id: gridView id: gridView
Connections {
target: gridView
onKeyNavDown: {
console.log("ItemMultiGridView.qml: ↓")
if (gridView.currentIndex < gridView.count - 1) {
gridView.currentIndex += 1
return
}
// At end of grid jump to next grid
var i = index
for (var j = i + 1; j < repeater.count; j++) {
var next = subGridAt(j)
if (next.count > 0) {
next.currentIndex = 0
next.focus = true
return
}
}
}
onKeyNavUp: {
console.log("ItemMultiGridView.qml: ↑")
if (gridView.currentIndex > 0) {
gridView.currentIndex -= 1
return
}
// At start of grid jump to previous grid
var i = index
for (var j = i - 1; j >= 0; j--) {
var prev = subGridAt(j)
if (prev.count > 0) {
prev.currentIndex = prev.count - 1
prev.focus = true
return
}
}
// If first grid and first item focus search bar
if (i === 0 && gridView.currentIndex === 0) {
searchField.forceActiveFocus()
}
}
}
anchors { anchors {
top: gridViewLabel.bottom top: gridViewLabel.bottom
topMargin: Kirigami.Units.largeSpacing topMargin: Kirigami.Units.largeSpacing
@ -145,13 +195,14 @@ PlasmaComponents.ScrollView {
width: parent.width width: parent.width
height: count * itemMultiGrid.cellHeight height: count * itemMultiGrid.cellHeight
itemColumns: 3//itemMultiGrid.itemColumns itemColumns: 3 //itemMultiGrid.itemColumns
cellWidth: itemMultiGrid.cellWidth cellWidth: itemMultiGrid.cellWidth
cellHeight: itemMultiGrid.cellHeight cellHeight: itemMultiGrid.cellHeight
iconSize: root.iconSize iconSize: root.iconSize
verticalScrollBarPolicy: PlasmaComponents.ScrollBar.AlwaysOff verticalScrollBarPolicy: PlasmaComponents.ScrollBar.AlwaysOff
bypassArrowNav: true
model: repeater.model.modelForRow(index) model: repeater.model.modelForRow(index)
onFocusChanged: { onFocusChanged: {
@ -192,64 +243,17 @@ PlasmaComponents.ScrollView {
} }
} }
} }
onKeyNavLeft: {
itemMultiGrid.keyNavLeft(index);
}
onKeyNavRight: {
itemMultiGrid.keyNavRight(index);
}
onKeyNavUp: {
if (index > 0) {
var i;
for (i = index; i > 0 ; i--) {
var prevGrid = subGridAt(i-1);
if(prevGrid.count > 0 ){
prevGrid.tryActivate(prevGrid.lastRow(), currentCol());
break;
}
}
if(i === 0){
itemMultiGrid.keyNavUp();
}
// var prevGrid = subGridAt(index - 1);
// prevGrid.tryActivate(prevGrid.lastRow(), currentCol());
} else {
itemMultiGrid.keyNavUp();
}
}
onKeyNavDown: {
if (index < repeater.count - 1) {
var i;
for (i = index; i < repeater.count - 1 ; i++) {
var grid = subGridAt(i+1);
if(grid.count > 0 ){
grid.tryActivate(0, currentCol());
break;
}
}
if(i === repeater.count){
itemMultiGrid.keyNavDown();
}
// subGridAt(index + 1).tryActivate(0, currentCol());
} else {
itemMultiGrid.keyNavDown();
}
}
}
// HACK: Steal wheel events from the nested grid view and forward them to
// the ScrollView's internal WheelArea.
Kicker.WheelInterceptor {
anchors.fill: gridView
z: 1
destination: findWheelArea(itemMultiGrid)
} }
} }
} }
// HACK: Steal wheel events from the nested grid view and forward them to
// the ScrollView's internal WheelArea.
Kicker.WheelInterceptor {
anchors.fill: gridView
z: 1
destination: findWheelArea(itemMultiGrid)
}
} }
} }
} }

View File

@ -18,51 +18,67 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
***************************************************************************/ ***************************************************************************/
import QtQuick 2.4 import QtQuick
import QtQuick.Layouts 1.1 import QtQuick.Layouts
import QtQuick.Controls 2.12 import QtQuick.Controls
import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.plasmoid
import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.components 3.0 as PC3 import org.kde.plasma.components as PC3
import org.kde.plasma.extras 2.0 as PlasmaExtras import org.kde.plasma.extras as PlasmaExtras
import org.kde.plasma.private.kicker 0.1 as Kicker import org.kde.plasma.private.kicker as Kicker
import org.kde.kquickcontrolsaddons 2.0 import org.kde.kquickcontrolsaddons
import org.kde.plasma.private.quicklaunch 1.0 import org.kde.plasma.private.quicklaunch
import org.kde.kirigami as Kirigami import org.kde.kirigami as Kirigami
import org.kde.plasma.plasma5support as Plasma5Support
PlasmaCore.Dialog { PlasmaCore.Dialog {
id: root id: root
objectName: "popupWindow" objectName: "popupWindow"
//flags: Qt.Dialog | Qt.FramelessWindowHint
flags: Qt.WindowStaysOnTopHint flags: Qt.WindowStaysOnTopHint
location:{ location: {
if (Plasmoid.configuration.displayPosition === 1) if (Plasmoid.configuration.displayPosition === 1)
return PlasmaCore.Types.Floating return PlasmaCore.Types.Floating;
else if (Plasmoid.configuration.displayPosition === 2) else if (Plasmoid.configuration.displayPosition === 2)
return PlasmaCore.Types.BottomEdge return PlasmaCore.Types.BottomEdge;
else else
return Plasmoid.location return Plasmoid.location;
} }
hideOnWindowDeactivate: true hideOnWindowDeactivate: true
property int iconSize:{ switch(Plasmoid.configuration.appsIconSize){ // Ensure minimum dimensions to prevent empty dialog error
case 0: return Kirigami.Units.iconSizes.smallMedium; width: Math.max(rootItem.width, 300)
case 1: return Kirigami.Units.iconSizes.medium; height: Math.max(rootItem.height, 200)
case 2: return Kirigami.Units.iconSizes.large;
case 3: return Kirigami.Units.iconSizes.huge; property int iconSize: {
default: return 64 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){ property int docsIconSize: {
case 0: return Kirigami.Units.iconSizes.smallMedium; switch (Plasmoid.configuration.docsIconSize) {
case 1: return Kirigami.Units.iconSizes.medium; case 0:
case 2: return Kirigami.Units.iconSizes.large; return Kirigami.Units.iconSizes.smallMedium;
case 3: return Kirigami.Units.iconSizes.huge; case 1:
default: return Kirigami.Units.iconSizes.medium; 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;
} }
} }
@ -75,10 +91,11 @@ PlasmaCore.Dialog {
property bool searching: (searchField.text != "") property bool searching: (searchField.text != "")
onSearchingChanged: { onSearchingChanged: {
if(searching) if (searching) {
view.currentIndex = 2 view.currentIndex = 2;
else } else {
view.currentIndex = 0 view.currentIndex = 0;
}
} }
onVisibleChanged: { onVisibleChanged: {
@ -87,34 +104,38 @@ PlasmaCore.Dialog {
x = pos.x; x = pos.x;
y = pos.y; y = pos.y;
reset(); reset();
}else{ } else {
view.currentIndex = 0 view.currentIndex = 0;
} }
} }
onHeightChanged: { onHeightChanged: {
var pos = popupPosition(width, height); if (visible) {
x = pos.x; var pos = popupPosition(width, height);
y = pos.y; x = pos.x;
y = pos.y;
}
} }
onWidthChanged: { onWidthChanged: {
var pos = popupPosition(width, height); if (visible) {
x = pos.x; var pos = popupPosition(width, height);
y = pos.y; x = pos.x;
y = pos.y;
}
} }
function toggle(){ function toggle() {
root.visible = !root.visible root.visible = !root.visible;
} }
function reset() { function reset() {
searchField.text = ""; searchField.text = "";
searchField.focus = true searchField.focus = true;
view.currentIndex = 0 view.currentIndex = 0;
globalFavoritesGrid.currentIndex = -1 globalFavoritesGrid.currentIndex = -1;
documentsGrid.currentIndex = -1 documentsGrid.currentIndex = -1;
allAppsGrid.currentIndex = -1 allAppsGrid.currentIndex = -1;
} }
function popupPosition(width, height) { function popupPosition(width, height) {
@ -175,24 +196,48 @@ PlasmaCore.Dialog {
} }
function colorWithAlpha(color: color, alpha: real): color { function colorWithAlpha(color: color, alpha: real): color {
return Qt.rgba(color.r, color.g, color.b, alpha) return Qt.rgba(color.r, color.g, color.b, alpha);
} }
mainItem: FocusScope {
mainItem: FocusScope {
id: rootItem id: rootItem
property int widthComputed: root.cellSizeWidth * Plasmoid.configuration.numberColumns + Kirigami.Units.gridUnit*2 property int widthComputed: root.cellSizeWidth * Plasmoid.configuration.numberColumns + Kirigami.Units.gridUnit * 2
width: rootItem.widthComputed+ Kirigami.Units.gridUnit*2 width: Math.max(widthComputed + Kirigami.Units.gridUnit * 2, 300)
Layout.minimumWidth: width height: view.height + searchField.height + footer.height + Kirigami.Units.gridUnit * 3
Layout.maximumWidth: width
Layout.minimumHeight: view.height + searchField.height + footer.height + Kirigami.Units.gridUnit * 3 Layout.minimumWidth: width
Layout.maximumHeight: view.height + searchField.height + footer.height + Kirigami.Units.gridUnit * 3 Layout.maximumWidth: width
Layout.minimumHeight: height
Layout.maximumHeight: height
focus: true focus: true
onFocusChanged: searchField.focus = true onFocusChanged: searchField.focus = true
Plasma5Support.DataSource {
id: executable
engine: "executable"
connectedSources: []
property bool dolphinRunning: false
onNewData: function (source, data) {
if (source.includes("pgrep")) {
dolphinRunning = data["exit code"] === 0;
}
disconnectSource(source);
}
function exec(cmd) {
connectSource(cmd);
}
function checkDolphin() {
connectSource("pgrep dolphin");
}
}
Kirigami.Heading { Kirigami.Heading {
id: dummyHeading id: dummyHeading
visible: false visible: false
@ -207,7 +252,7 @@ PlasmaCore.Dialog {
PC3.TextField { PC3.TextField {
id: searchField id: searchField
anchors{ anchors {
top: parent.top top: parent.top
topMargin: Kirigami.Units.gridUnit topMargin: Kirigami.Units.gridUnit
left: parent.left left: parent.left
@ -225,29 +270,107 @@ PlasmaCore.Dialog {
background: Rectangle { background: Rectangle {
color: Kirigami.Theme.backgroundColor color: Kirigami.Theme.backgroundColor
radius: 3 radius: 20
border.width: 1 border.width: 1
border.color: colorWithAlpha(Kirigami.Theme.textColor,0.05) border.color: colorWithAlpha(Kirigami.Theme.textColor, 0.05)
} }
onTextChanged: runnerModel.query = text; onTextChanged: runnerModel.query = text;
Keys.onPressed: (event)=> { Keys.onPressed: (event) => {
if (event.key === Qt.Key_Escape) { if (event.key === Qt.Key_Escape) {
event.accepted = true; event.accepted = true;
if(root.searching){ if (root.searching) {
searchField.clear() searchField.clear();
} else { } else {
root.toggle() root.toggle();
} }
} }
if (event.key === Qt.Key_Down || event.key === Qt.Key_Tab || event.key === Qt.Key_Backtab) { // Forward Up/Down keys directly to runnerGrid when on search page
event.accepted = true; if (view.currentIndex === 2 && (event.key === Qt.Key_Up || event.key === Qt.Key_Down)) {
view.currentItem.forceActiveFocus() event.accepted = true;
view.currentItem.tryActivate(0,0)
} // Make sure runnerGrid can receive the key event
runnerGrid.focus = true;
// Forward the key event to runnerGrid
if (event.key === Qt.Key_Down) {
console.log("Down key pressed");
// Simulate a down key press on the first item if nothing is selected
if (!runnerGrid.focus || runnerGrid.currentIndex === -1) {
runnerGrid.tryActivate(0, 0);
} else {
// Forward the down key to the currently focused grid
var currentGrid = runnerGrid.subGridAt(0); // or find the currently active grid
if (currentGrid) {
currentGrid.forceActiveFocus();
// Trigger the key navigation
currentGrid.keyNavDown();
} }
}
} else if (event.key === Qt.Key_Up) {
// For up key, go to the last item or handle appropriately
console.log("Up key pressed");
var lastGridIndex = runnerGrid.count - 1;
if (lastGridIndex >= 0) {
var lastGrid = runnerGrid.subGridAt(lastGridIndex);
if (lastGrid && lastGrid.count > 0) {
lastGrid.tryActivate(lastGrid.lastRow(), 0);
lastGrid.focus = true;
}
}
}
return;
}
if (event.key === Qt.Key_Down || event.key === Qt.Key_Tab || event.key === Qt.Key_Backtab) {
event.accepted = true;
if (view.currentIndex === 2) {
// For search results page
runnerGrid.focus = true;
runnerGrid.tryActivate(0, 0);
} else {
// For other pages
view.currentItem.forceActiveFocus();
view.currentItem.tryActivate(0, 0);
}
}
}
Keys.onReturnPressed: {
if (view.currentIndex === 2) {
// On search results page, activate the first available item
runnerGrid.focus = true;
// Find the first grid with items and activate its first item
for (var i = 0; i < runnerGrid.count; i++) {
var grid = runnerGrid.subGridAt(i);
if (grid && grid.count > 0) {
grid.currentIndex = 0;
grid.focus = true;
grid.itemActivated(0, "", null);
if ("trigger" in grid.model) {
//console.log("Calling grid.model.trigger(0)");
grid.model.trigger(0, "", null);
root.toggle();
}
return;
}
}
} else {
// Original logic for other pages
for (var i = 0; i < runnerGrid.count; i++) {
var grid = runnerGrid.subGridAt(i)
if (grid && grid.count > 0) {
grid.currentIndex = 0
grid.focus = true
grid.itemActivated(0, "", null)
return
}
}
}
}
function backspace() { function backspace() {
if (!root.visible) { if (!root.visible) {
return; return;
@ -270,68 +393,55 @@ PlasmaCore.Dialog {
left: searchField.left left: searchField.left
verticalCenter: searchField.verticalCenter verticalCenter: searchField.verticalCenter
leftMargin: Kirigami.Units.smallSpacing * 2 leftMargin: Kirigami.Units.smallSpacing * 2
} }
height: Kirigami.Units.iconSizes.small height: Kirigami.Units.iconSizes.small
width: height width: height
} }
} }
Rectangle{
height: 2
width: searchField.width - 2
anchors.bottom: searchField.bottom
anchors.horizontalCenter: parent.horizontalCenter
color: Kirigami.Theme.highlightColor
}
//
//
//
//
//
SwipeView { SwipeView {
id: view id: view
interactive: false interactive: false
currentIndex: 0 currentIndex: 0
clip: true clip: true
anchors.top: searchField.bottom
anchors.topMargin: Kirigami.Units.gridUnit
anchors.left: parent.left
anchors.leftMargin: Kirigami.Units.gridUnit
onCurrentIndexChanged: { anchors {
globalFavoritesGrid.currentIndex = -1 top: searchField.bottom
documentsGrid.currentIndex = -1 topMargin: Kirigami.Units.gridUnit
left: parent.left
leftMargin: Kirigami.Units.gridUnit
right: parent.right
rightMargin: Kirigami.Units.gridUnit
} }
width: rootItem.widthComputed onCurrentIndexChanged: {
height: (root.cellSizeHeight * Plasmoid.configuration.numberRows) + (topRow.height*2) + ((docsIconSize + Kirigami.Units.largeSpacing)*3) + (3*Kirigami.Units.largeSpacing) globalFavoritesGrid.currentIndex = -1;
documentsGrid.currentIndex = -1;
}
width: rootItem.widthComputed / 0.1
height: (root.cellSizeHeight * Plasmoid.configuration.numberRows) + (topRow.height * 2) + ((docsIconSize + Kirigami.Units.largeSpacing) * 5) + (3 * Kirigami.Units.largeSpacing)
// //
// PAGE 1 // PAGE 1
// //
Column {
Column{
width: rootItem.widthComputed width: rootItem.widthComputed
height: view.height height: view.height
spacing: Kirigami.Units.largeSpacing spacing: Kirigami.Units.largeSpacing * 2
function tryActivate(row, col) { function tryActivate(row, col) {
globalFavoritesGrid.tryActivate(row, col); globalFavoritesGrid.tryActivate(row, col);
} }
RowLayout{ RowLayout {
id: topRow id: topRow
width: rootItem.widthComputed width: parent.width
height: butttonActionAllApps.implicitHeight height: butttonActionAllApps.implicitHeight
Kirigami.Icon { Kirigami.Icon {
source: 'favorite' source: 'favorite'
implicitHeight: Kirigami.Units.iconSizes.smallMedium implicitHeight: Kirigami.Units.iconSizes.smallMedium
implicitWidth: Kirigami.Units.iconSizes.smallMedium implicitWidth: Kirigami.Units.iconSizes.smallMedium
} }
@ -344,52 +454,55 @@ PlasmaCore.Dialog {
font.weight: Font.Bold font.weight: Font.Bold
} }
Item{ Layout.fillWidth: true } Item {
Layout.fillWidth: true
}
AToolButton { AToolButton {
id: butttonActionAllApps id: butttonActionAllApps
flat: false flat: false
iconName: "go-next" iconName: "go-next"
text: i18n("All apps") text: i18n("All apps")
onClicked: { buttonHeight: 25
view.currentIndex = 1 onClicked: {
view.currentIndex = 1;
} }
} }
} }
ItemGridView { ItemGridView {
id: globalFavoritesGrid id: globalFavoritesGrid
width: rootItem.widthComputed width: parent.width
height: root.cellSizeHeight * Plasmoid.configuration.numberRows height: root.cellSizeHeight * Plasmoid.configuration.numberRows
itemColumns: 1 itemColumns: 1
dragEnabled: true dragEnabled: true
dropEnabled: true dropEnabled: true
cellWidth: root.cellSizeWidth cellWidth: parent.width / Plasmoid.configuration.numberColumns
cellHeight: root.cellSizeHeight cellHeight: root.cellSizeHeight
iconSize: root.iconSize iconSize: root.iconSize
onKeyNavUp: { onKeyNavUp: {
globalFavoritesGrid.focus = false globalFavoritesGrid.focus = false;
searchField.focus = true; searchField.focus = true;
} }
onKeyNavDown: { onKeyNavDown: {
globalFavoritesGrid.focus = false globalFavoritesGrid.focus = false;
documentsGrid.tryActivate(0,0) documentsGrid.tryActivate(0, 0);
}
Keys.onPressed: event => {
if (event.key === Qt.Key_Tab) {
event.accepted = true;
searchField.focus = true;
globalFavoritesGrid.focus = false;
}
} }
Keys.onPressed:(event)=> {
if (event.key === Qt.Key_Tab) {
event.accepted = true;
searchField.focus = true
globalFavoritesGrid.focus = false
}
}
} }
RowLayout{ RowLayout {
width: rootItem.widthComputed width: parent.width
height: butttonActionAllApps.implicitHeight height: butttonActionAllApps.implicitHeight
Kirigami.Icon { Kirigami.Icon {
source: 'tag-recents' source: 'tag-recents'
implicitHeight: Kirigami.Units.iconSizes.smallMedium implicitHeight: Kirigami.Units.iconSizes.smallMedium
implicitWidth: Kirigami.Units.iconSizes.smallMedium implicitWidth: Kirigami.Units.iconSizes.smallMedium
} }
@ -402,17 +515,28 @@ PlasmaCore.Dialog {
font.weight: Font.Bold font.weight: Font.Bold
} }
Item{ Layout.fillWidth: true } Item {
Layout.fillWidth: true
}
//AToolButton { AToolButton {
// flat: false id: butttonActionRecentMore
// iconName: "list-add" flat: false
// text: i18n("More") iconName: "go-next"
// onClicked: { text: i18n("Show more")
// //view.currentIndex = 1 buttonHeight: 25
// onClicked: {
// } executable.checkDolphin();
//} if (executable.dolphinRunning) {
console.log("dolphin is running");
executable.exec("dolphin 'recentlyused:/files/'");
} else {
console.log("dolphin is not running");
executable.exec("dolphin --new-window 'recentlyused:/files/'");
}
root.toggle();
}
}
} }
ItemGridView { ItemGridView {
@ -422,37 +546,37 @@ PlasmaCore.Dialog {
itemColumns: 2 itemColumns: 2
dragEnabled: true dragEnabled: true
dropEnabled: true dropEnabled: true
cellWidth: rootItem.widthComputed * 0.48 cellWidth: rootItem.widthComputed * 0.48
cellHeight: docsIconSize + Kirigami.Units.largeSpacing cellHeight: docsIconSize + Kirigami.Units.largeSpacing * 2
iconSize: docsIconSize iconSize: docsIconSize
clip: true clip: true
onKeyNavUp: {globalFavoritesGrid.tryActivate(0,0); onKeyNavUp: {
documentsGrid.focus = false 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;
}
} }
Keys.onPressed:(event)=> {
if (event.key === Qt.Key_Tab) {
event.accepted = true;
searchField.focus = true
documentsGrid.focus = false
}
}
} }
} }
// //
// PAGE 2 // PAGE 2
// //
Column {
Column{
width: rootItem.widthComputed width: rootItem.widthComputed
height: view.height height: view.height
spacing: Kirigami.Units.largeSpacing spacing: Kirigami.Units.largeSpacing * 2
function tryActivate(row, col) { function tryActivate(row, col) {
allAppsGrid.tryActivate(row, col); allAppsGrid.tryActivate(row, col);
} }
RowLayout{ RowLayout {
width: rootItem.widthComputed width: parent.width
height: butttonActionAllApps.implicitHeight height: butttonActionAllApps.implicitHeight
Kirigami.Icon { Kirigami.Icon {
@ -469,15 +593,18 @@ PlasmaCore.Dialog {
font.weight: Font.Bold font.weight: Font.Bold
} }
Item{ Layout.fillWidth: true } Item {
Layout.fillWidth: true
}
AToolButton { AToolButton {
flat: false flat: false
iconName: 'go-previous' iconName: 'go-previous'
text: i18n("Pinned") text: i18n("Pinned")
buttonHeight: 25
mirror: true mirror: true
onClicked: { onClicked: {
view.currentIndex = 0 view.currentIndex = 0;
} }
} }
} }
@ -485,45 +612,44 @@ PlasmaCore.Dialog {
ItemGridView { ItemGridView {
id: allAppsGrid id: allAppsGrid
width: rootItem.widthComputed width: rootItem.widthComputed
height: Math.floor((view.height-topRow.height-Kirigami.Units.largeSpacing)/cellHeight)* cellHeight height: Math.floor((view.height - topRow.height - Kirigami.Units.largeSpacing) / cellHeight) * cellHeight
itemColumns: 3 itemColumns: 2
dragEnabled: false dragEnabled: false
dropEnabled: false dropEnabled: false
cellWidth: rootItem.widthComputed - Kirigami.Units.gridUnit * 2 cellWidth: rootItem.widthComputed - Kirigami.Units.gridUnit * 2
cellHeight: root.iconSize + Kirigami.Units.largeSpacing cellHeight: root.iconSize + Kirigami.Units.largeSpacing
iconSize: root.iconSize iconSize: root.iconSize
clip: true clip: true
onKeyNavUp: { onKeyNavUp: {
searchField.focus = true searchField.focus = true;
allAppsGrid.focus = false allAppsGrid.focus = false;
} }
Keys.onPressed:(event)=> { Keys.onPressed: (event) => {
if (event.key === Qt.Key_Tab) { if (event.key === Qt.Key_Tab) {
event.accepted = true; event.accepted = true;
searchField.focus = true searchField.focus = true;
allAppsGrid.focus = false allAppsGrid.focus = false;
} }
} }
} }
} }
// //
// PAGE 3 // PAGE 3
// //
ItemMultiGridView { ItemMultiGridView {
id: runnerGrid id: runnerGrid
width: rootItem.widthComputed width: rootItem.widthComputed
height: view.height height: view.height
itemColumns: 3 itemColumns: 3
cellWidth: rootItem.widthComputed - Kirigami.Units.gridUnit * 2 cellWidth: rootItem.widthComputed - Kirigami.Units.gridUnit * 2
cellHeight: root.iconSize + Kirigami.Units.smallSpacing cellHeight: root.iconSize + Kirigami.Units.smallSpacing * 4
model: runnerModel model: runnerModel
grabFocus: false grabFocus: true // Change this to true
focus: view.currentIndex === 2 // Add this line
onKeyNavUp: { onKeyNavUp: {
runnerGrid.focus = false runnerGrid.focus = false;
searchField.focus = true searchField.focus = true;
} }
} }
} }
@ -535,56 +661,51 @@ PlasmaCore.Dialog {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
position: PC3.ToolBar.Footer position: PC3.ToolBar.Footer
Footer{ Footer {
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Kirigami.Units.gridUnit anchors.leftMargin: Kirigami.Units.gridUnit
anchors.rightMargin: Kirigami.Units.gridUnit anchors.rightMargin: Kirigami.Units.gridUnit
} }
} }
Keys.onPressed: (event)=> { Keys.onPressed: (event) => {
if(event.modifiers & Qt.ControlModifier ||event.modifiers & Qt.ShiftModifier){ if (event.modifiers & Qt.ControlModifier || event.modifiers & Qt.ShiftModifier) {
searchField.focus = true; searchField.focus = true;
return return;
} }
if (event.key === Qt.Key_Escape) { if (event.key === Qt.Key_Escape) {
event.accepted = true; event.accepted = true;
if (root.searching) { if (root.searching) {
reset(); reset();
} else { } else {
root.visible = false; root.visible = false;
} }
return; return;
} }
if (searchField.focus) { if (searchField.focus) {
return; 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
}
if (event.key === Qt.Key_Backspace) {
event.accepted = true;
searchField.backspace();
} else if (event.text !== "") {
event.accepted = true;
searchField.appendText(event.text);
}
}
} }
function setModels(){ function setModels() {
globalFavoritesGrid.model = globalFavorites globalFavoritesGrid.model = globalFavorites;
allAppsGrid.model = rootModel.modelForRow(2); allAppsGrid.model = rootModel.modelForRow(2);
documentsGrid.model = rootModel.modelForRow(1) documentsGrid.model = rootModel.modelForRow(1);
} }
Component.onCompleted: { Component.onCompleted: {
rootModel.refreshed.connect(setModels) rootModel.refreshed.connect(setModels);
reset(); reset();
rootModel.refresh(); rootModel.refresh();
} }
} }

View File

@ -17,18 +17,17 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
***************************************************************************/ ***************************************************************************/
import QtQuick 2.0 import QtQuick
import QtQuick.Layouts 1.1 import QtQuick.Layouts
import org.kde.plasma.plasmoid import org.kde.plasma.plasmoid
import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.components 3.0 as PC3 import org.kde.plasma.components as PC3
import org.kde.plasma.private.kicker 0.1 as Kicker import org.kde.plasma.private.kicker as Kicker
import org.kde.plasma.plasma5support 2.0 as P5Support
import org.kde.kirigami as Kirigami import org.kde.kirigami as Kirigami
import org.kde.ksvg 1.0 as KSvg import org.kde.ksvg as KSvg
PlasmoidItem { PlasmoidItem {
@ -59,7 +58,9 @@ PlasmoidItem {
Plasmoid.icon: Plasmoid.configuration.useCustomButtonImage ? Plasmoid.configuration.customButtonImage : Plasmoid.configuration.icon Plasmoid.icon: Plasmoid.configuration.useCustomButtonImage ? Plasmoid.configuration.customButtonImage : Plasmoid.configuration.icon
onSystemFavoritesChanged: { onSystemFavoritesChanged: {
systemFavorites.favorites = Plasmoid.configuration.favoriteSystemActions; if (systemFavorites) {
systemFavorites.favorites = Plasmoid.configuration.favoriteSystemActions;
}
} }
Kicker.RootModel { Kicker.RootModel {
@ -102,7 +103,6 @@ PlasmoidItem {
} }
} }
Connections { Connections {
target: globalFavorites target: globalFavorites
@ -115,7 +115,8 @@ PlasmoidItem {
target: systemFavorites target: systemFavorites
function onFavoritesChanged() { function onFavoritesChanged() {
Plasmoid.configuration.favoriteSystemActions = target.favorites; if (Plasmoid.configuration && target)
Plasmoid.configuration.favoriteSystemActions = target.favorites;
} }
} }
@ -158,7 +159,6 @@ PlasmoidItem {
} }
} }
Kicker.DragHelper { Kicker.DragHelper {
id: dragHelper id: dragHelper
} }
@ -204,7 +204,6 @@ PlasmoidItem {
imagePath: "dialogs/background" imagePath: "dialogs/background"
} }
PC3.Label { PC3.Label {
id: toolTipDelegate id: toolTipDelegate
@ -235,10 +234,6 @@ PlasmoidItem {
] ]
Component.onCompleted: { Component.onCompleted: {
// plasmoid.setAction("menuedit", i18n("Edit Applications..."));
// //rootModel.refreshed.connect(reset);
// //dragHelper.dropped.connect(resetDragSource);
if (Plasmoid.hasOwnProperty("activationTogglesExpanded")) { if (Plasmoid.hasOwnProperty("activationTogglesExpanded")) {
Plasmoid.activationTogglesExpanded = !kicker.isDash Plasmoid.activationTogglesExpanded = !kicker.isDash
} }
@ -246,10 +241,6 @@ PlasmoidItem {
windowSystem.focusIn.connect(enableHideOnWindowDeactivate); windowSystem.focusIn.connect(enableHideOnWindowDeactivate);
kicker.hideOnWindowDeactivate = true; kicker.hideOnWindowDeactivate = true;
//updateSvgMetrics();
//PlasmaCore.Theme.themeChanged.connect(updateSvgMetrics);
//rootModel.refreshed.connect(reset);
dragHelper.dropped.connect(resetDragSource); dragHelper.dropped.connect(resetDragSource);
} }
} }

View File

@ -35,11 +35,11 @@ Or if you know how to make a pull request
## Status ## Status
| Locale | Lines | % Done| | Locale | Lines | % Done|
|----------|---------|-------| |----------|---------|-------|
| Template | 34 | | | Template | 35 | |
| fr | 20/34 | 58% | | fr | 20/35 | 57% |
| ko | 17/34 | 50% | | ko | 17/35 | 48% |
| nl | 13/34 | 38% | | nl | 13/35 | 37% |
| pl | 15/34 | 44% | | pl | 15/35 | 42% |
| pt_BR | 20/34 | 58% | | pt_BR | 20/35 | 57% |
| ru | 34/34 | 100% | | ru | 34/35 | 97% |
| tr | 15/34 | 44% | | tr | 15/35 | 42% |

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: dittomenu\n" "Project-Id-Version: dittomenu\n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n" "Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2024-09-24 13:00+0500\n" "POT-Creation-Date: 2025-07-13 14:15+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: omano\n" "Last-Translator: omano\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -155,6 +155,10 @@ msgstr "Toutes les applications"
msgid "Recent documents" msgid "Recent documents"
msgstr "" msgstr ""
#: ../contents/ui/MenuRepresentation.qml
msgid "Show more"
msgstr ""
#~ msgid "Ditto Menu" #~ msgid "Ditto Menu"
#~ msgstr "Ditto Menu" #~ msgstr "Ditto Menu"

View File

@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n" "Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2024-09-24 13:00+0500\n" "POT-Creation-Date: 2025-07-13 14:15+0500\n"
"PO-Revision-Date: 2021-09-29 09:43+0900\n" "PO-Revision-Date: 2021-09-29 09:43+0900\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
@ -152,6 +152,10 @@ msgstr "모든 프로그램"
msgid "Recent documents" msgid "Recent documents"
msgstr "" msgstr ""
#: ../contents/ui/MenuRepresentation.qml
msgid "Show more"
msgstr ""
#~ msgid "Ditto Menu" #~ msgid "Ditto Menu"
#~ msgstr "Ditto 메뉴" #~ msgstr "Ditto 메뉴"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: dittomenu\n" "Project-Id-Version: dittomenu\n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n" "Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2024-09-24 13:00+0500\n" "POT-Creation-Date: 2025-07-13 14:15+0500\n"
"PO-Revision-Date: 2022-01-01 20:09+0100\n" "PO-Revision-Date: 2022-01-01 20:09+0100\n"
"Last-Translator: Heimen Stoffels <vistausss@fastmail.com>\n" "Last-Translator: Heimen Stoffels <vistausss@fastmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
@ -156,6 +156,10 @@ msgstr ""
msgid "Recent documents" msgid "Recent documents"
msgstr "" msgstr ""
#: ../contents/ui/MenuRepresentation.qml
msgid "Show more"
msgstr ""
#~ msgid "Ditto Menu" #~ msgid "Ditto Menu"
#~ msgstr "Ditto-menu" #~ msgstr "Ditto-menu"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: dittomenu\n" "Project-Id-Version: dittomenu\n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n" "Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2024-09-24 13:00+0500\n" "POT-Creation-Date: 2025-07-13 14:15+0500\n"
"PO-Revision-Date: 2022-04-05 10:40+0100\n" "PO-Revision-Date: 2022-04-05 10:40+0100\n"
"Last-Translator: Krzysztof Korab <korapps@outlook.com>\n" "Last-Translator: Krzysztof Korab <korapps@outlook.com>\n"
"Language-Team: \n" "Language-Team: \n"
@ -155,6 +155,10 @@ msgstr ""
msgid "Recent documents" msgid "Recent documents"
msgstr "" msgstr ""
#: ../contents/ui/MenuRepresentation.qml
msgid "Show more"
msgstr ""
#~ msgid "A configurable launcher menu" #~ msgid "A configurable launcher menu"
#~ msgstr "Konfigurowalne menu uruchamiania programów" #~ msgstr "Konfigurowalne menu uruchamiania programów"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: dittomenu\n" "Project-Id-Version: dittomenu\n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n" "Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2024-09-24 13:00+0500\n" "POT-Creation-Date: 2025-07-13 14:15+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -155,6 +155,10 @@ msgstr "Todos os programas"
msgid "Recent documents" msgid "Recent documents"
msgstr "" msgstr ""
#: ../contents/ui/MenuRepresentation.qml
msgid "Show more"
msgstr ""
#~ msgid "Ditto Menu" #~ msgid "Ditto Menu"
#~ msgstr "Ditto Menu" #~ msgstr "Ditto Menu"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: dittomenu\n" "Project-Id-Version: dittomenu\n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n" "Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2024-09-24 13:00+0500\n" "POT-Creation-Date: 2025-07-13 14:15+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Edward Karate <edward.karate@ya.ru>\n" "Last-Translator: Edward Karate <edward.karate@ya.ru>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -155,6 +155,10 @@ msgstr "Все приложения"
msgid "Recent documents" msgid "Recent documents"
msgstr "Последние документы" msgstr "Последние документы"
#: ../contents/ui/MenuRepresentation.qml
msgid "Show more"
msgstr "Показать больше"
#~ msgid "Ditto Menu" #~ msgid "Ditto Menu"
#~ msgstr "Ditto Menu" #~ msgstr "Ditto Menu"

View File

@ -1,5 +1,5 @@
# Translation of Menu11 in LANGUAGE # Translation of Menu11 in LANGUAGE
# Copyright (C) 2024 # Copyright (C) 2025
# This file is distributed under the same license as the Menu11 package. # This file is distributed under the same license as the Menu11 package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Menu11\n" "Project-Id-Version: Menu11\n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n" "Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2024-09-24 13:00+0500\n" "POT-Creation-Date: 2025-07-13 14:15+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -154,3 +154,7 @@ msgstr ""
#: ../contents/ui/MenuRepresentation.qml #: ../contents/ui/MenuRepresentation.qml
msgid "Recent documents" msgid "Recent documents"
msgstr "" msgstr ""
#: ../contents/ui/MenuRepresentation.qml
msgid "Show more"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: dittomenu\n" "Project-Id-Version: dittomenu\n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n" "Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2024-09-24 13:00+0500\n" "POT-Creation-Date: 2025-07-13 14:15+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -158,6 +158,10 @@ msgstr ""
msgid "Recent documents" msgid "Recent documents"
msgstr "" msgstr ""
#: ../contents/ui/MenuRepresentation.qml
msgid "Show more"
msgstr ""
#~ msgid "Ditto Menu" #~ msgid "Ditto Menu"
#~ msgstr "Ditto Menu" #~ msgstr "Ditto Menu"