aerothemeplasma/plasma/plasmoids/org.kde.desktopcontainment/contents/ui/ConfigIcons.qml
2024-08-09 03:20:25 +02:00

370 lines
11 KiB
QML

/*
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 2.15
import QtQuick.Layouts 1.15
import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.extras 2.0 as PlasmaExtras
import org.kde.iconthemes as KIconThemes
import org.kde.config // for KAuthorized
import org.kde.kirigami 2.20 as Kirigami
import org.kde.private.desktopcontainment.folder 0.1 as Folder
Item {
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
property alias cfg_textShadows: textShadows.checked
property alias cfg_iconShadows: iconShadows.checked
readonly property bool lockedByKiosk: !KAuthorized.authorize("editable_desktop_icons")
KIconThemes.IconDialog {
id: iconDialog
onIconNameChanged: cfg_icon = iconName || "folder-symbolic";
}
Kirigami.FormLayout {
anchors {
top: parent.top
left: parent.left
right: parent.right
}
// Panel button
RowLayout {
spacing: Kirigami.Units.smallSpacing
visible: isPopup
Kirigami.FormData.label: i18n("Panel button:")
CheckBox {
id: useCustomIcon
visible: isPopup
checked: cfg_useCustomIcon
text: i18n("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: 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: cfg_icon = "folder-symbolic";
}
}
}
Item {
visible: isPopup
Kirigami.FormData.isSection: true
}
// Arrangement section
ComboBox {
id: arrangement
Layout.fillWidth: true
visible: !isPopup || viewMode.currentIndex === 1 /* Icons mode */
Kirigami.FormData.label: i18n("Arrangement:")
model: [
Qt.application.layoutDirection === Qt.LeftToRight ?
i18nc("@item:inlistbox arrangement of icons", "Left to Right") :
i18nc("@item:inlistbox arrangement of icons", "Right to Left"),
i18nc("@item:inlistbox arrangement of icons", "Top to Bottom"),
]
}
ComboBox {
id: alignment
Layout.fillWidth: true
visible: !isPopup || viewMode.currentIndex === 1 /* Icons mode */
model: [i18nc("@item:inlistbox alignment of icons", "Align left"),
i18nc("@item:inlistbox alignment of icons", "Align right")]
}
CheckBox {
id: locked
visible: ("containmentType" in plasmoid)
checked: cfg_locked || lockedByKiosk
enabled: !lockedByKiosk
onCheckedChanged: {
if (!lockedByKiosk) {
cfg_locked = checked;
}
}
text: i18n("Lock in place")
}
Item {
Kirigami.FormData.isSection: true
visible: !isPopup || viewMode.currentIndex === 1 /* Icons mode */
}
// Sorting section
ComboBox {
id: sortMode
Layout.fillWidth: true
Kirigami.FormData.label: i18n("Sorting:")
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: 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: 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: !isPopup || viewMode.currentIndex === 1 /* Icons mode */
Kirigami.FormData.label: i18n("Icon size:")
from: 0
to: 6
stepSize: 1
snapMode: Slider.SnapAlways
}
RowLayout {
Layout.fillWidth: true
Label {
Layout.alignment: Qt.AlignLeft
visible: !isPopup || viewMode.currentIndex === 1 /* Icons mode */
text: i18nc("@label:slider smallest icon size", "Small")
}
Item {
Layout.fillWidth: true
}
Label {
Layout.alignment: Qt.AlignRight
visible: !isPopup || viewMode.currentIndex === 1 /* Icons mode */
text: i18nc("@label:slider largest icon size", "Large")
}
}
ComboBox {
id: labelWidth
visible: !isPopup || viewMode.currentIndex === 1 /* Icons mode */
Layout.fillWidth: true
Kirigami.FormData.label: i18n("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: !isPopup || viewMode.currentIndex === 1 /* Icons mode */
Kirigami.FormData.label: i18n("Text lines:")
from: 1
to: 10
stepSize: 1
}
Item {
Kirigami.FormData.isSection: true
}
// Features section
CheckBox {
id: toolTips
Kirigami.FormData.label: i18n("When hovering over icons:")
text: i18n("Show tooltips")
}
CheckBox {
id: selectionMarkers
visible: Qt.styleHints.singleClickActivation
text: i18n("Show selection markers")
}
CheckBox {
id: popups
visible: !isPopup
text: i18n("Show folder preview popups")
}
Item {
Kirigami.FormData.isSection: true
}
CheckBox {
id: renameInline
Kirigami.FormData.label: i18n("Rename:")
visible: !selectionMarkers.visible
text: i18n("Rename inline by clicking selected item's text")
}
Item {
Kirigami.FormData.isSection: true
visible: renameInline.visible
}
CheckBox {
id: textShadows
text: i18n("Use drop shadows for icon labels on the desktop")
}
CheckBox {
id: iconShadows
text: i18n("Use drop shadows for icons on the desktop")
}
CheckBox {
id: previews
Kirigami.FormData.label: i18n("Previews:")
text: i18n("Show preview thumbnails")
}
Button {
id: previewSettings
Layout.fillWidth: true
icon.name: "configure"
text: i18n("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();
}
}
}
}