some more branding

This commit is contained in:
tumillanino
2026-03-26 14:36:06 +11:00
parent 204c1638b9
commit e7d6daf595
317 changed files with 23146 additions and 1 deletions

View File

@@ -0,0 +1,36 @@
/*
SPDX-FileCopyrightText: 2014-2015 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
import QtQuick
import org.kde.plasma.plasmoid
import org.kde.plasma.configuration
ConfigModel {
id: configModel
property bool isFolder: (Plasmoid.pluginName === "org.kde.plasma.folder")
ConfigCategory {
name: i18nc("@title:group for configuration dialog page", "Location")
icon: "inode-directory"
source: "ConfigLocation.qml"
visible: configModel.isFolder
}
ConfigCategory {
name: i18nc("@title:group for configuration dialog page", "Icons")
icon: "preferences-desktop-icons"
source: "ConfigIcons.qml"
visible: configModel.isFolder
}
ConfigCategory {
name: i18nc("@title:group for configuration dialog page", "Filter")
icon: "preferences-desktop-filter"
source: "ConfigFilter.qml"
visible: configModel.isFolder
}
}

View File

@@ -0,0 +1,139 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<kcfgfile name=""/>
<group name="General">
<entry name="icon" type="String">
<label>The name of the custom icon to use for the compact representation (e.g. on a small panel) of the Folder View applet. Only used if useCustomIcon is true.</label>
<default>folder-symbolic</default>
</entry>
<entry name="useCustomIcon" type="Bool">
<label>Whether to use a custom icon for the compact representation (e.g. on a small panel) of the Folder View Applet.</label>
<default>false</default>
</entry>
<entry name="ItemsGeometries" type="String" hidden="true">
<label>Encoded geometries of items (resource categories).</label>
</entry>
<entry name="ToolBoxButtonState" type="String">
<label>Position state of the toolbox button.</label>
<default></default>
</entry>
<entry name="ToolBoxButtonX" type="int">
<label>X coordinate of the toolbox.</label>
</entry>
<entry name="ToolBoxButtonY" type="int">
<label>Y coordinate of the toolbox.</label>
</entry>
<entry name="FirstStartup" type="Bool" hidden="true">
<label>First time the containment starts?</label>
<default>true</default>
</entry>
<entry name="positions" type="StringList" hidden="true">
<default></default>
</entry>
<entry name="url" type="String">
<label>URL of the file system location being shown.</label>
<default>desktop:/</default>
</entry>
<entry name="labelMode" type="Int">
<label>How to show the Folder View label: 0 = No label, 1 = Friendly version of path relative to closest Places entry, 2 = Full path, 3 = Custom title</label>
<default>1</default>
</entry>
<entry name="labelText" type="String">
<label>Custom text for the Folder View label. Only used if labelMode is 3.</label>
<default></default>
</entry>
<entry name="arrangement" type="Int">
<label>How Folder View icons are arranged: 0 = Rows, 1 = Columns</label>
<default>0</default>
</entry>
<entry name="alignment" type="Int">
<label>How Folder View icons are aligned: 0 = Left, 1 = Right</label>
<default>0</default>
</entry>
<entry name="locked" type="Bool">
<label>Whether Folder View icons are locked or not. Only used when serving as containment.</label>
<default>false</default>
</entry>
<entry name="sortMode" type="Int">
<label>How Folder View icons are sorted: 0 = Unsorted, 1 = Name, 2 = Size, 3 = Type, 4 = Date</label>
<default>0</default>
</entry>
<entry name="sortDesc" type="Bool">
<label>Whether to sort Folder View icons descending instead of ascending.</label>
<default>false</default>
</entry>
<entry name="sortDirsFirst" type="Bool">
<label>Whether to sort folders before files in Folder View.</label>
<default>true</default>
</entry>
<entry name="toolTips" type="Bool">
<label>Whether to show info tooltips when hovering Folder View icons.</label>
<default>false</default>
</entry>
<entry name="selectionMarkers" type="Bool">
<label>Whether to show selection markers when hovering Folder View icons.</label>
<default>true</default>
</entry>
<entry name="renameInline" type="Bool">
<label>Whether to initiate inline renaming when clicking on the text of an already-selected item, while using the systemwide double-click mode.</label>
<default>true</default>
</entry>
<entry name="popups" type="Bool">
<label>Whether to show a popup preview window for Folder View icons for folders.</label>
<default>true</default>
</entry>
<entry name="previews" type="Bool">
<label>Whether to show preview thumbnails in Folder View.</label>
<default>true</default>
</entry>
<entry name="previewPlugins" type="StringList">
<label>List of ids of the thumbnail preview plugins to use in Folder View. If empty, uses a default set of thumbnailers (cf. KIO::PreviewJob::defaultPlugins)</label>
<default></default>
</entry>
<entry name="viewMode" type="Int">
<label>The Folder View view mode (used only by the widget full representation): 0 = Grid, 1 = List</label>
<default>0</default>
</entry>
<entry name="iconSize" type="Int">
<label>The icon size to use for Folder View icons. 0 = 22px (smallMedium); 1 = 32px (medium); 2 = 48px (large); 3 = 64px (huge); 4 = 96px (large * 2); 5 = 128px (enormous); 6 = 256px (enormous * 2)</label>
<default>3</default>
</entry>
<entry name="labelWidth" type="Int">
<label>The width of the grid cells when using icon view. 0 = Narrow, 1 = Medium, 2 = Wide</label>
<default>1</default>
</entry>
<entry name="textLines" type="Int">
<label>The (maximum) number of lines of text to use below Folder View icons.</label>
<default>2</default>
</entry>
<entry name="textColor" type="String">
<label>The text color to use below Folder View icons. Only used when serving as containment.</label>
<default>white</default>
</entry>
<entry name="filterPattern" type="String">
<label>The pattern to filter files by. Supports wildcards.</label>
<default>*</default>
</entry>
<entry name="filterMode" type="Int">
<label>The file filter mode: 0 = Show All Files, 1 = Show Files Matching, 2 = Hide Files Matching</label>
<default>0</default>
</entry>
<entry name="filterMimeTypes" type="StringList">
<label>List of MIME types to filter by.</label>
<default>all/all</default>
</entry>
<entry name="showHiddenFiles" type="Bool">
<label>Show hidden files.</label>
<default>false</default>
</entry>
</group>
</kcfg>

View File

@@ -0,0 +1,45 @@
/*
SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
SPDX-FileCopyrightText: 2013 Sebastian Kügler <sebas@kde.org>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
import QtQuick
import org.kde.plasma.plasmoid
import org.kde.plasma.core as PlasmaCore
import org.kde.kirigami as Kirigami
import org.kde.plasma.components as PC3
PC3.ToolButton {
id: button
property PlasmaCore.Action qAction
readonly property int iconSize: Kirigami.Settings.hasTransientTouchInput
? Kirigami.Units.iconSizes.medium
: Kirigami.Units.iconSizes.small
property alias toolTip: toolTip.text
onClicked: {
if (qAction) {
qAction.trigger()
}
if (!Plasmoid.containment.corona.editMode) {
appletContainer.editMode = false;
}
}
icon.width: iconSize
icon.height: iconSize
PC3.ToolTip {
id: toolTip
text: button.qAction ? button.qAction.text : ""
delay: 0
visible: button.hovered && text.length > 0
Kirigami.Theme.colorSet: Kirigami.Theme.Window
Kirigami.Theme.inherit: false
}
}

View File

@@ -0,0 +1,126 @@
/*
SPDX-FileCopyrightText: 2011-2013 Sebastian Kügler <sebas@kde.org>
SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
SPDX-FileCopyrightText: 2014-2015 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
import QtQuick
import org.kde.plasma.plasmoid
import org.kde.ksvg as KSvg
import org.kde.plasma.components as PlasmaComponents3
import org.kde.kirigami as Kirigami
KSvg.FrameSvgItem {
id: upButton
width: gridView.cellWidth
height: visible ? gridView.cellHeight : 0
visible: history.length !== 0
property bool ignoreClick: false
property bool containsDrag: false
property alias active: hoverActivateTimer.running
imagePath: "widgets/viewitem"
function handleDragMove() {
containsDrag = true;
hoverActivateTimer.restart();
}
function endDragMove() {
containsDrag = false;
hoverActivateTimer.stop();
}
MouseArea {
id: mouseArea
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.BackButton
hoverEnabled: true
onContainsMouseChanged: {
gridView.hoveredItem = null;
}
onPressed: mouse => {
if (mouse.buttons & Qt.BackButton) {
if (root.isPopup && dir.resolvedUrl !== dir.resolve(Plasmoid.configuration.url)) {
doBack();
upButton.ignoreClick = true;
}
}
}
onClicked: mouse => {
if (upButton.ignoreClick) {
upButton.ignoreClick = false;
return;
}
doBack();
}
}
Kirigami.Icon {
id: icon
anchors {
left: parent.left
leftMargin: Kirigami.Units.smallSpacing
verticalCenter: parent.verticalCenter
}
width: gridView.iconSize
height: gridView.iconSize
source: "arrow-left"
}
PlasmaComponents3.Label {
id: label
anchors {
left: icon.right
leftMargin: Kirigami.Units.smallSpacing * 2
verticalCenter: parent.verticalCenter
}
width: parent.width - icon.width - (Kirigami.Units.smallSpacing * 4);
height: undefined // Unset PlasmaComponents.Label's default.
textFormat: Text.PlainText
maximumLineCount: root.isPopup ? 1 : Plasmoid.configuration.textLines
wrapMode: Text.Wrap
elide: Text.ElideRight
text: i18nc("@action:button", "Back")
}
Timer {
id: hoverActivateTimer
interval: root.hoverActivateDelay
onTriggered: doBack()
}
states: [
State {
name: "hover"
when: mouseArea.containsMouse || upButton.containsDrag
PropertyChanges {
upButton.prefix: "hover"
}
}
]
}

View File

@@ -0,0 +1,74 @@
/*
SPDX-FileCopyrightText: 2013-2014 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
import QtQuick
import QtQuick.Layouts
import org.kde.plasma.plasmoid
import org.kde.plasma.core as PlasmaCore
import org.kde.draganddrop as DragDrop
import org.kde.kirigami as Kirigami
DragDrop.DropArea {
id: compactRoot
readonly property bool inPanel: [
PlasmaCore.Types.TopEdge,
PlasmaCore.Types.LeftEdge,
PlasmaCore.Types.RightEdge,
PlasmaCore.Types.BottomEdge,
].includes(Plasmoid.location)
Layout.minimumWidth: Plasmoid.formFactor === PlasmaCore.Types.Horizontal ? height : Kirigami.Units.iconSizes.small
Layout.minimumHeight: Plasmoid.formFactor === PlasmaCore.Types.Vertical ? width : (Kirigami.Units.iconSizes.small + 2 * Kirigami.Units.iconSizes.sizeForLabels)
property FolderView folderView: null
onContainsDragChanged: contained => {
if (containsDrag) {
hoverActivateTimer.restart();
} else {
hoverActivateTimer.stop();
}
}
onDrop: event => {
folderView.model.dropCwd(event);
}
preventStealing: true
function toggle() {
root.expanded = !root.expanded;
}
Kirigami.Icon {
id: icon
anchors.fill: parent
active: mouseArea.containsMouse
source: Plasmoid.configuration.useCustomIcon ? Plasmoid.configuration.icon : compactRoot.folderView.model.iconName
}
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
onClicked: mouse => compactRoot.toggle()
}
Timer {
id: hoverActivateTimer
interval: root.hoverActivateDelay
onTriggered: compactRoot.toggle()
}
}

View File

@@ -0,0 +1,212 @@
/*
SPDX-FileCopyrightText: 2014 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import org.kde.kirigami as Kirigami
import org.kde.private.desktopcontainment.folder as Folder
import org.kde.kitemmodels as KItemModels
import org.kde.kcmutils as KCM
KCM.ScrollViewKCM {
id: configIcons
property alias cfg_filterMode: filterMode.currentIndex
property alias cfg_filterPattern: filterPattern.text
property alias cfg_filterMimeTypes: mimeTypesModel.checkedTypes
property alias cfg_showHiddenFiles: showHiddenFiles.checked
KItemModels.KSortFilterProxyModel {
id: filteredMimeTypesModel
sourceModel: Folder.MimeTypesModel {
id: mimeTypesModel
}
filterRegularExpression: RegExp(mimeFilter.text, "i")
filterRoleName: "name"
sortRoleName: "name"
sortOrder: Qt.AscendingOrder
function checkFiltered() {
var types = [];
for (var i = 0; i < count; ++i) {
types.push(index(i, 0).data(Qt.UserRole));
}
mimeTypesModel.checkedTypes = types;
}
function uncheckFiltered() {
var types = [];
for (var i = 0; i < count; ++i) {
types.push(index(i, 0).data(Qt.UserRole));
}
mimeTypesModel.checkedTypes = mimeTypesModel.checkedTypes
.filter(x => types.indexOf(x) === -1);
}
}
header: Kirigami.FormLayout {
ComboBox {
id: filterMode
Kirigami.FormData.label: i18nc("@label:listbox filter mode", "Files:")
model: [i18nc("@item:inlistbox filter mode", "Show all"), i18nc("@item:inlistbox filter mode", "Show matching"), i18nc("@item:inlistbox filter mode", "Hide matching")]
}
TextField {
id: filterPattern
Kirigami.FormData.label: i18nc("@label:textbox", "File name pattern:")
enabled: (filterMode.currentIndex > 0)
inputMethodHints: Qt.ImhNoPredictiveText
}
Kirigami.SearchField {
id: mimeFilter
Kirigami.FormData.label: i18nc("@label:textbox filter list by", "File types:")
enabled: (filterMode.currentIndex > 0)
}
CheckBox {
id: showHiddenFiles
Kirigami.FormData.label: i18nc("@option:check prefix", "Show hidden files:")
}
}
view: ListView {
id: mimeTypesView
clip: true
enabled: (filterMode.currentIndex > 0)
// Signal the delegates listen to when user presses space to toggle current row.
signal toggleCurrent()
model: filteredMimeTypesModel
property real columnSize: Kirigami.Units.gridUnit * 15
headerPositioning: ListView.OverlayHeader
Keys.onSpacePressed: toggleCurrent()
header: HorizontalHeaderView {
id: headerView
z: 9
implicitWidth: mimeTypesView.width
rowHeightProvider: function () {
return Kirigami.Units.gridUnit * 2
}
clip: true // This removes event handling blocking by the header
model: ListModel {
Component.onCompleted: {
append({ display: i18nc("@title:column", "File Type") });
append({ display: i18nc("@title:column", "Description") });
}
}
interactive: false
columnWidthProvider: function(column) {
if (column === 0) {
return mimeTypesView.columnSize;
} else {
return mimeTypesView.width - mimeTypesView.columnSize;
}
}
}
delegate: ItemDelegate {
id: delegate
width: mimeTypesView.width
required property string name
required property string comment
required property var decoration
contentItem: RowLayout {
Layout.fillWidth: true
Layout.preferredHeight: Kirigami.Units.iconSizes.small
RowLayout {
Layout.preferredWidth: mimeTypesView.columnSize
Layout.maximumWidth: mimeTypesView.columnSize
Layout.fillHeight: true
CheckBox {
Layout.fillHeight: true
checked: mimeTypesModel.checkedTypes.indexOf(delegate.name) >= 0
onToggled: {
let idx = mimeTypesModel.checkedTypes.indexOf(delegate.name);
if (idx >= 0) {
mimeTypesModel.checkedTypes.splice(idx, 1);
} else {
mimeTypesModel.checkedTypes.push(delegate.name)
}
}
}
Kirigami.Icon {
Layout.fillHeight: true
implicitWidth: Kirigami.Units.iconSizes.small
implicitHeight: Kirigami.Units.iconSizes.small
animated: false // TableView reuses delegates, avoid animation when sorting/filtering.
source: delegate.decoration
}
Label {
text: delegate.name
elide: Text.ElideRight
Layout.fillWidth: true
Layout.fillHeight: true
}
}
Label {
text: delegate.comment
elide: Text.ElideRight
Layout.fillWidth: true
Layout.fillHeight: true
}
}
}
}
footer: RowLayout {
id: selectLayout
Button {
id: selectAllButton
enabled: (filterMode.currentIndex > 0)
icon.name: "edit-select-all"
ToolTip.delay: Kirigami.Units.toolTipDelay
ToolTip.visible: (Kirigami.Settings.isMobile ? pressed : hovered) && ToolTip.text.length > 0
ToolTip.text: i18nc("@action:button tooltip only Select all filetypes", "Select All")
onClicked: filteredMimeTypesModel.checkFiltered()
}
Button {
id: deselectAllButton
enabled: (filterMode.currentIndex > 0)
icon.name: "edit-select-none"
ToolTip.delay: Kirigami.Units.toolTipDelay
ToolTip.visible: (Kirigami.Settings.isMobile ? pressed : hovered) && ToolTip.text.length > 0
ToolTip.text: i18nc("@action:button tooltip only Deselect all filetypes", "Deselect All")
onClicked: filteredMimeTypesModel.uncheckFiltered()
}
Button {
enabled: (filterMode.currentIndex > 0)
icon.name: filteredMimeTypesModel.sortOrder === Qt.AscendingOrder ? "view-sort-ascending-symbolic" : "view-sort-descending-symbolic"
ToolTip.delay: Kirigami.Units.toolTipDelay
ToolTip.visible: (Kirigami.Settings.isMobile ? pressed : hovered) && ToolTip.text.length > 0
ToolTip.text: i18nc("@action:button tooltip only, ascending/descending", "Switch Sort Order")
onClicked: {
filteredMimeTypesModel.sortOrder = filteredMimeTypesModel.sortOrder === Qt.AscendingOrder ? Qt.DescendingOrder : Qt.AscendingOrder;
filteredMimeTypesModel.sort(0, filteredMimeTypesModel.sortOrder);
}
}
Item {
Layout.fillWidth: true
}
}
}

View File

@@ -0,0 +1,358 @@
/*
SPDX-FileCopyrightText: 2014 Eike Hein <hein@kde.org>
SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de>
SPDX-License-Identifier: GPL-2.0-or-later
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import org.kde.plasma.plasmoid
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.extras as PlasmaExtras
import org.kde.iconthemes as KIconThemes
import org.kde.config // for KAuthorized
import org.kde.kirigami as Kirigami
import org.kde.kcmutils as KCM
KCM.SimpleKCM {
id: configIcons
property bool isPopup: (Plasmoid.location !== PlasmaCore.Types.Floating)
property string cfg_icon: Plasmoid.configuration.icon
property alias cfg_useCustomIcon: useCustomIcon.checked
property alias cfg_arrangement: arrangement.currentIndex
property alias cfg_alignment: alignment.currentIndex
property bool cfg_locked
property alias cfg_sortMode: sortMode.mode
property alias cfg_sortDesc: sortDesc.checked
property alias cfg_sortDirsFirst: sortDirsFirst.checked
property alias cfg_toolTips: toolTips.checked
property alias cfg_selectionMarkers: selectionMarkers.checked
property alias cfg_renameInline: renameInline.checked
property alias cfg_popups: popups.checked
property alias cfg_previews: previews.checked
property var cfg_previewPlugins
property alias cfg_viewMode: viewMode.currentIndex
property alias cfg_iconSize: iconSize.value
property alias cfg_labelWidth: labelWidth.currentIndex
property alias cfg_textLines: textLines.value
readonly property bool lockedByKiosk: !KAuthorized.authorize("editable_desktop_icons")
KIconThemes.IconDialog {
id: iconDialog
onIconNameChanged: iconName => configIcons.cfg_icon = iconName || "folder-symbolic";
}
Kirigami.FormLayout {
// Panel button
RowLayout {
spacing: Kirigami.Units.smallSpacing
visible: configIcons.isPopup
Kirigami.FormData.label: i18nc("@title:group prefix for checkbox + button", "Panel button:")
CheckBox {
id: useCustomIcon
visible: configIcons.isPopup
checked: configIcons.cfg_useCustomIcon
text: i18nc("@option:check", "Use a custom icon")
}
Button {
id: iconButton
Layout.minimumWidth: Kirigami.Units.iconSizes.large + Kirigami.Units.smallSpacing * 2
Layout.maximumWidth: Layout.minimumWidth
Layout.minimumHeight: Layout.minimumWidth
Layout.maximumHeight: Layout.minimumWidth
checkable: true
enabled: useCustomIcon.checked
onClicked: {
checked = Qt.binding(() =>
iconMenu.status === PlasmaExtras.Menu.Open);
iconMenu.open(0, height);
}
Kirigami.Icon {
anchors.centerIn: parent
width: Kirigami.Units.iconSizes.large
height: width
source: configIcons.cfg_icon
}
}
PlasmaExtras.Menu {
id: iconMenu
visualParent: iconButton
PlasmaExtras.MenuItem {
text: i18nc("@item:inmenu Open icon chooser dialog", "Choose…")
icon: "document-open-folder"
onClicked: iconDialog.open()
}
PlasmaExtras.MenuItem {
text: i18nc("@item:inmenu Reset icon to default", "Clear Icon")
icon: "edit-clear"
onClicked: configIcons.cfg_icon = "folder-symbolic";
}
}
}
Item {
visible: configIcons.isPopup
Kirigami.FormData.isSection: true
}
// Arrangement section
ComboBox {
id: arrangement
Layout.fillWidth: true
visible: !configIcons.isPopup || viewMode.currentIndex === 1 /* Icons mode */
Kirigami.FormData.label: i18nc("@label:listbox columns/rows", "Arrangement:")
model: [
i18nc("@item:inlistbox arrangement of icons", "In Columns"),
i18nc("@item:inlistbox arrangement of icons", "In Rows"),
]
}
ComboBox {
id: alignment
Layout.fillWidth: true
visible: !configIcons.isPopup || viewMode.currentIndex === 1 /* Icons mode */
Kirigami.FormData.label: i18nc("@label:listbox, LtR/RtL", "Sort Alignment:")
model: {
const ltrText = i18nc("@item:inlistbox alignment of icons", "Left-to-Right");
const rtlText = i18nc("@item:inlistbox alignment of icons", "Right-to-Left");
if (Application.layoutDirection === Qt.LeftToRight) {
return [ltrText, rtlText];
}
else {
return [rtlText, ltrText];
}
}
}
CheckBox {
id: locked
visible: ("containmentType" in Plasmoid)
checked: configIcons.cfg_locked || configIcons.lockedByKiosk
enabled: !configIcons.lockedByKiosk
onCheckedChanged: {
if (!configIcons.lockedByKiosk) {
configIcons.cfg_locked = checked;
}
}
text: i18nc("@option:check lock icon positions", "Lock in place")
}
Item {
Kirigami.FormData.isSection: true
visible: !configIcons.isPopup || viewMode.currentIndex === 1 /* Icons mode */
}
// Sorting section
ComboBox {
id: sortMode
Layout.fillWidth: true
Kirigami.FormData.label: i18nc("@label:listbox sort items by field", "Sort by:")
property int mode
// FIXME TODO HACK: This maps the combo box list model to the KDirModel::ModelColumns
// enum, which should be done in C++.
property var indexToMode: [-1, 0, 1, 6, 2]
property var modeToIndex: {'-1': '0', '0': '1', '1': '2', '6': '3', '2': '4'}
model: [i18nc("@item:inlistbox sort icons manually", "Manual"),
i18nc("@item:inlistbox sort icons by name", "Name"),
i18nc("@item:inlistbox sort icons by size", "Size"),
i18nc("@item:inlistbox sort icons by file type", "Type"),
i18nc("@item:inlistbox sort icons by date", "Date")]
Component.onCompleted: currentIndex = modeToIndex[mode]
onActivated: index => mode = indexToMode[index]
}
CheckBox {
id: sortDesc
enabled: sortMode.currentIndex !== 0
text: i18nc("@option:check sort icons in descending order", "Descending")
}
CheckBox {
id: sortDirsFirst
enabled: sortMode.currentIndex !== 0
text: i18nc("@option:check sort icons with folders first", "Folders first")
}
Item {
Kirigami.FormData.isSection: true
}
// View Mode section (only if we're a pop-up)
ComboBox {
id: viewMode
visible: configIcons.isPopup
Layout.fillWidth: true
Kirigami.FormData.label: i18nc("whether to use icon or list view", "View mode:")
model: [i18nc("@item:inlistbox show icons in a list", "List"),
i18nc("@item:inlistbox show icons in a grid", "Grid")]
}
// Size section
Slider {
id: iconSize
Layout.fillWidth: true
visible: !configIcons.isPopup || viewMode.currentIndex === 1 /* Icons mode */
Kirigami.FormData.label: i18nc("@label:slider", "Icon size:")
from: 0
to: 6
stepSize: 1
snapMode: Slider.SnapAlways
}
RowLayout {
Layout.fillWidth: true
Label {
Layout.alignment: Qt.AlignLeft
visible: !configIcons.isPopup || viewMode.currentIndex === 1 /* Icons mode */
text: i18nc("@item:inrange smallest icon size", "Small")
}
Item {
Layout.fillWidth: true
}
Label {
Layout.alignment: Qt.AlignRight
visible: !configIcons.isPopup || viewMode.currentIndex === 1 /* Icons mode */
text: i18nc("@item:inrange largest icon size", "Large")
}
}
ComboBox {
id: labelWidth
visible: !configIcons.isPopup || viewMode.currentIndex === 1 /* Icons mode */
Layout.fillWidth: true
Kirigami.FormData.label: i18nc("@label:listbox", "Label width:")
model: [
i18nc("@item:inlistbox how long a text label should be", "Narrow"),
i18nc("@item:inlistbox how long a text label should be", "Medium"),
i18nc("@item:inlistbox how long a text label should be", "Wide"),
]
}
SpinBox {
id: textLines
visible: !configIcons.isPopup || viewMode.currentIndex === 1 /* Icons mode */
Kirigami.FormData.label: i18nc("@label:spinbox", "Text lines:")
from: 1
to: 10
stepSize: 1
}
Item {
Kirigami.FormData.isSection: true
}
// Features section
CheckBox {
id: toolTips
Kirigami.FormData.label: i18nc("@title:group prefix for checkbox group", "When hovering over icons:")
text: i18nc("@option:check When hovering over icons…", "Show tooltips")
}
CheckBox {
id: selectionMarkers
visible: Application.styleHints.singleClickActivation
text: i18nc("@option:check When hovering over icons…", "Show selection markers")
}
CheckBox {
id: popups
visible: !configIcons.isPopup
text: i18nc("@option:check When hovering over icons…", "Show folder preview popups")
}
Item {
Kirigami.FormData.isSection: true
}
CheckBox {
id: renameInline
Kirigami.FormData.label: i18nc("@label prefix for checkbox", "Rename:")
visible: !selectionMarkers.visible
text: i18nc("@option:check", "Rename inline by clicking selected item's text")
}
Item {
Kirigami.FormData.isSection: true
visible: renameInline.visible
}
CheckBox {
id: previews
Kirigami.FormData.label: i18nc("@title:group prefix for checkbox and button", "Previews:")
text: i18nc("@option:check", "Show preview thumbnails")
}
Button {
id: previewSettings
Layout.fillWidth: true
icon.name: "configure"
text: i18nc("@action:button opens dialog", "Configure Preview Plugins…")
onClicked: {
const component = Qt.createComponent(Qt.resolvedUrl("FolderItemPreviewPluginsDialog.qml"));
component.incubateObject(configIcons.Window.window.contentItem, {
"previewPlugins": configIcons.cfg_previewPlugins,
}, Qt.Asynchronous);
component.destroy();
}
}
}
}

View File

@@ -0,0 +1,213 @@
/*
SPDX-FileCopyrightText: 2014 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import org.kde.plasma.plasmoid
import org.kde.kirigami as Kirigami
import org.kde.kcmutils as KCM
import org.kde.private.desktopcontainment.folder as Folder
KCM.SimpleKCM {
id: configLocation
property string cfg_url
property alias cfg_labelMode: labelMode.currentIndex
property alias cfg_labelText: labelText.text
property bool titleVisible: Plasmoid.containment != Plasmoid
onCfg_urlChanged: applyConfig()
function applyConfig(force) {
if (!force && locationGroup.checkedButton !== null) {
return;
}
if (cfg_url === "desktop:/") {
locationDesktop.checked = true;
locationCustomValue.text = "";
} else if (cfg_url === "activities:/current/") {
locationCurrentActivity.checked = true;
locationCustomValue.text = "";
} else {
var placeForUrl = placesModel.indexForUrl(cfg_url);
if (placeForUrl !== -1) {
locationPlaceValue.currentIndex = placeForUrl; // needs to happen before checking the radiobutton
locationPlace.checked = true;
locationCustomValue.text = "";
} else {
locationCustom.checked = true;
locationCustomValue.text = cfg_url;
}
}
locationPlaceValue.enabled = locationPlace.checked;
}
Folder.PlacesModel {
id: placesModel
showDesktopEntry: false
onPlacesChanged: configLocation.applyConfig(true)
}
ButtonGroup {
id: locationGroup
buttons: [locationDesktop, locationCurrentActivity, locationPlace, locationCustom]
onCheckedButtonChanged: {
if (checkedButton === locationDesktop) {
configLocation.cfg_url = "desktop:/";
} else if (checkedButton === locationCurrentActivity) {
configLocation.cfg_url = "activities:/current/";
}
}
}
Kirigami.FormLayout {
RadioButton {
id: locationDesktop
implicitHeight: locationCustomValue.implicitHeight
Kirigami.FormData.label: i18nc("@title:group form label for radiobutton group", "Show:")
text: i18nc("@option:radio", "Desktop folder")
}
RadioButton {
id: locationCurrentActivity
visible: placesModel.activityLinkingEnabled
implicitHeight: locationCustomValue.implicitHeight
text: i18nc("@option:radio", "Files linked to the current activity")
}
RowLayout {
Layout.fillWidth: true
spacing: Kirigami.Units.smallSpacing
RadioButton {
id: locationPlace
text: i18nc("@option:radio also label for combobox", "Places panel item:")
Layout.minimumWidth: Math.max(locationPlace.implicitWidth, locationCustom.implicitWidth, labelMode.implicitWidth)
onCheckedChanged: {
locationPlaceValue.enabled = checked;
}
}
ComboBox {
id: locationPlaceValue
Layout.fillWidth: true
model: placesModel
textRole: "display"
enabled: true
onEnabledChanged: {
if (enabled && currentIndex !== -1) {
configLocation.cfg_url = Folder.DesktopSchemeHelper.getDesktopUrl(placesModel.urlForIndex(currentIndex));
}
}
onActivated: index => {
configLocation.cfg_url = Folder.DesktopSchemeHelper.getDesktopUrl(placesModel.urlForIndex(index));
}
}
}
RowLayout {
Layout.fillWidth: true
spacing: Kirigami.Units.smallSpacing
RadioButton {
id: locationCustom
Layout.minimumWidth: Math.max(locationPlace.implicitWidth, locationCustom.implicitWidth, labelMode.implicitWidth)
text: i18nc("@option:radio also label for text field", "Custom location:")
}
TextField {
id: locationCustomValue
enabled: locationCustom.checked
Layout.fillWidth: true
placeholderText: i18nc("@info:placeholder custom location", "Type path or URL…")
inputMethodHints: Qt.ImhNoPredictiveText
onEnabledChanged: {
if (enabled && text !== "") {
configLocation.cfg_url = Folder.DesktopSchemeHelper.getDesktopUrl(text);
}
}
onTextChanged: {
if (enabled) {
configLocation.cfg_url = Folder.DesktopSchemeHelper.getDesktopUrl(text);
}
}
}
Button {
icon.name: "document-open"
enabled: locationCustom.checked
onClicked: {
directoryPicker.open();
}
}
Folder.DirectoryPicker {
id: directoryPicker
onUrlChanged: {
locationCustomValue.text = Folder.DesktopSchemeHelper.getDesktopUrl(url);
}
}
}
Item {
visible: configLocation.titleVisible
Kirigami.FormData.isSection: true
}
RowLayout {
Layout.fillWidth: true
spacing: Kirigami.Units.smallSpacing
visible: configLocation.titleVisible
Kirigami.FormData.label: i18nc("@label:textbox custom widget title", "Title:")
ComboBox {
id: labelMode
Layout.minimumWidth: Math.max(locationPlace.implicitWidth, locationCustom.implicitWidth, labelMode.implicitWidth)
visible: configLocation.titleVisible
model: [
i18nc("@item:inlistbox no title", "None"),
i18nc("@item:inlistbox default title", "Default"),
i18nc("@item:inlistbox full path as title", "Full path"),
i18nc("@item:inlistbox title from text input field", "Custom")
]
}
TextField {
id: labelText
Layout.fillWidth: true
enabled: (labelMode.currentIndex === 3)
placeholderText: i18nc("@info:placeholder custom window title", "Enter title…")
}
}
}
}

View File

@@ -0,0 +1,256 @@
/*
SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
import QtQuick
import QtQuick.Layouts
import org.kde.plasma.core as PlasmaCore
import org.kde.kirigami as Kirigami
import org.kde.ksvg as KSvg
import org.kde.plasma.private.containmentlayoutmanager as ContainmentLayoutManager
ContainmentLayoutManager.ConfigOverlayWithHandles {
id: overlay
SequentialAnimation {
id: removeAnim
NumberAnimation {
target: overlay.itemContainer
property: "scale"
from: 1
to: 0
duration: Kirigami.Units.longDuration
easing.type: Easing.InOutQuad
}
ScriptAction {
script: {
appletContainer.applet.plasmoid.internalAction("remove").trigger();
appletContainer.editMode = false;
}
}
}
KSvg.FrameSvgItem {
id: frame
anchors.verticalCenter: parent.verticalCenter
anchors.verticalCenterOffset: {
let heightDifference = Math.round((frame.height - overlay.height) / 2)
if (heightDifference > 0) {
if (heightDifference > overlay.topAvailableSpace) {
return heightDifference - overlay.topAvailableSpace
}
if (heightDifference > overlay.bottomAvailableSpace) {
return overlay.bottomAvailableSpace - heightDifference
}
}
return 0
}
x: overlay.rightAvailableSpace > width + Kirigami.Units.gridUnit
? parent.width + Kirigami.Units.gridUnit
: -width - Kirigami.Units.gridUnit
// This MouseArea is used to block input between the applet and the handle, to not make it steal by other applets
MouseArea {
anchors {
top: parent.top
bottom: parent.bottom
}
z: -1
x: overlay.rightAvailableSpace > parent.width + Kirigami.Units.gridUnit ? -Kirigami.Units.gridUnit : 0
width: Kirigami.Units.gridUnit + parent.width
hoverEnabled: true
}
transform: Translate {
x: overlay.open ? 0 : (overlay.rightAvailableSpace > frame.width + Kirigami.Units.gridUnit ? -frame.width : frame.width)
Behavior on x {
NumberAnimation {
duration: Kirigami.Units.longDuration
easing.type: Easing.InOutQuad
}
}
}
width: layout.implicitWidth + margins.left + margins.right
height: Math.max(layout.implicitHeight + margins.top + margins.bottom, parent.height)
imagePath: "widgets/background"
ColumnLayout {
id: layout
anchors {
fill: parent
topMargin: parent.margins.top
leftMargin: parent.margins.left
bottomMargin: parent.margins.bottom
rightMargin: parent.margins.right
}
ActionButton {
id: rotateButton
icon.name: "object-rotate-left-symbolic"
toolTip: !rotateHandle.pressed ? i18nc("@action:button tooltip rotate widget", "Click and drag to rotate") : ""
action: applet ? applet.plasmoid.internalAction("rotate") : null
down: rotateHandle.pressed
Component.onCompleted: {
if (action !== null) {
action.enabled = true;
}
}
MouseArea {
id: rotateHandle
anchors.fill: parent
property int startRotation
property real startCenterRelativeAngle
function pointAngle(pos: point): real {
var r = Math.sqrt(pos.x * pos.x + pos.y * pos.y);
var cosine = pos.x / r;
if (pos.y >= 0) {
return Math.acos(cosine) * (180/Math.PI);
} else {
return -Math.acos(cosine) * (180/Math.PI);
}
}
function centerRelativePos(x: real, y: real): point {
var mousePos = overlay.itemContainer.parent.mapFromItem(rotateButton, x, y);
var centerPos = overlay.itemContainer.parent.mapFromItem(overlay.itemContainer, overlay.itemContainer.width/2, overlay.itemContainer.height/2);
mousePos.x -= centerPos.x;
mousePos.y -= centerPos.y;
return mousePos;
}
onPressed: mouse => {
mouse.accepted = true;
startRotation = overlay.itemContainer.rotation;
startCenterRelativeAngle = pointAngle(centerRelativePos(mouse.x, mouse.y));
}
onPositionChanged: mouse => {
var rot = startRotation % 360;
var snap = 4;
var newRotation = Math.round(pointAngle(centerRelativePos(mouse.x, mouse.y)) - startCenterRelativeAngle + startRotation);
if (newRotation < 0) {
newRotation = newRotation + 360;
} else if (newRotation >= 360) {
newRotation = newRotation % 360;
}
snapIt(0);
snapIt(90);
snapIt(180);
snapIt(270);
function snapIt(snapTo) {
if (newRotation > (snapTo - snap) && newRotation < (snapTo + snap)) {
newRotation = snapTo;
}
}
overlay.itemContainer.rotation = newRotation;
}
onReleased: mouse => {
// save rotation
overlay.itemContainer.layout.save();
}
}
}
ActionButton {
icon.name: "configure"
visible: qAction && qAction.enabled && (applet && applet.plasmoid.hasConfigurationInterface)
qAction: applet ? applet.plasmoid.internalAction("configure") : null
Component.onCompleted: {
if (qAction) {
qAction.enabled = true;
}
}
}
ActionButton {
icon.name: "show-background"
toolTip: checked ? i18nc("@action:button tooltip hide widget background", "Hide Background") : i18nc("@action:button tooltip", "Show Background")
visible: (applet.plasmoid.backgroundHints & PlasmaCore.Types.ConfigurableBackground)
checked: applet.plasmoid.effectiveBackgroundHints & PlasmaCore.Types.StandardBackground || applet.plasmoid.effectiveBackgroundHints & PlasmaCore.Types.TranslucentBackground
checkable: true
onClicked: {
if (checked) {
if (applet.plasmoid.backgroundHints & PlasmaCore.Types.StandardBackground || applet.plasmoid.backgroundHints & PlasmaCore.Types.TranslucentBackground) {
applet.plasmoid.userBackgroundHints = applet.plasmoid.backgroundHints;
} else {
applet.plasmoid.userBackgroundHints = PlasmaCore.Types.StandardBackground;
}
} else {
if (applet.plasmoid.backgroundHints & PlasmaCore.Types.ShadowBackground || applet.plasmoid.backgroundHints & PlasmaCore.Types.NoBackground) {
applet.plasmoid.userBackgroundHints = applet.plasmoid.backgroundHints;
} else {
applet.plasmoid.userBackgroundHints = PlasmaCore.Types.ShadowBackground;
}
}
}
}
MouseArea {
drag.target: overlay.itemContainer
Layout.minimumHeight: Kirigami.Units.gridUnit * 3
Layout.fillHeight: true
Layout.fillWidth: true
cursorShape: containsPress ? Qt.DragMoveCursor : Qt.OpenHandCursor
hoverEnabled: true
onPressed: mouse => {
overlay.itemContainer.layout.releaseSpace(overlay.itemContainer);
}
onPositionChanged: mouse => {
if (!pressed) {
return;
}
overlay.itemContainer.layout.showPlaceHolderForItem(overlay.itemContainer);
var dragPos = mapToItem(overlay.itemContainer, mouse.x, mouse.y);
overlay.itemContainer.userDrag(Qt.point(overlay.itemContainer.x, overlay.itemContainer.y), dragPos);
}
onReleased: mouse => {
overlay.itemContainer.layout.hidePlaceHolder();
overlay.itemContainer.layout.positionItem(overlay.itemContainer);
}
}
ActionButton {
id: closeButton
icon.name: "edit-delete-remove"
toolTip: i18nc("@action:button tooltip remove widget", "Remove")
visible: {
if (!applet) {
return false;
}
var a = applet.plasmoid.internalAction("remove");
return a && a.enabled || false;
}
// we don't set action, since we want to catch the button click,
// animate, and then trigger the "remove" action
// Triggering the action is handled in the overlay.itemContainer, we just
// Q_EMIT a signal here to avoid the applet-gets-removed-before-we-
// can-animate it race condition.
onClicked: {
removeAnim.restart();
}
Component.onCompleted: {
var a = applet.plasmoid.internalAction("remove");
if (a) {
a.enabled = true;
}
}
}
}
}
}

View File

@@ -0,0 +1,77 @@
/*
SPDX-FileCopyrightText: 2014 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
import QtQuick
import org.kde.plasma.plasmoid
import org.kde.kirigami as Kirigami
import org.kde.ksvg as KSvg
KSvg.SvgItem {
id: actionButton
width: {
if (!visible) {
return 0;
}
switch (Plasmoid.configuration.iconSize) {
case 0: return Kirigami.Units.iconSizes.small;
case 1: return Kirigami.Units.iconSizes.small;
case 2: return Kirigami.Units.iconSizes.smallMedium;
case 3: return Kirigami.Units.iconSizes.smallMedium;
case 4: return Kirigami.Units.iconSizes.smallMedium;
case 5: return Kirigami.Units.iconSizes.medium;
case 6: return Kirigami.Units.iconSizes.large;
default: return Kirigami.Units.iconSizes.small;
}
}
height: width
signal clicked()
property string element
svg: KSvg.Svg {
imagePath: "widgets/action-overlays"
multipleImages: true
size: Qt.size(16, 16)
}
elementId: element + "-normal"
Behavior on opacity {
NumberAnimation { duration: Kirigami.Units.shortDuration }
}
MouseArea {
id: actionButtonMouseArea
anchors.fill: actionButton
acceptedButtons: Qt.LeftButton
hoverEnabled: true
onClicked: mouse => actionButton.clicked()
states: [
State {
name: "hover"
when: actionButtonMouseArea.containsMouse && !actionButtonMouseArea.pressed
PropertyChanges {
actionButton.elementId: actionButton.element + "-hover"
}
},
State {
name: "pressed"
when: actionButtonMouseArea.pressed
PropertyChanges {
actionButton.elementId: actionButton.element + "-pressed"
}
}
]
}
}

View File

@@ -0,0 +1,489 @@
/*
SPDX-FileCopyrightText: 2014-2015 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Window
import Qt5Compat.GraphicalEffects
import org.kde.plasma.plasmoid
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.extras as PlasmaExtras
import org.kde.kirigami as Kirigami
import org.kde.private.desktopcontainment.folder as Folder
Item {
id: main
required property var model
property int index: model.index
property string name: model.blank ? "" : model.display
property string nameWrapped: model.blank ? "" : model.displayWrapped
property bool blank: model.blank
property bool selected: model.blank ? false : model.selected
property bool isDir: loader.item ? loader.item.isDir : false
property bool isOnRootView: false
property /*FolderViewDialog*/ Folder.SubDialog popupDialog: loader.item ? loader.item.popupDialog : null
property Item iconArea: loader.item ? loader.item.iconArea : null
property Item label: loader.item ? loader.item.label : null
property Item labelArea: loader.item ? loader.item.labelArea : null
property Item actionsOverlay: loader.item ? loader.item.actionsOverlay : null
property Item hoverArea: loader.item ? loader.item.hoverArea : null
property Item frame: loader.item ? loader.item.frame : null
property PlasmaCore.ToolTipArea toolTip: loader.item ? loader.item.toolTip : null
property real contentHeight: loader.item && !root.useListViewMode ? loader.item.contentHeight : null
Accessible.name: name
Accessible.role: Accessible.Canvas
// This MouseArea exists to intercept press and hold; preventing edit mode
// from being triggered when pressing and holding on an icon (if there is one).
MouseArea {
anchors.fill: parent
visible: !main.blank
}
function openPopup() {
if (isDir) {
loader.item.openPopup();
}
}
function closePopup() {
if (popupDialog && popupDialog.allowClosing) {
(popupDialog as FolderViewDialog).requestDestroy();
loader.item.popupDialog = null;
}
}
Loader {
id: loader
// On the desktop we pad our cellSize to avoid a gap at the right/bottom of the screen.
// The padding per item is quite small and causes the delegate to be positioned on fractional pixels
// leading to blurry rendering. The Loader is offset to account for this.
x: -main.x % 1
y: -main.y % 1
width: parent.width
height: parent.height
visible: status === Loader.Ready
active: !main.model.blank
sourceComponent: delegateImplementation
asynchronous: true
}
function updateDragImage() {
if (selected && !blank) {
loader.grabToImage(result => {
dir.addItemDragImage(positioner.map(index), main.x + loader.x, main.y + loader.y, loader.width, loader.height, result.image);
});
}
}
Component {
id: delegateImplementation
Item {
id: impl
anchors.fill: parent
property bool blank: main.model.blank
property bool isDir: main.model.blank ? false : main.model.isDir
property bool hovered: (main.GridView.view.hoveredItem === main)
property /*FolderViewDialog*/ Folder.SubDialog popupDialog: null
property Item iconArea: icon
property Item label: label
property Item labelArea: label
property Item actionsOverlay: actions
property Item hoverArea: toolTip
property Item frame: frameLoader
property alias toolTip: toolTip
property Item selectionButton: selectionButtonComponent.createObject(actions) as FolderItemActionButton
property Item popupButton: null
property int contentHeight: frameLoader.height + frameLoader.y * 2
readonly property bool iconAndLabelsShouldlookSelected: impl.hovered
Connections {
target: main.model
function onSelectedChanged() {
if (dir.usedByContainment && main.model.selected) {
gridView.currentIndex = main.model.index;
}
}
}
onHoveredChanged: {
if (hovered) {
if (Plasmoid.configuration.selectionMarkers && Application.styleHints.singleClickActivation) {
selectionButton.visible = true;
}
if (main.model.isDir) {
if (!main.GridView.view.isRootView || root.containsDrag) {
hoverActivateTimer.restart();
}
if (Plasmoid.configuration.popups && !root.useListViewMode) {
popupButton = popupButtonComponent.createObject(actions);
}
}
} else if (!hovered) {
if (popupDialog != null) {
main.closePopup();
}
selectionButton.visible = false;
if (popupButton) {
popupButton.destroy();
popupButton = null;
}
}
}
function openPopup() {
if (folderViewDialogComponent.status === Component.Ready) {
impl.popupDialog = folderViewDialogComponent.createObject(impl);
impl.popupDialog.visualParent = icon;
impl.popupDialog.url = Folder.DesktopSchemeHelper.getDesktopUrl(main.model.linkDestinationUrl);
impl.popupDialog.visible = true;
}
}
PlasmaCore.ToolTipArea {
id: toolTip
anchors.fill: impl
active: (Plasmoid.configuration.toolTips || label.truncated)
&& impl.popupDialog === null
&& !main.model.blank
interactive: false
location: root.useListViewMode ? (Plasmoid.location === PlasmaCore.Types.LeftEdge ? PlasmaCore.Types.LeftEdge : PlasmaCore.Types.RightEdge) : Plasmoid.location
onContainsMouseChanged: {
if (containsMouse && !main.model.blank) {
if (toolTip.active) {
toolTip.icon = main.model.decoration;
toolTip.mainText = main.model.display;
if (main.model.size !== undefined) {
toolTip.subText = main.model.type + "\n" + main.model.size;
} else {
toolTip.subText = main.model.type;
}
}
Qt.callLater(() => {
// Workaround for Qt Bug: https://bugreports.qt.io/browse/QTBUG-117444
// In some cases the signal order is reversed:
// - first it's delivered to the new object with "true" value
// - next it's delivered to the old object with "false" value
// In this case when the signal is emitted with "false" (to the old object),
// it's also delivered to the "FolderView" which sets the "hoveredItem" to
// "null" right after we set it here.
// The solution is to call later and check again to make sure if we still contains
// mouse and next set the "hoveredItem". In this approach the "FolderView" sets the
// old "hoveredItem" to "null" and next we set it to the new item here.
if (containsMouse && !main.model.blank) {
main.GridView.view.hoveredItem = main;
}
})
}
}
states: [
State { // icon view
when: !root.useListViewMode
AnchorChanges {
target: toolTip
anchors.horizontalCenter: parent.horizontalCenter
}
PropertyChanges {
toolTip.y: frameLoader.y + icon.y
toolTip.width: Math.max(icon.paintedWidth, label.paintedWidth)
toolTip.height: (label.y + label.paintedHeight) - y
}
},
State { // list view
when: root.useListViewMode
AnchorChanges {
target: toolTip
anchors.horizontalCenter: undefined
}
PropertyChanges {
toolTip.x: frameLoader.x
toolTip.y: frameLoader.y
toolTip.width: frameLoader.width
toolTip.height: frameLoader.height
}
}
]
}
Loader {
id: frameLoader
x: root.useListViewMode ? 0 : Kirigami.Units.smallSpacing
y: root.useListViewMode ? 0 : Kirigami.Units.smallSpacing
property Item iconShadow: null
property string prefix: ""
sourceComponent: frameComponent
active: impl.iconAndLabelsShouldlookSelected || (main.model?.selected ?? false)
asynchronous: true
width: {
if (root.useListViewMode) {
if (main.GridView.view.overflowing) {
return parent.width - Kirigami.Units.smallSpacing;
} else {
return parent.width;
}
}
return parent.width - (Kirigami.Units.smallSpacing * 2);
}
height: root.useListViewMode
? parent.height
// the smallSpacings are for padding
: icon.height + label.implicitHeight + (Kirigami.Units.smallSpacing * 3)
Kirigami.Icon {
id: icon
z: 2
states: [
State { // icon view
when: !root.useListViewMode
AnchorChanges {
target: icon
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
}
},
State { // list view
when: root.useListViewMode
AnchorChanges {
target: icon
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
}
}
]
anchors {
topMargin: Kirigami.Units.smallSpacing
leftMargin: Kirigami.Units.smallSpacing
}
width: root.useListViewMode ? main.GridView.view.iconSize : (parent.width - 2 * Kirigami.Units.smallSpacing)
height: main.GridView.view.iconSize
opacity: {
if (root.useListViewMode && impl.selectionButton.visible) {
return 0.3;
}
if (main.model.isHidden) {
return 0.6;
}
return 1.0;
}
animated: false
source: main.model.decoration
}
PlasmaExtras.ShadowedLabel {
id: label
readonly property bool renaming: (editor && editor.targetItem === main)
z: 2 // So it's always above the highlight effect
states: [
State { // icon view
when: !root.useListViewMode
AnchorChanges {
target: label
anchors.top: icon.bottom
anchors.horizontalCenter: parent.horizontalCenter
}
PropertyChanges {
label.anchors.topMargin: Kirigami.Units.smallSpacing
label.width: label.parent.width - Kirigami.Units.smallSpacing
label.maximumLineCount: label.Plasmoid.configuration.textLines
label.horizontalAlignment: Text.AlignHCenter
}
},
State { // list view
when: root.useListViewMode
AnchorChanges {
target: label
anchors.left: icon.right
anchors.verticalCenter: parent.verticalCenter
}
PropertyChanges {
label.anchors.leftMargin: Kirigami.Units.smallSpacing * 2
label.anchors.rightMargin: Kirigami.Units.smallSpacing * 2
label.width: label.parent.width - icon.width - (Kirigami.Units.smallSpacing * 4)
label.maximumLineCount: 1
label.horizontalAlignment: Text.AlignLeft
}
}
]
color: {
if (main.isOnRootView) {
// In this situation there's a shadow or a background rect, both of which are always black
return "white";
}
if (main.model.selected) {
return Kirigami.Theme.highlightedTextColor;
}
return Kirigami.Theme.textColor;
}
visible: !renaming
renderShadow: main.isOnRootView && !renaming
opacity: main.model.isHidden ? 0.6 : 1
text: main.nameWrapped
font.italic: (main.model?.isLink ?? false)
wrapMode: (maximumLineCount === 1) ? Text.NoWrap : Text.Wrap
horizontalAlignment: Text.AlignHCenter
}
Component {
id: frameComponent
PlasmaExtras.Highlight {
// Workaround for a bug where the frameComponent does not
// get unloaded when items are dragged to a different
// place on the desktop.
visible: this === frameLoader.item
hovered: impl.iconAndLabelsShouldlookSelected
pressed: main.model.selected
active: Window.active
}
}
Component {
id: selectionButtonComponent
FolderItemActionButton {
element: main.model.selected ? "remove" : "add"
onClicked: {
dir.toggleSelected(positioner.map(main.index));
main.GridView.view.currentIndex = main.index;
}
}
}
Component {
id: popupButtonComponent
FolderItemActionButton {
visible: main.GridView.view.isRootView && (impl.popupDialog == null)
element: "open"
onClicked: {
dir.setSelected(positioner.map(main.index));
main.GridView.view.currentIndex = main.index;
main.openPopup();
}
}
}
Component {
id: iconShadowComponent
DropShadow {
anchors.fill: icon
z: 1
verticalOffset: 1
radius: 5.0
samples: radius * 2 + 1
spread: 0.05
color: "black"
opacity: main.model.isHidden ? 0.3 : 0.6
source: icon
}
}
}
Column {
id: actions
visible: {
if (main.GridView.view.isRootView && root.containsDrag) {
return false;
}
if (!main.GridView.view.isRootView && main.GridView.view.dialog && main.GridView.view.dialog.containsDrag) {
return false;
}
if (main.popupDialog) {
return false;
}
return true;
}
anchors {
left: frameLoader.left
top: frameLoader.top
leftMargin: root.useListViewMode ? (icon.x + (icon.width / 2)) - (width / 2) : 0
topMargin: root.useListViewMode ? (icon.y + (icon.height / 2)) - (height / 2) : 0
}
width: implicitWidth
height: implicitHeight
}
Component.onCompleted: {
selectionButton.visible = false;
if (Plasmoid.isContainment && main.GridView.view.isRootView && root.GraphicsInfo.api === GraphicsInfo.OpenGL) {
frameLoader.iconShadow = iconShadowComponent.createObject(frameLoader);
}
}
}
}
}

View File

@@ -0,0 +1,53 @@
/*
SPDX-FileCopyrightText: 2014 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
import QtQuick
import QtQuick.Controls
import org.kde.private.desktopcontainment.folder as Folder
import org.kde.kirigami as Kirigami
Kirigami.Dialog {
id: dialog
required property var previewPlugins
title: i18nc("@title:window", "Preview Plugins")
preferredWidth: Kirigami.Units.gridUnit * 15
implicitHeight: Math.round(parent.height * 0.8)
standardButtons: Kirigami.Dialog.Ok | Kirigami.Dialog.Cancel
onAccepted: {
configIcons.cfg_previewPlugins = previewPluginsModel.checkedPlugins;
dialog.close();
}
onRejected: {
dialog.close();
destroy();
}
onClosed: destroy()
ListView {
model: Folder.PreviewPluginsModel {
id: previewPluginsModel
}
delegate: CheckDelegate {
required property var model // for display, which shadows a delegate property
required checked
width: ListView.view.width
text: model.display
onToggled: model.checked = checked;
}
}
Component.onCompleted: {
previewPluginsModel.checkedPlugins = dialog.previewPlugins;
open();
}
}

View File

@@ -0,0 +1,129 @@
/*
SPDX-FileCopyrightText: 2014-2015 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.plasma.plasmoid
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.extras as PlasmaExtras
import org.kde.kirigami as Kirigami
import org.kde.private.desktopcontainment.folder as Folder
Folder.SubDialog {
id: dialog
visible: false
property bool containsDrag: {
if (folderViewDropArea.containsDrag) {
return true;
}
if (folderView.hoveredItem && folderView.hoveredItem.popupDialog) {
return folderView.hoveredItem.popupDialog.containsDrag;
}
return false;
}
property QtObject closeTimer: closeTimer
property QtObject childDialog: (folderView.hoveredItem !== null) ? folderView.hoveredItem.popupDialog : null
property bool containsMouse: folderView.containsMouse || (childDialog !== null && childDialog.containsMouse)
property alias url: folderView.url
location: PlasmaCore.Types.Floating
hideOnWindowDeactivate: (allowClosing && (childDialog === null))
onContainsMouseChanged: {
if (containsMouse) {
closeTimer.stop();
} else {
closeTimer.start();
}
}
mainItem: FolderViewDropArea {
id: folderViewDropArea
width: folderView.cellWidth * 3 + Kirigami.Units.gridUnit // FIXME HACK: Use actual scrollbar width.
height: folderView.cellHeight * 2
folderView: folderView
FolderView {
id: folderView
anchors.fill: parent
isRootView: false
dialog: dialog
locked: true
sortMode: ((Plasmoid.configuration.sortMode === 0) ? 1 : Plasmoid.configuration.sortMode)
filterMode: 0
// TODO: Bidi.
flow: GridView.FlowLeftToRight
layoutDirection: Qt.LeftToRight
onDragInProgressAnywhereChanged: {
if (!dragInProgressAnywhere && !dialog.visible) {
dialog.destroy();
}
}
onCreatingNewItemsChanged: {
dialog.allowClosing = !creatingNewItems;
}
}
Loader {
anchors.centerIn: parent
width: parent.width - (Kirigami.Units.gridUnit * 4)
active: folderView.view.count === 0
sourceComponent: PlasmaExtras.PlaceholderMessage {
text: i18nc("@info:placeholder", "Folder is empty")
}
}
}
data: [
Timer {
id: closeTimer
interval: Kirigami.Units.humanMoment
onTriggered: {
if (dialog.childDialog !== null) {
dialog.childDialog.closeTimer.stop();
dialog.childDialog.visible = false;
}
dialog.visible = false;
dialog.delayedDestroy();
}
}
]
function requestDestroy() {
if (folderView.dragInProgressAnywhere) {
visible = false;
} else {
destroy();
}
}
function delayedDestroy() {
Qt.callLater(() => itemDialog.destroy());
}
Component.onDestruction: {
closeTimer.stop();
}
}

View File

@@ -0,0 +1,60 @@
/*
SPDX-FileCopyrightText: 2014-2017 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
import QtQuick
import org.kde.draganddrop as DragDrop
import org.kde.kirigami as Kirigami
DragDrop.DropArea {
id: dropArea
property FolderView folderView: null
function handleDragMove(folderView, pos) {
// Trigger autoscroll.
folderView.scrollLeft = (pos.x < (Kirigami.Units.gridUnit * 3));
folderView.scrollRight = (pos.x > width - (Kirigami.Units.gridUnit * 3));
folderView.scrollUp = (pos.y < (Kirigami.Units.gridUnit * 3));
folderView.scrollDown = (pos.y > height - (Kirigami.Units.gridUnit * 3));
folderView.handleDragMove(pos.x, pos.y);
}
function handleDragEnd(folderView) {
// Cancel autoscroll.
folderView.scrollLeft = false;
folderView.scrollRight = false;
folderView.scrollUp = false;
folderView.scrollDown = false;
folderView.endDragMove();
}
onDragMove: event => {
// TODO: We should reject drag moves onto file items that don't accept drops
// (cf. QAbstractItemModel::flags() here, but DeclarativeDropArea currently
// is currently incapable of rejecting drag events.
if (folderView) {
handleDragMove(folderView, mapToItem(folderView, event.x, event.y));
}
}
onDragLeave: event => {
if (folderView) {
handleDragEnd(folderView);
}
}
onDrop: event => {
if (folderView) {
handleDragEnd(folderView);
folderView.drop(folderView, event, mapToItem(folderView, event.x, event.y));
}
}
}

View File

@@ -0,0 +1,385 @@
/*
SPDX-FileCopyrightText: 2014-2015 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
pragma ComponentBehavior: Bound
import QtQuick
import QtQml
import org.kde.plasma.plasmoid
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.components as PlasmaComponents
import org.kde.config // for KAuthorized
import org.kde.kirigami as Kirigami
import org.kde.private.desktopcontainment.folder as Folder
FocusScope {
id: folderViewLayerComponent
// these need to be passed in from main, but required properties with Loaders are awkward
/*required*/ property bool isPopup
/*required*/ property bool useListViewMode
property var sharedActions: ["newMenu", "paste", "undo", "emptyTrash"]
property Component folderViewDialogComponent: Qt.createComponent("FolderViewDialog.qml", Qt.Asynchronous, root)
property FolderView view: folderView
property Item label: null
property int labelHeight: Kirigami.Units.iconSizes.sizeForLabels + (Kirigami.Units.smallSpacing * 2)
property alias model: folderView.model
property alias overflowing: folderView.overflowing
property alias flow: folderView.flow
readonly property bool lockedByKiosk: !KAuthorized.authorize("editable_desktop_icons")
focus: true
function updateContextualActions() {
folderView.model.updateActions();
for (let i = 0, len = sharedActions.length; i < len; i++) {
const actionName = sharedActions[i];
const appletAction = Plasmoid.internalAction(actionName);
if (appletAction) {
modelAction = folderView.model.action(actionName);
appletAction.text = modelAction.text;
appletAction.enabled = modelAction.enabled;
appletAction.visible = modelAction.visible;
}
}
}
function cancelRename() {
folderView.cancelRename();
}
function goHome() {
if (folderView.url !== Plasmoid.configuration.url) {
folderView.url = Qt.binding(() => Plasmoid.configuration.url);
folderView.history = [];
folderView.historyChanged();
}
}
Binding {
target: Plasmoid
property: "title"
value: labelGenerator.displayLabel
restoreMode: Binding.RestoreBinding
}
Folder.LabelGenerator {
id: labelGenerator
folderModel: folderView.model
rtl: (Application.layoutDirection === Qt.RightToLeft)
labelMode: Plasmoid.configuration.labelMode || (Plasmoid.isContainment ? 0 : 1)
labelText: Plasmoid.configuration.labelText
}
Folder.ViewPropertiesMenu {
id: viewPropertiesMenu
showLayoutActions: !folderViewLayerComponent.isPopup
showLockAction: Plasmoid.isContainment
showIconSizeActions: !folderViewLayerComponent.useListViewMode
lockedEnabled: !folderViewLayerComponent.lockedByKiosk
onArrangementChanged: {
Plasmoid.configuration.arrangement = arrangement;
}
onAlignmentChanged: {
Plasmoid.configuration.alignment = alignment;
}
onPreviewsChanged: {
Plasmoid.configuration.previews = previews;
}
onLockedChanged: {
if (!folderViewLayerComponent.lockedByKiosk) {
Plasmoid.configuration.locked = locked;
}
}
onSortModeChanged: {
Plasmoid.configuration.sortMode = sortMode;
}
onSortDescChanged: {
Plasmoid.configuration.sortDesc = sortDesc;
}
onSortDirsFirstChanged: {
Plasmoid.configuration.sortDirsFirst = sortDirsFirst;
}
onIconSizeChanged: {
Plasmoid.configuration.iconSize = iconSize;
}
Component.onCompleted: {
arrangement = Plasmoid.configuration.arrangement;
alignment = Plasmoid.configuration.alignment;
previews = Plasmoid.configuration.previews;
locked = Plasmoid.configuration.locked || folderViewLayerComponent.lockedByKiosk;
sortMode = Plasmoid.configuration.sortMode;
sortDesc = Plasmoid.configuration.sortDesc;
sortDirsFirst = Plasmoid.configuration.sortDirsFirst;
iconSize = Plasmoid.configuration.iconSize;
}
}
PlasmaComponents.Label {
anchors.fill: parent
text: folderView.errorString
textFormat: Text.PlainText
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.Wrap
}
Connections {
target: root
function onExpandedChanged() {
if (folderViewLayerComponent.isPopup) {
if (root.expanded) {
folderView.currentIndex = -1;
folderView.forceActiveFocus();
folderView.positionViewAtBeginning();
} else {
folderViewLayerComponent.goHome();
folderView.currentIndex = -1;
folderView.model.clearSelection();
folderView.cancelRename();
}
}
}
}
Connections {
target: Plasmoid.configuration
function onArrangementChanged() {
viewPropertiesMenu.arrangement = Plasmoid.configuration.arrangement;
}
function onAlignmentChanged() {
viewPropertiesMenu.alignment = Plasmoid.configuration.alignment;
}
function onLockedChanged() {
viewPropertiesMenu.locked = Plasmoid.configuration.locked;
}
function onSortModeChanged() {
folderView.sortMode = Plasmoid.configuration.sortMode;
viewPropertiesMenu.sortMode = Plasmoid.configuration.sortMode;
}
function onSortDescChanged() {
viewPropertiesMenu.sortDesc = Plasmoid.configuration.sortDesc;
}
function onSortDirsFirstChanged() {
viewPropertiesMenu.sortDirsFirst = Plasmoid.configuration.sortDirsFirst;
}
function onIconSizeChanged() {
viewPropertiesMenu.iconSize = Plasmoid.configuration.iconSize;
}
}
FolderView {
id: folderView
anchors.left: parent.left
anchors.top: parent.top
anchors.topMargin: folderViewLayerComponent.label !== null ? folderViewLayerComponent.label.height : 0
anchors.right: parent.right
anchors.bottom: parent.bottom
focus: true
isRootView: Plasmoid.isContainment
positionerApplet: Plasmoid
url: Plasmoid.configuration.url
locked: (Plasmoid.configuration.locked || !Plasmoid.isContainment || folderViewLayerComponent.lockedByKiosk)
filterMode: Plasmoid.configuration.filterMode
filterPattern: Plasmoid.configuration.filterPattern
filterMimeTypes: Plasmoid.configuration.filterMimeTypes
showHiddenFiles: Plasmoid.configuration.showHiddenFiles
flow: (Plasmoid.configuration.arrangement === 0) ? GridView.FlowLeftToRight : GridView.FlowTopToBottom
layoutDirection: (Plasmoid.configuration.alignment === 0) ? Qt.LeftToRight : Qt.RightToLeft
onSortModeChanged: {
Plasmoid.configuration.sortMode = sortMode;
}
Component.onCompleted: {
folderView.sortMode = Plasmoid.configuration.sortMode;
}
}
Component {
id: labelComponent
Item {
id: label
// If we bind height to visible, it will be invisible initially (since "visible"
// propagates recursively) and that confuses the Label, hence the temp property.
readonly property bool active: (Plasmoid.configuration.labelMode !== 0)
readonly property bool showPin: folderViewLayerComponent.isPopup && root.compactRepresentationItem && root.compactRepresentationItem.visible
width: parent.width
height: active ? folderViewLayerComponent.labelHeight : 0
visible: active
property Item windowPin: null
property Item homeButton: null
onVisibleChanged: {
if (folderViewLayerComponent.isPopup && !visible) {
root.hideOnWindowDeactivate = true;
}
}
onShowPinChanged: {
if (!windowPin && showPin) {
windowPin = windowPinComponent.createObject(label);
} else if (windowPin) {
windowPin.destroy();
windowPin = null;
}
}
Connections {
target: folderView
function onUrlChanged() {
if (!label.homeButton && folderView.url !== Plasmoid.configuration.url) {
label.homeButton = homeButtonComponent.createObject(label);
} else if (label.homeButton && folderView.url === Plasmoid.configuration.url) {
label.homeButton.destroy();
}
}
}
PlasmaComponents.Label {
id: text
anchors {
left: label.homeButton ? label.homeButton.right : parent.left
right: label.windowPin ? label.windowPin.left : parent.right
margins: Kirigami.Units.smallSpacing
}
height: parent.height
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignTop
elide: Text.ElideMiddle
text: labelGenerator.displayLabel
textFormat: Text.PlainText
font.underline: labelMouseArea.containsMouse
}
MouseArea {
id: labelMouseArea
anchors {
top: text.top
horizontalCenter: text.horizontalCenter
}
width: text.contentWidth
height: text.contentHeight
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
Folder.AppLauncher.openUrl(folderView.url)
}
}
Component {
id: windowPinComponent
PlasmaComponents.ToolButton {
id: windowPin
anchors.right: parent.right
visible: label.showPin
width: folderViewLayerComponent.isPopup ? Math.round(Kirigami.Units.gridUnit * 1.25) : 0
height: width
checkable: true
icon.name: "window-pin"
onCheckedChanged: root.hideOnWindowDeactivate = !checked
}
}
Component {
id: homeButtonComponent
PlasmaComponents.ToolButton {
id: homeButton
anchors.left: parent.left
visible: folderViewLayerComponent.isPopup && folderView.url !== Plasmoid.configuration.url
width: folderViewLayerComponent.isPopup ? Math.round(Kirigami.Units.gridUnit * 1.25) : 0
height: width
icon.name: "go-home"
onClicked: folderViewLayerComponent.goHome()
}
}
}
}
PlasmaCore.Action {
id: viewPropertiesAction
text: i18nc("@item:inmenu opens submenu with view options like sorting", "Icons")
icon.name: "view-list-icons"
menu: viewPropertiesMenu.menu
}
PlasmaCore.Action {
id: actionSeparator
isSeparator: true
}
Component.onCompleted: {
if (!Plasmoid.isContainment) {
label = labelComponent.createObject(folderViewLayerComponent);
}
for (let i = 0, len = sharedActions.length; i < len; i++) {
const actionName = sharedActions[i];
const modelAction = folderView.model.action(actionName);
Plasmoid.contextualActions.push(modelAction)
if (actionName === "emptyTrash") {
Plasmoid.contextualActions.push(viewPropertiesAction)
}
}
Plasmoid.contextualActions.push(actionSeparator);
Plasmoid.contextualActionsAboutToShow.connect(updateContextualActions);
Plasmoid.contextualActionsAboutToShow.connect(folderView.model.clearSelection);
}
}

View File

@@ -0,0 +1,206 @@
/*
SPDX-FileCopyrightText: 2014-2015 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
import QtQuick
import QtQml
import QtQuick.Controls as QQC2
import org.kde.plasma.plasmoid
import org.kde.plasma.components as PlasmaComponents
import org.kde.kirigami as Kirigami
PlasmaComponents.ScrollView {
id: root
property alias text: editor.text
property alias targetItem: editor.targetItem
signal commit
onFocusChanged: {
if (focus) {
editor.forceActiveFocus();
}
}
// We use QQC2.TextArea here to allow context menu to appear,
// since PlasmaComponents.TextArea does not have a context menu
// BUG:427292
QQC2.TextArea {
id: editor
wrapMode: root.useListViewMode ? TextEdit.NoWrap : TextEdit.Wrap
textMargin: 0
horizontalAlignment: root.useListViewMode ? TextEdit.AlignLeft : TextEdit.AlignHCenter
rightPadding: root.PlasmaComponents.ScrollBar.vertical.visible ? root.PlasmaComponents.ScrollBar.vertical.width : 0
Kirigami.SpellCheck.enabled: false
background: Rectangle {
color: Kirigami.Theme.backgroundColor
radius: Kirigami.Units.cornerRadius
border.color: Kirigami.Theme.highlightColor
border.width: 1
}
property FolderItemDelegate targetItem: null
Binding {
target: editor.background
property: "width"
value: root.width
}
Binding {
target: editor.background
property: "height"
value: root.height
}
Component.onCompleted: root.contentItem.clip = false
onTargetItemChanged: {
if (targetItem !== null) {
var xy = getXY();
root.x = xy[0];
root.y = xy[1];
root.width = getWidth();
root.height = getInitHeight();
text = targetItem.name;
adjustSize();
editor.select(0, dir.fileExtensionBoundary(positioner.map(targetItem.index)));
if (isPopup) {
root.contentItem.contentX = Math.max(root.contentItem.contentWidth - contentItem.width, 0);
} else {
root.contentItem.contentY = Math.max(root.contentItem.contentHeight - contentItem.height, 0);
}
root.visible = true;
} else {
root.x = 0;
root.y = 0;
root.visible = false;
}
}
Keys.onPressed: event => {
switch (event.key) {
case Qt.Key_Return:
case Qt.Key_Enter:
root.commit();
break;
case Qt.Key_Escape:
if (targetItem) {
targetItem = null;
event.accepted = true;
}
break;
case Qt.Key_Home:
if (event.modifiers & Qt.ShiftModifier) {
editor.select(0, cursorPosition);
} else {
editor.select(0, 0);
}
event.accepted = true;
break;
case Qt.Key_End:
if (event.modifiers & Qt.ShiftModifier) {
editor.select(cursorPosition, text.length);
} else {
editor.select(text.length, text.length);
}
event.accepted = true;
break;
default:
adjustSize();
break;
}
}
Keys.onReleased: event => {
adjustSize();
}
function getXY() {
if (!targetItem) {
return [0,0];
}
var pos = main.mapFromItem(targetItem, targetItem.labelArea.x, targetItem.labelArea.y);
var _x, _y;
if (root.useListViewMode) {
_x = targetItem.labelArea.x - editor.leftPadding;
_y = pos.y - editor.topPadding;
} else {
_x = targetItem.x + Math.abs(Math.min(gridView.contentX, gridView.originX));
_x += editor.leftPadding;
_x += scrollArea.viewport.x;
if (root.PlasmaComponents.ScrollBar.vertical.policy === Qt.ScrollBarAlwaysOn
&& gridView.effectiveLayoutDirection === Qt.RightToLeft) {
_x -= root.PlasmaComponents.ScrollBar.vertical.width;
}
_y = pos.y + Kirigami.Units.smallSpacing - editor.topPadding;
}
return [ _x, _y ];
}
function getWidth(addWidthVerticalScroller) {
if (!targetItem) {
return 0;
}
return(targetItem.label.parent.width - Kirigami.Units.smallSpacing +
(root.useListViewMode ? -(editor.leftPadding + editor.rightPadding + Kirigami.Units.smallSpacing) : 0) +
(addWidthVerticalScroller ? root.PlasmaComponents.ScrollBar.vertical.width : 0));
}
function getHeight(addWidthHoriozontalScroller, init) {
if (!targetItem) {
return 0;
}
var _height;
if (isPopup || init) {
_height = targetItem.labelArea.height + editor.topPadding + editor.bottomPadding;
} else {
var realHeight = contentHeight + editor.topPadding + editor.bottomPadding;
var maxHeight = Kirigami.Units.iconSizes.sizeForLabels * (Plasmoid.configuration.textLines + 1) + editor.topPadding + editor.bottomPadding;
_height = Math.min(realHeight, maxHeight);
}
return _height + (addWidthHoriozontalScroller ? root.PlasmaComponents.ScrollBar.horizontal.height : 0);
}
function getInitHeight() {
return getHeight(false, true);
}
function adjustSize() {
if (isPopup) {
if(contentWidth + editor.leftPadding + editor.rightPadding > root.width) {
root.visible = targetItem !== null;
root.PlasmaComponents.ScrollBar.horizontal.policy = Qt.ScrollBarAlwaysOn;
root.height = getHeight(true);
} else {
root.PlasmaComponents.ScrollBar.horizontal.policy = Qt.ScrollBarAlwaysOff;
root.height = getHeight();
}
} else {
root.height = getHeight();
if(contentHeight + editor.topPadding + editor.bottomPadding > root.height) {
root.visible = targetItem !== null;
root.PlasmaComponents.ScrollBar.vertical.policy = Qt.ScrollBarAlwaysOn;
root.width = getWidth(true);
} else {
root.PlasmaComponents.ScrollBar.vertical.policy = Qt.ScrollBarAlwaysOff;
root.width = getWidth();
}
}
var xy = getXY();
root.x = xy[0];
root.y = xy[1];
}
}
}

View File

@@ -0,0 +1,69 @@
/*
SPDX-FileCopyrightText: 2014 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
var iconSizes = [Kirigami.Units.iconSizes.smallMedium,
Kirigami.Units.iconSizes.medium,
Kirigami.Units.iconSizes.large,
Kirigami.Units.iconSizes.huge,
Kirigami.Units.iconSizes.large*2,
Kirigami.Units.iconSizes.enormous,
Kirigami.Units.iconSizes.enormous*2];
function iconSizeFromTheme(size) {
return iconSizes[size];
}
function effectiveNavDirection(flow, layoutDirection, direction) {
if (direction == Qt.LeftArrow) {
if (flow == GridView.FlowLeftToRight) {
if (layoutDirection == Qt.LeftToRight) {
return Qt.LeftArrow;
} else {
return Qt.RightArrow;
}
} else {
if (layoutDirection == Qt.LeftToRight) {
return Qt.UpArrow;
} else {
return Qt.DownArrow;
}
}
} else if (direction == Qt.RightArrow) {
if (flow == GridView.FlowLeftToRight) {
if (layoutDirection == Qt.LeftToRight) {
return Qt.RightArrow;
} else {
return Qt.LeftArrow;
}
} else {
if (layoutDirection == Qt.LeftToRight) {
return Qt.DownArrow;
} else {
return Qt.UpArrow;
}
}
} else if (direction == Qt.UpArrow) {
if (flow == GridView.FlowLeftToRight) {
return Qt.UpArrow;
} else {
return Qt.LeftArrow;
}
} else if (direction == Qt.DownArrow) {
if (flow == GridView.FlowLeftToRight) {
return Qt.DownArrow;
} else {
return Qt.RightArrow
}
}
}
function isFileDrag(event) {
var taskUrl = event.mimeData.formats.indexOf("text/x-orgkdeplasmataskmanager_taskurl") != -1;
var arkService = event.mimeData.formats.indexOf("application/x-kde-ark-dndextract-service") != -1;
var arkPath = event.mimeData.formats.indexOf("application/x-kde-ark-dndextract-path") != -1;
return (event.mimeData.hasUrls || taskUrl || (arkService && arkPath));
}

View File

@@ -0,0 +1,473 @@
/*
SPDX-FileCopyrightText: 2011-2013 Sebastian Kügler <sebas@kde.org>
SPDX-FileCopyrightText: 2011-2019 Marco Martin <mart@kde.org>
SPDX-FileCopyrightText: 2014-2015 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import org.kde.plasma.plasmoid
import org.kde.plasma.core as PlasmaCore
import org.kde.ksvg as KSvg
import org.kde.kirigami as Kirigami
import org.kde.private.desktopcontainment.folder as Folder
import org.kde.plasma.private.containmentlayoutmanager as ContainmentLayoutManager
import "code/FolderTools.js" as FolderTools
ContainmentItem {
id: root
switchWidth: { switchSize(); }
switchHeight: { switchSize(); }
// Only exists because the default CompactRepresentation doesn't:
// - open on drag
// - allow defining a custom drop handler
// TODO remove once it gains that feature (perhaps optionally?)
compactRepresentation: (isFolder && !isContainment) ? compactRepresentation : null
objectName: isFolder ? "folder" : "desktop"
width: isPopup ? undefined : preferredWidth(false) // Initial size when adding to e.g. desktop.
height: isPopup ? undefined : preferredHeight(false) // Initial size when adding to e.g. desktop.
function switchSize() {
// Support expanding into the full representation on very thick vertical panels.
if (isPopup && Plasmoid.formFactor === PlasmaCore.Types.Vertical) {
return Kirigami.Units.gridUnit * 8;
}
return 0;
}
LayoutMirroring.enabled: Application.layoutDirection === Qt.RightToLeft
LayoutMirroring.childrenInherit: true
property bool isFolder: (Plasmoid.pluginName === "org.kde.plasma.folder")
property bool isContainment: Plasmoid.isContainment
property bool isPopup: (Plasmoid.location !== PlasmaCore.Types.Floating)
property bool useListViewMode: isPopup && Plasmoid.configuration.viewMode === 0
property Component appletAppearanceComponent
property int handleDelay: 800
property real haloOpacity: 0.5
readonly property bool isUiReady: Plasmoid.containment.corona.isScreenUiReady(root.screen)
readonly property int hoverActivateDelay: 750 // Magic number that matches Dolphin's auto-expand folders delay.
readonly property FolderViewLayerLoader folderViewLayer: fullRepresentationItem.folderViewLayer
readonly property ContainmentLayoutManager.AppletsLayout appletsLayout: fullRepresentationItem.appletsLayout
// Plasmoid.title is set by a Binding {} in FolderViewLayer
toolTipSubText: ""
Plasmoid.icon: (!Plasmoid.configuration.useCustomIcon && folderViewLayer.ready) ? symbolicizeIconName(folderViewLayer.view?.model.iconName) : Plasmoid.configuration.icon
// We want to do this here rather than in the model because we don't always want
// symbolic icons everywhere, but we do know that we always want them in this
// specific representation right here
function symbolicizeIconName(iconName) {
const symbolicSuffix = "-symbolic";
if (iconName?.endsWith(symbolicSuffix)) {
return iconName;
}
return iconName + symbolicSuffix;
}
function addLauncher(desktopUrl) {
if (!isFolder) {
return;
}
folderViewLayer.view.linkHere(desktopUrl);
}
function preferredWidth(forMinimumSize: bool): real {
if ((isContainment || !folderViewLayer.ready) || (isPopup && !compactRepresentationItem.visible)) {
return -1;
} else if (useListViewMode) {
return (forMinimumSize ? folderViewLayer.view.cellHeight * 4 : Kirigami.Units.gridUnit * 16);
}
return (folderViewLayer.view.cellWidth * (forMinimumSize ? 1 : 3)) + (Kirigami.Units.gridUnit * 2);
}
function preferredHeight(forMinimumSize: bool): real {
let height;
if ((isContainment || !folderViewLayer.ready) || (isPopup && !compactRepresentationItem.visible)) {
return -1;
} else if (useListViewMode) {
height = (folderViewLayer.view.cellHeight * (forMinimumSize ? 1 : 15)) + Kirigami.Units.smallSpacing;
} else {
height = (folderViewLayer.view.cellHeight * (forMinimumSize ? 1 : 2)) + Kirigami.Units.gridUnit;
}
if (Plasmoid.configuration.labelMode !== 0) {
height += (folderViewLayer.item as FolderViewLayer).labelHeight;
}
return height;
}
function isDrag(fromX, fromY, toX, toY) {
const length = Math.abs(fromX - toX) + Math.abs(fromY - toY);
return length >= Application.styleHints.startDragDistance;
}
onFocusChanged: {
if (focus && isFolder) {
(folderViewLayer.item as Item)?.forceActiveFocus();
}
}
onExternalData: (mimetype, data) => {
Plasmoid.configuration.url = data
}
component ShortDropBehavior : Behavior {
NumberAnimation {
duration: Kirigami.Units.shortDuration
easing.type: Easing.InOutQuad
}
}
component LongDropBehavior : Behavior {
NumberAnimation {
duration: Kirigami.Units.longDuration
easing.type: Easing.InOutQuad
}
}
KSvg.FrameSvgItem {
id: highlightItemSvg
visible: false
imagePath: root.isPopup ? "widgets/viewitem" : ""
prefix: "hover"
}
KSvg.FrameSvgItem {
id: listItemSvg
visible: false
imagePath: root.isPopup ? "widgets/viewitem" : ""
prefix: "normal"
}
KSvg.Svg {
id: toolBoxSvg
imagePath: "widgets/toolbox"
property int rightBorder: elementSize("right").width
property int topBorder: elementSize("top").height
property int bottomBorder: elementSize("bottom").height
property int leftBorder: elementSize("left").width
}
// FIXME: the use and existence of this property is a workaround
preloadFullRepresentation: true
fullRepresentation: FolderViewDropArea {
id: dropArea
anchors {
fill: parent
leftMargin: (root.isContainment && root.availableScreenRect) ? root.availableScreenRect.x : 0
topMargin: (root.isContainment && root.availableScreenRect) ? root.availableScreenRect.y : 0
rightMargin: (root.isContainment && root.availableScreenRect && parent)
? (parent.width - root.availableScreenRect.x - root.availableScreenRect.width) : 0
bottomMargin: (root.isContainment && root.availableScreenRect && parent)
? (parent.height - root.availableScreenRect.y - root.availableScreenRect.height) : 0
}
LongDropBehavior on anchors.topMargin { }
LongDropBehavior on anchors.leftMargin { }
LongDropBehavior on anchors.rightMargin { }
LongDropBehavior on anchors.bottomMargin { }
property alias folderViewLayer: folderViewLayer
property alias appletsLayout: appletsLayout
// Layout size bindings are set in Component.onCompleted
preventStealing: true
onDragEnter: event => {
if (root.isContainment && Plasmoid.immutable && !(root.isFolder && FolderTools.isFileDrag(event))) {
event.ignore();
}
// Don't allow any drops while listing.
if (root.isFolder && folderViewLayer.view.status === Folder.FolderModel.Listing) {
event.ignore();
}
// Firefox tabs are regular drags. Since all of our drop handling is asynchronous
// we would accept this drop and have Firefox not spawn a new window. (Bug 337711)
if (event.mimeData.formats.indexOf("application/x-moz-tabbrowser-tab") !== -1) {
event.ignore();
}
}
onDragMove: event => {
// TODO: We should reject drag moves onto file items that don't accept drops
// (cf. QAbstractItemModel::flags() here, but DeclarativeDropArea currently
// is currently incapable of rejecting drag events.
// Trigger autoscroll.
if (root.isFolder && FolderTools.isFileDrag(event)) {
handleDragMove(folderViewLayer.view, mapToItem(folderViewLayer.view, event.x, event.y));
} else if (root.isContainment) {
appletsLayout.showPlaceHolderAt(
Qt.rect(event.x - appletsLayout.minimumItemWidth / 2,
event.y - appletsLayout.minimumItemHeight / 2,
appletsLayout.minimumItemWidth,
appletsLayout.minimumItemHeight)
);
}
}
onDragLeave: event => {
// Cancel autoscroll.
if (root.isFolder) {
handleDragEnd(folderViewLayer.view);
}
if (root.isContainment) {
appletsLayout.hidePlaceHolder();
}
}
onDrop: event => {
if (root.isFolder && FolderTools.isFileDrag(event)) {
handleDragEnd(folderViewLayer.view);
folderViewLayer.view.drop(root, event, mapToItem(folderViewLayer.view, event.x, event.y));
} else if (root.isContainment) {
root.processMimeData(event.mimeData,
event.x - appletsLayout.placeHolder.width / 2,
event.y - appletsLayout.placeHolder.height / 2);
event.accept(event.proposedAction);
appletsLayout.hidePlaceHolder();
}
}
Component {
id: compactRepresentation
CompactRepresentation { folderView: folderViewLayer.view }
}
Connections {
target: Plasmoid.containment.corona
ignoreUnknownSignals: true
function onEditModeChanged() {
appletsLayout.editMode = Plasmoid.containment.corona.editMode;
}
// When adding panels, sizes change. We want to make sure all panels
// are loaded, and when they all are loaded, we tell the folderViewLayer loader to start.
function onScreenUiReadyChanged(screen: int, newLayoutReady: bool) {
if (root.isContainment && root.isFolder && !folderViewLayer.ready && root.screen === screen && newLayoutReady){
// We skip x and y since that is handled by the parent of folderViewLayer
folderViewLayer.active = true;
}
}
}
ContainmentLayoutManager.AppletsLayout {
id: appletsLayout
anchors.fill: parent
relayoutLock: width !== root.availableScreenRect.width || height !== root.availableScreenRect.height
// NOTE: use root.availableScreenRect and not own width and height as they are updated not atomically
configKey: "ItemGeometries-" + Math.round(root.screenGeometry.width) + "x" + Math.round(root.screenGeometry.height)
fallbackConfigKey: root.availableScreenRect.width > root.availableScreenRect.height ? "ItemGeometriesHorizontal" : "ItemGeometriesVertical"
Binding on containment {
value: Plasmoid
when: Plasmoid.isContainment
}
containmentItem: root
editModeCondition: Plasmoid.immutable
? ContainmentLayoutManager.AppletsLayout.Locked
: ContainmentLayoutManager.AppletsLayout.AfterPressAndHold
// Sets the containment in edit mode when we go in edit mode as well
onEditModeChanged: Plasmoid.containment.corona.editMode = editMode;
minimumItemWidth: Kirigami.Units.gridUnit * 3
minimumItemHeight: minimumItemWidth
cellWidth: Kirigami.Units.iconSizes.small
cellHeight: cellWidth
defaultItemWidth: cellWidth * 6
defaultItemHeight: cellHeight * 6
eventManagerToFilter: (folderViewLayer.item as FolderViewLayer)?.view.view ?? null
appletContainerComponent: ContainmentLayoutManager.BasicAppletContainer {
id: appletContainer
editModeCondition: Plasmoid.immutable
? ContainmentLayoutManager.ItemContainer.Locked
: ContainmentLayoutManager.ItemContainer.AfterPressAndHold
configOverlaySource: "ConfigOverlay.qml"
Connections {
target: appletsLayout
function onEditModeChanged(): void {
if (!Plasmoid.containment.corona.editMode) {
appletContainer.cancelEdit();
}
}
}
onAppletChanged: {
applet.visible = true
}
Drag.dragType: Drag.Automatic
Drag.active: false
Drag.supportedActions: Qt.MoveAction
Drag.mimeData: {
"text/x-plasmoidinstanceid": Plasmoid.containment.id+':'+appletContainer.applet.plasmoid.id
}
Drag.onDragFinished: dropEvent => {
if (dropEvent == Qt.MoveAction) {
appletContainer.visible = true
appletContainer.applet.visible = true
//currentApplet.applet.plasmoid.internalAction("remove").trigger()
} else {
appletContainer.visible = true
//appletsModel.insert(configurationArea.draggedItemIndex - 1, {applet: appletContainer.applet});
}
//appletContainer.destroy()
//root.dragAndDropping = false
//root.layoutManager.save()
}
onUserDrag: (newPosition, dragCenter) => {
const pos = mapToItem(root.parent, dragCenter.x, dragCenter.y);
const newCont = root.containmentItemAt(pos.x, pos.y);
// User likely touched screen edges, so ignore that.
if (!newCont) {
return;
}
if (newCont.plasmoid !== Plasmoid) {
// First go out of applet edit mode, get rid of the config overlay, release mouse grabs in preparation of applet reparenting
cancelEdit();
appletsLayout.hidePlaceHolder();
appletContainer.grabToImage(result => {
appletContainer.Drag.imageSource = result.url
appletContainer.visible = false
appletContainer.Drag.active = true
})
}
}
ShortDropBehavior on x { }
ShortDropBehavior on y { }
}
placeHolder: ContainmentLayoutManager.PlaceHolder {}
component FolderViewLayerLoader: Loader {
property bool ready: status === Loader.Ready
property FolderView view: (item as FolderViewLayer)?.view ?? null
property Folder.FolderModel model: (item as FolderViewLayer)?.model ?? null
source: "FolderViewLayer.qml"
}
FolderViewLayerLoader {
id: folderViewLayer
anchors.fill: parent
focus: true
// Do not set this active by default for desktop, and disable it when folderMode is not used
active: {
if (root.isFolder){
if (!root.isContainment) {
// We are a folder widget
return true;
} else {
// For desktop, test if the screen is ready
return root.isUiReady;
}
}
return false;
}
asynchronous: false
onFocusChanged: {
if (!focus && model) {
model.clearSelection();
}
}
Binding {
target: folderViewLayer.item
property: "isPopup"
value: root.isPopup
}
Binding {
target: folderViewLayer.item
property: "useListViewMode"
value: root.useListViewMode
}
Connections {
target: folderViewLayer.view
// `FolderViewDropArea` is not a FocusScope. We need to forward manually.
function onPressed() {
folderViewLayer.forceActiveFocus();
}
}
}
}
PlasmaCore.Action {
id: configAction
text: i18nc("@action:inmenu opens config dialog", "Desktop and Wallpaper")
icon.name: "preferences-desktop-wallpaper"
shortcut:"Ctrl+Shift+D"
onTriggered: Plasmoid.containment.configureRequested(Plasmoid)
}
Component.onCompleted: {
// Layout bindings need to be set delayed; the intermediate steps as the other bindings happen cause loops
Qt.callLater( () => {
dropArea.Layout.minimumWidth = Qt.binding(() => root.preferredWidth(root.isPopup))
dropArea.Layout.minimumHeight = Qt.binding(() => root.preferredHeight(root.isPopup))
dropArea.Layout.preferredWidth = Qt.binding(() => root.preferredWidth(false))
dropArea.Layout.preferredHeight = Qt.binding(() => root.preferredHeight(false))
// Maximum size is intentionally unbounded
})
if (!Plasmoid.isContainment) {
return;
}
Plasmoid.setInternalAction("configure", configAction)
}
}
}

View File

@@ -0,0 +1,266 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "sebas@kde.org",
"Name": "Sebastian Kügler",
"Name[ar]": "سيباستيان كوغلر",
"Name[az]": "Sebastian Kügler",
"Name[be]": "Sebastian Kügler",
"Name[bg]": "Sebastian Kügler",
"Name[ca@valencia]": "Sebastian Kügler",
"Name[ca]": "Sebastian Kügler",
"Name[cs]": "Sebastian Kügler",
"Name[da]": "Sebastian Kügler",
"Name[de]": "Sebastian Kügler",
"Name[el]": "Sebastian kügler",
"Name[en_GB]": "Sebastian Kügler",
"Name[eo]": "Sebastian Kügler",
"Name[es]": "Sebastian Kügler",
"Name[et]": "Sebastian Kügler",
"Name[eu]": "Sebastian Kügler",
"Name[fi]": "Sebastian Kügler",
"Name[fr]": "Sebastian Kügler",
"Name[ga]": "Sebastian Kügler",
"Name[gl]": "Sebastian Kügler",
"Name[he]": "סבסטיאן קיגלר",
"Name[hu]": "Sebastian Kügler",
"Name[ia]": "Sebastian Kügler",
"Name[id]": "Sebastian Kügler",
"Name[ie]": "Sebastian Kügler",
"Name[is]": "Sebastian Kügler",
"Name[it]": "Sebastian Kügler",
"Name[ja]": "Sebastian Kügler",
"Name[ka]": "სებასტიან კუგლერი",
"Name[ko]": "Sebastian Kügler",
"Name[lt]": "Sebastian Kügler",
"Name[lv]": "Sebastian Kügler",
"Name[nb]": "Sebastian Kügler",
"Name[nl]": "Sebastian Kügler",
"Name[nn]": "Sebastian Kügler",
"Name[pl]": "Sebastian Kügler",
"Name[pt]": "Sebastian Kügler",
"Name[pt_BR]": "Sebastian Kügler",
"Name[ro]": "Sebastian Kügler",
"Name[ru]": "Sebastian Kügler",
"Name[sa]": "सेबास्टियन कुग्लर",
"Name[sk]": "Sebastian Kügler",
"Name[sl]": "Sebastian Kügler",
"Name[sv]": "Sebastian Kügler",
"Name[ta]": "ஸெபாஸ்டியன் கூக்லர்",
"Name[tr]": "Sebastian Kügler",
"Name[uk]": "Sebastian Kügler",
"Name[vi]": "Sebastian Kügler",
"Name[zh_CN]": "Sebastian Kügler",
"Name[zh_TW]": "Sebastian Kügler"
},
{
"Email": "hein@kde.org",
"Name": "Eike Hein",
"Name[ar]": "إيكي هين",
"Name[az]": "Eike Hein",
"Name[be]": "Eike Hein",
"Name[bg]": "Eike Hein",
"Name[ca@valencia]": "Eike Hein",
"Name[ca]": "Eike Hein",
"Name[cs]": "Eike Hein",
"Name[da]": "Eike Hein",
"Name[de]": "Eike Hein",
"Name[el]": "Eike Hein",
"Name[en_GB]": "Eike Hein",
"Name[eo]": "Eike Hein",
"Name[es]": "Eike Hein",
"Name[et]": "Eike Hein",
"Name[eu]": "Eike Hein",
"Name[fi]": "Eike Hein",
"Name[fr]": "Eike Hein",
"Name[ga]": "Eike Hein",
"Name[gl]": "Eike Hein",
"Name[he]": "אייק היין",
"Name[hu]": "Eike Hein",
"Name[ia]": "Eike Hein",
"Name[id]": "Eike Hein",
"Name[ie]": "Eike Hein",
"Name[is]": "Eike Hein",
"Name[it]": "Eike Hein",
"Name[ja]": "Eike Hein",
"Name[ka]": "აიკე ჰაინი",
"Name[ko]": "Eike Hein",
"Name[lt]": "Eike Hein",
"Name[lv]": "Eike Hein",
"Name[nb]": "Eike Hein",
"Name[nl]": "Eike Hein",
"Name[nn]": "Eike Hein",
"Name[pa]": "ਇਕੀ ਹੀਇਨ",
"Name[pl]": "Eike Hein",
"Name[pt]": "Eike Hein",
"Name[pt_BR]": "Eike Hein",
"Name[ro]": "Eike Hein",
"Name[ru]": "Eike Hein",
"Name[sa]": "ऐके हेन",
"Name[sk]": "Eike Hein",
"Name[sl]": "Eike Hein",
"Name[sv]": "Eike Hein",
"Name[ta]": "எய்கே ஹைன்",
"Name[tr]": "Eike Hein",
"Name[uk]": "Eike Hein",
"Name[vi]": "Eike Hein",
"Name[zh_CN]": "Eike Hein",
"Name[zh_TW]": "Eike Hein"
}
],
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=plasmashell&component=Desktop%20Containment",
"Category": "Containments",
"Description": "A clean and simple layout",
"Description[ar]": "تخطيط نظيف وبسيط",
"Description[az]": "Təmiz və Sadə şablon",
"Description[be]": "Просты макет",
"Description[bg]": "Едно изчистено и просто оформление",
"Description[ca@valencia]": "Una disposició neta i senzilla",
"Description[ca]": "Una disposició neta i senzilla",
"Description[cs]": "Čisté a jednoduché rozvržení",
"Description[da]": "Et rent og simpelt layout",
"Description[de]": "Ein klares und einfaches Layout",
"Description[el]": "Μια καθαρή και απλή διάταξη",
"Description[en_GB]": "A clean and simple layout",
"Description[eo]": "Pura kaj simpla aranĝo",
"Description[es]": "Un esquema sencillo y claro",
"Description[et]": "Puhas ja lihtne paigutus",
"Description[eu]": "Antolaera garbi eta xumea",
"Description[fi]": "Selkeä ja yksinkertainen asettelu",
"Description[fr]": "Une disposition simple et épurée",
"Description[ga]": "Leagan amach glan agus simplí",
"Description[gl]": "Unha disposición sinxela e limpa.",
"Description[he]": "פריסה פשוטה ונקיה",
"Description[hu]": "Egy tiszta és egyszerű elrendezés",
"Description[ia]": "Un disposition simple e munde",
"Description[id]": "Sebuah tata letak yang bersih dan sederhana",
"Description[ie]": "Un simplic e nett arangement",
"Description[is]": "Skýr og einföld framsetning",
"Description[it]": "Una disposizione semplice e pulita",
"Description[ja]": "クリーンでシンプルなレイアウト",
"Description[ka]": "სუფთა და მარტივი განლაგება",
"Description[ko]": "깨끗하고 정돈된 레이아웃",
"Description[lt]": "Tvarkingas ir paprastas išdėstymas",
"Description[lv]": "Skaidrs un vienkāršs izkārtojums",
"Description[nb]": "En ren og enkel utforming",
"Description[nl]": "Een schone en simpele opmaak",
"Description[nn]": "Ei enkel og stilrein utforming",
"Description[pa]": "ਸਾਫ਼ ਅਤੇ ਸਧਾਰਨ ਲੇਆਉਟ",
"Description[pl]": "Schludny i prosty układ",
"Description[pt]": "Uma disposição limpa e simples",
"Description[pt_BR]": "Um layout limpo e simples",
"Description[ro]": "Aranjament curat și simplu",
"Description[ru]": "Ясный и простой шаблон",
"Description[sa]": "स्वच्छं सरलं च विन्यासः",
"Description[sk]": "Čisté a jednoduché rozloženie",
"Description[sl]": "Čist in preprost razpored",
"Description[sv]": "En ren och enkel layout",
"Description[ta]": "தெளிவான மற்றும் எளிய தளவமைப்பு",
"Description[tr]": "Temiz ve basit bir yerleşim",
"Description[uk]": "Просте компонування",
"Description[vi]": "Một bố cục thoáng đãng và đơn giản",
"Description[zh_CN]": "一款简洁的布局",
"Description[zh_TW]": "乾淨、簡單的佈局",
"EnabledByDefault": true,
"Icon": "user-desktop",
"Id": "org.kde.desktopcontainment",
"License": "GPL-2.0+",
"Name": "Desktop",
"Name[af]": "Werkskerm",
"Name[ar]": "سطح المكتب",
"Name[ast]": "Escritoriu",
"Name[az]": "İş masası",
"Name[be@latin]": "Rabočy stoł",
"Name[be]": "Працоўны стол",
"Name[bg]": "Работен плот",
"Name[bn]": "ডেস্কটপ",
"Name[bn_IN]": "ডেস্কটপ",
"Name[br]": "Gorretaol",
"Name[bs]": "Radna površina",
"Name[ca@valencia]": "Escriptori",
"Name[ca]": "Escriptori",
"Name[cs]": "Pracovní plocha",
"Name[csb]": "Pùlt",
"Name[cy]": "Penbwrdd",
"Name[da]": "Skrivebord",
"Name[de]": "Arbeitsfläche",
"Name[el]": "Επιφάνεια εργασίας",
"Name[en_GB]": "Desktop",
"Name[eo]": "Labortablo",
"Name[es]": "Escritorio",
"Name[et]": "Töölaud",
"Name[eu]": "Mahaigaina",
"Name[fa]": "رومیزی",
"Name[fi]": "Työpöytä",
"Name[fr]": "Bureau",
"Name[fy]": "Buroblêd",
"Name[ga]": "Deasc",
"Name[gl]": "Escritorio",
"Name[gu]": "ડેસ્કટોપ",
"Name[he]": "שולחן עבודה",
"Name[hi]": "डेस्कटॉप",
"Name[hne]": "डेस्कटाप",
"Name[hr]": "Radna površina",
"Name[hsb]": "Dźěłowy powjerch",
"Name[hu]": "Munkaasztal",
"Name[ia]": "Scriptorio",
"Name[id]": "Desktop",
"Name[ie]": "Pupitre",
"Name[is]": "Skjáborð",
"Name[it]": "Desktop",
"Name[ja]": "デスクトップ",
"Name[ka]": "სამუშაო მაგიდა",
"Name[kk]": "Жұмыс үстелі",
"Name[kn]": "ಗಣಕತೆರೆ",
"Name[ko]": "바탕 화면",
"Name[ku]": "Sermasê",
"Name[lt]": "Darbalaukis",
"Name[lv]": "Darbvirsma",
"Name[mai]": "डेस्कटाप",
"Name[mk]": "Работна површина",
"Name[ml]": "പണിയിടം",
"Name[mr]": "डेस्कटॉप",
"Name[ms]": "Ruang Kerja",
"Name[nb]": "Skrivebord",
"Name[nds]": "Schriefdisch",
"Name[ne]": "डेस्कटप",
"Name[nl]": "Bureaublad",
"Name[nn]": "Skrivebord",
"Name[oc]": "Burèu",
"Name[or]": "ଡ଼େସ୍କଟପ",
"Name[pa]": "ਡੈਸਕਟਾਪ",
"Name[pl]": "Pulpit",
"Name[pt]": "Ambiente de Trabalho",
"Name[pt_BR]": "Área de trabalho",
"Name[ro]": "Birou",
"Name[ru]": "Рабочий стол",
"Name[sa]": "डेस्कटॉप",
"Name[se]": "Čállinbeavdi",
"Name[si]": "වැඩතලය",
"Name[sk]": "Plocha",
"Name[sl]": "Namizje",
"Name[sr@ijekavian]": "Површ",
"Name[sr@ijekavianlatin]": "Površ",
"Name[sr@latin]": "Površ",
"Name[sr]": "Површ",
"Name[sv]": "Skrivbord",
"Name[ta]": "பணிமேடை",
"Name[te]": "రంగస్ఠలం",
"Name[tg]": "Мизи корӣ",
"Name[th]": "พื้นที่ทำงาน",
"Name[tr]": "Masaüstü",
"Name[uk]": "Стільниця",
"Name[uz@cyrillic]": "Иш столи",
"Name[uz]": "Ish stoli",
"Name[vi]": "Bàn làm việc",
"Name[wa]": "Sicribanne",
"Name[xh]": "Desktop",
"Name[zh_CN]": "桌面",
"Name[zh_TW]": "桌面",
"Website": "https://www.kde.org/plasma-desktop"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-ContainmentType": "Desktop"
}

View File

@@ -0,0 +1,80 @@
/**
* SPDX-FileCopyrightText: 2014 Samoilenko Yuri <kinnalru@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
id: checker
pluginName: "battery"
device: root.device
}
readonly property bool charging: battery?.isCharging ?? false
readonly property int charge: battery?.charge ?? -1
readonly property string displayString: {
if (available && charge > -1) {
if (charging) {
return i18n("%1% charging", charge);
} else {
return i18n("%1%", charge);
}
} else {
return i18n("No info");
}
}
property KDEConnect.BatteryDbusInterface battery
/**
* Suggests an icon name to use for the current battery level
*/
readonly property string iconName: {
if (charge < 0) {
return "battery-missing-symbolic";
} else if (charge < 10) {
return charging
? "battery-empty-charging-symbolic"
: "battery-empty-symbolic";
} else if (charge < 25) {
return charging
? "battery-caution-charging-symbolic"
: "battery-caution-symbolic";
} else if (charge < 50) {
return charging
? "battery-low-charging-symbolic"
: "battery-low-symbolic";
} else if (charge < 75) {
return charging
? "battery-good-charging-symbolic"
: "battery-good-symbolic";
} else {
return charging
? "battery-full-charging-symbolic"
: "battery-full-symbolic";
}
}
onAvailableChanged: {
if (available) {
battery = KDEConnect.DeviceBatteryDbusInterfaceFactory.create(device.id());
} else {
battery = null;
}
}
}

View File

@@ -0,0 +1,42 @@
/**
* SPDX-FileCopyrightText: 2021 Yaman Qalieh <ybq987@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
id: checker
pluginName: "clipboard"
device: root.device
}
property KDEConnect.ClipboardDbusInterface clipboard
function sendClipboard(): void {
if (clipboard) {
clipboard.sendClipboard();
}
}
onAvailableChanged: {
if (available) {
clipboard = KDEConnect.ClipboardDbusInterfaceFactory.create(device.id());
} else {
clipboard = null;
}
}
}

View File

@@ -0,0 +1,44 @@
/**
* SPDX-FileCopyrightText: 2014-2015 Frederic St-Pierre <me@fredericstpierre.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
*
* SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kirigami as Kirigami
import org.kde.plasma.plasmoid
DropArea {
id: root
required property PlasmoidItem plasmoidItem
onEntered: drag => {
if (drag.hasUrls) {
root.plasmoidItem.expanded = true;
}
}
MouseArea {
anchors.fill: parent
property bool wasExpanded: false
onPressed: mouse => {
wasExpanded = root.plasmoidItem.expanded;
}
onClicked: mouse => {
root.plasmoidItem.expanded = !root.plasmoidItem.expanded;
}
}
Kirigami.Icon {
anchors.fill: parent
source: Plasmoid.icon
}
}

View File

@@ -0,0 +1,129 @@
/**
* SPDX-FileCopyrightText: 2021 David Shlemayev <david.shlemayev@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
id: checker
pluginName: "connectivity_report"
device: root.device
}
/**
* Reports a string indicating the network type. Possible values:
* 5G
* LTE
* HSPA
* UMTS
* CDMA2000
* EDGE
* GPRS
* GSM
* CDMA
* iDEN
*
* The parsing from Android values into these strings is handled in the
* [ConnectivityReportPlugin.networkTypeToString method](https://invent.kde.org/network/kdeconnect-android/-/blob/master/src/org/kde/kdeconnect/Plugins/ConnectivityReportPlugin/ConnectivityReportPlugin.java#L82)
*/
readonly property string networkType: connectivity?.cellularNetworkType ?? i18n("Unknown")
/**
* Reports a value between 0 and 4 (inclusive) which represents the strength of the cellular connection
*/
readonly property int signalStrength: connectivity?.cellularNetworkStrength ?? -1
readonly property string displayString: {
if (connectivity !== null) {
return `${networkType} ${signalStrength}/4`;
} else {
return i18n("No signal");
}
}
property KDEConnect.ConnectivityReportDbusInterface connectivity
/**
* Suggests an icon name to use for the current signal level
*
* Returns names which correspond to Plasma Framework's network.svg:
* https://invent.kde.org/frameworks/plasma-framework/-/blob/master/src/desktoptheme/breeze/icons/network.svg
*/
readonly property string iconName: {
// Firstly, get the name prefix which represents the signal strength
const signalStrengthIconName =
(signalStrength < 0 || connectivity === null) ?
// As long as the signal strength is nonsense or the plugin reports as non-ready,
// show us as disconnected
"network-mobile-off" :
(signalStrength === 0) ?
"network-mobile-0" :
(signalStrength === 1) ?
"network-mobile-20" :
(signalStrength === 2) ?
"network-mobile-60" :
(signalStrength === 3) ?
"network-mobile-80" :
(signalStrength === 4) ?
"network-mobile-100" :
// Since all possible values are enumerated above, this default case should never be hit.
// However, I need it in order for my ternary syntax to be valid!
"network-mobile-available";
// If we understand the network type, append to the icon name to show the type
const networkTypeSuffix =
(networkType === "5G") ?
"-5g" :
(networkType === "LTE") ?
"-lte" :
(networkType === "HSPA") ?
"-hspa" :
(networkType === "UMTS") ?
"-umts" :
(networkType === "CDMA2000") ?
// GSconnect just uses the 3g icon
// No icon for this case!
"" :
(networkType === "EDGE") ?
"-edge" :
(networkType === "GPRS") ?
"-gprs" :
(networkType === "GSM") ?
// GSconnect just uses the 2g icon
// No icon for this case!
"" :
(networkType === "CDMA") ?
// GSconnect just uses the 2g icon
// No icon for this case!
"" :
(networkType === "iDEN") ?
// GSconnect just uses the 2g icon
// No icon for this case!
"" :
""; // We didn't recognize the network type. Don't append anything.
return signalStrengthIconName + networkTypeSuffix;
}
onAvailableChanged: {
if (available) {
connectivity = KDEConnect.DeviceConnectivityReportDbusInterfaceFactory.create(device.id());
} else {
connectivity = null;
}
}
}

View File

@@ -0,0 +1,490 @@
/**
* SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
pragma ComponentBehavior: Bound
import QtCore
import QtQuick
import QtQuick.Dialogs as QtDialogs
import QtQuick.Layouts
import org.kde.kdeconnect as KDEConnect
import org.kde.kirigami as Kirigami
import org.kde.plasma.components as PlasmaComponents
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.extras as PlasmaExtras
PlasmaComponents.ItemDelegate {
id: root
required property int index
required property var model
readonly property KDEConnect.DeviceDbusInterface device: KDEConnect.DeviceDbusInterfaceFactory.create(model.deviceId)
hoverEnabled: false
down: false
Battery {
id: battery
device: root.device
}
Clipboard {
id: clipboard
device: root.device
}
Connectivity {
id: connectivity
device: root.device
}
FindMyPhone {
id: findmyphone
device: root.device
}
RemoteCommands {
id: remoteCommands
device: root.device
}
Sftp {
id: sftp
device: root.device
}
Share {
id: share
device: root.device
}
SMS {
id: sms
device: root.device
}
VirtualMonitor {
id: virtualmonitor
device: root.device
}
Kirigami.PromptDialog {
id: prompt
visible: false
showCloseButton: true
standardButtons: Kirigami.Dialog.NoButton
title: i18n("Virtual Monitor is not available")
}
QtDialogs.FileDialog {
id: fileDialog
title: i18n("Please choose a file")
currentFolder: StandardPaths.writableLocation(StandardPaths.HomeLocation)
modality: Qt.NonModal
fileMode: QtDialogs.FileDialog.OpenFiles
onAccepted: {
selectedFiles.forEach(url => share.plugin.shareUrl(url));
}
}
PlasmaExtras.Menu {
id: menu
visualParent: overflowMenu
placement: PlasmaExtras.Menu.BottomPosedLeftAlignedPopup
// Share
PlasmaExtras.MenuItem {
icon: "document-share"
visible: share.available
text: i18n("Share file")
onClicked: fileDialog.open()
}
// Clipboard
PlasmaExtras.MenuItem {
icon: "klipper"
visible: clipboard.clipboard?.isAutoShareDisabled ?? false
text: i18n("Send Clipboard")
onClicked: {
clipboard.sendClipboard()
}
}
// Find my phone
PlasmaExtras.MenuItem {
icon: "irc-voice"
visible: findmyphone.available
text: i18n("Ring my phone")
onClicked: {
findmyphone.ring()
}
}
// SFTP
PlasmaExtras.MenuItem {
icon: "document-open-folder"
visible: sftp.available
text: i18n("Browse this device")
onClicked: {
sftp.browse()
}
}
// SMS
PlasmaExtras.MenuItem {
icon: "message-new"
visible: sms.available
text: i18n("SMS Messages")
onClicked: {
sms.plugin.launchApp()
}
}
}
DropArea {
id: fileDropArea
anchors.fill: parent
onDropped: drop => {
if (drop.hasUrls) {
const urls = new Set(drop.urls.map(url => url.toString()));
urls.forEach(url => share.plugin.shareUrl(url));
}
drop.accepted = true;
}
PlasmaCore.ToolTipArea {
id: dropAreaToolTip
anchors.fill: parent
active: true
mainText: i18n("File Transfer")
subText: i18n("Drop a file to transfer it onto your phone.")
}
}
contentItem: ColumnLayout {
spacing: Kirigami.Units.smallSpacing
RowLayout {
width: parent.width
spacing: Kirigami.Units.smallSpacing
PlasmaComponents.Label {
id: deviceName
elide: Text.ElideRight
text: root.model.name
Layout.fillWidth: true
textFormat: Text.PlainText
}
PlasmaComponents.ToolButton {
icon.name: "krdc"
visible: virtualmonitor.available
text: i18n("Virtual Display")
checked: visible && virtualmonitor.plugin.active
checkable: true
onClicked: {
if (virtualmonitor.plugin.active) {
virtualmonitor.plugin.stop();
prompt.visible = false;
} else {
virtualmonitor.plugin.requestVirtualMonitor();
prompt.subtitle = virtualmonitor.plugin.lastError;
prompt.visible = prompt.subtitle.length > 0;
}
}
}
RowLayout {
id: connectionInformation
visible: connectivity.available
spacing: Kirigami.Units.smallSpacing
// TODO: In the future, when the Connectivity Report plugin supports more than one
// subscription, add more signal strength icons to represent all the available
// connections.
Kirigami.Icon {
id: celluarConnectionStrengthIcon
source: connectivity.iconName
Layout.preferredHeight: connectivityText.height
Layout.preferredWidth: Layout.preferredHeight
Layout.alignment: Qt.AlignCenter
visible: valid
}
PlasmaComponents.Label {
// Fallback plain-text label. Only show this if the icon doesn't work.
id: connectivityText
text: connectivity.displayString
textFormat: Text.PlainText
visible: !celluarConnectionStrengthIcon.visible
}
}
RowLayout {
id: batteryInformation
visible: battery.available && battery.charge > -1
spacing: Kirigami.Units.smallSpacing
Kirigami.Icon {
id: batteryIcon
source: battery.iconName
// Make the icon the same size as the text so that it doesn't dominate
Layout.preferredHeight: batteryPercent.height
Layout.preferredWidth: Layout.preferredHeight
Layout.alignment: Qt.AlignCenter
}
PlasmaComponents.Label {
id: batteryPercent
text: i18nc("Battery charge percentage", "%1%", battery.charge)
textFormat: Text.PlainText
}
}
PlasmaComponents.ToolButton {
id: overflowMenu
icon.name: "application-menu"
checked: menu.status === PlasmaExtras.Menu.Open
onPressed: menu.openRelative()
}
}
// RemoteKeyboard
PlasmaComponents.ItemDelegate {
visible: remoteKeyboard.remoteState
Layout.fillWidth: true
contentItem: RowLayout {
width: parent.width
spacing: 5
PlasmaComponents.Label {
id: remoteKeyboardLabel
text: i18n("Remote Keyboard")
}
KDEConnect.RemoteKeyboard {
id: remoteKeyboard
device: root.device
Layout.fillWidth: true
}
}
}
// Notifications
PlasmaComponents.ItemDelegate {
visible: notificationsModel.count > 0
enabled: true
Layout.fillWidth: true
contentItem: RowLayout {
spacing: Kirigami.Units.smallSpacing
PlasmaComponents.Label {
text: i18n("Notifications:")
}
PlasmaComponents.ToolButton {
enabled: true
visible: notificationsModel.isAnyDimissable;
Layout.alignment: Qt.AlignRight
icon.name: "edit-clear-history"
PlasmaComponents.ToolTip.text: i18n("Dismiss all notifications")
onClicked: notificationsModel.dismissAll();
}
}
}
Repeater {
id: notificationsView
model: KDEConnect.NotificationsModel {
id: notificationsModel
deviceId: root.model.deviceId
}
delegate: PlasmaComponents.ItemDelegate {
id: listitem
required property int index
required property var model
enabled: true
onClicked: checked = !checked
Layout.fillWidth: true
property bool replying: false
contentItem: ColumnLayout {
spacing: Kirigami.Units.smallSpacing
RowLayout {
spacing: Kirigami.Units.smallSpacing
Kirigami.Icon {
id: notificationIcon
source: listitem.model.appIcon
width: (valid && listitem.model.appIcon !== "") ? dismissButton.width : 0
height: width
Layout.alignment: Qt.AlignLeft
}
PlasmaComponents.Label {
id: notificationLabel
text: {
const { appName, notitext, title } = listitem.model;
const description = title !== "" ? (appName === title ? notitext : `${title}: ${notitext}`) : notitext;
return `${appName}: ${description}`;
}
elide: listitem.checked ? Text.ElideNone : Text.ElideRight
maximumLineCount: listitem.checked ? 0 : 1
wrapMode: Text.Wrap
Layout.fillWidth: true
}
PlasmaComponents.ToolButton {
id: replyButton
visible: listitem.model.repliable
enabled: listitem.model.repliable && !listitem.replying
icon.name: "mail-reply-sender"
PlasmaComponents.ToolTip.text: i18n("Reply")
onClicked: {
listitem.replying = true;
replyTextField.forceActiveFocus();
}
}
PlasmaComponents.ToolButton {
id: dismissButton
visible: notificationsModel.isAnyDimissable;
enabled: listitem.model.dismissable
Layout.alignment: Qt.AlignRight
icon.name: "window-close"
PlasmaComponents.ToolTip.text: i18n("Dismiss")
onClicked: listitem.model.dbusInterface.dismiss();
}
}
RowLayout {
visible: listitem.replying
width: notificationLabel.width + replyButton.width + dismissButton.width + Kirigami.Units.smallSpacing * 2
spacing: Kirigami.Units.smallSpacing
PlasmaComponents.Button {
id: replyCancelButton
Layout.alignment: Qt.AlignBottom
text: i18n("Cancel")
display: PlasmaComponents.AbstractButton.IconOnly
PlasmaComponents.ToolTip {
text: replyCancelButton.text
}
icon.name: "dialog-cancel"
onClicked: {
replyTextField.text = "";
listitem.replying = false;
}
}
PlasmaComponents.TextArea {
id: replyTextField
placeholderText: i18nc("@info:placeholder", "Reply to %1…", listitem.model.appName)
wrapMode: TextEdit.Wrap
Layout.fillWidth: true
Keys.onPressed: event => {
if ((event.key === Qt.Key_Return || event.key === Qt.Key_Enter) && !(event.modifiers & Qt.ShiftModifier)) {
replySendButton.clicked();
event.accepted = true;
}
if (event.key === Qt.Key_Escape) {
replyCancelButton.clicked();
event.accepted = true;
}
}
}
PlasmaComponents.Button {
Layout.alignment: Qt.AlignBottom
id: replySendButton
text: i18n("Send")
icon.name: "document-send"
enabled: replyTextField.text !== ""
onClicked: {
listitem.model.dbusInterface.sendReply(replyTextField.text);
replyTextField.text = "";
listitem.replying = false;
}
}
}
}
}
}
// Commands
RowLayout {
visible: remoteCommands.available
width: parent.width
spacing: Kirigami.Units.smallSpacing
PlasmaComponents.Label {
text: i18n("Run command")
Layout.fillWidth: true
}
PlasmaComponents.Button {
id: addCommandButton
icon.name: "list-add"
PlasmaComponents.ToolTip.text: i18n("Add command")
onClicked: remoteCommands.plugin.editCommands()
visible: remoteCommands.plugin?.canAddCommand ?? false
}
}
Repeater {
id: commandsView
visible: remoteCommands.available
model: KDEConnect.RemoteCommandsModel {
id: commandsModel
deviceId: root.model.deviceId
}
delegate: PlasmaComponents.ItemDelegate {
id: commandDelegate
required property int index
required property var model
enabled: true
onClicked: {
remoteCommands.plugin?.triggerCommand(commandDelegate.model.key);
}
Layout.fillWidth: true
contentItem: PlasmaComponents.Label {
text: `${commandDelegate.model.name}\n${commandDelegate.model.command}`
}
}
}
}
}

View File

@@ -0,0 +1,42 @@
/**
* SPDX-FileCopyrightText: 2014 Samoilenko Yuri <kinnalru@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
id: checker
pluginName: "findmyphone"
device: root.device
}
property KDEConnect.FindMyPhoneDbusInterface findMyPhone
function ring(): void {
if (findMyPhone) {
findMyPhone.ring();
}
}
onAvailableChanged: {
if (available) {
findMyPhone = KDEConnect.FindMyPhoneDbusInterfaceFactory.create(device.id());
} else {
findMyPhone = null;
}
}
}

View File

@@ -0,0 +1,98 @@
/**
* SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Controls as QQC2
import QtQuick.Layouts
import org.kde.config as KConfig
import org.kde.kdeconnect as KDEConnect
import org.kde.kirigami as Kirigami
import org.kde.plasma.components as PlasmaComponents3
import org.kde.plasma.extras as PlasmaExtras
PlasmaExtras.Representation {
id: kdeconnect
property alias devicesModel: devicesView.model
collapseMarginsHint: true
KDEConnect.DevicesModel {
id: allDevicesModel
}
KDEConnect.DevicesModel {
id: pairedDevicesModel
displayFilter: KDEConnect.DevicesModel.Paired
}
PlasmaComponents3.ScrollView {
anchors.fill: parent
contentItem: ListView {
id: devicesView
spacing: Kirigami.Units.smallSpacing
clip: true
delegate: DeviceDelegate {
width: ListView.view.width - ListView.view.leftMargin - ListView.view.rightMargin
}
PlasmaExtras.PlaceholderMessage {
width: parent.width - Kirigami.Units.gridUnit * 2
anchors.centerIn: parent
visible: devicesView.count === 0
iconName: {
if (pairedDevicesModel.count >= 0) {
return pairedDevicesModel.count === 0 ? "edit-none" : "network-disconnect";
}
return "kdeconnect";
}
text: {
if (pairedDevicesModel.count >= 0) {
return pairedDevicesModel.count === 0 ? i18n("No paired devices") : i18np("Paired device is unavailable", "All paired devices are unavailable", pairedDevicesModel.count)
} else if (allDevicesModel.count === 0) {
return i18n("Install KDE Connect on your Android device to integrate it with Plasma!")
}
}
helpfulAction: QQC2.Action {
text: i18n("Pair a Device…")
icon.name: "list-add"
onTriggered: KDEConnect.OpenConfig.openConfiguration()
enabled: pairedDevicesModel.count === 0
}
PlasmaComponents3.Button {
Layout.leftMargin: Kirigami.Units.gridUnit * 3
Layout.rightMargin: Kirigami.Units.gridUnit * 3
Layout.alignment: Qt.AlignHCenter
Layout.fillWidth: true
visible: allDevicesModel.count === 0
text: i18n("Install from Google Play")
onClicked: Qt.openUrlExternally("https://play.google.com/store/apps/details?id=org.kde.kdeconnect_tp")
}
PlasmaComponents3.Button {
Layout.leftMargin: Kirigami.Units.gridUnit * 3
Layout.rightMargin: Kirigami.Units.gridUnit * 3
Layout.alignment: Qt.AlignHCenter
Layout.fillWidth: true
visible: allDevicesModel.count === 0
text: i18n("Install from F-Droid")
onClicked: Qt.openUrlExternally("https://f-droid.org/en/packages/org.kde.kdeconnect_tp/")
}
}
}
}
}

View File

@@ -0,0 +1,29 @@
/**
* SPDX-FileCopyrightText: 2018 Nicolas Fella <nicolas.fella@gmx.de>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
id: checker
pluginName: "remotecommands"
device: root.device
}
property KDEConnect.RemoteCommandsDbusInterface plugin:
available ? KDEConnect.RemoteCommandsDbusInterfaceFactory.create(device.id()) : null
}

View File

@@ -0,0 +1,29 @@
/**
* SPDX-FileCopyrightText: 2019 Aleix Pol Gonzalez <aleixpol@kde.org>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
id: checker
pluginName: "sms"
device: root.device
}
readonly property KDEConnect.SmsDbusInterface plugin:
available ? KDEConnect.SmsDbusInterfaceFactory.create(device.id()) : null
}

View File

@@ -0,0 +1,42 @@
/**
* SPDX-FileCopyrightText: 2014 Samoilenko Yuri <kinnalru@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
id: checker
pluginName: "sftp"
device: root.device
}
property KDEConnect.SftpDbusInterface sftp
function browse(): void {
if (sftp) {
sftp.startBrowsing();
}
}
onAvailableChanged: {
if (available) {
sftp = KDEConnect.SftpDbusInterfaceFactory.create(device.id());
} else {
sftp = null;
}
}
}

View File

@@ -0,0 +1,29 @@
/**
* SPDX-FileCopyrightText: 2018 Nicolas Fella <nicolas.fella@gmx.de>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
id: checker
pluginName: "share"
device: root.device
}
property KDEConnect.ShareDbusInterface plugin:
available ? KDEConnect.ShareDbusInterfaceFactory.create(device.id()) : null
}

View File

@@ -0,0 +1,29 @@
/**
* SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
id: checker
pluginName: "virtualmonitor"
device: root.device
}
readonly property KDEConnect.VirtualmonitorDbusInterface plugin:
available ? KDEConnect.VirtualmonitorDbusInterfaceFactory.create(device.id()) : null
}

View File

@@ -0,0 +1,62 @@
/**
* SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@kde.org>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.config as KConfig
import org.kde.kdeconnect as KDEConnect
import org.kde.kquickcontrolsaddons as KQuickControlsAddons
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.plasmoid
PlasmoidItem {
id: root
readonly property bool inPanel: [
PlasmaCore.Types.TopEdge,
PlasmaCore.Types.RightEdge,
PlasmaCore.Types.BottomEdge,
PlasmaCore.Types.LeftEdge,
].includes(Plasmoid.location)
KDEConnect.DevicesModel {
id: connectedDeviceModel
displayFilter: KDEConnect.DevicesModel.Paired | KDEConnect.DevicesModel.Reachable
}
KDEConnect.DevicesModel {
id: pairedDeviceModel
displayFilter: KDEConnect.DevicesModel.Paired
}
Plasmoid.icon: inPanel
? "kdeconnect-tray-symbolic"
: "kdeconnect-tray"
Plasmoid.status: connectedDeviceModel.count > 0 ? PlasmaCore.Types.ActiveStatus : PlasmaCore.Types.PassiveStatus
fullRepresentation: FullRepresentation {
devicesModel: connectedDeviceModel
}
compactRepresentation: CompactRepresentation {
plasmoidItem: root
}
PlasmaCore.Action {
id: configureAction
text: i18n("KDE Connect Settings…")
icon.name: "configure"
onTriggered: KDEConnect.OpenConfig.openConfiguration()
}
Component.onCompleted: {
Plasmoid.setInternalAction("configure", configureAction);
}
}

View File

@@ -0,0 +1,150 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "albertvaka@gmail.com",
"Name": "Albert Vaca Cintora",
"Name[ar]": "ألبرت فاكا سينتورا",
"Name[az]": "Albert Vaca Cintora",
"Name[bg]": "Albert Vaca Cintora",
"Name[ca@valencia]": "Albert Vaca Cintora",
"Name[ca]": "Albert Vaca Cintora",
"Name[cs]": "Albert Vaca Cintora",
"Name[da]": "Albert Vaca Cintora",
"Name[de]": "Albert Vaca Cintora",
"Name[en_GB]": "Albert Vaca Cintora",
"Name[eo]": "Albert Vaca Cintora",
"Name[es]": "Albert Vaca Cintora",
"Name[eu]": "Albert Vaca Cintora",
"Name[fi]": "Albert Vaca Cintora",
"Name[fr]": "Albert Vaca Cintora",
"Name[ga]": "Albert Vaca Cintora",
"Name[gl]": "Albert Vaca Cintora",
"Name[he]": "אלברט ואקה סינטורה",
"Name[hi]": "अल्बर्ट वाका सिंटोरा",
"Name[hu]": "Albert Vaca Cintora",
"Name[ia]": "Albert Vaca Cintora",
"Name[is]": "Albert Vaca Cintora",
"Name[it]": "Albert Vaca Cintora",
"Name[ja]": "Albert Vaca Cintora",
"Name[ka]": "Albert Vaca Cintora",
"Name[ko]": "Albert Vaca Cintora",
"Name[lt]": "Albert Vaca Cintora",
"Name[lv]": "Albert Vaca Cintora",
"Name[nl]": "Albert Vaca Cintora",
"Name[nn]": "Albert Vaca Cintora",
"Name[pl]": "Albert Vaca Cintora",
"Name[pt]": "Albert Vaca Cintora",
"Name[pt_BR]": "Albert Vaca Cintora",
"Name[ro]": "Albert Vaca Cintora",
"Name[ru]": "Albert Vaca Cintora",
"Name[sa]": "अल्बर्ट वाका सिन्टोरा",
"Name[sk]": "Albert Vaca Cintora",
"Name[sl]": "Albert Vaca Cintora",
"Name[sv]": "Albert Vaca Cintora",
"Name[tr]": "Albert Vaca Cintora",
"Name[uk]": "Albert Vaca Cintora",
"Name[zh_CN]": "Albert Vaca Cintora",
"Name[zh_TW]": "Albert Vaca Cintora"
}
],
"Category": "System Information",
"Description": "Manage connected devices",
"Description[ar]": "تدير الأجهزة المتصلة",
"Description[bg]": "Управление на свързани устройства",
"Description[ca@valencia]": "Gestiona els dispositius connectats",
"Description[ca]": "Gestiona els dispositius connectats",
"Description[cs]": "Spravovat připojená zařízení",
"Description[da]": "Håndtér forbundede enheder",
"Description[de]": "Verbundene Geräte verwalten",
"Description[en_GB]": "Manage connected devices",
"Description[eo]": "Mastrumi konektitajn aparatojn",
"Description[es]": "Administrar dispositivos conectados",
"Description[eu]": "Konektatutako gailuak kudeatu",
"Description[fi]": "Hallitse kytkettyjä laitteita",
"Description[fr]": "Gérer les appareils connectés",
"Description[ga]": "Bainistigh gléasanna ceangailte",
"Description[gl]": "Xestionar os dispositivos conectados.",
"Description[he]": "ניהול התקנים מחוברים",
"Description[hu]": "Csatlakoztatott eszközök kezelése",
"Description[ia]": "Gere dispositivos connectite",
"Description[is]": "Stjórna tengdum tækjum",
"Description[it]": "Gestisci i dispositivi connessi",
"Description[ka]": "მიერთებული მოწყობილობების მართვა",
"Description[ko]": "연결된 장치 관리",
"Description[lt]": "Tvarkyti prijungtus įrenginius",
"Description[lv]": "Pārvaldīt savienotās ierīces",
"Description[nl]": "Verbonden apparaten beheren",
"Description[nn]": "Handsam tilkopla einingar",
"Description[pa]": "ਕਨੈਕਟ ਹੋਏ ਡਿਵਾਈਸਾਂ ਦਾ ਇੰਤਜ਼ਾਮ",
"Description[pl]": "Zarządzaj podłączonymi urządzeniami",
"Description[pt_BR]": "Gerenciar dispositivos conectados",
"Description[ro]": "Gestionează dispozitivele conectate",
"Description[ru]": "Управление подключёнными устройствами",
"Description[sa]": "संयोजितयन्त्राणां प्रबन्धनं कुर्वन्तु",
"Description[sl]": "Upravljaj povezane naprave",
"Description[sv]": "Hantera anslutna apparater",
"Description[ta]": "இணைந்துள்ள சாதனங்களை நிர்வகிக்க விடும்",
"Description[tr]": "Bağlı aygıtları yönetin",
"Description[uk]": "Керування з'єднаними пристроями",
"Description[zh_CN]": "管理已连接的设备",
"Description[zh_TW]": "管理已連線裝置",
"EnabledByDefault": true,
"Icon": "kdeconnect",
"Id": "org.kde.kdeconnect",
"License": "GPL",
"Name": "KDE Connect",
"Name[ar]": "جسر كِيدِي",
"Name[az]": "KDE Connect",
"Name[bg]": "KDE Connect",
"Name[ca@valencia]": "KDE Connect",
"Name[ca]": "KDE Connect",
"Name[cs]": "KDE Connect",
"Name[da]": "KDE Connect",
"Name[de]": "KDE Connect",
"Name[en_GB]": "KDE Connect",
"Name[eo]": "KDE Konekti",
"Name[es]": "KDE Connect",
"Name[eu]": "KDE Connect",
"Name[fi]": "KDE Connect",
"Name[fr]": "KDEConnect",
"Name[ga]": "KDE Connect",
"Name[gl]": "KDE Connect",
"Name[he]": "KDE Connect",
"Name[hi]": "केडीई कनेक्ट",
"Name[hu]": "KDE Connect",
"Name[ia]": "KDE Connect",
"Name[is]": "KDE Connect",
"Name[it]": "KDE Connect",
"Name[ja]": "KDE Connect",
"Name[ka]": "KDE Connect",
"Name[ko]": "KDE Connect",
"Name[lt]": "KDE Connect",
"Name[lv]": "KDE Connect",
"Name[nl]": "KDE Connect",
"Name[nn]": "KDE Connect",
"Name[pa]": "KDE ਕਨੈਕਟ",
"Name[pl]": "KDE Connect",
"Name[pt]": "KDE Connect",
"Name[pt_BR]": "KDE Connect",
"Name[ro]": "KDE Connect",
"Name[ru]": "KDE Connect",
"Name[sa]": "KDE Connect इति",
"Name[sk]": "KDE Connect",
"Name[sl]": "KDE Connect",
"Name[sv]": "KDE-anslut",
"Name[ta]": "கே.டீ.யீ. கனெக்ட்",
"Name[tr]": "KDE Bağlan",
"Name[uk]": "KDE Connect",
"Name[zh_CN]": "KDE Connect",
"Name[zh_TW]": "KDE Connect",
"Version": "0.1",
"Website": "https://albertvaka.wordpress.com"
},
"X-Plasma-API": "declarativeappletscript",
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-MainScript": "ui/main.qml",
"X-Plasma-NotificationArea": "true",
"X-Plasma-NotificationAreaCategory": "Hardware"
}

View File

@@ -0,0 +1,177 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "plasma-devel@kde.org",
"Name": "The Plasma Team",
"Name[ar]": "فريق بلازما",
"Name[ast]": "L'equipu de Plasma",
"Name[az]": "Plasma komandası",
"Name[be]": "Каманда Plasma",
"Name[bg]": "Екипът на Plasma",
"Name[ca@valencia]": "L'equip de Plasma",
"Name[ca]": "L'equip del Plasma",
"Name[cs]": "Team Plasma",
"Name[da]": "Plasma-udviklingsholdet",
"Name[de]": "Das Plasma-Team",
"Name[el]": "Η ομάδα Plasma",
"Name[en_GB]": "The Plasma Team",
"Name[eo]": "La Teamo de Plasma",
"Name[es]": "El equipo de Plasma",
"Name[et]": "Plasma meeskond",
"Name[eu]": "Plasmaren taldea",
"Name[fi]": "Plasma-työryhmä",
"Name[fr]": "L'équipe de Plasma",
"Name[ga]": "An Fhoireann Plasma",
"Name[gl]": "O equipo de Plasma",
"Name[he]": "צוות פלזמה",
"Name[hu]": "A Plasma fejlesztői",
"Name[ia]": "Le equipa de Plasma",
"Name[id]": "Tim Plasma",
"Name[ie]": "Li equipe de Plasma",
"Name[is]": "Plasma-þróunarhópurinn",
"Name[it]": "La squadra di Plasma",
"Name[ja]": "Plasma チーム",
"Name[ka]": "Plasma-ის გუნდი",
"Name[ko]": "Plasma 팀",
"Name[lt]": "Plasma komanda",
"Name[lv]": "„Plasma“ komanda",
"Name[nb]": "Utviklingslaget for Plasma",
"Name[nl]": "Het team van Plasma",
"Name[nn]": "Utviklingslaget for Plasma",
"Name[pa]": "ਪਲਾਜ਼ਮਾ ਟੀਮ",
"Name[pl]": "Zespół Plazmy",
"Name[pt]": "A Equipa do Plasma",
"Name[pt_BR]": "A equipe do Plasma",
"Name[ro]": "Echipa Plasma",
"Name[ru]": "Команда разработчиков Plasma",
"Name[sa]": "प्लाज्मादलम्",
"Name[sk]": "Tím Plasma",
"Name[sl]": "Ekipa Plasme",
"Name[sv]": "Plasma-gruppen",
"Name[ta]": "பிளாஸ்மா குழு",
"Name[tr]": "Plasma Takımı",
"Name[uk]": "Команда розробників Плазми",
"Name[vi]": "Đội Plasma",
"Name[zh_CN]": "Plasma 开发团队",
"Name[zh_TW]": "Plasma 團隊"
}
],
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=plasmashell&component=Pager%20widget",
"Category": "Windows and Tasks",
"Description": "Switch between activities",
"Description[ar]": "بدل بين الأنشطة",
"Description[az]": "Otaqlar arası keçid",
"Description[be]": "Пераключэнне паміж пакоямі",
"Description[bg]": "Превключване между дейностите",
"Description[ca@valencia]": "Canvia entre activitats",
"Description[ca]": "Commuta entre activitats",
"Description[cs]": "Přepnout mezi aktivitami",
"Description[da]": "Skift mellem aktiviteter",
"Description[de]": "Zwischen Aktivitäten umschalten",
"Description[el]": "Εναλλαγή μεταξύ δραστηριοτήτων",
"Description[en_GB]": "Switch between activities",
"Description[eo]": "Komuti inter aktivecoj",
"Description[es]": "Cambiar entre actividades",
"Description[et]": "Lülitumine tegevuste vahel",
"Description[eu]": "Jarduera artean trukatzea",
"Description[fi]": "Vaihda aktiviteetista toiseen",
"Description[fr]": "Basculer entre les activités",
"Description[ga]": "Athraigh idir gníomhaíochtaí",
"Description[gl]": "Cambia de actividade.",
"Description[he]": "מעבר בין פעילויות",
"Description[hu]": "Váltás az aktivitások között",
"Description[ia]": "Commuta inter activitates",
"Description[id]": "Beralih antar aktivitas",
"Description[ie]": "Alterar li activitás",
"Description[is]": "Skipt á milli athafna",
"Description[it]": "Passa da un'attività all'altra",
"Description[ja]": "アクティビティの切り替え",
"Description[ka]": "აქტივობებს შორის გადართვა",
"Description[ko]": "활동간 전환",
"Description[lt]": "Perjungti tarp veiklų",
"Description[lv]": "Pārslēgties starp aktivitātēm",
"Description[nb]": "Bytt mellom aktiviteter",
"Description[nl]": "Tussen activiteiten schakelen",
"Description[nn]": "Byt mellom aktivitetar",
"Description[pa]": "ਸਰਗਰਮੀਆਂ ਵਿਚਾਲੇ ਬਦਲੋ",
"Description[pl]": "Przełącza między aktywnościami",
"Description[pt]": "Mudar de actividades",
"Description[pt_BR]": "Alternar entre as atividades",
"Description[ro]": "Schimbă între activități",
"Description[ru]": "Переключение между комнатами",
"Description[sa]": "क्रियाकलापानाम् मध्ये परिवर्तनं कुर्वन्तु",
"Description[sk]": "Prepínanie medzi aktivitami",
"Description[sl]": "Preklopi med opravili",
"Description[sv]": "Byt mellan aktiviteter",
"Description[ta]": "செயல்பாடுகளுக்கிடையே தாவ உதவும்",
"Description[tr]": "Etkinlikler arasında gezin",
"Description[uk]": "Перемикання між просторами дій",
"Description[vi]": "Chuyển giữa các Hoạt động",
"Description[zh_CN]": "在不同活动之间切换",
"Description[zh_TW]": "在活動間切換",
"EnabledByDefault": true,
"Icon": "org.kde.plasma.pager",
"Id": "org.kde.plasma.activitypager",
"License": "GPL-2.0+",
"Name": "Activity Pager",
"Name[ar]": "مبوب الأنشطة",
"Name[az]": "İş otağı dəyişdiricisi",
"Name[be]": "Пэйджар пакояў",
"Name[bg]": "Пейджър на дейностите",
"Name[ca@valencia]": "Paginador d'activitats",
"Name[ca]": "Paginador d'activitats",
"Name[cs]": "Prohlížeč aktivit",
"Name[da]": "Aktivitetssøger",
"Name[de]": "Aktivitätenübersicht",
"Name[el]": "Σελιδοποίηση δραστηριότητας",
"Name[en_GB]": "Activity Pager",
"Name[eo]": "Aktiveca Tabulpaĝilo",
"Name[es]": "Paginador de actividades",
"Name[et]": "Tegevuste lülitaja",
"Name[eu]": "Jardueren orrialdekatzailea",
"Name[fi]": "Aktiviteettisivutin",
"Name[fr]": "Gestionnaire d'activités",
"Name[ga]": "Leathanach Gníomhaíochta",
"Name[gl]": "Paxinador de actividades",
"Name[he]": "דפדפן פעילויות",
"Name[hu]": "Aktivitásváltó",
"Name[ia]": "Pager de activitate",
"Name[id]": "Pager Aktivitas",
"Name[ie]": "Paginator de activitás",
"Name[is]": "Athafnaflettir",
"Name[it]": "Paginatore attività",
"Name[ja]": "アクティビティページャ",
"Name[ka]": "აქტივობის პეიჯერი",
"Name[ko]": "활동 호출기",
"Name[lt]": "Veiklų perjungiklis",
"Name[lv]": "Aktivitāšu lapotājs",
"Name[nb]": "Aktivitetsbytter",
"Name[nl]": "Pager van activiteiten",
"Name[nn]": "Aktivitets­bytar",
"Name[pa]": "ਸਰਗਰਮੀ ਪੇਜ਼ਰ",
"Name[pl]": "Przełącznik aktywności",
"Name[pt]": "Paginador de Actividades",
"Name[pt_BR]": "Paginador de atividades",
"Name[ro]": "Paginator de activități",
"Name[ru]": "Переключение комнат",
"Name[sa]": "गतिविधि पेजर",
"Name[sk]": "Stránkovač aktivít",
"Name[sl]": "Pager dejavnosti",
"Name[sv]": "Aktivitetsbytare",
"Name[ta]": "செயல்பாடு மாற்றி",
"Name[tr]": "Etkinlik Sayfalayıcısı",
"Name[uk]": "Пейджер просторів дій",
"Name[vi]": "Tổng quan Hoạt động",
"Name[zh_CN]": "活动切换器",
"Name[zh_TW]": "活動管理器",
"Website": "https://userbase.kde.org"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-Provides": [
"org.kde.plasma.virtualdesktops",
"org.kde.plasma.activities"
],
"X-Plasma-RootPath": "org.kde.plasma.pager"
}

View File

@@ -0,0 +1,185 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "hein@kde.org",
"Name": "Eike Hein",
"Name[ar]": "إيكي هين",
"Name[az]": "Eike Hein",
"Name[be]": "Eike Hein",
"Name[bg]": "Eike Hein",
"Name[ca@valencia]": "Eike Hein",
"Name[ca]": "Eike Hein",
"Name[cs]": "Eike Hein",
"Name[da]": "Eike Hein",
"Name[de]": "Eike Hein",
"Name[el]": "Eike Hein",
"Name[en_GB]": "Eike Hein",
"Name[eo]": "Eike Hein",
"Name[es]": "Eike Hein",
"Name[et]": "Eike Hein",
"Name[eu]": "Eike Hein",
"Name[fi]": "Eike Hein",
"Name[fr]": "Eike Hein",
"Name[ga]": "Eike Hein",
"Name[gl]": "Eike Hein",
"Name[he]": "אייק היין",
"Name[hu]": "Eike Hein",
"Name[ia]": "Eike Hein",
"Name[id]": "Eike Hein",
"Name[ie]": "Eike Hein",
"Name[is]": "Eike Hein",
"Name[it]": "Eike Hein",
"Name[ja]": "Eike Hein",
"Name[ka]": "აიკე ჰაინი",
"Name[ko]": "Eike Hein",
"Name[lt]": "Eike Hein",
"Name[lv]": "Eike Hein",
"Name[nb]": "Eike Hein",
"Name[nl]": "Eike Hein",
"Name[nn]": "Eike Hein",
"Name[pa]": "ਇਕੀ ਹੀਇਨ",
"Name[pl]": "Eike Hein",
"Name[pt]": "Eike Hein",
"Name[pt_BR]": "Eike Hein",
"Name[ro]": "Eike Hein",
"Name[ru]": "Eike Hein",
"Name[sa]": "ऐके हेन",
"Name[sk]": "Eike Hein",
"Name[sl]": "Eike Hein",
"Name[sv]": "Eike Hein",
"Name[ta]": "எய்கே ஹைன்",
"Name[tr]": "Eike Hein",
"Name[uk]": "Eike Hein",
"Name[vi]": "Eike Hein",
"Name[zh_CN]": "Eike Hein",
"Name[zh_TW]": "Eike Hein"
}
],
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=plasmashell&component=Folder",
"Category": "File System",
"Description": "Display the contents of folders",
"Description[ar]": "اعرض محتويات المجلّدات",
"Description[az]": "Qovluqların tərkibinə baxış",
"Description[be]": "Паказваць змесціва каталогаў",
"Description[bg]": "Показване на съдържанието на папки",
"Description[ca@valencia]": "Mostra el contingut de les carpetes",
"Description[ca]": "Mostra el contingut de les carpetes",
"Description[cs]": "Zobrazit obsah složek",
"Description[da]": "Vis indholdet af mapper",
"Description[de]": "Ordnerinhalte anzeigen",
"Description[el]": "Εμφάνιση των περιεχομένων των φακέλων",
"Description[en_GB]": "Display the contents of folders",
"Description[eo]": "Montri la enhavon de dosierujoj",
"Description[es]": "Mostrar el contenido de carpetas",
"Description[et]": "Kataloogide sisu näitamine",
"Description[eu]": "Karpeten edukia erakustea",
"Description[fi]": "Näyttää kansion sisällön",
"Description[fr]": "Afficher le contenu des dossiers",
"Description[ga]": "Taispeáin ábhar na bhfillteán",
"Description[gl]": "Amosa o contido de cartafoles.",
"Description[he]": "מציג תוכן של תיקייה",
"Description[hu]": "Megjeleníti a mappák tartalmát",
"Description[ia]": "Monstra le contentos de dossieres",
"Description[id]": "Tampilkan konten folder",
"Description[ie]": "Monstrar li contenete de fólderes",
"Description[is]": "Sýna innihald í möppum",
"Description[it]": "Visualizza il contenuto delle cartelle",
"Description[ja]": "フォルダの内容を表示します",
"Description[ka]": "საქაღალდეების შიგთავსის ჩვენება",
"Description[ko]": "폴더의 내용 보기",
"Description[lt]": "Rodyti aplankų turinį",
"Description[lv]": "Parādīt mapju saturu",
"Description[nb]": "Vis innholdet i mapper",
"Description[nl]": "Toon de inhoud van mappen",
"Description[nn]": "Vis innhaldet i mapper",
"Description[pa]": "ਫੋਲਡਰਾਂ ਦੀ ਸਮੱਗਰੀ ਵੇਖਾਓ",
"Description[pl]": "Wyświetla zawartość katalogów",
"Description[pt]": "Mostrar o conteúdo das pastas",
"Description[pt_BR]": "Mostra o conteúdo das pastas",
"Description[ro]": "Afișează conținutul dosarelor",
"Description[ru]": "Вывод содержимого папки",
"Description[sa]": "पुटस्य सामग्रीं प्रदर्शयन्तु",
"Description[sk]": "Zobraziť obsah priečinkov",
"Description[sl]": "Pokaži vsebino map",
"Description[sv]": "Visa innehåll i kataloger",
"Description[ta]": "அடைவுகளின் உள்ளடக்கத்தை காட்டும்",
"Description[tr]": "Klasörlerin içeriğini görüntüle",
"Description[uk]": "Показ вмісту тек",
"Description[vi]": "Hiển thị nội dung các thư mục",
"Description[zh_CN]": "显示文件夹的内容",
"Description[zh_TW]": "顯示資料夾內容",
"EnabledByDefault": true,
"Icon": "org.kde.plasma.folder",
"Id": "org.kde.plasma.folder",
"License": "GPL-2.0+",
"Name": "Folder View",
"Name[ar]": "عرض المجلّد",
"Name[az]": "Qovluqlara baxış",
"Name[be]": "Каталогі",
"Name[bg]": "Преглед на папка",
"Name[ca@valencia]": "Vista de carpetes",
"Name[ca]": "Vista de carpeta",
"Name[cs]": "Pohled na složku",
"Name[da]": "Mappevisning",
"Name[de]": "Ordner-Ansicht",
"Name[el]": "Προβολή φακέλου",
"Name[en_GB]": "Folder View",
"Name[eo]": "Dosieruja Vidigo",
"Name[es]": "Vista de carpetas",
"Name[et]": "Kataloogivaade",
"Name[eu]": "Karpeta ikuspegia",
"Name[fi]": "Kansionäkymä",
"Name[fr]": "Vue de dossier",
"Name[ga]": "Amharc Fillteán",
"Name[gl]": "Vista de cartafoles",
"Name[he]": "הצגת תיקיות",
"Name[hu]": "Mappanézet",
"Name[ia]": "Vista del Dossier",
"Name[id]": "Tampilan Folder",
"Name[ie]": "Vise de fólder",
"Name[is]": "Möppuyfirlit",
"Name[it]": "Vista delle cartelle",
"Name[ja]": "フォルダビュー",
"Name[ka]": "საქაღალდის ხედი",
"Name[ko]": "폴더 보기",
"Name[lt]": "Aplankų rodinys",
"Name[lv]": "Mapes skats",
"Name[nb]": "Mappevisning",
"Name[nl]": "Mapweergave",
"Name[nn]": "Mappe­vising",
"Name[pa]": "ਫੋਲਡਰ ਝਲਕ",
"Name[pl]": "Widok katalogu",
"Name[pt]": "Vista da Pasta",
"Name[pt_BR]": "Visualização de pastas",
"Name[ro]": "Vizualizare dosare",
"Name[ru]": "Просмотр папки",
"Name[sa]": "समुच्चय दृश्यम्",
"Name[se]": "Máhppačájeheapmi",
"Name[sk]": "Pohľad priečinka",
"Name[sl]": "Prikaz mape",
"Name[sr@ijekavian]": "Приказ фасцикле",
"Name[sr@ijekavianlatin]": "Prikaz fascikle",
"Name[sr@latin]": "Prikaz fascikle",
"Name[sr]": "Приказ фасцикле",
"Name[sv]": "Katalogvy",
"Name[ta]": "அடைவு பார்வை",
"Name[tg]": "Намуди ҷузвадонҳо",
"Name[tr]": "Klasör Görünümü",
"Name[uk]": "Перегляд теки",
"Name[vi]": "Xem thư mục",
"Name[zh_CN]": "文件夹视图",
"Name[zh_TW]": "資料夾檢視",
"Website": "https://www.kde.org/plasma-desktop"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-ContainmentType": "Desktop",
"X-Plasma-DropMimeTypes": [
"inode/directory"
],
"X-Plasma-Provides": [
"org.kde.plasma.filemanagement"
],
"X-Plasma-RootPath": "org.kde.desktopcontainment"
}

View File

@@ -0,0 +1,165 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "hein@kde.org",
"Name": "Eike Hein",
"Name[ar]": "إيكي هين",
"Name[az]": "Eike Hein",
"Name[be]": "Eike Hein",
"Name[bg]": "Eike Hein",
"Name[ca@valencia]": "Eike Hein",
"Name[ca]": "Eike Hein",
"Name[cs]": "Eike Hein",
"Name[da]": "Eike Hein",
"Name[de]": "Eike Hein",
"Name[el]": "Eike Hein",
"Name[en_GB]": "Eike Hein",
"Name[eo]": "Eike Hein",
"Name[es]": "Eike Hein",
"Name[et]": "Eike Hein",
"Name[eu]": "Eike Hein",
"Name[fi]": "Eike Hein",
"Name[fr]": "Eike Hein",
"Name[ga]": "Eike Hein",
"Name[gl]": "Eike Hein",
"Name[he]": "אייק היין",
"Name[hu]": "Eike Hein",
"Name[ia]": "Eike Hein",
"Name[id]": "Eike Hein",
"Name[ie]": "Eike Hein",
"Name[is]": "Eike Hein",
"Name[it]": "Eike Hein",
"Name[ja]": "Eike Hein",
"Name[ka]": "აიკე ჰაინი",
"Name[ko]": "Eike Hein",
"Name[lt]": "Eike Hein",
"Name[lv]": "Eike Hein",
"Name[nb]": "Eike Hein",
"Name[nl]": "Eike Hein",
"Name[nn]": "Eike Hein",
"Name[pa]": "ਇਕੀ ਹੀਇਨ",
"Name[pl]": "Eike Hein",
"Name[pt]": "Eike Hein",
"Name[pt_BR]": "Eike Hein",
"Name[ro]": "Eike Hein",
"Name[ru]": "Eike Hein",
"Name[sa]": "ऐके हेन",
"Name[sk]": "Eike Hein",
"Name[sl]": "Eike Hein",
"Name[sv]": "Eike Hein",
"Name[ta]": "எய்கே ஹைன்",
"Name[tr]": "Eike Hein",
"Name[uk]": "Eike Hein",
"Name[vi]": "Eike Hein",
"Name[zh_CN]": "Eike Hein",
"Name[zh_TW]": "Eike Hein"
}
],
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=plasmashell&component=Task%20Manager%20and%20Icons-Only%20Task%20Manager%20widgets",
"Category": "Windows and Tasks",
"Description": "App bar displaying only icons",
"Description[ar]": "شريط التطبيقات يعرض أيقونات فقط",
"Description[az]": "Yalnız nişanları göstərən tətbiq paneli",
"Description[be]": "На панэлі праграм паказваюцца толькі значкі",
"Description[bg]": "Лента с приложения, показваща само икони",
"Description[ca@valencia]": "Barra d'aplicacions que mostra només les icones",
"Description[ca]": "Barra d'aplicacions que mostra només les icones",
"Description[da]": "App-linjen viser kun ikoner",
"Description[de]": "Nur Symbole werden auf der Anwendungsleiste angezeigt",
"Description[el]": "Γραμμή εφαρμογών που εμφανίζει μόνο εικονίδια",
"Description[en_GB]": "App bar displaying only icons",
"Description[eo]": "Apobreto montranta nur piktogramojn",
"Description[es]": "Barra de aplicaciones que solo muestra iconos",
"Description[eu]": "Ikonoak bakarrik azaltzen dituen aplikazio-barra",
"Description[fi]": "Vain kuvakkeet näyttävä sovelluspalkki",
"Description[fr]": "Barre d'applications n'affichant que des icônes",
"Description[ga]": "Barra aipeanna ag taispeáint deilbhíní amháin",
"Description[gl]": "Barra de aplicacións que amosa só iconas.",
"Description[he]": "סרגל היישומים מציג סמלים בלבד",
"Description[hu]": "Csak ikonokat megjelenítő alkalmazássáv",
"Description[ia]": "Barra de app monstrante solmente icones",
"Description[id]": "Bilah app menampilkan ikon saja",
"Description[is]": "Forritastika sem birtir eingöngu tákn",
"Description[it]": "Barra dell'applicazione che mostra solo le icone",
"Description[ja]": "アイコンのみを表示するアプリケーションバー",
"Description[ka]": "აპის პანელი, მხოლოდ, ხატულებს აჩვენებს",
"Description[ko]": "아이콘만 표시하는 앱 표시줄",
"Description[lt]": "Programų juosta atvaizduojanti tik piktogramas",
"Description[lv]": "Programmu josla, kurā ir tikai ikonas",
"Description[nb]": "Oppgavelinje med bare ikoner",
"Description[nl]": "Toepassingenbalk met alleen pictogrammen",
"Description[nn]": "Oppgåvelinje med berre ikon",
"Description[pl]": "Pasek aplikacji wyświetlający tylko ikony",
"Description[pt_BR]": "Barra de aplicativos apenas com ícones",
"Description[ro]": "Bară de aplicații ce afișează doar pictograme",
"Description[ru]": "Панель задач, использующая только значки",
"Description[sa]": "केवलं चिह्नानि प्रदर्शयति एप् बार",
"Description[sk]": "Panel aplikácií zobrazujúci iba ikony",
"Description[sl]": "Vrstica aplikacij, ki prikazuje samo ikone",
"Description[sv]": "Programrad som bara visar ikoner",
"Description[ta]": "சின்னங்களை மட்டும் காட்டும் பணிப்பட்டை",
"Description[tr]": "Yalnızca simgeler görüntüleyen uygulama çubuğu",
"Description[uk]": "Панель програм, де показано лише піктограми",
"Description[zh_CN]": "应用栏仅显示图标",
"Description[zh_TW]": "只顯示圖示的應用程式列",
"EnabledByDefault": true,
"Icon": "preferences-system-windows",
"Id": "org.kde.plasma.icontasks",
"License": "GPL-2.0+",
"Name": "Icons-Only Task Manager",
"Name[ar]": "مدير مهامّ بأيقونات فقط",
"Name[az]": "Yalnız nişanlı tapşırıq meneceri",
"Name[be]": "Кіраўнік задач у выглядзе значкоў",
"Name[bg]": "Мениджър на задачи (само икони)",
"Name[ca@valencia]": "Gestor de tasques només amb icones",
"Name[ca]": "Gestor de tasques només amb icones",
"Name[cs]": "Správce úloh pouze s ikonami",
"Name[da]": "Opgavelinje kun med ikoner",
"Name[de]": "Fensterleiste nur mit Symbolen",
"Name[el]": "Διαχείριση εργασιών μόνο με εικονίδια",
"Name[en_GB]": "Icons-Only Task Manager",
"Name[eo]": "Nur-Piktograma Taskadministrilo",
"Name[es]": "Gestor de tareas con solo iconos",
"Name[eu]": "Ikono-soileko ataza-kudeatzailea",
"Name[fi]": "Kuvaketehtävienhallinta",
"Name[fr]": "Gestionnaire de tâches uniquement par icônes",
"Name[ga]": "Bainisteoir Tascanna Deilbhíní Amháin",
"Name[gl]": "Xestor de tarefas de só iconas",
"Name[he]": "מנהל משימות של סמלים בלבד",
"Name[hu]": "Ikonos feladatkezelő",
"Name[ia]": "Gerente de carga a sol icone",
"Name[id]": "Pengelola Tugas Ikon Saja",
"Name[is]": "Verkefnastjóri með táknum eingöngu",
"Name[it]": "Gestore dei processi solo icone",
"Name[ja]": "アイコンだけのタスクマネージャ",
"Name[ka]": "მხოლოდ ხატულებიანი ამოცანების მმართველი",
"Name[ko]": "아이콘 전용 작업 관리자",
"Name[lt]": "Tik piktogramų užduočių tvarkytuvė",
"Name[lv]": "Tikai ikonu uzdevumu pārvaldnieks",
"Name[nb]": "Oppgavebehandler med bare ikoner",
"Name[nl]": "Takenbeheer met alleen pictogrammen",
"Name[nn]": "Oppgåve­handsamar med berre ikon",
"Name[pa]": "ਸਿਰਫ਼-ਆਈਕਾਨ ਟਾਸਕ ਮੈਨੇਜਰ",
"Name[pl]": "Ikonowy przełącznik zadań",
"Name[pt_BR]": "Gerenciador de tarefas apenas com ícones",
"Name[ro]": "Gestionar de sarcini numai cu pictograme",
"Name[ru]": "Панель задач (только значки)",
"Name[sa]": "चिह्न-केवलं कार्यप्रबन्धकम्",
"Name[sk]": "Správca úloh iba s ikonami",
"Name[sl]": "Upravljalnik opravil samo z ikonami",
"Name[sv]": "Aktivitetshanterare med bara ikoner",
"Name[ta]": "சின்னங்களை மட்டும் கொண்ட பணி மேலாளி",
"Name[tr]": "Simgesel Görev Yöneticisi",
"Name[uk]": "Керування задачами лише за допомогою піктограм",
"Name[zh_CN]": "图标任务管理器",
"Name[zh_TW]": "只有圖示的工作管理員",
"Website": "https://userbase.kde.org/Plasma/Tasks"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-Provides": [
"org.kde.plasma.multitasking"
],
"X-Plasma-RootPath": "org.kde.plasma.taskmanager"
}

View File

@@ -0,0 +1,155 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "hein@kde.org",
"Name": "Eike Hein",
"Name[ar]": "إيكي هين",
"Name[az]": "Eike Hein",
"Name[bg]": "Eike Hein",
"Name[ca@valencia]": "Eike Hein",
"Name[ca]": "Eike Hein",
"Name[cs]": "Eike Hein",
"Name[da]": "Eike Hein",
"Name[de]": "Eike Hein",
"Name[en_GB]": "Eike Hein",
"Name[eo]": "Eike Hein",
"Name[es]": "Eike Hein",
"Name[eu]": "Eike Hein",
"Name[fi]": "Eike Hein",
"Name[fr]": "Eike Hein",
"Name[gl]": "Eike Hein",
"Name[he]": "אייק היין",
"Name[hu]": "Eike Hein",
"Name[ia]": "Eike Hein",
"Name[id]": "Eike Hein",
"Name[is]": "Eike Hein",
"Name[it]": "Eike Hein",
"Name[ja]": "Eike Hein",
"Name[ka]": "აიკე ჰაინი",
"Name[ko]": "Eike Hein",
"Name[lt]": "Eike Hein",
"Name[lv]": "Eike Hein",
"Name[nl]": "Eike Hein",
"Name[nn]": "Eike Hein",
"Name[pl]": "Eike Hein",
"Name[pt]": "Eike Hein",
"Name[pt_BR]": "Eike Hein",
"Name[ro]": "Eike Hein",
"Name[ru]": "Eike Hein",
"Name[sa]": "ऐके हेन",
"Name[sk]": "Eike Hein",
"Name[sl]": "Eike Hein",
"Name[sv]": "Eike Hein",
"Name[ta]": "எய்கே ஹைன்",
"Name[tr]": "Eike Hein",
"Name[uk]": "Eike Hein",
"Name[vi]": "Eike Hein",
"Name[zh_CN]": "Eike Hein",
"Name[zh_TW]": "Eike Hein"
}
],
"Category": "Application Launchers",
"Description": "A fullscreen application launcher",
"Description[ar]": "مطلق تطبيقات ملء الشاشة ",
"Description[az]": "Tam ekran tətbiq başladıcısı",
"Description[bg]": "Стартер на приложения на цял екран",
"Description[ca@valencia]": "Un iniciador d'aplicacions a pantalla completa",
"Description[ca]": "Un llançador d'aplicacions a pantalla completa",
"Description[cs]": "Spouštěč aplikací na celou obrazovku",
"Description[da]": "En fuldskærms programstarter",
"Description[de]": "Anwendungsstarter im Vollbildmodus",
"Description[en_GB]": "A fullscreen application launcher",
"Description[eo]": "Plenekrana aplikaĵlanĉilo",
"Description[es]": "Lanzador de aplicaciones a pantalla completa",
"Description[eu]": "Pantaila-osoko aplikazio abiarazle bat",
"Description[fi]": "Koko näytön sovelluskäynnistin",
"Description[fr]": "Un lanceur d'applications en plein écran",
"Description[gl]": "Un iniciador de aplicacións a pantalla completa",
"Description[he]": "משגר יישומים במסך מלא",
"Description[hu]": "Teljes képernyős alkalmazásindító",
"Description[ia]": "Un lanceator de application a schermo plen",
"Description[id]": "Sebuah peluncur aplikasi layar penuh",
"Description[is]": "Forritaræsir sem fyllir skjáinn",
"Description[it]": "Un lanciatore di applicazioni a schermo intero",
"Description[ja]": "フルスクリーンのアプリケーションランチャー",
"Description[ka]": "აპლიკაციების მთელ ეკრანზე გამშვები",
"Description[ko]": "전체 화면 앱 실행기",
"Description[lt]": "Viso ekrano programų paleidyklė",
"Description[lv]": "Pilnekrāna programmu palaidējs",
"Description[nl]": "Een programmastarter met volledig scherm",
"Description[nn]": "Fullskjerms programstartar",
"Description[pl]": "Pełnoekranowe menu programów",
"Description[pt]": "Um lançador de aplicações em ecrã completo",
"Description[pt_BR]": "Lançador de aplicativos em tela cheia",
"Description[ro]": "Lansator de aplicații pe tot ecranul",
"Description[ru]": "Полноэкранное меню запуска приложений",
"Description[sa]": "एकः पूर्णपर्दे अनुप्रयोगप्रक्षेपकः",
"Description[sk]": "Spúšťač aplikácií na celú obrazovku",
"Description[sl]": "Celozaslonski zaganjalnik aplikacij",
"Description[sv]": "Ett fullskärmsverktyg för programstart",
"Description[ta]": "முழுத்திரை செயலி ஏவி",
"Description[tr]": "Tam ekran uygulama başlatıcısı",
"Description[uk]": "Повноекранний засіб запуску програм",
"Description[vi]": "Trình khởi chạy ứng dụng, với kích cỡ toàn màn hình",
"Description[zh_CN]": "全屏应用程序启动器",
"Description[zh_TW]": "一個全螢幕應用程式啟動器",
"FormFactors": [
"desktop"
],
"Icon": "start-here-kde",
"Id": "org.kde.plasma.kickerdash",
"License": "GPL-2.0+",
"Name": "Application Dashboard",
"Name[ar]": "لوحة معلومات التطبيق",
"Name[az]": "Tətbiq tablosu",
"Name[bg]": "Панел на приложения",
"Name[ca@valencia]": "Tauler d'aplicacions",
"Name[ca]": "Tauler d'aplicacions",
"Name[cs]": "Pracovní plocha aplikace",
"Name[da]": "Programoverblik",
"Name[de]": "Anwendungsübersicht",
"Name[en_GB]": "Application Dashboard",
"Name[eo]": "Aplika Instrumentpanelo",
"Name[es]": "Tablero de aplicaciones",
"Name[eu]": "Aplikazioen Aginte-mahaia",
"Name[fi]": "Sovelluskojelauta",
"Name[fr]": "Tableau de bord des applications",
"Name[gl]": "Cadro de control de aplicacións",
"Name[he]": "לוח מחווני יישומים",
"Name[hu]": "Alkalmazás irányítópult",
"Name[ia]": "Pannello de instrumentos de Application",
"Name[id]": "Dasbor Aplikasi",
"Name[is]": "Hugbúnaðarborð",
"Name[it]": "Cruscotto applicazioni",
"Name[ja]": "アプリケーションダッシュボード",
"Name[ka]": "აპლიკაციის სამუშაო დაფა",
"Name[ko]": "앱 대시보드",
"Name[lt]": "Programų skydelis",
"Name[lv]": "Programmu panelis",
"Name[nl]": "Toepassingendashboard",
"Name[nn]": "Program­kontrollpult",
"Name[pl]": "Tablica programów",
"Name[pt]": "Quadro da Aplicação",
"Name[pt_BR]": "Painel de aplicativos",
"Name[ro]": "Panou de bord pentru aplicații",
"Name[ru]": "Доска приложений",
"Name[sa]": "अनुप्रयोग डैशबोर्ड",
"Name[sk]": "Hlavný panel aplikácií",
"Name[sl]": "Application Dashboard",
"Name[sv]": "Instrumentpanel för program",
"Name[ta]": "செயலி கருவிப்பலகை",
"Name[tr]": "Uygulama Gösterge Tablosu",
"Name[uk]": "Панель приладів програм",
"Name[vi]": "Bảng điều khiển ứng dụng",
"Name[zh_CN]": "应用程序面板",
"Name[zh_TW]": "應用程式儀表板",
"Website": "https://kde.org/plasma-desktop"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-Provides": [
"org.kde.plasma.launchermenu"
],
"X-Plasma-RootPath": "org.kde.plasma.kicker"
}

View File

@@ -0,0 +1,170 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "sebas@kde.org",
"Name": "Sebastian Kügler",
"Name[ar]": "سيباستيان كوغلر",
"Name[az]": "Sebastian Kügler",
"Name[be]": "Sebastian Kügler",
"Name[bg]": "Sebastian Kügler",
"Name[ca@valencia]": "Sebastian Kügler",
"Name[ca]": "Sebastian Kügler",
"Name[cs]": "Sebastian Kügler",
"Name[da]": "Sebastian Kügler",
"Name[de]": "Sebastian Kügler",
"Name[el]": "Sebastian kügler",
"Name[en_GB]": "Sebastian Kügler",
"Name[eo]": "Sebastian Kügler",
"Name[es]": "Sebastian Kügler",
"Name[et]": "Sebastian Kügler",
"Name[eu]": "Sebastian Kügler",
"Name[fi]": "Sebastian Kügler",
"Name[fr]": "Sebastian Kügler",
"Name[ga]": "Sebastian Kügler",
"Name[gl]": "Sebastian Kügler",
"Name[he]": "סבסטיאן קיגלר",
"Name[hu]": "Sebastian Kügler",
"Name[ia]": "Sebastian Kügler",
"Name[id]": "Sebastian Kügler",
"Name[ie]": "Sebastian Kügler",
"Name[is]": "Sebastian Kügler",
"Name[it]": "Sebastian Kügler",
"Name[ja]": "Sebastian Kügler",
"Name[ka]": "სებასტიან კუგლერი",
"Name[ko]": "Sebastian Kügler",
"Name[lt]": "Sebastian Kügler",
"Name[lv]": "Sebastian Kügler",
"Name[nb]": "Sebastian Kügler",
"Name[nl]": "Sebastian Kügler",
"Name[nn]": "Sebastian Kügler",
"Name[pl]": "Sebastian Kügler",
"Name[pt]": "Sebastian Kügler",
"Name[pt_BR]": "Sebastian Kügler",
"Name[ro]": "Sebastian Kügler",
"Name[ru]": "Sebastian Kügler",
"Name[sa]": "सेबास्टियन कुग्लर",
"Name[sk]": "Sebastian Kügler",
"Name[sl]": "Sebastian Kügler",
"Name[sv]": "Sebastian Kügler",
"Name[ta]": "ஸெபாஸ்டியன் கூக்லர்",
"Name[tr]": "Sebastian Kügler",
"Name[uk]": "Sebastian Kügler",
"Name[vi]": "Sebastian Kügler",
"Name[zh_CN]": "Sebastian Kügler",
"Name[zh_TW]": "Sebastian Kügler"
}
],
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=plasmashell&component=Show%20Desktop/Minimize%20All%20widget",
"Category": "Windows and Tasks",
"Description": "Shows the desktop by minimizing all windows",
"Description[ar]": "تظهر سطح المكتب بتصغير كل النوافذ",
"Description[az]": "Bütün pəncərələri kiçiltməklə İş Masasını göstərir",
"Description[be]": "Згортвае ўсе вокны і паказвае пусты працоўны стол",
"Description[bg]": "Показва работния плот, като минимизира всички прозорци",
"Description[ca@valencia]": "Mostra l'escriptori minimitzant totes les finestres",
"Description[ca]": "Mostra l'escriptori minimitzant totes les finestres",
"Description[cs]": "Zobrazit plochu minimalizací všech oken",
"Description[da]": "Viser skrivebordet ved at minimere alle vinduer",
"Description[de]": "Zeigt die Arbeitsfläche an, indem alle Fenster minimiert werden",
"Description[el]": "Εμφανίζει την επιφάνεια εργασίας ελαχιστοποιώντας όλα τα παράθυρα",
"Description[en_GB]": "Shows the desktop by minimising all windows",
"Description[eo]": "Montras la labortablon minimumigante ĉiujn fenestrojn",
"Description[es]": "Muestra el escritorio minimizando todas las ventanas",
"Description[et]": "Töölaua näitamine kõigi akende minimeerimise järel",
"Description[eu]": "Mahaigaina erakusten du leiho guztiak ikonotuz",
"Description[fi]": "Näyttää työpöydän pienentämällä kaikki ikkunat",
"Description[fr]": "Afficher le bureau en minimisant toutes les fenêtres",
"Description[ga]": "Taispeáin an deasc trí na fuinneoga go léir a íoslaghdú",
"Description[gl]": "Minimiza todas as xanelas para amosar o escritorio.",
"Description[he]": "מציג את שולחן העבודה על ידי מזעור כל החלונות",
"Description[hu]": "Megjeleníti az asztalt az összes ablak minimalizálásával",
"Description[ia]": "Monstra le scriptorio per minimisar omne fenestras",
"Description[id]": "Menampilkan desktop dengan meminimalkan semua jendela",
"Description[ie]": "Minimisar omni fenestres e monstrar li Pupitre",
"Description[is]": "Sýnir skjáborðið með því að fela alla glugga",
"Description[it]": "Mostra il desktop minimizzando tutte le finestre",
"Description[ja]": "すべてのウィンドウを最小化してデスクトップを表示します",
"Description[ka]": "ფანჯრების ჩაკეცვა და სამუშაო მაგიდის ჩვენება",
"Description[ko]": "모든 창을 최소화하여 바탕 화면 표시",
"Description[lt]": "Suskleisdamas visus langus, rodo darbalaukį",
"Description[lv]": "Parāda darbvirsmu, minimizējot visus logus",
"Description[nb]": "Vis skrivebordet ved å minimere alle vinduene",
"Description[nl]": "Toont het bureaublad door alle vensters te minimaliseren",
"Description[nn]": "Viser skrivebordet ved å minimera alle vindauga",
"Description[pa]": "ਸਾਰੀਆਂ ਵਿੰਡੋਆਂ ਨੂੰ ਘੱਟੋ-ਘੱਟ ਕਰਕੇ ਡੈਸਕਟਾਪ ਵੇਖਾਓ",
"Description[pl]": "Ukazuje pulpit minimalizując wszystkie okna",
"Description[pt]": "Mostra o ecrã, minimizando todas as janelas",
"Description[pt_BR]": "Mostra a área de trabalho ao minimizar todas as janelas",
"Description[ro]": "Arată biroul prin minimizarea tuturor ferestrelor",
"Description[ru]": "Показывает рабочий стол, свернув все окна",
"Description[sa]": "सर्वाणि विण्डोस् न्यूनीकृत्य डेस्कटॉप् दर्शयति",
"Description[sk]": "Zobrazí plochu minimalizovaním všetkých okien",
"Description[sl]": "Prikaže namizje s strnjevanjem vseh oken",
"Description[sv]": "Visar skrivbordet genom att minimera alla fönster",
"Description[ta]": "அனைத்து சாளரங்களையும் ஒதுக்கி பணிமேடையை காட்டும்",
"Description[tr]": "Bütün pencereleri küçülterek masaüstünü gösterir",
"Description[uk]": "Показати стільницю, мінімізувавши усі вікна",
"Description[vi]": "Hiện bàn làm việc bằng cách thu nhỏ tất cả các cửa sổ",
"Description[zh_CN]": "最小化所有窗口以显示桌面",
"Description[zh_TW]": "藉由將所有視窗最小化來顯示桌面",
"EnabledByDefault": true,
"Icon": "user-desktop",
"Id": "org.kde.plasma.minimizeall",
"License": "GPL-2.0+",
"Name": "Minimize All Windows",
"Name[ar]": "صغّر كلّ النّوافذ",
"Name[az]": "Bütün pəncərələri yığmaq",
"Name[be]": "Згарнуць усе вокны",
"Name[bg]": "Минимизиране на всички прозорци",
"Name[ca@valencia]": "Minimitza totes les finestres",
"Name[ca]": "Minimitza totes les finestres",
"Name[cs]": "Minimalizovat všechna okna",
"Name[da]": "Minimér alle vinduer",
"Name[de]": "Alle Fenster minimieren",
"Name[el]": "Ελαχιστοποίηση όλων των παραθύρων",
"Name[en_GB]": "Minimise All Windows",
"Name[eo]": "Minimumigi Ĉiujn Fenestrojn",
"Name[es]": "Minimizar todas las ventanas",
"Name[eu]": "Ikonotu leiho guztiak",
"Name[fi]": "Pienennä kaikki ikkunat",
"Name[fr]": "Minimiser toutes les fenêtres",
"Name[ga]": "Íoslaghdaigh Gach Fuinneog",
"Name[gl]": "Minimizar todas as xanelas",
"Name[he]": "מזעור כל החלונות",
"Name[hu]": "Összes ablak minimalizálása",
"Name[ia]": "Minimisa omne fenestras",
"Name[id]": "Minimalkan Semua Jendela",
"Name[is]": "Fela alla glugga",
"Name[it]": "Minimizza tutte le finestre",
"Name[ja]": "ウィンドウ最小化",
"Name[ka]": "ყველა ფანჯრის ჩაკეცვა",
"Name[ko]": "모든 창 최소화",
"Name[lt]": "Suskleisti visus langus",
"Name[lv]": "Minimizēt visus logus",
"Name[nb]": "Minimer alle vinduene",
"Name[nl]": "Alle vensters minimaliseren",
"Name[nn]": "Minimer alle vindauga",
"Name[pa]": "ਸਭ ਵਿੰਡੋਆਂ ਨੂੰ ਘੱਟੋ-ਘੱਟ ਕਰੋ",
"Name[pl]": "Zminimalizuj wszystkie okna",
"Name[pt_BR]": "Minimizar todas as janelas",
"Name[ro]": "Minimizează toate ferestrele",
"Name[ru]": "Свернуть все окна",
"Name[sa]": "सर्वाणि विण्डोजानि न्यूनीकरोतु",
"Name[sk]": "Minimalizovať všetky okná",
"Name[sl]": "Strni vsa okna",
"Name[sv]": "Minimera alla fönster",
"Name[ta]": "அனைத்து சாளரங்களையும் ஒதுக்கு",
"Name[tr]": "Tüm Pencereleri Küçült",
"Name[uk]": "Мінімізувати усі вікна",
"Name[zh_CN]": "最小化所有窗口",
"Name[zh_TW]": "最小化所有視窗",
"Website": "https://kde.org/plasma-desktop"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-Provides": [
"org.kde.plasma.windowmanagement"
],
"X-Plasma-RootPath": "org.kde.plasma.showdesktop"
}

View File

@@ -0,0 +1,11 @@
[Config]
chartFace=org.kde.ksysguard.piechart
highPrioritySensorIds=["cpu/all/usage"]
totalSensors=["cpu/all/usage"]
lowPrioritySensorIds=["cpu/all/cpuCount","cpu/all/coreCount"]
[FaceConfig]
rangeAuto=false
rangeFrom=0
rangeTo=100

View File

@@ -0,0 +1,175 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "kde@privat.broulik.de",
"Name": "Kai Uwe Broulik",
"Name[ar]": "كاي أووي بروتيك",
"Name[ast]": "Kai Uwe Broulik",
"Name[az]": "Kai Uwe Broulik",
"Name[be]": "Kai Uwe Broulik",
"Name[bg]": "Kai Uwe Broulik",
"Name[ca@valencia]": "Kai Uwe Broulik",
"Name[ca]": "Kai Uwe Broulik",
"Name[cs]": "Kai Uwe Broulik",
"Name[da]": "Kai Uwe Broulik",
"Name[de]": "Kai Uwe Broulik",
"Name[el]": "Kai Uwe Broulik",
"Name[en_GB]": "Kai Uwe Broulik",
"Name[eo]": "Kai Uwe Broulik",
"Name[es]": "Kai Uwe Broulik",
"Name[et]": "Kai Uwe Broulik",
"Name[eu]": "Kai Uwe Broulik",
"Name[fi]": "Kai Uwe Broulik",
"Name[fr]": "Kai Uwe Broulik",
"Name[ga]": "Kai Uwe Broulik",
"Name[gl]": "Kai Uwe Broulik",
"Name[he]": "קאי אווה ברוליק",
"Name[hi]": "काई उवे ब्रोलिक",
"Name[hu]": "Kai Uwe Broulik",
"Name[ia]": "Kai Uwe Broulik",
"Name[id]": "Kai Uwe Broulik",
"Name[is]": "Kai Uwe Broulik",
"Name[it]": "Kai Uwe Broulik",
"Name[ja]": "Kai Uwe Broulik",
"Name[ka]": "კაი უვე ბროულიკი",
"Name[ko]": "Kai Uwe Broulik",
"Name[lt]": "Kai Uwe Broulik",
"Name[lv]": "Kai Uwe Broulik",
"Name[nb]": "Kai Uwe Broulik",
"Name[nl]": "Kai Uwe Broulik",
"Name[nn]": "Kai Uwe Broulik",
"Name[pa]": "ਕੋਈ ਉਵੇ ਬਰੋਉਲਿਕ",
"Name[pl]": "Kai Uwe Broulik",
"Name[pt]": "Kai Uwe Broulik",
"Name[pt_BR]": "Kai Uwe Broulik",
"Name[ro]": "Kai Uwe Broulik",
"Name[ru]": "Kai Uwe Broulik",
"Name[sa]": "कै उवे ब्रौलिक्",
"Name[sk]": "Kai Uwe Broulik",
"Name[sl]": "Kai Uwe Broulik",
"Name[sv]": "Kai Uwe Broulik",
"Name[ta]": "காய் ஊவே புரோலிக்",
"Name[tr]": "Kai Uwe Broulik",
"Name[uk]": "Kai Uwe Broulik",
"Name[vi]": "Kai Uwe Broulik",
"Name[zh_CN]": "Kai Uwe Broulik",
"Name[zh_TW]": "Kai Uwe Broulik"
}
],
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=plasmashell&component=System%20Monitor%20widgets",
"Category": "System Information",
"Description": "System monitor widget that shows the total CPU usage",
"Description[ar]": "أداة مراقبة النظام التي تعرض مجموع استخدام المعالج",
"Description[az]": "Prosessorun ümumi istifadəsini göstərən sistem izləyici vidjeti",
"Description[be]": "Віджэт сістэмнага назіральніка, які паказвае агульнае выкарыстанне працэсара",
"Description[bg]": "Уиджет за системен монитор, което показва общото използване на процесора",
"Description[ca@valencia]": "Giny del monitor del sistema que mostra l'ús total de la CPU",
"Description[ca]": "Giny del monitor del sistema que mostra l'ús total de la CPU",
"Description[cs]": "Widget monitoru systému, zobrazující celkové využití CPU",
"Description[da]": "Systemovervågning-widget som viser den samlede CPU-brug",
"Description[de]": "Systemmonitor-Miniprogramm, das die Auslastung des gesamten Prozessors anzeigt",
"Description[el]": "Συστατικό παρακολούθησης συστήματος που εμφανίζει τη συνολική χρήση της ΚΜΕ",
"Description[en_GB]": "System monitor widget that shows the total CPU usage",
"Description[eo]": "Sistemmonitora fenestraĵo kiu montras la suman CPU-uzadon",
"Description[es]": "Elemento gráfico del monitor del sistema que muestra el uso total de CPU",
"Description[eu]": "PUZ erabileraren guztizkoa erakusten duen sistema gainbegiratzeko trepeta",
"Description[fi]": "Suorittimen kokonaiskäytön näyttävä järjestelmänvalvontasovelma",
"Description[fr]": "Composant graphique de surveillance du système, affichant l'utilisation globale du processeur.",
"Description[gl]": "Trebello de vixilancia do sistema que mostra o uso total do procesador.",
"Description[he]": "יישומון צג מערכת שמציג את ניצולת המעבד הכללית",
"Description[hu]": "Rendszermonitor elem, amely a teljes processzorhasználatot mutatja",
"Description[ia]": "Widget de supervision de systema que monstra le uso total de CPU",
"Description[id]": "Widget pemantau sistem yang menampilkan penggunaan total CPU",
"Description[is]": "Kerfisvöktunargræja sem sýnir heildarnotkun örgjörva",
"Description[it]": "Oggetto di monitoraggio del sistema che mostra l'utilizzo totale del processore",
"Description[ja]": "CPU 全体の使用率を表示するウィジェット",
"Description[ka]": "სისტემური მონიტორის ვიჯეტი, რომელიც CPU-ის ჯამურ დატვირთვას აჩვენებს",
"Description[ko]": "총 CPU 사용량을 표시하는 시스템 모니터 위젯",
"Description[lt]": "Sistemos prižiūryklės valdiklis, kuris rodo bendrą procesoriaus naudojimą",
"Description[lv]": "Sistēmas pārraudzības logdaļa, kas parāda CPU kopējo noslodzi",
"Description[nb]": "Systemovervåking-element som viser bruk av alle prosessorkjernene",
"Description[nl]": "Systeemmonitorwidget die het totale gebruik toont de CPU toont",
"Description[nn]": "System­overvaking som viser total prosessorlast",
"Description[pa]": "ਕੁੱਲ CPU ਵਰਤੋਂ ਵਿਖਾਉਣ ਵਾਲਾ ਸਿਸਟਮ ਮਾਨੀਟਰ ਵਿਜੈੱਟ",
"Description[pl]": "Element interfejsu, który pokazuje całkowite wykorzystanie procesora",
"Description[pt_BR]": "Widget monitor do sistema que mostra o uso total da CPU",
"Description[ro]": "Control grafic de monitorizare a sistemului ce arată utilizarea totală a procesorului",
"Description[ru]": "Мониторинг общей загрузки процессора",
"Description[sa]": "सङ्गणकतन्त्रस्य निरीक्षकस्य विजेट् यत् कुल CPU उपयोगं दर्शयति",
"Description[sk]": "Miniaplikácia monitorovania systému, ktorá zobrazuje celkové využitie CPU",
"Description[sl]": "Gradnik sistemskega monitorja, ki prikazuje celotno rabo CPE",
"Description[sv]": "Grafisk systemövervakningskomponent som visar total processoranvändning",
"Description[ta]": "மொத்த CPU பயன்பாட்டைக் காட்டும் பிளாஸ்மாய்ட்",
"Description[tr]": "Toplam CPU kullanımını gösteren sistem monitörü araç takımı",
"Description[uk]": "Віджет нагляду за системою, який показує загальне використання процесора",
"Description[zh_CN]": "显示总 CPU 占用率的系统监视小部件",
"Description[zh_TW]": "顯示總 CPU 用量的系統監控元件",
"EnabledByDefault": true,
"FormFactors": [
"desktop"
],
"Icon": "cpu",
"Id": "org.kde.plasma.systemmonitor.cpu",
"License": "GPL-2.0+",
"Name": "Total CPU Use",
"Name[ar]": "مجموع استخدام المعالج",
"Name[az]": "Ümumi MP istifadəsi",
"Name[be]": "Агульнае выкарыстанне працэсара",
"Name[bg]": "Общо използване на процесора",
"Name[ca@valencia]": "Ús total de CPU",
"Name[ca]": "Ús total de CPU",
"Name[cs]": "Celkové použití CPU",
"Name[da]": "Samlet CPU-brug",
"Name[de]": "Gesamt-CPU-Auslastung",
"Name[el]": "Συνολική χρήση ΚΜΕ",
"Name[en_GB]": "Total CPU Use",
"Name[eo]": "Suma Uzo de CPU",
"Name[es]": "Uso total de CPU",
"Name[et]": "Protsessori kogukasutus",
"Name[eu]": "PUZ erabileraren guztizkoa",
"Name[fi]": "Suorittimen kokonaiskäyttö",
"Name[fr]": "Utilisation globale du processeur",
"Name[gl]": "Uso de procesador total",
"Name[he]": "ניצולת מעבד כוללת",
"Name[hi]": "कुल सीपीयू उपयोग",
"Name[hu]": "Teljes processzorhasználat",
"Name[ia]": "Uso total de CPU",
"Name[id]": "Total Penggunaan CPU",
"Name[is]": "Heildarnotkun örgjörva",
"Name[it]": "Utilizzo totale CPU",
"Name[ja]": "全体の CPU 使用率",
"Name[ka]": "CPU-ის ჯამური დატვირთვა",
"Name[ko]": "총 CPU 사용량",
"Name[lt]": "Bendras procesoriaus naudojimas",
"Name[lv]": "Kopējā CPU noslodze",
"Name[ml]": "ആകെ സിപിയു ഉപയോഗം",
"Name[nb]": "Total prosessorbruk",
"Name[nl]": "Totaal CPU-gebruik",
"Name[nn]": "Total prosessorlast",
"Name[pa]": "ਕੁੱਲ CPU ਵਰਤੋ",
"Name[pl]": "Całkowite użycie procesora",
"Name[pt]": "Carga Total do CPU",
"Name[pt_BR]": "Uso total da CPU",
"Name[ro]": "Utilizare totală procesor",
"Name[ru]": "Общая загрузка ЦП",
"Name[sa]": "कुल CPU उपयोगः",
"Name[sk]": "Celkové využitie CPU",
"Name[sl]": "Celotna raba CPE",
"Name[sv]": "Total processoranvändning",
"Name[ta]": "மொத்த CPU பயன்பாட்டு",
"Name[tok]": "kepeken pi ilo nanpa ale",
"Name[tr]": "Toplam CPU Kullanımı",
"Name[uk]": "Загальне використання процесора",
"Name[vi]": "Tổng lượng dùng CPU",
"Name[zh_CN]": "总 CPU 使用率",
"Name[zh_TW]": "總 CPU 用量",
"Website": "https://www.kde.org/plasma-desktop"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-Provides": [
"org.kde.plasma.systemmonitor"
],
"X-Plasma-RootPath": "org.kde.plasma.systemmonitor"
}

View File

@@ -0,0 +1,10 @@
[Config]
chartFace=org.kde.ksysguard.barchart
highPrioritySensorIds=["cpu/cpu.*/usage"]
totalSensors=["cpu/all/usage"]
[FaceConfig]
rangeAuto=false
rangeFrom=0
rangeTo=100

View File

@@ -0,0 +1,174 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "kde@privat.broulik.de",
"Name": "Kai Uwe Broulik",
"Name[ar]": "كاي أووي بروتيك",
"Name[ast]": "Kai Uwe Broulik",
"Name[az]": "Kai Uwe Broulik",
"Name[be]": "Kai Uwe Broulik",
"Name[bg]": "Kai Uwe Broulik",
"Name[ca@valencia]": "Kai Uwe Broulik",
"Name[ca]": "Kai Uwe Broulik",
"Name[cs]": "Kai Uwe Broulik",
"Name[da]": "Kai Uwe Broulik",
"Name[de]": "Kai Uwe Broulik",
"Name[el]": "Kai Uwe Broulik",
"Name[en_GB]": "Kai Uwe Broulik",
"Name[eo]": "Kai Uwe Broulik",
"Name[es]": "Kai Uwe Broulik",
"Name[et]": "Kai Uwe Broulik",
"Name[eu]": "Kai Uwe Broulik",
"Name[fi]": "Kai Uwe Broulik",
"Name[fr]": "Kai Uwe Broulik",
"Name[ga]": "Kai Uwe Broulik",
"Name[gl]": "Kai Uwe Broulik",
"Name[he]": "קאי אווה ברוליק",
"Name[hi]": "काई उवे ब्रोलिक",
"Name[hu]": "Kai Uwe Broulik",
"Name[ia]": "Kai Uwe Broulik",
"Name[id]": "Kai Uwe Broulik",
"Name[is]": "Kai Uwe Broulik",
"Name[it]": "Kai Uwe Broulik",
"Name[ja]": "Kai Uwe Broulik",
"Name[ka]": "კაი უვე ბროულიკი",
"Name[ko]": "Kai Uwe Broulik",
"Name[lt]": "Kai Uwe Broulik",
"Name[lv]": "Kai Uwe Broulik",
"Name[nb]": "Kai Uwe Broulik",
"Name[nl]": "Kai Uwe Broulik",
"Name[nn]": "Kai Uwe Broulik",
"Name[pa]": "ਕੋਈ ਉਵੇ ਬਰੋਉਲਿਕ",
"Name[pl]": "Kai Uwe Broulik",
"Name[pt]": "Kai Uwe Broulik",
"Name[pt_BR]": "Kai Uwe Broulik",
"Name[ro]": "Kai Uwe Broulik",
"Name[ru]": "Kai Uwe Broulik",
"Name[sa]": "कै उवे ब्रौलिक्",
"Name[sk]": "Kai Uwe Broulik",
"Name[sl]": "Kai Uwe Broulik",
"Name[sv]": "Kai Uwe Broulik",
"Name[ta]": "காய் ஊவே புரோலிக்",
"Name[tr]": "Kai Uwe Broulik",
"Name[uk]": "Kai Uwe Broulik",
"Name[vi]": "Kai Uwe Broulik",
"Name[zh_CN]": "Kai Uwe Broulik",
"Name[zh_TW]": "Kai Uwe Broulik"
}
],
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=plasmashell&component=System%20Monitor%20widgets",
"Category": "System Information",
"Description": "System monitor widget that shows usage of individual CPU cores",
"Description[ar]": "أداة مراقبة النظام التي تعرض استخدام كل نواة من المعالج",
"Description[az]": "Hər prosessorun istifadəsini göstərən sistem izləyici vidjeti",
"Description[be]": "Віджэт сістэмнага назіральніка, які паказвае выкарыстанне ядзер працэсара паасобку",
"Description[bg]": "Уиджет за системен монитор, който показва използването на отделни ядра на процесора",
"Description[ca@valencia]": "Giny del monitor del sistema que mostra l'ús individual dels nuclis de la CPU",
"Description[ca]": "Giny del monitor del sistema que mostra l'ús individual dels nuclis de la CPU",
"Description[cs]": "Widget monitoru systému, zobrazující využití jednotlivých jader CPU",
"Description[da]": "Systemovervågning-widget som viser brug af hver CPU-kerne",
"Description[de]": "Systemmonitor-Miniprogramm, das die Auslastung einzelner CPU-Kerne anzeigt",
"Description[el]": "Συστατικό παρακολούθησης συστήματος που δείχνει τη χρήση των πυρήνων ΚΜΕ ξεχωριστά",
"Description[en_GB]": "System monitor widget that shows usage of individual CPU cores",
"Description[eo]": "Sistemmonitora fenestraĵo kiu montras uzadon de individuaj CPU-kernoj",
"Description[es]": "Elemento gráfico del monitor del sistema que muestra el uso de los núcleos individuales de la CPU",
"Description[eu]": "PUZeko nukleoen banakako erabilera erakusten duen sistema gainbegiratzeko trepeta",
"Description[fi]": "Yksittäisten järjestelmäydinten käytön näyttävä järjestelmänvalvontasovelma",
"Description[fr]": "Composant graphique de surveillance du système, affichant l'utilisation de chaque cœur du processeur.",
"Description[gl]": "Trebello de vixilancia do sistema que mostra o uso de núcleos de procesador individuais.",
"Description[he]": "יישומון צג מערכת שמציג ניצולת של ליבות מעבד בנפרד",
"Description[hu]": "Rendszermonitor elem, amely az egyes logikai processzorok használatát mutatja",
"Description[ia]": "Widget de supervision de systema que monstra le uso del nucleos individual",
"Description[id]": "Widget pemantau sistem yang menampilkan penggunaan core CPU individual",
"Description[is]": "Kerfisvöktunargræja sem sýnir notkun á einstökum örgjörvakjörnum",
"Description[it]": "Oggetto di monitoraggio del sistema che mostra l'utilizzo dei singoli core del processore",
"Description[ja]": "CPU の各コアの使用率を表示するウィジェット",
"Description[ka]": "სისტემური მონიტორის ვიჯეტი, რომელიც CPU-ის ბირთვების დატვირთვას სათითაოდ აჩვენებს",
"Description[ko]": "개별 CPU 코어 사용량을 표시하는 시스템 모니터 위젯",
"Description[lt]": "Sistemos prižiūryklės valdiklis, kuris rodo atskirų procesoriaus branduolių naudojimą",
"Description[lv]": "Sistēmas pārraudzības logdaļa, kas parāda atsevišķu CPU kodolu noslodzi",
"Description[nb]": "Systemovervåking-element som viser bruk av individuelle prosessorkjerner",
"Description[nl]": "Systeemmonitorwidget die gebruik toont van individuele CPU-kernen",
"Description[nn]": "System­overvaking som viser bruk av einskilde prosessor­kjernar",
"Description[pa]": "ਵੱਖ-ਵੱਖ CPU ਕੋਰਾਂ ਦੀ ਵਰਤੋਂ ਵਿਖਾਉਣ ਵਾਲਾ ਸਿਸਟਮ ਮਾਨੀਟਰ ਵਿਜੈੱਟ",
"Description[pl]": "Element interfejsu, który pokazuje wykorzystanie poszczególnych rdzeni procesora",
"Description[pt_BR]": "Widget monitor do sistema que mostra o uso individual dos núcleos da CPU",
"Description[ro]": "Control grafic de monitorizare a sistemului ce arată utilizarea nucleelor individuale ale procesorului",
"Description[ru]": "Мониторинг загрузки процессора, предоставляющий сведения об индивидуальном использовании ядер",
"Description[sa]": "सङ्गणकतन्त्रस्य निरीक्षकस्य विजेट् यत् व्यक्तिगत CPU कोर्स् इत्यस्य उपयोगं दर्शयति",
"Description[sk]": "Miniaplikácia monitorovania systému, ktorá zobrazuje využitie jednotlivých jadier",
"Description[sl]": "Gradnik sistemskega monitorja, ki prikazuje rabo posameznih jeder CPE",
"Description[sv]": "Grafisk systemövervakningskomponent som visar användning av individuella processorkärnor",
"Description[ta]": "தனிப்பட்ட CPU core-களின் பயன்பாட்டைக் காட்டும் பிளாஸ்மாய்ட்",
"Description[tr]": "Tekil CPU çekirdeklerini gösteren sistem monitörü araç takımı",
"Description[uk]": "Віджет нагляду за системою, який показує використання окремих ядер процесора",
"Description[zh_CN]": "显示单个 CPU 核心占用率的系统监视小部件",
"Description[zh_TW]": "顯示個別 CPU 核心用量的系統監控元件",
"EnabledByDefault": true,
"FormFactors": [
"desktop"
],
"Icon": "ksysguardd",
"Id": "org.kde.plasma.systemmonitor.cpucore",
"License": "GPL-2.0+",
"Name": "Individual Core Usage",
"Name[ar]": "استخدام النوى الفردية",
"Name[az]": "MP nüvəsinin yükü",
"Name[be]": "Выкарыстанне ядзер працэсара",
"Name[bg]": "Използване на ядрата на процесора",
"Name[ca@valencia]": "Ús individual del nucli",
"Name[ca]": "Ús individual del nucli",
"Name[da]": "Brug af hver kerne",
"Name[de]": "Auslastung einzelner Prozessorkerne",
"Name[el]": "Ατομική χρήση πυρήνα",
"Name[en_GB]": "Individual Core Usage",
"Name[eo]": "Uzado de Individuaj Kernoj",
"Name[es]": "Uso de núcleos individuales",
"Name[et]": "Iga tuuma kasutus",
"Name[eu]": "Nukleoen banakako erabilera",
"Name[fi]": "Yksittäisten ydinten käyttö",
"Name[fr]": "Utilisation de chaque cœur ",
"Name[gl]": "Uso de núcleos individuais",
"Name[he]": "ניצולת לליבה בודדת",
"Name[hi]": "व्यक्तिगत कोर उपयोग ",
"Name[hu]": "Logikai processzorok használata",
"Name[ia]": "Uso de nucleo (core) individual",
"Name[id]": "Penggunaan Core Individual",
"Name[is]": "Notkun einstakra kjarna",
"Name[it]": "Utilizzo del singolo core",
"Name[ja]": "各コアの使用率",
"Name[ka]": "თითოეული ბირთვის დატვირთვა",
"Name[ko]": "개별 코어 사용량",
"Name[lt]": "Atskirų branduolių naudojimas",
"Name[lv]": "Atsevišķa kodola noslodze",
"Name[ml]": "വ്യക്തിഗത കോർ ഉപയോഗം",
"Name[nb]": "Individuell kjernebruk",
"Name[nl]": "Individueel gebruik van kernen",
"Name[nn]": "Einskildkjerne-bruk",
"Name[pa]": "ਵੱਖੋ-ਵੱਖ ਕੋਰ ਵਰਤੋਂ",
"Name[pl]": "Wykorzystanie na rdzeń",
"Name[pt]": "Carga dos Núcleos Individuais",
"Name[pt_BR]": "Uso individual do núcleo",
"Name[ro]": "Utilizare individuală nuclee",
"Name[ru]": "Загрузка ядер ЦП",
"Name[sa]": "व्यक्तिगत मूलप्रयोग",
"Name[sk]": "Využitie jednotlivých jadier",
"Name[sl]": "Poraba posameznega jedra",
"Name[sv]": "Användning av individuella kärnor",
"Name[ta]": "தனிப்பட்ட கணிப்பி பயன்பாட்டு",
"Name[tok]": "kepeken pi ilo nanpa wan",
"Name[tr]": "Tekil Çekirdek Kullanımı",
"Name[uk]": "Використання окремих ядер",
"Name[vi]": "Lượng dùng mỗi lõi riêng lẻ",
"Name[zh_CN]": "单个核心使用率",
"Name[zh_TW]": "獨立核心用量",
"Website": "https://www.kde.org/plasma-desktop"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-Provides": [
"org.kde.plasma.systemmonitor"
],
"X-Plasma-RootPath": "org.kde.plasma.systemmonitor"
}

View File

@@ -0,0 +1,8 @@
[Config]
chartFace=org.kde.ksysguard.linechart
highPrioritySensorIds=["disk/all/write","disk/all/read"]
[FaceConfig]
rangeAuto=true
lineChartStacked=true

View File

@@ -0,0 +1,181 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "mart@kde.org",
"Name": "Marco Martin",
"Name[ar]": "ماركو مارتن",
"Name[ast]": "Marco Martin",
"Name[az]": "Marco Martin",
"Name[be]": "Marco Martin",
"Name[bg]": "Марко Мартин",
"Name[ca@valencia]": "Marco Martin",
"Name[ca]": "Marco Martin",
"Name[cs]": "Marco Martin",
"Name[da]": "Marco Martin",
"Name[de]": "Marco Martin",
"Name[el]": "Marco Martin",
"Name[en_GB]": "Marco Martin",
"Name[eo]": "Marco Martin",
"Name[es]": "Marco Martin",
"Name[et]": "Marco Martin",
"Name[eu]": "Marco Martin",
"Name[fi]": "Marco Martin",
"Name[fr]": "Marco Martin",
"Name[ga]": "Marco Martin",
"Name[gl]": "Marco Martin",
"Name[he]": "מרקו מרטין",
"Name[hi]": "मार्को मार्टिन",
"Name[hu]": "Marco Martin",
"Name[ia]": "Marco Martin",
"Name[id]": "Marco Martin",
"Name[is]": "Marco Martin",
"Name[it]": "Marco Martin",
"Name[ja]": "Marco Martin",
"Name[ka]": "მაკრო მარტინი",
"Name[ko]": "Marco Martin",
"Name[lt]": "Marco Martin",
"Name[lv]": "Marco Martin",
"Name[nb]": "Marco Martin",
"Name[nl]": "Marco Martin",
"Name[nn]": "Marco Martin",
"Name[pa]": "ਮਾਰਕੋ ਮਾਰਟਿਨ",
"Name[pl]": "Marco Martin",
"Name[pt]": "Marco Martin",
"Name[pt_BR]": "Marco Martin",
"Name[ro]": "Marco Martin",
"Name[ru]": "Marco Martin",
"Name[sa]": "मार्को मार्टिन्",
"Name[sk]": "Marco Martin",
"Name[sl]": "Marco Martin",
"Name[sv]": "Marco Martin",
"Name[ta]": "மார்க்கோ மார்ட்டின்",
"Name[tr]": "Marco Martin",
"Name[uk]": "Marco Martin",
"Name[vi]": "Marco Martin",
"Name[zh_CN]": "Marco Martin",
"Name[zh_TW]": "Marco Martin"
}
],
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=plasmashell&component=System%20Monitor%20widgets",
"Category": "System Information",
"Description": "An applet that monitors hard disk throughput and input/output",
"Description[ar]": "بُريْمج يراقب استخدام إنتاجيّة القرص الصلب ودَخْله/خَرْجه",
"Description[az]": "Sərt Diskdə verilənlərin ötürmələsini və giriş/çıxışını izləyən tətbiq",
"Description[be]": "Аплет, які назірае за прапускной здольнасцю цвёрдага дыска і аперацыямі з ім",
"Description[bg]": "Аплет, който следи пропускателната способност и вход/изход на твърдия диск",
"Description[ca@valencia]": "Una miniaplicació que controla la velocitat de transferència, així com l'entrada/eixida de les dades en el disc dur",
"Description[ca]": "Una miniaplicació que controla la velocitat de transferència, així com l'entrada/sortida de les dades al disc dur",
"Description[cs]": "Aplet, jenž monitoruje propustnost disku a vstup/výstup",
"Description[da]": "En applet som overvåger gennemgang og input/output for harddisken",
"Description[de]": "Ein Miniprogramm, das den Festplattendurchsatz und die Festplattenein- und -ausgabe überwacht",
"Description[el]": "Μικροεφαρμογή που εποπτεύει την ρυθμοαπόδοση του σκληρού δίσκου και την είσοδο/έξοδο",
"Description[en_GB]": "An applet that monitors hard disk throughput and input/output",
"Description[eo]": "Apleto kiu monitoras durdiskan trairon kaj enigon/eligon",
"Description[es]": "Una miniaplicación que monitoriza el rendimiento y la entrada/salida del disco duro",
"Description[et]": "Kõvaketta läbilaset ja sisendit/väljundit jälgiv aplett",
"Description[eu]": "Disko zurrunaren transferentzia tasa eraginkorra («throughput») eta sarrera/irteera gainbegiratzen dituen aplikaziotxo bat",
"Description[fi]": "Tarkkailee levyjen suoritustehoa ja siirtomäärää",
"Description[fr]": "Une applet surveillant le débit des disques durs et leurs entrées / sorties.",
"Description[gl]": "Un trebello que vixía o rendemento e a entrada e saída do disco duro.",
"Description[he]": "יישומונית למעקב אחר תעבורת הכונן וקלט/פלט",
"Description[hi]": "एक एप्लेट जो हार्ड डिस्क प्रवाह क्षमता और इनपुट/आउटपुट की निगरानी करता है",
"Description[hu]": "Egy kisalkalmazás, amely figyeli a merevlemez átvitelét és a bemenetet/kimenetet",
"Description[ia]": "Un applet que que monitora le prestation (throughput) e ingresso/egresso de disco dur",
"Description[id]": "Sebuah applet yang memantau lalu-lalang dan input/output hard disk",
"Description[is]": "Smáforrit sem fylgist með afköstum harðra diska og inntaki/úttaki",
"Description[it]": "Un'applet che controlla le prestazioni e l'uso del disco fisso",
"Description[ja]": "ハードディスクのスループットと入力/出力を監視するウィジェット",
"Description[ka]": "აპლეტი, რომელიც მყარი დისკის გამტარობასა და შეტანა/გამოტანას უყურებს",
"Description[ko]": "하드 디스크 대역폭 및 I/O 상태를 보여 주는 애플릿",
"Description[lt]": "Programėlė, kuri stebi disko apkrovą ir įvedimą/išvedimą",
"Description[lv]": "Sīklietotne, kas pārrauga cietā diska caurlaidspēju un ievadi/izvadi",
"Description[nb]": "Skjermelement som overvåker dataflyt til og fra harddisk",
"Description[nl]": "Een applet die de activiteit van de harde schijf volgt",
"Description[nn]": "Skjermelement som overvaker dataflyt til og frå harddisk",
"Description[pa]": "ਹਾਰਡ ਡਿਸਕ ਥਰੂਪੁੱਟ ਅਤੇ ਇੰਪੁੱਟ/ਆਉਟਪੁੱਟ ਦੀ ਨਿਗਰਾਨੀ ਲਈ ਐਪਲਿਟ",
"Description[pl]": "Monitoruje przepustowość WE/WY dysku twardego",
"Description[pt]": "Uma 'applet' que vigia o rendimento e o fluxo de entrada-saída do disco",
"Description[pt_BR]": "Monitora a taxa de transferência e entrada/saída do disco rígido",
"Description[ro]": "Miniaplicație ce monitorizează traficul de intrare și cel de ieșire pentru discul dur",
"Description[ru]": "Мониторинг пропускной способности и процессов ввода/вывода жёстких дисков",
"Description[sa]": "एकं एप्लेट् यत् हार्डडिस्क सम्पादनक्षमता तथा निवेशः/निर्गमः निरीक्षते",
"Description[sk]": "Applet, ktorý monitoruje priepustnosť pevného disku a vstup/výstup",
"Description[sl]": "Programček, ki nadzoruje prepustnost in vhod/izhod trdega diska",
"Description[sv]": "Ett miniprogram som övervakar hårddiskprestanda samt in- och utmatning",
"Description[ta]": "வட்டின் உள்ளீடு/வெளியீடு மற்றும் செயல் வீதம் ஆகியவற்றை கண்காணிக்கும் பிளாஸ்மாய்ட்",
"Description[tr]": "Sabit disk girişini/çıkışını izleyen bir uygulamacık",
"Description[uk]": "Аплет, який стежить за даними, які записуються на жорсткий диск та читаються з жорсткого диска",
"Description[vi]": "Một tiểu ứng dụng giám sát vào/ra và thông lượng của đĩa cứng",
"Description[zh_CN]": "监视硬盘吞吐量和输入输出情况的小程序",
"Description[zh_TW]": "監視硬碟效能與 I/O 的小程式",
"EnabledByDefault": true,
"FormFactors": [
"desktop"
],
"Icon": "drive-harddisk",
"Id": "org.kde.plasma.systemmonitor.diskactivity",
"License": "GPL-2.0+",
"Name": "Hard Disk Activity",
"Name[ar]": "نشاط القرص الصلب",
"Name[az]": "Sərt Disk istifadəsi",
"Name[be]": "Актыўнасць цвёрдага дыска",
"Name[bg]": "Активност на твърдия диск",
"Name[ca@valencia]": "Activitat del disc dur",
"Name[ca]": "Activitat del disc dur",
"Name[cs]": "Aktivita pevného disku",
"Name[da]": "Harddisk-aktivitet",
"Name[de]": "Festplattenaktivität",
"Name[el]": "Δραστηριότητα σκληρού δίσκου",
"Name[en_GB]": "Hard Disk Activity",
"Name[eo]": "Malmoldiska Aktiveco",
"Name[es]": "Actividad del disco duro",
"Name[et]": "Kõvaketta tegevus",
"Name[eu]": "Disko zurruneko jarduera",
"Name[fi]": "Kiintolevyn toiminta",
"Name[fr]": "Activité des disques durs",
"Name[gl]": "Actividade do disco duro",
"Name[he]": "פעילות כונן קשיח",
"Name[hi]": "हार्ड डिस्क गतिविधि",
"Name[hsb]": "Monitor, kiž pokazuje aktiwitu kruteje tačele",
"Name[hu]": "Merevlemez-aktivitás",
"Name[ia]": "Activitate del disco dur",
"Name[id]": "Aktivitas Hard Disk",
"Name[is]": "Virkni harðdiska",
"Name[it]": "Attività disco fisso",
"Name[ja]": "ディスクの状態",
"Name[ka]": "მყარი დისკის აქტივობა",
"Name[ko]": "하드 디스크 활동",
"Name[lt]": "Standžiojo disko veikla",
"Name[lv]": "Cietā diska noslodze",
"Name[ml]": "ഹാർഡ് ഡിസ്ക് പ്രവർത്തനം",
"Name[nb]": "Harddiskaktivitet",
"Name[nl]": "Activiteit van de vaste schijf",
"Name[nn]": "Harddisk­aktivitet",
"Name[pa]": "ਹਾਰਡ ਡਿਸਕ ਸਰਗਰਮੀ",
"Name[pl]": "Ruch na dysku twardym",
"Name[pt]": "Actividade do Disco Rígido",
"Name[pt_BR]": "Atividade do disco rígido",
"Name[ro]": "Activitate disc dur",
"Name[ru]": "Загрузка дисковой подсистемы",
"Name[sa]": "हार्ड् डिस्क् गतिविधि",
"Name[sk]": "Aktivita pevného disku",
"Name[sl]": "Nadzornik aktivnosti trdega diska",
"Name[sv]": "Hårddiskaktivitet",
"Name[ta]": "வட்டு செயல்பாட்டு",
"Name[tg]": "Фаъолияти диски компютерӣ",
"Name[tok]": "pali poki",
"Name[tr]": "Sabit Disk Etkinliği",
"Name[uk]": "Робота із жорстким диском",
"Name[vi]": "Hoạt động của đĩa cứng",
"Name[zh_CN]": "磁盘活动",
"Name[zh_TW]": "硬碟活動",
"Website": "https://www.kde.org/plasma-desktop"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-Provides": [
"org.kde.plasma.systemmonitor"
],
"X-Plasma-RootPath": "org.kde.plasma.systemmonitor"
}

View File

@@ -0,0 +1,11 @@
[Config]
chartFace=org.kde.ksysguard.horizontalbars
highPrioritySensorIds=["disk/.*/usedPercent"]
totalSensors=["disk/all/usedPercent"]
lowPrioritySensorIds=["disk/all/total"]
[FaceConfig]
rangeAuto=true
rangeFrom=0
rangeTo=100

View File

@@ -0,0 +1,178 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "mart@kde.org",
"Name": "Marco Martin",
"Name[ar]": "ماركو مارتن",
"Name[ast]": "Marco Martin",
"Name[az]": "Marco Martin",
"Name[be]": "Marco Martin",
"Name[bg]": "Марко Мартин",
"Name[ca@valencia]": "Marco Martin",
"Name[ca]": "Marco Martin",
"Name[cs]": "Marco Martin",
"Name[da]": "Marco Martin",
"Name[de]": "Marco Martin",
"Name[el]": "Marco Martin",
"Name[en_GB]": "Marco Martin",
"Name[eo]": "Marco Martin",
"Name[es]": "Marco Martin",
"Name[et]": "Marco Martin",
"Name[eu]": "Marco Martin",
"Name[fi]": "Marco Martin",
"Name[fr]": "Marco Martin",
"Name[ga]": "Marco Martin",
"Name[gl]": "Marco Martin",
"Name[he]": "מרקו מרטין",
"Name[hi]": "मार्को मार्टिन",
"Name[hu]": "Marco Martin",
"Name[ia]": "Marco Martin",
"Name[id]": "Marco Martin",
"Name[is]": "Marco Martin",
"Name[it]": "Marco Martin",
"Name[ja]": "Marco Martin",
"Name[ka]": "მაკრო მარტინი",
"Name[ko]": "Marco Martin",
"Name[lt]": "Marco Martin",
"Name[lv]": "Marco Martin",
"Name[nb]": "Marco Martin",
"Name[nl]": "Marco Martin",
"Name[nn]": "Marco Martin",
"Name[pa]": "ਮਾਰਕੋ ਮਾਰਟਿਨ",
"Name[pl]": "Marco Martin",
"Name[pt]": "Marco Martin",
"Name[pt_BR]": "Marco Martin",
"Name[ro]": "Marco Martin",
"Name[ru]": "Marco Martin",
"Name[sa]": "मार्को मार्टिन्",
"Name[sk]": "Marco Martin",
"Name[sl]": "Marco Martin",
"Name[sv]": "Marco Martin",
"Name[ta]": "மார்க்கோ மார்ட்டின்",
"Name[tr]": "Marco Martin",
"Name[uk]": "Marco Martin",
"Name[vi]": "Marco Martin",
"Name[zh_CN]": "Marco Martin",
"Name[zh_TW]": "Marco Martin"
}
],
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=plasmashell&component=System%20Monitor%20widgets",
"Category": "System Information",
"Description": "System monitor widget that shows the usage of the root partition",
"Description[ar]": "أداة مراقبة النظام التي تعرض استخدام قسم الجذر",
"Description[az]": "Kök bölməsinin istifadəsini göstərən sistem izləyici vidjeti",
"Description[be]": "Віджэт сістэмнага назіральніка, які паказвае выкарыстанне каранёвага раздзела",
"Description[bg]": "Уиджет за системен монитор, който показва използването на основния дял",
"Description[ca@valencia]": "Giny del monitor del sistema que mostra l'ús de la partició arrel",
"Description[ca]": "Giny del monitor del sistema que mostra l'ús de la partició arrel",
"Description[cs]": "Widget monitoru systému, zobrazující celkové využití kořenového oddílu",
"Description[da]": "Systemovervågning-widget som viser brug af rod-partitionen",
"Description[de]": "Systemmonitor-Miniprogramm, das die Belegung der Systempartition anzeigt",
"Description[el]": "Συστατικό παρακολούθησης συστήματος που δείχνει τη χρήση της ριζικής κατάτμησης",
"Description[en_GB]": "System monitor widget that shows the usage of the root partition",
"Description[eo]": "Sistemmonitora fenestraĵo kiu montras la uzadon de la radika sekcio",
"Description[es]": "Elemento gráfico del monitor del sistema que muestra el uso de la partición raíz",
"Description[eu]": "Erro partizioaren erabilera erakusten duen sistema gainbegiratzeko trepeta",
"Description[fi]": "Juuriosion käyttöasteen näyttävä järjestelmänvalvontasovelma",
"Description[fr]": "Composant graphique de surveillance du système, affichant l'utilisation de la partition « Système ».",
"Description[gl]": "Trebello de vixilancia do sistema que mostra o uso da partición raíz.",
"Description[he]": "יישומון צג מערכת שמציג את ניצולת מחיצת העל",
"Description[hu]": "Rendszermonitor elem, amely a root partíció használatát mutatja",
"Description[ia]": "Widget de supervision de systema que monstra le uso del partition de root (radice)",
"Description[id]": "Widget pemantau sistem yang menampilkan penggunaan partisi root",
"Description[is]": "Kerfisvöktunargræja sem sýnir notkunina á rótarsneiðinni",
"Description[it]": "Oggetto di monitoraggio del sistema che mostra l'utilizzo della partizione radice",
"Description[ja]": "root パーティションの使用率を表示するウィジェット",
"Description[ka]": "სისტემური მონიტორის ვიჯეტი, რომელიც საწყისი დანაყოფის გამოყენებას გაჩვენებთ",
"Description[ko]": "루트 파티션 사용량을 표시하는 시스템 모니터 위젯",
"Description[lt]": "Sistemos prižiūryklės valdiklis, kuris rodo šaknies skaidinio naudojimą",
"Description[lv]": "Sistēmas pārraudzības logdaļa, kas parāda saknes nodalījuma lietojumu",
"Description[nb]": "Systemovervåking-element som viser bruk av rotpartisjonen",
"Description[nl]": "Systeemmonitorwidget die het totale gebruik toont van de root-partitie",
"Description[nn]": "System­overvaking som viser bruk av rotpartisjonen",
"Description[pa]": "ਰੂਟ ਪਾਰਟੀਸ਼ਨ ਦੀ ਵਰਤੋਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਦਿਖਾਉਣ ਵਾਲਾ ਸਿਸਟਮ ਮਾਨੀਟਰ ਵਿਜੈਟ ",
"Description[pl]": "Element interfejsu, który pokazuje wykorzystanie głównej partycji",
"Description[pt_BR]": "Widget monitor do sistema que mostra o uso da partição raiz",
"Description[ro]": "Control grafic de monitorizare a sistemului ce arată utilizarea partiției root",
"Description[ru]": "Мониторинг использования дискового пространства корневым разделом",
"Description[sa]": "सङ्गणकतन्त्रस्य निरीक्षकस्य विजेट् यत् मूलविभाजनस्य उपयोगं दर्शयति",
"Description[sk]": "Miniaplikácia monitorovania systému, ktorá zobrazuje využitie koreňovej partície",
"Description[sl]": "Gradnik sistemskega monitorja, ki prikazuje rabo korenske particije",
"Description[sv]": "Grafisk systemövervakningskomponent som visar användning av rotpartitionen",
"Description[ta]": "ரூட் வகிர்வின் பயன்பாட்டைக் காட்டும் பிளாஸ்மாய்ட்",
"Description[tr]": "Kök bölüntünün kullanımını gösteren sistem monitörü araç takımı",
"Description[uk]": "Віджет нагляду за системою, який показує використання кореневого розділу",
"Description[zh_CN]": "显示根分区占用率的系统监视小部件",
"Description[zh_TW]": "顯示 root 分割區用量的系統監控元件",
"EnabledByDefault": true,
"FormFactors": [
"desktop"
],
"Icon": "cpu",
"Id": "org.kde.plasma.systemmonitor.diskusage",
"License": "GPL-2.0+",
"Name": "Disk Usage",
"Name[ar]": "استخدام القرص",
"Name[az]": "Disk sahəsnin İstifadəsi",
"Name[be]": "Выкарыстанне дыска",
"Name[bg]": "Използване на диска",
"Name[ca@valencia]": "Ús del disc",
"Name[ca]": "Ús del disc",
"Name[cs]": "Zaplnění Disku",
"Name[da]": "Diskforbrug",
"Name[de]": "Datenträgerbelegung",
"Name[el]": "Χρήση δίσκου",
"Name[en_GB]": "Disk Usage",
"Name[eo]": "Disk-Uzado",
"Name[es]": "Uso del disco duro",
"Name[et]": "Kettakasutus",
"Name[eu]": "Diskoaren erabilera",
"Name[fi]": "Levyn käyttö",
"Name[fr]": "Utilisation des disques",
"Name[ga]": "Úsáid Diosca",
"Name[gl]": "Uso de disco",
"Name[he]": "ניצולת כונן",
"Name[hi]": "डिस्क उपयोग",
"Name[hsb]": "Wužiwanje tačele",
"Name[hu]": "Lemezhasználat",
"Name[ia]": "Uso de disco",
"Name[id]": "Penggunaan Disk",
"Name[is]": "Notkun diska",
"Name[it]": "Utilizzo disco",
"Name[ja]": "ディスク使用率",
"Name[ka]": "დისკის გამოყენება",
"Name[ko]": "디스크 사용량",
"Name[lt]": "Disko naudojimas",
"Name[lv]": "Diska noslodze",
"Name[ml]": "ഡ‍ിസ്ക് ഉപയോഗം",
"Name[nb]": "Diskbruk",
"Name[nl]": "Schijfgebruik",
"Name[nn]": "Diskbruk",
"Name[pa]": "ਡਿਸਕ ਥਾਂ ਦੀ ਵਰਤੋਂ",
"Name[pl]": "Wykorzystanie dysku",
"Name[pt]": "Utilização do Disco",
"Name[pt_BR]": "Uso do disco",
"Name[ro]": "Utilizare disc",
"Name[ru]": "Использование дискового пространства",
"Name[sa]": "डिस्कस्य उपयोगः",
"Name[sk]": "Využitie disku",
"Name[sl]": "Uporaba diska",
"Name[sv]": "Diskanvändning",
"Name[ta]": "வட்டு பயன்பாட்டு",
"Name[tg]": "Истифодабарии диск",
"Name[tok]": "kepeken poki",
"Name[tr]": "Disk Kullanımı",
"Name[uk]": "Використання диска",
"Name[vi]": "Lượng dùng đĩa",
"Name[zh_CN]": "磁盘使用率",
"Name[zh_TW]": "磁碟用量",
"Website": "https://www.kde.org/plasma-desktop"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-Provides": [
"org.kde.plasma.systemmonitor"
],
"X-Plasma-RootPath": "org.kde.plasma.systemmonitor"
}

View File

@@ -0,0 +1,11 @@
[Config]
chartFace=org.kde.ksysguard.piechart
highPrioritySensorIds=["memory/physical/used"]
totalSensors=["memory/physical/usedPercent"]
lowPrioritySensorIds=["memory/physical/total"]
[FaceConfig]
rangeAuto=true
rangeFrom=0
rangeTo=100

View File

@@ -0,0 +1,178 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "kde@privat.broulik.de",
"Name": "Kai Uwe Broulik",
"Name[ar]": "كاي أووي بروتيك",
"Name[ast]": "Kai Uwe Broulik",
"Name[az]": "Kai Uwe Broulik",
"Name[be]": "Kai Uwe Broulik",
"Name[bg]": "Kai Uwe Broulik",
"Name[ca@valencia]": "Kai Uwe Broulik",
"Name[ca]": "Kai Uwe Broulik",
"Name[cs]": "Kai Uwe Broulik",
"Name[da]": "Kai Uwe Broulik",
"Name[de]": "Kai Uwe Broulik",
"Name[el]": "Kai Uwe Broulik",
"Name[en_GB]": "Kai Uwe Broulik",
"Name[eo]": "Kai Uwe Broulik",
"Name[es]": "Kai Uwe Broulik",
"Name[et]": "Kai Uwe Broulik",
"Name[eu]": "Kai Uwe Broulik",
"Name[fi]": "Kai Uwe Broulik",
"Name[fr]": "Kai Uwe Broulik",
"Name[ga]": "Kai Uwe Broulik",
"Name[gl]": "Kai Uwe Broulik",
"Name[he]": "קאי אווה ברוליק",
"Name[hi]": "काई उवे ब्रोलिक",
"Name[hu]": "Kai Uwe Broulik",
"Name[ia]": "Kai Uwe Broulik",
"Name[id]": "Kai Uwe Broulik",
"Name[is]": "Kai Uwe Broulik",
"Name[it]": "Kai Uwe Broulik",
"Name[ja]": "Kai Uwe Broulik",
"Name[ka]": "კაი უვე ბროულიკი",
"Name[ko]": "Kai Uwe Broulik",
"Name[lt]": "Kai Uwe Broulik",
"Name[lv]": "Kai Uwe Broulik",
"Name[nb]": "Kai Uwe Broulik",
"Name[nl]": "Kai Uwe Broulik",
"Name[nn]": "Kai Uwe Broulik",
"Name[pa]": "ਕੋਈ ਉਵੇ ਬਰੋਉਲਿਕ",
"Name[pl]": "Kai Uwe Broulik",
"Name[pt]": "Kai Uwe Broulik",
"Name[pt_BR]": "Kai Uwe Broulik",
"Name[ro]": "Kai Uwe Broulik",
"Name[ru]": "Kai Uwe Broulik",
"Name[sa]": "कै उवे ब्रौलिक्",
"Name[sk]": "Kai Uwe Broulik",
"Name[sl]": "Kai Uwe Broulik",
"Name[sv]": "Kai Uwe Broulik",
"Name[ta]": "காய் ஊவே புரோலிக்",
"Name[tr]": "Kai Uwe Broulik",
"Name[uk]": "Kai Uwe Broulik",
"Name[vi]": "Kai Uwe Broulik",
"Name[zh_CN]": "Kai Uwe Broulik",
"Name[zh_TW]": "Kai Uwe Broulik"
}
],
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=plasmashell&component=System%20Monitor%20widgets",
"Category": "System Information",
"Description": "System monitor widget that shows physical memory usage",
"Description[ar]": "أداة مراقبة النظام التي تعرض استخدام الذاكرة الفعلية",
"Description[az]": "Fiziki yaddaşın istifadəsini gösərən sistem izləyici vidjeti",
"Description[be]": "Віджэт сістэмнага назіральніка, які паказвае выкарыстанне фізічнай памяці",
"Description[bg]": "Уиджет за системен монитор, което показва използването на физическа памет",
"Description[ca@valencia]": "Giny del monitor del sistema que mostra l'ús de la memòria física",
"Description[ca]": "Giny del monitor del sistema que mostra l'ús de la memòria física",
"Description[cs]": "Widget monitoru systému, zobrazující celkové využití paměti",
"Description[da]": "Systemovervågning-widget som viser brug af den fysiske hukommelse",
"Description[de]": "Systemmonitor-Miniprogramm, das die Auslastung des Arbeitsspeichers anzeigt",
"Description[el]": "Συστατικό παρακολούθησης συστήματος που δείχνει τη χρήση φυσικής μνήμης",
"Description[en_GB]": "System monitor widget that shows physical memory usage",
"Description[eo]": "Sistemmonitora fenestraĵo kiu montras fizikan memoruzon",
"Description[es]": "Elemento gráfico del monitor del sistema que muestra el uso de la memoria física",
"Description[eu]": "Memoria fisikoaren erabilera erakusten duen sistema gainbegiratzeko trepeta",
"Description[fi]": "Fyysisen muistin käytön näyttävä järjestelmänvalvontasovelma",
"Description[fr]": "Composant graphique de surveillance du système, affichant l'utilisation de la mémoire physique.",
"Description[gl]": "Trebello de vixilancia do sistema que mostra o uso da memoria física.",
"Description[he]": "יישומון צג מערכת שמציג את ניצולת הזיכרון הפיזי",
"Description[hu]": "A fizikai memória használati statisztikáit megjelenítő elem",
"Description[ia]": "Widget de supervision de systema que monstra le uso de memoria physic",
"Description[id]": "Widget pemantau sistem yang menampilkan penggunaan memori fisik",
"Description[is]": "Kerfisvöktunargræja sem sýnir notkun á innra minninu",
"Description[it]": "Oggetto di monitoraggio del sistema che mostra l'utilizzo della memoria fisica",
"Description[ja]": "物理メモリの使用率を表示するウィジェット",
"Description[ka]": "სისტემური მონიტორის ვიჯეტი, რომელიც ფიზიკური მეხსიერების გამოყენებას აჩვენებს",
"Description[ko]": "물리적 메모리 사용량을 표시하는 시스템 모니터 위젯",
"Description[lt]": "Sistemos prižiūryklės valdiklis, kuris rodo fizinės atminties naudojimą",
"Description[lv]": "Sistēmas pārraudzības logdaļa, kas parāda fiziskās atmiņas lietojumu",
"Description[nb]": "Systemovervåking-element som viser bruk av fysisk minne",
"Description[nl]": "Systeemmonitorwidget die het gebruik van fysiek geheugen toont",
"Description[nn]": "System­overvaking som viser bruk av fysisk minne",
"Description[pa]": "ਕੁੱਲ ਫਿਜ਼ੀਕਲ ਮੈਮੋਰੀ ਵਰਤੋਂ ਦਿਖਾਉਣ ਵਾਲਾ ਸਿਸਟਮ ਮਾਨੀਟਰ ਵਿਜੈੱਟ",
"Description[pl]": "Element interfejsu, który pokazuje wykorzystanie pamięci fizycznej",
"Description[pt_BR]": "Widget monitor do sistema que mostra o uso da memória física",
"Description[ro]": "Control grafic de monitorizare a sistemului ce arată utilizarea memoriei fizice",
"Description[ru]": "Мониторинг использования физической памяти",
"Description[sa]": "सङ्गणकतन्त्रस्य निरीक्षकस्य विजेट् यत् भौतिकस्मृतिप्रयोगं दर्शयति",
"Description[sk]": "Miniaplikácia monitorovania systému, ktorá zobrazuje využitie fyzickej pamäte",
"Description[sl]": "Gradnik sistemskega monitorja, ki prikazuje rabo fizičnega pomnilnika",
"Description[sv]": "Grafisk systemövervakningskomponent som fysisk minnesanvändning",
"Description[ta]": "நினைவகத்தின் பயன்பாட்டைக் காட்டும் பிளாஸ்மாய்ட்",
"Description[tr]": "Fiziksel bellek kullanımını gösteren sistem monitörü araç takımı",
"Description[uk]": "Віджет нагляду за системою, який показує використання фізичної пам'яті",
"Description[zh_CN]": "显示物理内存占用率的系统监视小部件",
"Description[zh_TW]": "顯示實體記憶體用量的系統監控元件",
"EnabledByDefault": true,
"FormFactors": [
"desktop"
],
"Icon": "ksysguardd",
"Id": "org.kde.plasma.systemmonitor.memory",
"License": "GPL-2.0+",
"Name": "Memory Usage",
"Name[ar]": "استخدام الذاكرة",
"Name[ast]": "Usu de la memoria",
"Name[az]": "Yaddaş İstifadəsi",
"Name[be]": "Выкарыстанне памяці",
"Name[bg]": "Използване на паметта",
"Name[ca@valencia]": "Ús de memòria",
"Name[ca]": "Ús de memòria",
"Name[cs]": "Spotřeba paměti",
"Name[da]": "Hukommelsesforbrug",
"Name[de]": "Speicherbelegung",
"Name[el]": "Χρήση μνήμης",
"Name[en_GB]": "Memory Usage",
"Name[eo]": "Memor-Uzado",
"Name[es]": "Uso de memoria",
"Name[et]": "Mälukasutus",
"Name[eu]": "Memoria erabilera",
"Name[fi]": "Muistin käyttö",
"Name[fr]": "Utilisation de la mémoire",
"Name[gl]": "Uso de memoria",
"Name[he]": "ניצולת זיכרון",
"Name[hi]": "मेमोरी उपयोग",
"Name[hsb]": "Wužiwanje pomjatka",
"Name[hu]": "Memóriahasználat",
"Name[ia]": "Uso de Memoria",
"Name[id]": "Penggunaan Memori",
"Name[is]": "Minnisnotkun",
"Name[it]": "Utilizzo memoria",
"Name[ja]": "メモリ使用率",
"Name[ka]": "მეხსიერების გამოყენება",
"Name[ko]": "메모리 사용량",
"Name[lt]": "Atminties naudojimas",
"Name[lv]": "Atmiņas lietojums",
"Name[ml]": "മെമ്മറി ഉപയോഗം",
"Name[nb]": "Minnebruk",
"Name[nl]": "Geheugengebruik",
"Name[nn]": "Minne­bruk",
"Name[pa]": "ਮੈਮੋਰੀ ਦੀ ਵਰਤੋਂ",
"Name[pl]": "Wykorzystanie pamięci",
"Name[pt]": "Utilização da Memória",
"Name[pt_BR]": "Uso da memória",
"Name[ro]": "Utilizare memorie",
"Name[ru]": "Использование памяти",
"Name[sa]": "स्मृतिप्रयोगः",
"Name[sk]": "Využitie pamäte",
"Name[sl]": "Raba pomnilnika",
"Name[sv]": "Minnesanvändning",
"Name[ta]": "நினைவு பயன்பாட்டு",
"Name[tg]": "Истифодабарии ҳофиза",
"Name[tok]": "kepeken sona",
"Name[tr]": "Bellek Kullanımı",
"Name[uk]": "Використання пам'яті",
"Name[vi]": "Lượng dùng bộ nhớ",
"Name[zh_CN]": "内存使用率",
"Name[zh_TW]": "記憶體用量",
"Website": "https://www.kde.org/plasma-desktop"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-Provides": [
"org.kde.plasma.systemmonitor"
],
"X-Plasma-RootPath": "org.kde.plasma.systemmonitor"
}

View File

@@ -0,0 +1,7 @@
[Config]
chartFace=org.kde.ksysguard.linechart
highPrioritySensorIds=["network/all/download","network/all/upload"]
[FaceConfig]
lineChartSmooth=true

View File

@@ -0,0 +1,169 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "mart@kde.org",
"Name": "Marco Martin",
"Name[ar]": "ماركو مارتن",
"Name[ast]": "Marco Martin",
"Name[az]": "Marco Martin",
"Name[be]": "Marco Martin",
"Name[bg]": "Марко Мартин",
"Name[ca@valencia]": "Marco Martin",
"Name[ca]": "Marco Martin",
"Name[cs]": "Marco Martin",
"Name[da]": "Marco Martin",
"Name[de]": "Marco Martin",
"Name[el]": "Marco Martin",
"Name[en_GB]": "Marco Martin",
"Name[eo]": "Marco Martin",
"Name[es]": "Marco Martin",
"Name[et]": "Marco Martin",
"Name[eu]": "Marco Martin",
"Name[fi]": "Marco Martin",
"Name[fr]": "Marco Martin",
"Name[ga]": "Marco Martin",
"Name[gl]": "Marco Martin",
"Name[he]": "מרקו מרטין",
"Name[hi]": "मार्को मार्टिन",
"Name[hu]": "Marco Martin",
"Name[ia]": "Marco Martin",
"Name[id]": "Marco Martin",
"Name[is]": "Marco Martin",
"Name[it]": "Marco Martin",
"Name[ja]": "Marco Martin",
"Name[ka]": "მაკრო მარტინი",
"Name[ko]": "Marco Martin",
"Name[lt]": "Marco Martin",
"Name[lv]": "Marco Martin",
"Name[nb]": "Marco Martin",
"Name[nl]": "Marco Martin",
"Name[nn]": "Marco Martin",
"Name[pa]": "ਮਾਰਕੋ ਮਾਰਟਿਨ",
"Name[pl]": "Marco Martin",
"Name[pt]": "Marco Martin",
"Name[pt_BR]": "Marco Martin",
"Name[ro]": "Marco Martin",
"Name[ru]": "Marco Martin",
"Name[sa]": "मार्को मार्टिन्",
"Name[sk]": "Marco Martin",
"Name[sl]": "Marco Martin",
"Name[sv]": "Marco Martin",
"Name[ta]": "மார்க்கோ மார்ட்டின்",
"Name[tr]": "Marco Martin",
"Name[uk]": "Marco Martin",
"Name[vi]": "Marco Martin",
"Name[zh_CN]": "Marco Martin",
"Name[zh_TW]": "Marco Martin"
}
],
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=plasmashell&component=System%20Monitor%20widgets",
"Category": "System Information",
"Description": "System monitor widget that shows the download and upload data rate",
"Description[ar]": "أداة مراقبة النظام التي تعرض سرعة تنزيل ورفع البيانات",
"Description[az]": "Verilənlərin endirmə və yükləmə sürətini göstərən sistem izləyici vidjeti",
"Description[be]": "Віджэт сістэмнага назіральніка, які паказвае хуткасць спампоўвання і запампоўвання даных",
"Description[bg]": "Уиджет за системен монитор, който показва скоростта на изтегляне и качване на данни",
"Description[ca@valencia]": "Giny del monitor del sistema que mostra la velocitat de baixada i pujada de les dades",
"Description[ca]": "Giny del monitor del sistema que mostra la velocitat de baixada i pujada de les dades",
"Description[cs]": "Widget monitoru systému, zobrazující přenosovou rychlost stahování a odesílání",
"Description[da]": "Systemovervågning-widget som viser download- og uploadhastighed",
"Description[de]": "Systemmonitor-Miniprogramm, das die Download- und Upload-Datenrate anzeigt",
"Description[el]": "Συστατικό παρακολούθησης συστήματος που δείχνει το ρυθμό λήψης και μεταφόρτωσης δεδομένων",
"Description[en_GB]": "System monitor widget that shows the download and upload data rate",
"Description[eo]": "Sistemmonitora fenestraĵo kiu montras la elŝutan kaj alŝutan datumrapidecon",
"Description[es]": "Elemento gráfico del monitor del sistema que muestra las velocidades de subida y bajada de datos",
"Description[eu]": "Zama-jaiste eta -igotze datuen emaria erakusten duen sistema gainbegiratzeko trepeta",
"Description[fi]": "Lataus- ja lähetysnopeuden näyttävä järjestelmänvalvontasovelma",
"Description[fr]": "Composant graphique de surveillance du système, affichant le débit pour les envois et les téléchargements de données.",
"Description[gl]": "Trebello de vixilancia do sistema que amosa a velocidade de descarga e envío de datos.",
"Description[he]": "יישומון צג מערכת שמציג את קצב ההורדה וההעלאה",
"Description[hu]": "A le- és feltöltési sebességet megjelenítő elem",
"Description[ia]": "Widget de supervision de systema que monstra le velocitate de discargar e incargar datos",
"Description[id]": "Widget pemantau sistem yang menampilkan laju data unggah dan unduh",
"Description[is]": "Kerfisvöktunargræja sem sýnir gagnahraða fyrir sóttar skrár og upphleðslur",
"Description[it]": "Oggetto di monitoraggio del sistema che mostra la velocità di ricezione e invio dei dati",
"Description[ja]": "ダウンロード/アップロード速度を表示するウィジェット",
"Description[ka]": "სისტემური მონიტორის ვიჯეტი, რომელიც გადმოწერისა და ატვირთვის სიჩქარეს გაჩვენებთ",
"Description[ko]": "데이터 다운로드 및 업로드 전송률을 표시하는 시스템 모니터 위젯",
"Description[lt]": "Sistemos prižiūryklės valdiklis, kuris rodo duomenų atsiuntimo ir išsiuntimo spartą",
"Description[lv]": "Sistēmas pārraudzības logdaļa, kas parāda datu lejupielādes un augšupielādes ātrumu",
"Description[nb]": "Systemovervåking-element som viser ned- og opplastingshastighet",
"Description[nl]": "Systeemmonitorwidget die gegevenssnelheid van down- en uploaden toont",
"Description[nn]": "System­overvaking som viser ned- og opplastingsratar",
"Description[pa]": "ਡਾਊਨਲੋਡ ਅਤੇ ਅੱਪਲੋਡ ਡਾਟਾ ਦਰ ਵਿਖਾਉਣ ਵਾਲਾ ਸਿਸਟਮ ਮਾਨੀਟਰ ਵਿਜੈੱਟ",
"Description[pl]": "Element interfejsu, który pokazuje szybkość wysyłania i pobierania danych",
"Description[pt_BR]": "Widget monitor do sistema que mostra a taxa de download e upload",
"Description[ro]": "Control grafic de monitorizare a sistemului ce arată rata de încărcare și descărcare a datelor",
"Description[ru]": "Мониторинг скорости получения и передачи данных по сети",
"Description[sa]": "सङ्गणकतन्त्रस्य निरीक्षकस्य विजेट् यत् अवारोपण उपारोपण च दत्तांशदरः दर्शयति",
"Description[sk]": "Miniaplikácia monitorovania systému, ktorá zobrazuje množstvo sťahovaných a odosielaných dát",
"Description[sl]": "Gradnik sistemskega monitorja, ki prikazuje podatke prenosa podatkov noter in ven",
"Description[sv]": "Grafisk systemövervakningskomponent som visar nerladdnings- och uppladdningshastighet för data",
"Description[ta]": "பதிவிறக்க மற்றும் பதிவேற்ற விகிதத்தைக் காட்டும் பிளாஸ்மாய்ட்",
"Description[tr]": "Veri indirme ve karşıya yükleme hızını gösteren sistem monitörü araç takımı",
"Description[uk]": "Віджет нагляду за системою, який показує швидкість отримання та вивантаження даних",
"Description[zh_CN]": "显示下载和上传速率的系统监视小部件",
"Description[zh_TW]": "顯示下載與上傳之資料速率的系統監控元件",
"EnabledByDefault": true,
"FormFactors": [
"desktop"
],
"Icon": "network-workgroup",
"Id": "org.kde.plasma.systemmonitor.net",
"License": "GPL-2.0+",
"Name": "Network Speed",
"Name[ar]": "سرعة الشبكة",
"Name[az]": "Şəbəkə sürəti",
"Name[be]": "Хуткасць сеткі",
"Name[bg]": "Скорост на мрежата",
"Name[ca@valencia]": "Velocitat de xarxa",
"Name[ca]": "Velocitat de xarxa",
"Name[cs]": "Rychlost sítě",
"Name[da]": "Netværkshastighed",
"Name[de]": "Netzwerkgeschwindigkeit",
"Name[el]": "Ταχύτητα δικτύου",
"Name[en_GB]": "Network Speed",
"Name[eo]": "Reta Rapideco",
"Name[es]": "Velocidad de la red",
"Name[eu]": "Sareko abiadura",
"Name[fi]": "Verkon nopeus",
"Name[fr]": "Débit du réseau",
"Name[gl]": "Velocidade de rede",
"Name[he]": "מהירות רשת",
"Name[hu]": "Hálózati sebesség",
"Name[ia]": "Velocitate de Rete",
"Name[id]": "Kecepatan Jaringan",
"Name[is]": "Nethraði",
"Name[it]": "Velocità di rete",
"Name[ja]": "ネットワーク速度",
"Name[ka]": "ქსელის სიჩქარე",
"Name[ko]": "네트워크 속도",
"Name[lt]": "Tinklo greitis",
"Name[lv]": "Tīkla ātrums",
"Name[nb]": "Nettverkshastighet",
"Name[nl]": "Netwerksnelheid",
"Name[nn]": "Nettverks­fart",
"Name[pa]": "ਨੈੱਟਵਰਕ ਸਪੀਡ",
"Name[pl]": "Szybkość sieci",
"Name[pt_BR]": "Velocidade de rede",
"Name[ro]": "Viteza rețelei",
"Name[ru]": "Скорость передачи данных по сети",
"Name[sa]": "संजालस्य गतिः",
"Name[sk]": "Rýchlosť siete",
"Name[sl]": "Hitrost omrežja",
"Name[sv]": "Nätverkshastighet",
"Name[ta]": "பிணைய வேகம்",
"Name[tr]": "Ağ Hızı",
"Name[uk]": "Швидкість мережі",
"Name[zh_CN]": "网络速度",
"Name[zh_TW]": "網路速度",
"Website": "https://www.kde.org/plasma-desktop"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-Provides": [
"org.kde.plasma.systemmonitor"
],
"X-Plasma-RootPath": "org.kde.plasma.systemmonitor"
}

View File

@@ -0,0 +1,25 @@
import QtQuick
import org.kde.ksysguard.sensors as Sensors
import org.kde.plasma.plasmoid
import org.kde.plasma.configuration
ConfigModel {
ConfigCategory {
name: i18n("Appearance")
icon: "preferences-desktop-color"
source: "config/ConfigAppearance.qml"
}
ConfigCategory {
name: i18n("%1 Details", Plasmoid.faceController.name)
icon: Plasmoid.faceController.icon
visible: Plasmoid.faceController.faceConfigUi !== null
source: "config/FaceDetails.qml"
}
ConfigCategory {
name: i18n("Sensors Details")
icon: "ksysguardd"
source: "config/ConfigSensors.qml"
}
}

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<kcfgfile name=""/>
<group name="Appearance">
<entry name="title" type="String"/>
<entry name="chartFace" type="String">
<default>org.kde.ksysguard.piechart</default>
</entry>
</group>
<group name="Sensors">
<entry name="totalSensor" type="String">
</entry>
<entry name="sensorIds" type="StringList">
</entry>
<entry name="sensorColors" type="StringList"/>
<entry name="textOnlySensorIds" type="StringList"/>
</group>
</kcfg>

View File

@@ -0,0 +1,62 @@
/*
SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
SPDX-FileCopyrightText: 2019 David Edmundson <davidedmundson@kde.org>
SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import QtQml
import org.kde.plasma.plasmoid
import org.kde.plasma.core as PlasmaCore
import org.kde.ksysguard.faces as Faces
Control {
id: chartFace
Layout.fillWidth: contentItem ? contentItem.Layout.fillWidth : false
Layout.fillHeight: contentItem ? contentItem.Layout.fillHeight : false
Layout.minimumWidth: (contentItem ? contentItem.Layout.minimumWidth : 0) + leftPadding + rightPadding
Layout.minimumHeight: (contentItem ? contentItem.Layout.minimumHeight : 0) + leftPadding + rightPadding
Layout.preferredWidth: (contentItem ? contentItem.Layout.preferredWidth : 0) + leftPadding + rightPadding
Layout.preferredHeight: (contentItem ? contentItem.Layout.preferredHeight : 0) + leftPadding + rightPadding
Layout.maximumWidth: (contentItem ? contentItem.Layout.maximumWidth : 0) + leftPadding + rightPadding
Layout.maximumHeight: (contentItem ? contentItem.Layout.maximumHeight : 0) + leftPadding + rightPadding
leftPadding: 0
topPadding: 0
rightPadding: 0
bottomPadding: 0
anchors.fill: parent
contentItem: Plasmoid.faceController.compactRepresentation
Binding {
target: Plasmoid.faceController.compactRepresentation
property: "formFactor"
value: {
switch (Plasmoid.formFactor) {
case PlasmaCore.Types.Horizontal:
return Faces.SensorFace.Horizontal;
case PlasmaCore.Types.Vertical:
return Faces.SensorFace.Vertical;
default:
return Faces.SensorFace.Planar;
}
}
restoreMode: Binding.RestoreBinding
}
MouseArea {
parent: chartFace
anchors.fill: parent
onClicked: root.expanded = !root.expanded
}
}

View File

@@ -0,0 +1,62 @@
/*
SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
SPDX-FileCopyrightText: 2019 David Edmundson <davidedmundson@kde.org>
SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import QtQuick.Window
import Qt5Compat.GraphicalEffects
import QtQml
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.plasmoid
import org.kde.ksysguard.faces as Faces
Control {
id: chartFace
Layout.minimumWidth: (contentItem ? contentItem.Layout.minimumWidth : 0) + leftPadding + rightPadding
Layout.minimumHeight: (contentItem ? contentItem.Layout.minimumHeight : 0) + leftPadding + rightPadding
Layout.preferredWidth: (contentItem
? (contentItem.Layout.preferredWidth > 0 ? contentItem.Layout.preferredWidth : contentItem.implicitWidth)
: 0) + leftPadding + rightPadding
Layout.preferredHeight: (contentItem
? (contentItem.Layout.preferredHeight > 0 ? contentItem.Layout.preferredHeight: contentItem.implicitHeight)
: 0) + leftPadding + rightPadding
Layout.maximumWidth: (contentItem ? contentItem.Layout.maximumWidth : 0) + leftPadding + rightPadding
Layout.maximumHeight: (contentItem ? contentItem.Layout.maximumHeight : 0) + leftPadding + rightPadding
contentItem: Plasmoid.faceController.fullRepresentation
// This empty mousearea serves for the sole purpose of refusing touch events
// which otherwise are eaten by Control stealing the event from any of its parents
// TODO KF6: Check if this is still needed as Qt6 doesn't accept touch by default on Control
MouseArea {
parent: chartFace
anchors.fill:parent
}
Binding {
target: Plasmoid.faceController.fullRepresentation
property: "formFactor"
value: {
switch (Plasmoid.formFactor) {
case PlasmaCore.Types.Horizontal:
return Faces.SensorFace.Horizontal;
case PlasmaCore.Types.Vertical:
return Faces.SensorFace.Vertical;
default:
return Faces.SensorFace.Planar;
}
}
restoreMode: Binding.RestoreBinding
}
}

View File

@@ -0,0 +1,52 @@
/*
SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
SPDX-FileCopyrightText: 2019 David Edmundson <davidedmundson@kde.org>
SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
import QtQuick
import org.kde.plasma.plasmoid
import org.kde.kcmutils as KCM
KCM.SimpleKCM {
id: root
signal configurationChanged
function saveConfig() {
configUi.saveConfig()
Plasmoid.faceController.reloadConfig()
}
// Workaround for Bug 424458, when reusing the controller/item things break
readonly property Item configUi: Plasmoid.workaroundController(root).appearanceConfigUi
// We cannot directly override the contentItem since SimpleKCM is a
// Kirigami.ScrollablePage which breaks if we override the contentItem. So
// instead use a placeholder item and reparent the config UI into that item,
// making sure to bind the required properties so sizing is correct.
Item {
id: contents
implicitWidth: root.configUi.implicitWidth
implicitHeight: root.configUi.implicitHeight
children: root.configUi
Binding {
target: root.configUi
property: "width"
value: contents.width
}
}
Connections {
target: root.configUi
function onConfigurationChanged() {
root.configurationChanged()
}
}
}

View File

@@ -0,0 +1,50 @@
/*
SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
SPDX-FileCopyrightText: 2019 David Edmundson <davidedmundson@kde.org>
SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
import QtQuick
import org.kde.plasma.plasmoid
import org.kde.kcmutils as KCM
KCM.SimpleKCM {
id: root
signal configurationChanged
function saveConfig() {
configUi.saveConfig();
}
readonly property Item configUi: Plasmoid.faceController.sensorsConfigUi
// We cannot directly override the contentItem since SimpleKCM is a
// Kirigami.ScrollablePage which breaks if we override the contentItem. So
// instead use a placeholder item and reparent the config UI into that item,
// making sure to bind the required properties so sizing is correct.
Item {
id: contents
implicitWidth: root.configUi.implicitWidth
implicitHeight: root.configUi.implicitHeight
children: root.configUi
Binding {
target: root.configUi
property: "width"
value: contents.width
}
}
Connections {
target: root.configUi
function onConfigurationChanged() {
root.configurationChanged()
}
}
}

View File

@@ -0,0 +1,50 @@
/*
SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
SPDX-FileCopyrightText: 2019 David Edmundson <davidedmundson@kde.org>
SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
import QtQuick
import org.kde.plasma.plasmoid
import org.kde.kcmutils as KCM
KCM.SimpleKCM {
id: root
signal configurationChanged
function saveConfig() {
configUi.saveConfig();
}
readonly property Item configUi: Plasmoid.faceController.faceConfigUi
// We cannot directly override the contentItem since SimpleKCM is a
// Kirigami.ScrollablePage which breaks if we override the contentItem. So
// instead use a placeholder item and reparent the config UI into that item,
// making sure to bind the required properties so sizing is correct.
Item {
id: contents
implicitWidth: root.configUi.implicitWidth
implicitHeight: root.configUi.implicitHeight
children: root.configUi
Binding {
target: root.configUi
property: "width"
value: contents.width
}
}
Connections {
target: root.configUi
function onConfigurationChanged() {
root.configurationChanged()
}
}
}

View File

@@ -0,0 +1,96 @@
/*
SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
SPDX-FileCopyrightText: 2019 David Edmundson <davidedmundson@kde.org>
SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
import QtQuick
import QtQuick.Layouts
import QtQuick.Window
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.plasmoid
import org.kde.kirigami as Kirigami
import org.kde.ksysguard.sensors as Sensors
PlasmoidItem {
id: root
Plasmoid.backgroundHints: PlasmaCore.Types.DefaultBackground | PlasmaCore.Types.ConfigurableBackground
// Determine the right value to use for representation switching
function switchSizeFromSize(formFactor, compactMax, fullMin) {
// If we are planar (aka on the desktop), do not do any switching
if (Plasmoid.formFactor === PlasmaCore.Types.Planar) {
return -1
}
// If we are in a form factor where we can extend freely one way, don't
// use that for determining switching.
if (Plasmoid.formFactor === formFactor) {
// 0 or less is considered as "no switching" so return the smallest
// possible still valid value.
return 1
}
// Layout.maximumWidth will return Infinity if it isn't set, so handle that.
if (!Number.isFinite(compactMax)) {
// This is the default maximum size for compact reps, with 1 subtracted
// to ensure we switch if the maximum is reached.
compactMax = Kirigami.Units.iconSizes.enormous - 1
}
// Layout.minimumWidth will return -1 if it is not set, handle that.
if (fullMin <= 0) {
fullMin = Kirigami.Units.iconSizes.enormous - 1
}
// Use the larger of the two sizes to ensure we switch when the compact
// rep reaches its maximum but we don't try to cram in a full rep that
// won't actually fit.
return Math.max(compactMax, fullMin)
}
switchWidth: switchSizeFromSize(PlasmaCore.Types.Horizontal, compactRepresentationItem?.Layout.maximumWidth ?? Infinity, fullRepresentationItem?.Layout.minimumWidth ?? -1)
switchHeight: switchSizeFromSize(PlasmaCore.Types.Vertical, compactRepresentationItem?.Layout.maximumHeight ?? Infinity, fullRepresentationItem?.Layout.minimumHeight ?? -1)
preferredRepresentation: Plasmoid.formFactor === PlasmaCore.Types.Planar ? fullRepresentation : null
Plasmoid.title: Plasmoid.faceController?.title || i18n("System Monitor")
toolTipSubText: totalSensor.sensorId ? i18nc("Sensor name: value", "%1: %2", totalSensor.name, totalSensor.formattedValue) : ""
compactRepresentation: CompactRepresentation {
}
fullRepresentation: FullRepresentation {
}
Plasmoid.configurationRequired: (Plasmoid.faceController ?? false) &&
Plasmoid.faceController.highPrioritySensorIds.length == 0 &&
Plasmoid.faceController.lowPrioritySensorIds.length == 0 &&
Plasmoid.faceController.totalSensors.length == 0 &&
! (["org.kde.ksysguard.applicationstable",
"org.kde.ksysguard.processtable"].includes(Plasmoid.faceController.faceId))
Sensors.Sensor {
id: totalSensor
sensorId: Plasmoid.faceController?.totalSensors[0] || ""
updateRateLimit: Plasmoid.faceController?.updateRateLimit
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.MiddleButton
onClicked: Plasmoid.openSystemMonitor()
}
Plasmoid.contextualActions: [
PlasmaCore.Action {
text: i18nc("@action", "Open System Monitor…")
icon.name: "utilities-system-monitor"
onTriggered: Plasmoid.openSystemMonitor()
}
]
}

View File

@@ -0,0 +1,169 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Name": "Marco Martin",
"Name[ar]": "ماركو مارتن",
"Name[ast]": "Marco Martin",
"Name[az]": "Marco Martin",
"Name[be]": "Marco Martin",
"Name[bg]": "Марко Мартин",
"Name[ca@valencia]": "Marco Martin",
"Name[ca]": "Marco Martin",
"Name[cs]": "Marco Martin",
"Name[da]": "Marco Martin",
"Name[de]": "Marco Martin",
"Name[el]": "Marco Martin",
"Name[en_GB]": "Marco Martin",
"Name[eo]": "Marco Martin",
"Name[es]": "Marco Martin",
"Name[et]": "Marco Martin",
"Name[eu]": "Marco Martin",
"Name[fi]": "Marco Martin",
"Name[fr]": "Marco Martin",
"Name[ga]": "Marco Martin",
"Name[gl]": "Marco Martin",
"Name[he]": "מרקו מרטין",
"Name[hi]": "मार्को मार्टिन",
"Name[hu]": "Marco Martin",
"Name[ia]": "Marco Martin",
"Name[id]": "Marco Martin",
"Name[is]": "Marco Martin",
"Name[it]": "Marco Martin",
"Name[ja]": "Marco Martin",
"Name[ka]": "მაკრო მარტინი",
"Name[ko]": "Marco Martin",
"Name[lt]": "Marco Martin",
"Name[lv]": "Marco Martin",
"Name[nb]": "Marco Martin",
"Name[nl]": "Marco Martin",
"Name[nn]": "Marco Martin",
"Name[pa]": "ਮਾਰਕੋ ਮਾਰਟਿਨ",
"Name[pl]": "Marco Martin",
"Name[pt]": "Marco Martin",
"Name[pt_BR]": "Marco Martin",
"Name[ro]": "Marco Martin",
"Name[ru]": "Marco Martin",
"Name[sa]": "मार्को मार्टिन्",
"Name[sk]": "Marco Martin",
"Name[sl]": "Marco Martin",
"Name[sv]": "Marco Martin",
"Name[ta]": "மார்க்கோ மார்ட்டின்",
"Name[tr]": "Marco Martin",
"Name[uk]": "Marco Martin",
"Name[vi]": "Marco Martin",
"Name[zh_CN]": "Marco Martin",
"Name[zh_TW]": "Marco Martin"
}
],
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=plasmashell&component=System%20Monitor%20widgets",
"Category": "System Information",
"Description": "Displays a configurable chart of a system monitor sensor",
"Description[ar]": "يعرض مخططًا قابلًا للضبط لمتحسسات مراقبة النظام",
"Description[az]": "Sistem monitoru sensorunun ayarlana bilən zolaqlarını göstərir",
"Description[be]": "Паказвае наладжвальную дыяграму сэнсара сістэмнага назіральніка",
"Description[bg]": "Показва конфигурируема диаграма на сензор за системен монитор",
"Description[ca@valencia]": "Mostra un diagrama configurable d'un sensor del monitor del sistema",
"Description[ca]": "Mostra un diagrama configurable d'un sensor del monitor del sistema",
"Description[da]": "Viser et konfigurerbart diagram over en systemovervågning-sensor",
"Description[de]": "Zeigt ein anpassbares Diagramm eines Systemmonitor-Sensors an",
"Description[el]": "Εμφανίζει ένα διαμορφώσιμο διάγραμμα ενός αισθητήρα παρακολούθησης συστήματος",
"Description[en_GB]": "Displays a configurable chart of a system monitor sensor",
"Description[eo]": "Montras agordeblan diagramon de sistemmonitora sensilo",
"Description[es]": "Muestra un gráfico configurable de un sensor del monitor del sistema",
"Description[et]": "Süsteemi jälgija sensori seadistatava diagrammi näitamine",
"Description[eu]": "Sistema gainbegiratzeko sentsore baten diagrama konfiguragarri bat azaltzen du",
"Description[fi]": "Näyttää mukautettavissa olevan kaavion järjestelmänvalvonnan anturista",
"Description[fr]": "Affiche un graphique configurable du senseur de surveillance du système.",
"Description[gl]": "Amosa un gráfico configurábel dun sensor de vixilancia do sistema",
"Description[he]": "יישומון צג מערכת שמציג את חיישן צג המערכת",
"Description[hi]": "तंत्र परिवीक्षक सेंसर का विन्यास करने योग्य लेखा-चित्र प्रदर्शित करता है ",
"Description[hu]": "Testre szabható szenzorokat megjelenítő elem",
"Description[ia]": "Monstra un graphico configurabile de un sensor de supervision de systema",
"Description[id]": "Menampilkan sebuah bagan yang bisa dikonfigurasi pada sebuah sensor pemantau sistem",
"Description[is]": "Sýnir stillanlegt myndrit yfir kerfisvöktunarskynjara",
"Description[it]": "Visualizza un grafico configurabile di un sensore di monitoraggio del sistema",
"Description[ja]": "カスタム可能なチャートを表示します",
"Description[ka]": "სისტემური მონიტორის სენსორის მორგებადი ცხვრილის ჩვენება",
"Description[ko]": "설정 가능한 시스템 모니터 센서 차트 표시",
"Description[lt]": "Rodo konfigūruojamą sistemos prižiūryklės jutiklio diagramą",
"Description[lv]": "Parāda sistēmas pārraudzības sensoru konfigurējamu diagrammu",
"Description[nb]": "Viser et tilpassbart diagram for en systemovervåkingssensor",
"Description[nl]": "Toont een te configureren grafiek van een systeemmonitorsensor",
"Description[nn]": "Viser eit tilpassbart diagram for ein systemovervakingssensor",
"Description[pa]": "ਸਿਸਟਮ ਮਾਨੀਟਰ ਸੈਂਸਰ ਦੀ ਸੰਰਚਨਾ-ਯੋਗ ਚਾਰਟ ਦਿਖਾਉਂਦਾ ਹੈ",
"Description[pl]": "Wyświetla wykres miernika monitora systemowego",
"Description[pt]": "Mostra um gráfico configurável de um sensor de monitorização do sistema",
"Description[pt_BR]": "Mostra um gráfico configurável do sensor do monitor do sistema",
"Description[ro]": "Afișează un grafic configurabil al unui senzor de monitorizare a sistemului",
"Description[ru]": "Настраиваемый график датчика системного монитора",
"Description[sa]": "प्रणालीनिरीक्षकसंवेदकस्य विन्यासयोग्यं चित्रपट प्रदर्शयति",
"Description[sk]": "Zobrazuje konfigurovateľný graf senzoru monitorovania systému",
"Description[sl]": "Prikaže nastavljiv grafikon sistemskega monitorja senzorja",
"Description[sv]": "Visar ett anpassningsbart diagram av en systemövervakningssensor",
"Description[ta]": "ஏதாவதொரு கணினி கண்காணிப்பு உணரியைக் காட்டும்",
"Description[tr]": "Sistem monitörü algılayıcısının yapılandırılabilir bir grafiğini görüntüler",
"Description[uk]": "Показує придатну до налаштовування діаграму на основі даних датчика нагляду за системою",
"Description[vi]": "Hiển thị một biểu đồ cấu hình được của một cảm biến giám sát hệ thống",
"Description[zh_CN]": "显示系统监视器的可配置图表",
"Description[zh_TW]": "顯示一個可自訂的系統監控偵測器圖表",
"FormFactors": [
"desktop"
],
"Icon": "ksysguardd",
"Id": "org.kde.plasma.systemmonitor",
"License": "GPL",
"Name": "System Monitor Sensor",
"Name[ar]": "مستشعر مراقبة النظام",
"Name[az]": "Sistem İzləməsi Sensoru",
"Name[be]": "Сэнсар сістэмнага назіральніка",
"Name[bg]": "Сензор на системния монитор",
"Name[ca@valencia]": "Sensor del monitor del sistema",
"Name[ca]": "Sensor del monitor del sistema",
"Name[cs]": "Senzor monitoru systému",
"Name[da]": "Systemovervågning-sensor",
"Name[de]": "Systemmonitor-Sensor",
"Name[el]": "Αισθητήρας παρακολούθησης συστήματος",
"Name[en_GB]": "System Monitor Sensor",
"Name[eo]": "Sistemmonitora Sentilo",
"Name[es]": "Sensor del monitor del sistema",
"Name[eu]": "Sistema gainbegiratzeko sentsorea",
"Name[fi]": "Järjestelmävalvonnan anturi",
"Name[fr]": "Senseur de surveillance du système",
"Name[gl]": "Sensores de vixilancia do sistema",
"Name[he]": "חיישן צג המערכת",
"Name[hu]": "Rendszermonitor-szenzor",
"Name[ia]": "Sensor de Monitor (supervisor) de systema",
"Name[id]": "Sensor Pemantau Sistem",
"Name[is]": "Skynjari kerfiseftirlits",
"Name[it]": "Sensori di monitoraggio del sistema",
"Name[ja]": "システムモニタセンサー",
"Name[ka]": "სისტემური მონიტორის სენსორი",
"Name[ko]": "시스템 모니터 센서",
"Name[lt]": "Sistemos prižiūryklės jutiklis",
"Name[lv]": "Sistēmās pārraudzības sensors",
"Name[nb]": "Systemovervåkingssensor",
"Name[nl]": "Systeemmonitorsensor",
"Name[nn]": "Systemovervakingssensor",
"Name[pa]": "ਸਿਸਟਮ ਮਾਨੀਟਰ ਸੈਂਸਰ",
"Name[pl]": "Miernik monitora systemowego",
"Name[pt_BR]": "Sensor do monitor do sistema ",
"Name[ro]": "Senzor de monitorizare a sistemului",
"Name[ru]": "Датчик системного монитора",
"Name[sa]": "प्रणालीनिरीक्षकस्य संवेदक",
"Name[sk]": "Senzor monitorovania systému",
"Name[sl]": "Sistemski nadzornik senzorja",
"Name[sv]": "Systemövervakningssensor",
"Name[ta]": "கணினி கண்காணிப்பு உணரி",
"Name[tr]": "Sistem Monitörü Algılayıcısı",
"Name[uk]": "Датчик нагляду за системою",
"Name[zh_CN]": "系统监视传感器",
"Name[zh_TW]": "系統監控感測器",
"Website": "https://www.kde.org/plasma-desktop"
},
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-Provides": [
"org.kde.plasma.systemmonitor"
]
}

View File

@@ -0,0 +1,79 @@
/*
* SPDX-FileCopyrightText: 2017, 2018, 2019 Ivan Cukic <ivan.cukic (at) kde.org>
* SPDX-FileCopyrightText: 2020 Nate Graham <nate@kde.org>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Controls as QQC2
import org.kde.plasma.extras as PlasmaExtras
import org.kde.plasma.plasmoid
PlasmaExtras.ExpandableListItem {
id: root
required index
required property var model
readonly property var vaultsModelActions: Plasmoid.vaultsModel.actionsModel()
icon: model.icon
iconEmblem: {
if (model.message.length !== 0) {
return "emblem-error";
} else if (model.isOpened) {
return "emblem-mounted";
} else if (model.isOfflineOnly) {
return "network-disconnect-symbolic";
} else {
return "";
}
}
title: model.name
subtitle: model.message
subtitleCanWrap: true
defaultActionButtonAction: QQC2.Action {
icon.name: root.model.isOpened ? "lock-symbolic" : "unlock-symbolic"
text: root.model.isOpened ? i18nd("plasmavault-kde", "Lock Vault") : i18nd("plasmavault-kde", "Unlock and Open")
onTriggered: source => {
if (root.model.isOpened) {
root.vaultsModelActions.toggle(root.model.device);
} else {
root.vaultsModelActions.openInFileManager(root.model.device);
}
}
}
isBusy: Plasmoid.busy
enabled: model.isEnabled
contextualActions: [
QQC2.Action {
enabled: root.model.isOpened
icon.name: "document-open-folder-symbolic"
text: i18nd("plasmavault-kde", "Show in File Manager")
onTriggered: source => {
root.vaultsModelActions.openInFileManager(root.model.device);
}
},
QQC2.Action {
icon.name: root.model.isOpened ? "window-close-symbolic" : "unlock-symbolic"
text: root.model.isOpened ? i18nd("plasmavault-kde", "Forcefully Lock Vault") : i18nd("plasmavault-kde", "Unlock Vault")
onTriggered: source => {
if (root.model.isOpened) {
root.vaultsModelActions.forceClose(root.model.device);
} else {
root.vaultsModelActions.toggle(root.model.device);
}
}
},
QQC2.Action {
icon.name: "configure-symbolic"
text: i18nd("plasmavault-kde", "Configure Vault…")
onTriggered: source => root.vaultsModelActions.configure(root.model.device);
}
]
}

View File

@@ -0,0 +1,133 @@
/*
* SPDX-FileCopyrightText: 2017, 2018, 2019 Ivan Cukic <ivan.cukic (at) kde.org>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Controls as QQC2
import QtQuick.Layouts
import org.kde.kirigami as Kirigami
import org.kde.kitemmodels as KItemModels
import org.kde.plasma.components as PlasmaComponents3
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.extras as PlasmaExtras
import org.kde.plasma.plasmoid
PlasmoidItem {
id: root
readonly property var vaultsModelActions: Plasmoid.vaultsModel.actionsModel()
readonly property bool inPanel: [
PlasmaCore.Types.TopEdge,
PlasmaCore.Types.RightEdge,
PlasmaCore.Types.BottomEdge,
PlasmaCore.Types.LeftEdge,
].includes(Plasmoid.location)
Plasmoid.busy: vaultsModelActions.isBusy
Plasmoid.icon: {
let iconName = (vaultsModelActions.hasError ? "plasmavault_error" : "plasmavault");
if (inPanel) {
return iconName += "-symbolic"
}
return iconName;
}
Plasmoid.status: vaultsModelActions.hasOpenVaults ? PlasmaCore.Types.ActiveStatus : PlasmaCore.Types.PassiveStatus
onExpandedChanged: {
Plasmoid.vaultsModel.reloadDevices();
}
Plasmoid.contextualActions: [
PlasmaCore.Action {
id: createAction
text: i18nd("plasmavault-kde", "Create a New Vault…")
icon.name: "list-add-symbolic"
onTriggered: checked => root.vaultsModelActions.requestNewVault()
}
]
fullRepresentation: PlasmaExtras.Representation {
Layout.minimumWidth: Kirigami.Units.gridUnit * 18
Layout.minimumHeight: Kirigami.Units.gridUnit * 12
collapseMarginsHint: true
PlasmaComponents3.ScrollView {
anchors.fill: parent
// HACK: workaround for https://bugreports.qt.io/browse/QTBUG-83890
PlasmaComponents3.ScrollBar.horizontal.policy: PlasmaComponents3.ScrollBar.AlwaysOff
contentWidth: availableWidth - vaultsList.leftMargin - vaultsList.rightMargin
contentItem: ListView {
id: vaultsList
model: KItemModels.KSortFilterProxyModel {
sortRoleName: "name"
sourceModel: Plasmoid.vaultsModel
}
clip: true
currentIndex: -1
spacing: Kirigami.Units.smallSpacing
topMargin: Kirigami.Units.largeSpacing
leftMargin: Kirigami.Units.largeSpacing
rightMargin: Kirigami.Units.largeSpacing
bottomMargin: Kirigami.Units.largeSpacing
highlight: PlasmaExtras.Highlight {}
highlightMoveDuration: Kirigami.Units.shortDuration
highlightResizeDuration: Kirigami.Units.shortDuration
delegate: VaultItem {}
PlasmaExtras.PlaceholderMessage {
id: noVaultsMessage
anchors.centerIn: parent
width: parent.width - (Kirigami.Units.gridUnit * 4)
visible: vaultsList.count === 0
iconName: "plasmavault"
text: i18nd("plasmavault-kde", "No Vaults have been set up")
helpfulAction: QQC2.Action {
text: createAction.text
icon.name: createAction.icon.name
onTriggered: source => createAction.trigger()
}
}
}
}
footer: PlasmaExtras.PlasmoidHeading {
visible: vaultsList.count > 0 && !(Plasmoid.containmentDisplayHints & PlasmaCore.Types.ContainmentDrawsPlasmoidHeading)
contentItem: RowLayout {
spacing: Kirigami.Units.smallSpacing
PlasmaComponents3.ToolButton {
text: createAction.text
icon.name: createAction.icon.name
onClicked: createAction.trigger()
Layout.alignment: Qt.AlignLeft
}
}
}
}
}

View File

@@ -0,0 +1,148 @@
{
"KPackageStructure": "Plasma/Applet",
"KPlugin": {
"Authors": [
{
"Email": "ivan.cukic at kde.org",
"Name": "Ivan Čukić",
"Name[ar]": "إيفان أووكيتش",
"Name[ast]": "Ivan Čukić",
"Name[az]": "Ivan Čukić",
"Name[be]": "Ivan Čukić",
"Name[bg]": "Ivan Čukić",
"Name[ca@valencia]": "Ivan Čukić",
"Name[ca]": "Ivan Čukić",
"Name[cs]": "Ivan Čukić",
"Name[da]": "Ivan Čukić",
"Name[de]": "Ivan Čukić",
"Name[en_GB]": "Ivan Čukić",
"Name[eo]": "Ivan Čukić",
"Name[es]": "Ivan Čukić",
"Name[eu]": "Ivan Čukić",
"Name[fi]": "Ivan Čukić",
"Name[fr]": "Ivan Čukić",
"Name[gl]": "Ivan Čukić",
"Name[he]": "איוון צ׳וקיץ׳",
"Name[hu]": "Ivan Čukić",
"Name[ia]": "Ivan Čukić",
"Name[is]": "Ivan Čukić",
"Name[it]": "Ivan Čukić",
"Name[ka]": "Ivan Čukić",
"Name[ko]": "Ivan Čukić",
"Name[lt]": "Ivan Čukić",
"Name[lv]": "Ivan Čukić",
"Name[nl]": "Ivan Čukić",
"Name[nn]": "Ivan Čukić",
"Name[pl]": "Ivan Čukić",
"Name[pt_BR]": "Ivan Čukić",
"Name[ro]": "Ivan Čukić",
"Name[ru]": "Ivan Čukić",
"Name[sa]": "इवान चुकिच्",
"Name[sk]": "Ivan Čukić",
"Name[sl]": "Ivan Čukić",
"Name[sv]": "Ivan Čukić",
"Name[tr]": "Ivan Čukić",
"Name[uk]": "Ivan Čukić",
"Name[zh_CN]": "Ivan Čukić",
"Name[zh_TW]": "Ivan Čukić"
}
],
"BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=Plasma%20Vault",
"Category": "Utilities",
"Description": "Create encrypted vaults",
"Description[ar]": "أنشئ خزنات معمّاة",
"Description[ast]": "Crea arques cifraes",
"Description[az]": "Şifrələnmiş seyflər yaratmaq",
"Description[be]": "Стварыць зашыфраваныя сховішчы",
"Description[bg]": "Създаване на криптирани трезори",
"Description[ca@valencia]": "Crea caixes fortes encriptades",
"Description[ca]": "Crea caixes fortes encriptades",
"Description[cs]": "Vytvářejte šifrované sejfy",
"Description[da]": "Opretter krypterede sikkerhedsbokse",
"Description[de]": "Verschlüsselte Tresore erstellen",
"Description[en_GB]": "Create encrypted vaults",
"Description[eo]": "Krei ĉifritajn trezorejojn",
"Description[es]": "Crear cajas fuertes cifradas",
"Description[eu]": "Sortu zifratutako kutxa-gotorrak",
"Description[fi]": "Luo salattuja holveja",
"Description[fr]": "Créer des coffres-forts chiffrés",
"Description[gl]": "Crear caixas fortes cifradas.",
"Description[he]": "יצירת כספות מוצפנות",
"Description[hu]": "Titkos tárolók létrehozása",
"Description[ia]": "Crea cellarios cryptate",
"Description[is]": "Setja upp dulritaðar öryggisgeymslur",
"Description[it]": "Crea caveau criptati",
"Description[ka]": "დაშიფრული სარდაფების შექმნა",
"Description[ko]": "암호화된 비밀 공간 생성",
"Description[lt]": "Sukurti šifruotas slėptuves",
"Description[lv]": "Izveidojiet šifrētus seifus",
"Description[nl]": "Versleutelde kluizen aanmaken",
"Description[nn]": "Lag krypterte datakvelv",
"Description[pa]": "ਇੰਕ੍ਰਿਪਟ ਕੀਤੇ ਵਾਲਟ ਬਣਾਓ",
"Description[pl]": "Tworzy zaszyfrowane sejfy",
"Description[pt_BR]": "Criar cofres criptografados",
"Description[ro]": "Creează bolți criptate",
"Description[ru]": "Создание зашифрованных папок",
"Description[sa]": "एन्क्रिप्टेड् वॉल्ट्स् रचयन्तु",
"Description[sk]": "Vytvoriť šifrované trezory",
"Description[sl]": "Ustvari šifrirane trezorje",
"Description[sv]": "Skapa krypterade valv",
"Description[tr]": "Şifrelenmiş kasalar oluşturun",
"Description[uk]": "Створення зашифрованих сховищ",
"Description[zh_CN]": "创建加密的保险库",
"Description[zh_TW]": "建立加密儲存庫",
"EnabledByDefault": true,
"Icon": "plasmavault",
"Id": "org.kde.plasma.vault",
"License": "GPL",
"Name": "Vaults",
"Name[ar]": "الخزنات",
"Name[ast]": "Arques",
"Name[az]": "Seyflər",
"Name[be]": "Сховішчы",
"Name[bg]": "Трезори",
"Name[ca@valencia]": "Caixes fortes",
"Name[ca]": "Caixes fortes",
"Name[cs]": "Sejfy",
"Name[da]": "Sikkerhedsbokse",
"Name[de]": "Tresore",
"Name[en_GB]": "Vaults",
"Name[eo]": "Trezorejoj",
"Name[es]": "Cajas fuertes",
"Name[eu]": "Kutxa-gotorrak",
"Name[fi]": "Holvi",
"Name[fr]": "Coffre-forts",
"Name[gl]": "Caixas fortes",
"Name[he]": "כספות",
"Name[hu]": "Titkos tárolók",
"Name[ia]": "Cellarios (Vaults)",
"Name[is]": "Öryggisgeymslur",
"Name[it]": "Caveau",
"Name[ka]": "საცავები",
"Name[ko]": "비밀 공간",
"Name[lt]": "Slėptuvės",
"Name[lv]": "Seifi",
"Name[nl]": "Kluizen",
"Name[nn]": "Datakvelv",
"Name[pa]": "ਵਾਲਟ",
"Name[pl]": "Sejfy",
"Name[pt_BR]": "Cofres",
"Name[ro]": "Bolți",
"Name[ru]": "Зашифрованные папки",
"Name[sa]": "तिजोरियाः",
"Name[sk]": "Trezory",
"Name[sl]": "Trezorji",
"Name[sv]": "Valv",
"Name[tr]": "Kasalar",
"Name[uk]": "Сховища",
"Name[zh_CN]": "保险库",
"Name[zh_TW]": "儲存庫",
"Version": "1.0",
"Website": "https://kde.org/plasma-desktop/"
},
"X-Plasma-API": "declarativeappletscript",
"X-Plasma-API-Minimum-Version": "6.0",
"X-Plasma-MainScript": "ui/main.qml",
"X-Plasma-NotificationArea": "true",
"X-Plasma-NotificationAreaCategory": "SystemServices"
}