Compare commits

..

2 Commits

Author SHA1 Message Date
Valeria Fadeeva af89c5bd43 Update 2026-01-22 16:12:22 +05:00
Valeria Fadeeva 83f87e0bca Update 2026-01-22 14:40:06 +05:00
33 changed files with 479 additions and 353 deletions

View File

@ -91,5 +91,13 @@
<entry name="viewUser" type="Bool">
<default>true</default>
</entry>
<entry name="showRecentDocuments" type="Bool">
<label>Show recent documents</label>
<default>true</default>
</entry>
<entry name="showDescriptions" type="Bool">
<label>Show application descriptions</label>
<default>true</default>
</entry>
</group>
</kcfg>

View File

@ -56,14 +56,18 @@ Item {
hoverEnabled: true
onClicked: {
dashWindow.visible = !dashWindow.visible;
if (dashWindow) {
dashWindow.visible = !dashWindow.visible;
}
}
}
Component.onCompleted: {
dashWindow = Qt.createQmlObject("MenuRepresentation {}", root);
plasmoid.activated.connect(function() {
dashWindow.visible = !dashWindow.visible;
if (dashWindow) {
dashWindow.visible = !dashWindow.visible;
}
});
}
}

View File

@ -56,6 +56,8 @@ KCM.SimpleKCM {
property alias cfg_appsIconSize: appsIconSize.currentIndex
property alias cfg_docsIconSize: docsIconSize.currentIndex
property alias cfg_displayPosition: displayPosition.currentIndex
property alias cfg_showRecentDocuments: showRecentDocuments.checked
property alias cfg_showDescriptions: showDescriptions.checked
Kirigami.FormLayout {
anchors.left: parent.left
@ -177,6 +179,18 @@ KCM.SimpleKCM {
model: [i18n("Small"),i18n("Medium"),i18n("Large"), i18n("Huge")]
}
CheckBox {
id: showRecentDocuments
Kirigami.FormData.label: i18n("Show recent documents:")
text: i18n("Enable")
}
CheckBox {
id: showDescriptions
Kirigami.FormData.label: i18n("Show descriptions:")
text: i18n("Enable")
}
ComboBox {

View File

@ -1,31 +1,23 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import QtCore
import org.kde.plasma.plasmoid
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.extras as PlasmaExtras
import org.kde.plasma.private.kicker 0.1 as Kicker
import org.kde.coreaddons 1.0 as KCoreAddons // kuser
import org.kde.plasma.private.shell 2.0
import org.kde.plasma.private.kicker as Kicker
import org.kde.coreaddons as KCoreAddons
import org.kde.plasma.private.shell
import org.kde.kwindowsystem
import Qt5Compat.GraphicalEffects
import org.kde.kquickcontrolsaddons
import org.kde.plasma.components as PlasmaComponents3
import org.kde.plasma.private.quicklaunch
import org.kde.kirigami as Kirigami
import org.kde.plasma.plasma5support as P5Support
import org.kde.plasma.private.sessions as Sessions
import org.kde.ksvg as KSvg
import org.kde.kcmutils as KCM
import org.kde.plasma.plasmoid
import org.kde.plasma.private.sessions
RowLayout{
@ -34,88 +26,51 @@ RowLayout{
KCoreAddons.KUser { id: kuser }
Logic { id: logic }
Sessions.SessionManagement {
SessionManagement {
id: sessionManager
}
Sessions.SessionsModel {
id: sessionsModel
}
P5Support.DataSource {
id: pmEngine
engine: "powermanagement"
connectedSources: ["PowerDevil", "Sleep States"]
function performOperation(what) {
var service = serviceForSource("PowerDevil")
var operation = service.operationDescription(what)
service.startOperationCall(operation)
}
}
Image {
id: iconUser
source: kuser.faceIconUrl.toString() || "user-identity"
cache: false
visible: source !== ""
sourceSize.height: parent.height * 0.9
sourceSize.width: parent.height * 0.9
fillMode: Image.PreserveAspectFit
Layout.alignment: Qt.AlignVCenter
// Crop the avatar to fit in a circle, like the lock and login screens
// but don't on software rendering where this won't render
layer.enabled:true // iconUser.GraphicsInfo.api !== GraphicsInfo.Software
layer.effect: OpacityMask {
// this Rectangle is a circle due to radius size
maskSource: Rectangle {
width: iconUser.width
height: iconUser.height
radius: height / 2
visible: false
RowLayout{
Image {
id: iconUser
source: {
var faceUrl = kuser.faceIconUrl.toString()
if (faceUrl !== "") {
return faceUrl
}
return "user-identity"
}
cache: false
visible: source !== ""
sourceSize.height: 24
sourceSize.width: 24
fillMode: Image.PreserveAspectFit
Layout.alignment: Qt.AlignVCenter
layer.enabled: true
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onClicked: logic.runCommand("systemsettings kcm_users")
}
}
state: "hide"
states: [
State {
name: "show"
when: parent.visible
PropertyChanges { target: iconUser; opacity: 1; }
},
State {
name: "hide"
when: !parent.visible
PropertyChanges { target: iconUser; opacity: 0; }
PlasmaExtras.Heading {
wrapMode: Text.NoWrap
color: Kirigami.Theme.textColor
level: 3
font.bold: true
text: qsTr(kuser.fullName)
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onClicked: logic.runCommand("systemsettings kcm_users")
}
]
transitions: Transition {
PropertyAnimation { properties: "opacity"; easing.type: Easing.InOutQuad; }
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: KCM.KCMLauncher.openSystemSettings("kcm_users")
}
}
PlasmaExtras.Heading {
wrapMode: Text.NoWrap
color: Kirigami.Theme.textColor
level: 3
font.bold: true
//font.weight: Font.Bold
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"
@ -125,14 +80,14 @@ RowLayout{
PlasmaComponents3.ToolTip.timeout: 1000
PlasmaComponents3.ToolTip.visible: hovered
PlasmaComponents3.ToolTip.text: i18n("User Home")
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onClicked: logic.openUrl(StandardPaths.writableLocation(StandardPaths.HomeLocation).toString())
}
}
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"
@ -141,6 +96,11 @@ RowLayout{
PlasmaComponents3.ToolTip.timeout: 1000
PlasmaComponents3.ToolTip.visible: hovered
PlasmaComponents3.ToolTip.text: i18n("System Preferences")
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onClicked: logic.runCommand("systemsettings")
}
}
Item{
@ -148,29 +108,23 @@ RowLayout{
}
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"
Layout.rightMargin: 10
PlasmaComponents3.ToolTip.delay: 1000
PlasmaComponents3.ToolTip.timeout: 1000
PlasmaComponents3.ToolTip.visible: hovered
PlasmaComponents3.ToolTip.text: i18n("Lock Screen")
}
PlasmaComponents3.ToolButton {
visible: sessionManager.canLock
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onClicked: sessionManager.switchUser()
onClicked: sessionManager.lock()
}
}
PlasmaComponents3.ToolButton {
icon.width: 24
icon.height: 24
icon.name: "system-switch-user"
@ -179,15 +133,14 @@ RowLayout{
PlasmaComponents3.ToolTip.timeout: 1000
PlasmaComponents3.ToolTip.visible: hovered
PlasmaComponents3.ToolTip.text: i18n("Switch User")
}
PlasmaComponents3.ToolButton {
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
// onClicked: sessionManager.requestShutdown()
onClicked: sessionManager.requestLogoutPrompt()
onClicked: sessionManager.switchUser()
}
}
PlasmaComponents3.ToolButton {
icon.width: 24
icon.height: 24
icon.name: "system-shutdown"
@ -196,5 +149,11 @@ RowLayout{
PlasmaComponents3.ToolTip.timeout: 1000
PlasmaComponents3.ToolTip.visible: hovered
PlasmaComponents3.ToolTip.text: i18n("Shutdown")
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
// onClicked: sessionManager.requestShutdown()
onClicked: sessionManager.requestLogoutPrompt()
}
}
}

View File

@ -32,11 +32,15 @@ Item {
|| (("hasActionList" in model) && (model.hasActionList === true)))
property int itemColumns
property bool handleTriggerManually: false
Accessible.role: Accessible.MenuItem
Accessible.name: model.display
function openActionMenu(x, y) {
var actionList = hasActionList ? model.actionList : [];
var actionList = [];
if (hasActionList && model.actionList !== undefined) {
actionList = model.actionList;
}
Tools.fillActionMenu(i18n, actionMenu, actionList, GridView.view.model.favoritesModel, model.favoriteId);
actionMenu.visualParent = item;
actionMenu.open(x, y);
@ -120,7 +124,7 @@ Item {
} else if ((event.key === Qt.Key_Enter || event.key === Qt.Key_Return)) {
event.accepted = true;
if ("trigger" in GridView.view.model) {
if (!handleTriggerManually && "trigger" in GridView.view.model) {
GridView.view.model.trigger(index, "", null);
root.toggle();
}

View File

@ -31,11 +31,15 @@ Item {
|| (("hasActionList" in model) && (model.hasActionList === true)))
property int itemColumns
property bool handleTriggerManually: false
Accessible.role: Accessible.MenuItem
Accessible.name: model.display
function openActionMenu(x, y) {
var actionList = hasActionList ? model.actionList : [];
var actionList = [];
if (hasActionList && model.actionList !== undefined) {
actionList = model.actionList;
}
Tools.fillActionMenu(i18n, actionMenu, actionList, GridView.view.model.favoritesModel, model.favoriteId);
actionMenu.visualParent = item;
actionMenu.open(x, y);
@ -49,72 +53,103 @@ Item {
}
}
property bool showDescriptions: true
Kirigami.Icon {
id: icon
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
RowLayout {
anchors.fill: parent
anchors.leftMargin: Kirigami.Units.largeSpacing
anchors.rightMargin: Kirigami.Units.largeSpacing
spacing: Kirigami.Units.largeSpacing
width: iconSize
height: width
animated: false
source: model.decoration
}
PlasmaComponents3.Label {
id: label
visible: item.showLabel
anchors {
left: icon.right
leftMargin: Kirigami.Units.largeSpacing
right: itemColumns == 2 ? parent.right : desc.left
rightMargin: Kirigami.Units.largeSpacing
verticalCenter: icon.verticalCenter
Kirigami.Icon {
id: icon
Layout.preferredWidth: iconSize
Layout.preferredHeight: iconSize
Layout.alignment: Qt.AlignVCenter
source: model.decoration
animated: false
}
anchors.verticalCenterOffset: itemColumns == 2 ? -Kirigami.Units.largeSpacing : 0
horizontalAlignment: Text.AlignLeft
maximumLineCount: 1
elide: Text.ElideMiddle
//wrapMode: Text.Wrap
color: Kirigami.Theme.textColor
font.pointSize: Kirigami.Theme.defaultFont.pointSize
text: ("name" in model ? model.name : model.display)
textFormat: Text.PlainText
}
PlasmaComponents3.Label {
id: desc
anchors {
top: itemColumns == 2 ? label.bottom: undefined
left: itemColumns == 2 ? icon.right : undefined
leftMargin: Kirigami.Units.largeSpacing
right: parent.right
rightMargin: Kirigami.Units.largeSpacing
verticalCenter: itemColumns == 2 ? undefined : icon.verticalCenter
Item {
Layout.fillWidth: true
Layout.fillHeight: true
// List View Layout (itemColumns == 1)
RowLayout {
anchors.fill: parent
visible: itemColumns == 1
spacing: Kirigami.Units.smallSpacing
PlasmaComponents3.Label {
id: labelList
text: ("name" in model ? model.name : model.display)
// Name takes 65% of space ideally
Layout.fillWidth: true
Layout.preferredWidth: parent.width * 0.65
elide: Text.ElideRight
maximumLineCount: 1
color: Kirigami.Theme.textColor
font.pointSize: Kirigami.Theme.defaultFont.pointSize
horizontalAlignment: Text.AlignLeft
}
PlasmaComponents3.Label {
id: descList
text: ("description" in model ? model.description : "")
visible: item.showDescriptions && text.length > 0 && text !== model.display
// Description takes 35% of space ideally
Layout.fillWidth: true
Layout.preferredWidth: parent.width * 0.35
Layout.minimumWidth: 0
elide: Text.ElideRight
maximumLineCount: 1
color: colorWithAlpha(Kirigami.Theme.textColor, 0.6)
font.pointSize: Kirigami.Theme.defaultFont.pointSize - 1
horizontalAlignment: Text.AlignRight
}
}
// Grid View Layout (itemColumns == 2)
ColumnLayout {
anchors.fill: parent
visible: itemColumns == 2
spacing: 0
PlasmaComponents3.Label {
id: labelGrid
text: ("name" in model ? model.name : model.display)
Layout.fillWidth: true
elide: Text.ElideRight
maximumLineCount: 1
color: Kirigami.Theme.textColor
font.pointSize: Kirigami.Theme.defaultFont.pointSize
horizontalAlignment: Text.AlignLeft
}
PlasmaComponents3.Label {
id: descGrid
text: ("description" in model ? model.description : "")
visible: text.length > 0 && text !== model.display
Layout.fillWidth: true
elide: Text.ElideRight
maximumLineCount: 1
color: colorWithAlpha(Kirigami.Theme.textColor, 0.6)
font.pointSize: Kirigami.Theme.defaultFont.pointSize - 1
horizontalAlignment: Text.AlignLeft
}
}
}
horizontalAlignment: itemColumns == 2 ? Text.AlignLeft : Text.AlignRight
maximumLineCount: 1
elide: Text.ElideMiddle
//wrapMode: Text.Wrap
color: colorWithAlpha(Kirigami.Theme.textColor,0.4)
font.pointSize: Kirigami.Theme.defaultFont.pointSize - 1
text: ("description" in model ? model.description : "")
textFormat: Text.PlainText
}
property Item currentLabel: itemColumns == 1 ? labelList : labelGrid
PlasmaCore.ToolTipArea {
id: toolTip
property string text: model.display
anchors.fill: parent
active: root.visible && label.truncated
active: root.visible && currentLabel.truncated
mainItem: toolTipDelegate
onContainsMouseChanged: item.GridView.view.itemContainsMouseChanged(containsMouse)
@ -127,7 +162,7 @@ Item {
} else if ((event.key === Qt.Key_Enter || event.key === Qt.Key_Return)) {
event.accepted = true;
if ("trigger" in GridView.view.model) {
if (!handleTriggerManually && "trigger" in GridView.view.model) {
GridView.view.model.trigger(index, "", null);
root.toggle();
}

View File

@ -35,7 +35,10 @@ Item {
Accessible.name: model.display
function openActionMenu(x, y) {
var actionList = hasActionList ? model.actionList : [];
var actionList = [];
if (hasActionList && model.actionList !== undefined) {
actionList = model.actionList;
}
Tools.fillActionMenu(i18n, actionMenu, actionList, GridView.view.model.favoritesModel, model.favoriteId);
actionMenu.visualParent = item;
actionMenu.open(x, y);

View File

@ -37,9 +37,14 @@ FocusScope {
property alias cellHeight: gridView.cellHeight
property int iconSize
property bool forceListDelegate: false
property bool showDescriptions: true
property var horizontalScrollBarPolicy: PlasmaComponents.ScrollBar.AlwaysOff
property var verticalScrollBarPolicy: PlasmaComponents.ScrollBar.AlwaysOff
property bool bypassArrowNav: false
property bool handleTriggerManually: false
onDropEnabledChanged: {
if (!dropEnabled && "dropPlaceHolderIndex" in model) {
model.dropPlaceHolderIndex = -1;
@ -119,7 +124,7 @@ FocusScope {
if (item) {
if (kicker.dragSource.parent === gridView.contentItem) {
if (item !== kicker.dragSource) {
item.GridView.view.model.moveRow(dragSource.itemIndex, item.itemIndex);
item.GridView.view.model.moveRow(kicker.dragSource.itemIndex, item.itemIndex);
}
} else if (kicker.dragSource.GridView.view.model.favoritesModel === itemGrid.model
&& !itemGrid.model.isFavorite(kicker.dragSource.favoriteId)) {
@ -178,6 +183,8 @@ FocusScope {
showLabel: showLabels
itemColumns: itemGrid.itemColumns
iconSize: itemGrid.iconSize
showDescriptions: itemGrid.showDescriptions
handleTriggerManually: itemGrid.handleTriggerManually
}
}
Component{
@ -186,6 +193,7 @@ FocusScope {
showLabel: itemGrid.showLabels
itemColumns: itemGrid.itemColumns
iconSize: itemGrid.iconSize
handleTriggerManually: itemGrid.handleTriggerManually
}
}
@ -254,7 +262,7 @@ FocusScope {
keyNavigationWraps: false
boundsBehavior: Flickable.StopAtBounds
delegate: itemColumns == 1 ? aItemGridDelegate : aItemGridDelegate2
delegate: (itemColumns == 1 && !forceListDelegate) ? aItemGridDelegate : aItemGridDelegate2
highlight: Rectangle { color: Qt.rgba(0.9, 0.9, 0.9, 0.1); radius: 6 }
highlightFollowsCurrentItem: true
@ -422,7 +430,7 @@ FocusScope {
if (!dragHelper.dragging) {
if (pressedItem) {
if ("trigger" in gridView.model) {
if (!itemGrid.handleTriggerManually && "trigger" in gridView.model) {
gridView.model.trigger(pressedItem.itemIndex, "", null);
root.toggle();
}

View File

@ -195,7 +195,7 @@ PlasmaComponents.ScrollView {
width: parent.width
height: count * itemMultiGrid.cellHeight
itemColumns: 3 //itemMultiGrid.itemColumns
itemColumns: 2 //itemMultiGrid.itemColumns
cellWidth: itemMultiGrid.cellWidth
cellHeight: itemMultiGrid.cellHeight

View File

@ -0,0 +1,25 @@
import QtQuick
import org.kde.plasma.plasma5support as Plasma5Support
Item {
Plasma5Support.DataSource {
id: executable
engine: "executable"
connectedSources: []
onNewData: function(source, data) {
disconnectSource(source)
}
}
function openUrl(url) {
if (url.toString().endsWith(".desktop")) {
executable.connectSource("kioclient exec " + url)
} else {
executable.connectSource("xdg-open " + url)
}
}
function runCommand(cmd) {
executable.connectSource(cmd)
}
}

View File

@ -27,13 +27,13 @@ import org.kde.plasma.components as PC3
import org.kde.plasma.extras as PlasmaExtras
import org.kde.plasma.private.kicker as Kicker
import org.kde.kquickcontrolsaddons
import org.kde.plasma.private.quicklaunch
import org.kde.kirigami as Kirigami
import org.kde.plasma.plasma5support as Plasma5Support
PlasmaCore.Dialog {
id: root
backgroundHints: PlasmaCore.Types.SolidBackground | PlasmaCore.Types.ConfigurableBackground
objectName: "popupWindow"
flags: Qt.WindowStaysOnTopHint
@ -147,7 +147,7 @@ PlasmaCore.Dialog {
var vertMidPoint = screen.y + (screen.height / 2);
var appletTopLeft = parent.mapToGlobal(0, 0);
var offset = Kirigami.Units.smallSpacing * 2;
var offset = Kirigami.Units.smallSpacing;
if (Plasmoid.configuration.displayPosition === 1) {
horizMidPoint = screen.x + (screen.width / 2);
@ -161,8 +161,8 @@ PlasmaCore.Dialog {
vertMidPoint = screen.y + (screen.height / 2);
x = horizMidPoint - width / 2;
// y = screen.y + screen.height - height - offset - panelH - Kirigami.Units.gridUnit;
// y = screen.y + screen.height - height - offset - panelH - Kirigami.Units.gridUnit / 2;
y = screen.y + screen.height - height - offset - panelH - Kirigami.Units.largeSpacing * 1.5;
y = screen.y + screen.height - height - offset - panelH - Kirigami.Units.gridUnit / 2;
//y = screen.y + screen.height - height - offset - panelH - Kirigami.Units.largeSpacing * 1.5;
}
else {
@ -209,8 +209,8 @@ PlasmaCore.Dialog {
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
Layout.minimumHeight: height
Layout.maximumHeight: height
focus: true
onFocusChanged: searchField.focus = true
@ -427,10 +427,9 @@ PlasmaCore.Dialog {
// PAGE 1
//
Column {
width: rootItem.widthComputed
width: view.width // Ensure Column fills SwipeView
height: view.height
spacing: Kirigami.Units.largeSpacing * 2
spacing: Kirigami.Units.largeSpacing
function tryActivate(row, col) {
globalFavoritesGrid.tryActivate(row, col);
}
@ -441,7 +440,7 @@ PlasmaCore.Dialog {
height: butttonActionAllApps.implicitHeight
Kirigami.Icon {
source: 'favorite'
source: 'bookmarks'
implicitHeight: Kirigami.Units.iconSizes.smallMedium
implicitWidth: Kirigami.Units.iconSizes.smallMedium
}
@ -458,14 +457,14 @@ PlasmaCore.Dialog {
Layout.fillWidth: true
}
AToolButton {
PC3.ToolButton {
id: butttonActionAllApps
flat: false
iconName: "go-next"
icon.name: "go-next"
text: i18n("All apps")
buttonHeight: 25
onClicked: {
view.currentIndex = 1;
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onClicked: view.currentIndex = 1;
}
}
}
@ -473,7 +472,13 @@ PlasmaCore.Dialog {
ItemGridView {
id: globalFavoritesGrid
width: parent.width
height: root.cellSizeHeight * Plasmoid.configuration.numberRows
height: {
if (Plasmoid.configuration.showRecentDocuments) {
return root.cellSizeHeight * Plasmoid.configuration.numberRows;
} else {
return view.height - topRow.height - Kirigami.Units.largeSpacing - Kirigami.Units.gridUnit;
}
}
itemColumns: 1
dragEnabled: true
dropEnabled: true
@ -486,7 +491,9 @@ PlasmaCore.Dialog {
}
onKeyNavDown: {
globalFavoritesGrid.focus = false;
documentsGrid.tryActivate(0, 0);
if (Plasmoid.configuration.showRecentDocuments) {
documentsGrid.tryActivate(0, 0);
}
}
Keys.onPressed: event => {
if (event.key === Qt.Key_Tab) {
@ -498,6 +505,7 @@ PlasmaCore.Dialog {
}
RowLayout {
visible: Plasmoid.configuration.showRecentDocuments
width: parent.width
height: butttonActionAllApps.implicitHeight
@ -519,37 +527,47 @@ PlasmaCore.Dialog {
Layout.fillWidth: true
}
AToolButton {
PC3.ToolButton {
id: butttonActionRecentMore
flat: false
iconName: "go-next"
icon.name: "go-next"
text: i18n("Show more")
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/'");
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
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();
}
root.toggle();
}
}
}
ItemGridView {
visible: Plasmoid.configuration.showRecentDocuments
id: documentsGrid
width: rootItem.widthComputed
width: parent.width
height: cellHeight * 3
itemColumns: 2
dragEnabled: true
dropEnabled: true
cellWidth: rootItem.widthComputed * 0.48
cellWidth: (width - Kirigami.Units.gridUnit) / 2
cellHeight: docsIconSize + Kirigami.Units.largeSpacing * 2
iconSize: docsIconSize
clip: true
handleTriggerManually: true
onItemActivated: (index, actionId, argument) => {
var url = documentsGrid.currentItem.url.toString();
console.log("Opening URL:", url);
executable.exec("xdg-open '" + url.replace(/'/g, "'\\''") + "'");
root.toggle();
}
onKeyNavUp: {
globalFavoritesGrid.tryActivate(0, 0);
documentsGrid.focus = false;
@ -568,19 +586,20 @@ PlasmaCore.Dialog {
// PAGE 2
//
Column {
width: rootItem.widthComputed
width: view.width // Ensure Column fills SwipeView
height: view.height
spacing: Kirigami.Units.largeSpacing * 2
spacing: Kirigami.Units.largeSpacing
function tryActivate(row, col) {
allAppsGrid.tryActivate(row, col);
}
RowLayout {
id: allAppsTopRow
width: parent.width
height: butttonActionAllApps.implicitHeight
Kirigami.Icon {
source: 'application-menu'
source: 'view-grid'
implicitHeight: Kirigami.Units.iconSizes.smallMedium
implicitWidth: Kirigami.Units.iconSizes.smallMedium
}
@ -597,29 +616,29 @@ PlasmaCore.Dialog {
Layout.fillWidth: true
}
AToolButton {
flat: false
iconName: 'go-previous'
PC3.ToolButton {
icon.name: 'go-previous'
text: i18n("Pinned")
buttonHeight: 25
mirror: true
onClicked: {
view.currentIndex = 0;
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onClicked: view.currentIndex = 0;
}
}
}
ItemGridView {
id: allAppsGrid
width: rootItem.widthComputed
height: Math.floor((view.height - topRow.height - Kirigami.Units.largeSpacing) / cellHeight) * cellHeight
itemColumns: 2
width: parent.width
height: view.height - allAppsTopRow.height - Kirigami.Units.largeSpacing - Kirigami.Units.gridUnit
itemColumns: 1
forceListDelegate: true
showDescriptions: Plasmoid.configuration.showDescriptions
dragEnabled: false
dropEnabled: false
cellWidth: rootItem.widthComputed - Kirigami.Units.gridUnit * 2
cellWidth: width
cellHeight: root.iconSize + Kirigami.Units.largeSpacing
iconSize: root.iconSize
clip: true
onKeyNavUp: {
searchField.focus = true;
allAppsGrid.focus = false;

View File

@ -9,9 +9,6 @@
.pragma library
function fillActionMenu(i18n, actionMenu, actionList, favoriteModel, favoriteId) {
// Accessing actionList can be a costly operation, so we don't
// access it until we need the menu.
var actions = createFavoriteActions(i18n, favoriteModel, favoriteId);
if (actions) {
@ -19,13 +16,16 @@ function fillActionMenu(i18n, actionMenu, actionList, favoriteModel, favoriteId)
var actionListCopy = Array.from(actionList);
var separator = { "type": "separator" };
actionListCopy.push(separator);
// actionList = actions.concat(actionList); // this crashes Qt O.o
actionListCopy.push.apply(actionListCopy, actions);
actionList = actionListCopy;
} else {
actionList = actions;
}
}
if (!actionList || actionList.length === 0) {
actionList = [];
}
actionMenu.actionList = actionList;
}
@ -37,6 +37,8 @@ function createFavoriteActions(i18n, favoriteModel, favoriteId) {
if (favoriteModel.activities === undefined ||
!favoriteModel.activities ||
!favoriteModel.activities.runningActivities ||
favoriteModel.activities.runningActivities.length <= 1) {
var action = {};

View File

@ -24,6 +24,7 @@ import org.kde.plasma.plasmoid
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.components as PC3
import org.kde.plasma.plasma5support as Plasma5Support
import org.kde.plasma.private.kicker as Kicker
import org.kde.kirigami as Kirigami
@ -46,6 +47,10 @@ PlasmoidItem {
function action_menuedit() {
processRunner.runMenuEditor();
}
function openKMenuEdit() {
executable.exec("kmenuedit");
}
Component {
id: compactRepresentation
@ -166,6 +171,18 @@ PlasmoidItem {
Kicker.ProcessRunner {
id: processRunner;
}
Plasma5Support.DataSource {
id: executable
engine: "executable"
connectedSources: []
onNewData: function(source, data) {
disconnectSource(source);
}
function exec(cmd) {
connectSource(cmd);
}
}
Kicker.WindowSystem {
id: windowSystem
@ -229,7 +246,13 @@ PlasmoidItem {
text: i18n("Edit Applications…")
icon.name: "kmenuedit"
visible: Plasmoid.immutability !== PlasmaCore.Types.SystemImmutable
onTriggered: processRunner.runMenuEditor()
onTriggered: {
if (processRunner && processRunner.runMenuEditor) {
processRunner.runMenuEditor();
} else {
openKMenuEdit();
}
}
}
]

View File

@ -1,25 +1,25 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "adhemarks@gmail.com",
"Name": "Ademir"
}
],
"Category": "Application Launchers",
"Description": "Configurable grid of application icons",
"Description[x-test]": "xxConfigurable grid of application iconsxx",
"EnabledByDefault": true,
"Icon": "start-here-kde",
"Id": "com.github.adhec.Menu11",
"License": "GPL-2.0+",
"Name": "Menu 11",
"Name[x-test]": "xxMenu 11xx",
"Website": "https://kde.org/plasma-desktop"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-Provides": [
"org.kde.plasma.launchermenu"
]
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "hello@eisteed.com",
"Name": "Eisteed"
}
],
"BugReportUrl": "https://github.com/kurojs/Menu-11-Enhanced/issues",
"Category": "Application Launchers",
"Description": "Enhanced configurable grid application launcher for Plasma 6.5+",
"Description[x-test]": "xxCEnhanced configurable grid application launcher for Plasma 6.5+xx",
"EnabledByDefault": true,
"Icon": "start-here-kde",
"Id": "com.github.adhec.Menu11",
"License": "GPL-2.0+",
"Name": "Menu 11 Enhanced",
"Name[x-test]": "xxMenu 11 Enhancedxx",
"Version": "1.1.2",
"Website": "https://github.com/kurojs/Menu-11-Enhanced"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-Provides": ["org.kde.plasma.launchermenu"]
}

View File

@ -8,7 +8,7 @@ Go to `~/.local/share/plasma/plasmoids/com.github.adhec.Menu11/translate/` and r
## New Translations
1. Fill out [`template.pot`](template.pot) with your translations then open a [new issue](https://github.com/prateekmedia/Menu11/issues/new), name the file `spanish.txt`, attach the txt file to the issue (drag and drop).
1. Fill out [`template.pot`](template.pot) with your translations then open a [new issue](https://github.com/kurojs/Menu-11-Enhanced/issues/new), name the file `spanish.txt`, attach the txt file to the issue (drag and drop).
Or if you know how to make a pull request
@ -35,11 +35,11 @@ Or if you know how to make a pull request
## Status
| Locale | Lines | % Done|
|----------|---------|-------|
| Template | 35 | |
| fr | 20/35 | 57% |
| ko | 17/35 | 48% |
| nl | 13/35 | 37% |
| pl | 15/35 | 42% |
| pt_BR | 20/35 | 57% |
| ru | 34/35 | 97% |
| tr | 15/35 | 42% |
| Template | 38 | |
| fr | 20/38 | 52% |
| ko | 17/38 | 44% |
| nl | 13/38 | 34% |
| pl | 15/38 | 39% |
| pt_BR | 20/38 | 52% |
| ru | 38/38 | 100% |
| tr | 15/38 | 39% |

View File

@ -1,4 +1,4 @@
#!/bin/bash
#!/bin/sh
# Version: 6
# This script will convert the *.po files to *.mo files, rebuilding the package/contents/locale folder.
@ -8,7 +8,7 @@
DIR=`cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd`
plasmoidName=com.github.adhec.Menu11
widgetName="${plasmoidName##*.}" # Strip namespace
website=https://github.com/prateekmedia/Menu11
website=https://github.com/kurojs/Menu-11-Enhanced
bugAddress="$website"
packageRoot=".." # Root of translatable sources
projectName="plasma_applet_${plasmoidName}" # project name

View File

@ -7,8 +7,8 @@
msgid ""
msgstr ""
"Project-Id-Version: dittomenu\n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2025-07-13 14:15+0500\n"
"Report-Msgid-Bugs-To: https://github.com/kurojs/Menu-11-Enhanced\n"
"POT-Creation-Date: 2026-01-22 14:15+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: omano\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -79,6 +79,18 @@ msgstr ""
msgid "Docs icon size:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Show recent documents:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Enable"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Show descriptions:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Menu position"
msgstr "Position du menu"

View File

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2025-07-13 14:15+0500\n"
"Report-Msgid-Bugs-To: https://github.com/kurojs/Menu-11-Enhanced\n"
"POT-Creation-Date: 2026-01-22 14:15+0500\n"
"PO-Revision-Date: 2021-09-29 09:43+0900\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -76,6 +76,18 @@ msgstr ""
msgid "Docs icon size:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Show recent documents:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Enable"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Show descriptions:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Menu position"
msgstr ""

View File

@ -1,4 +1,4 @@
#!/bin/bash
#!/bin/sh
# Version: 22
# https://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems
@ -8,7 +8,7 @@
DIR=`cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd`
plasmoidName=com.github.adhec.Menu11
widgetName="${plasmoidName##*.}" # Strip namespace
website=https://github.com/prateekmedia/Menu11
website=https://github.com/kurojs/Menu-11-Enhanced
bugAddress="$website"
packageRoot=".." # Root of translatable sources
projectName="plasma_applet_${plasmoidName}" # project name

View File

@ -6,8 +6,8 @@
msgid ""
msgstr ""
"Project-Id-Version: dittomenu\n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2025-07-13 14:15+0500\n"
"Report-Msgid-Bugs-To: https://github.com/kurojs/Menu-11-Enhanced\n"
"POT-Creation-Date: 2026-01-22 14:15+0500\n"
"PO-Revision-Date: 2022-01-01 20:09+0100\n"
"Last-Translator: Heimen Stoffels <vistausss@fastmail.com>\n"
"Language-Team: \n"
@ -80,6 +80,18 @@ msgstr ""
msgid "Docs icon size:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Show recent documents:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Enable"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Show descriptions:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Menu position"
msgstr ""

View File

@ -7,8 +7,8 @@
msgid ""
msgstr ""
"Project-Id-Version: dittomenu\n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2025-07-13 14:15+0500\n"
"Report-Msgid-Bugs-To: https://github.com/kurojs/Menu-11-Enhanced\n"
"POT-Creation-Date: 2026-01-22 14:15+0500\n"
"PO-Revision-Date: 2022-04-05 10:40+0100\n"
"Last-Translator: Krzysztof Korab <korapps@outlook.com>\n"
"Language-Team: \n"
@ -79,6 +79,18 @@ msgstr ""
msgid "Docs icon size:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Show recent documents:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Enable"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Show descriptions:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Menu position"
msgstr ""

View File

@ -1,4 +1,4 @@
#!/bin/bash
#!/bin/sh
# Version 9
# Requires plasmoidviewer v5.13.0

View File

@ -7,8 +7,8 @@
msgid ""
msgstr ""
"Project-Id-Version: dittomenu\n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2025-07-13 14:15+0500\n"
"Report-Msgid-Bugs-To: https://github.com/kurojs/Menu-11-Enhanced\n"
"POT-Creation-Date: 2026-01-22 14:15+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -79,6 +79,18 @@ msgstr ""
msgid "Docs icon size:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Show recent documents:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Enable"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Show descriptions:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Menu position"
msgstr "Posição do menu"

View File

@ -7,8 +7,8 @@
msgid ""
msgstr ""
"Project-Id-Version: dittomenu\n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2025-07-13 14:15+0500\n"
"Report-Msgid-Bugs-To: https://github.com/kurojs/Menu-11-Enhanced\n"
"POT-Creation-Date: 2026-01-22 14:15+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Edward Karate <edward.karate@ya.ru>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -79,6 +79,18 @@ msgstr "Огромный"
msgid "Docs icon size:"
msgstr "Размер знаков документов"
#: ../contents/ui/ConfigGeneral.qml
msgid "Show recent documents:"
msgstr "Показать последние документы"
#: ../contents/ui/ConfigGeneral.qml
msgid "Enable"
msgstr "Разрешить"
#: ../contents/ui/ConfigGeneral.qml
msgid "Show descriptions:"
msgstr "Показать описание"
#: ../contents/ui/ConfigGeneral.qml
msgid "Menu position"
msgstr "Положение меню"
@ -158,77 +170,3 @@ msgstr "Последние документы"
#: ../contents/ui/MenuRepresentation.qml
msgid "Show more"
msgstr "Показать больше"
#~ msgid "Ditto Menu"
#~ msgstr "Ditto Menu"
#~ msgid "A configurable launcher menu"
#~ msgstr "Настраиваемое меню приложений"
#~ msgid "On The Current Activity"
#~ msgstr "О текущей деятельности"
#~ msgid "Show In Favorites"
#~ msgstr "Показать в Избранных"
#~ msgctxt "@item:inmenu Open icon chooser dialog"
#~ msgid "Choose..."
#~ msgstr "Выбрать..."
#~ msgid "Show favorites first"
#~ msgstr "Сначала показать избранные"
#~ msgid "Edit Applications..."
#~ msgstr "Редактировать меню..."
#~ msgid "Leave ..."
#~ msgstr "Выход ..."
#~ msgid "Hi, "
#~ msgstr "Привет, "
#~ msgid "Favorites"
#~ msgstr "Избранные"
#~ msgctxt "@action"
#~ msgid "Lock Screen"
#~ msgstr "Заблокировать"
#~ msgid "Behavior"
#~ msgstr "Поведение"
#~ msgid "Show applications as:"
#~ msgstr "Показывать приложения в виде:"
#~ msgid "Name only"
#~ msgstr "Только имя"
#~ msgid "Description only"
#~ msgstr "Только описание"
#~ msgid "Name (Description)"
#~ msgstr "Имя (Описание)"
#~ msgid "Description (Name)"
#~ msgstr "Описание (Имя)"
#~ msgid "Menu position:"
#~ msgstr "Позиция меню"
#~ msgid "Search"
#~ msgstr "Поиск"
#~ msgid "Expand search to bookmarks, files and emails"
#~ msgstr "Расширить поиск по закладкам, файлам и почте"
#~ msgid "Show user icon"
#~ msgstr "Показать иконку пользователя"
#~ msgid "Grid"
#~ msgstr "Сетка"
#~ msgid "Number of columns in grid"
#~ msgstr "Количество колонок в сетке"
#~ msgid "Number of rows in grid"
#~ msgstr "Количество строк в сетке"

View File

@ -1,5 +1,5 @@
# Translation of Menu11 in LANGUAGE
# Copyright (C) 2025
# Copyright (C) 2026
# This file is distributed under the same license as the Menu11 package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
@ -7,8 +7,8 @@
msgid ""
msgstr ""
"Project-Id-Version: Menu11\n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2025-07-13 14:15+0500\n"
"Report-Msgid-Bugs-To: https://github.com/kurojs/Menu-11-Enhanced\n"
"POT-Creation-Date: 2026-01-22 14:15+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -79,6 +79,18 @@ msgstr ""
msgid "Docs icon size:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Show recent documents:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Enable"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Show descriptions:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Menu position"
msgstr ""

View File

@ -7,8 +7,8 @@
msgid ""
msgstr ""
"Project-Id-Version: dittomenu\n"
"Report-Msgid-Bugs-To: https://github.com/prateekmedia/Menu11\n"
"POT-Creation-Date: 2025-07-13 14:15+0500\n"
"Report-Msgid-Bugs-To: https://github.com/kurojs/Menu-11-Enhanced\n"
"POT-Creation-Date: 2026-01-22 14:15+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -82,6 +82,18 @@ msgstr ""
msgid "Docs icon size:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Show recent documents:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Enable"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Show descriptions:"
msgstr ""
#: ../contents/ui/ConfigGeneral.qml
msgid "Menu position"
msgstr ""