Warning, /plasma/plasma-desktop/applets/kimpanel/package/contents/ui/main.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 SPDX-FileCopyrightText: 2014 Weng Xuetian <wengxt@gmail.com>
0003
0004 SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006
0007 import QtQuick 2.15
0008 import QtQuick.Layouts 1.1
0009 import org.kde.plasma.plasmoid 2.0
0010 import org.kde.plasma.core as PlasmaCore
0011 import org.kde.kquickcontrolsaddons 2.0
0012 import org.kde.plasma.private.kimpanel 0.1 as Kimpanel
0013 import org.kde.kirigami 2.20 as Kirigami
0014 import org.kde.plasma.plasmoid 2.0
0015
0016 PlasmoidItem {
0017 id: kimpanel
0018
0019 property int visibleButtons: 0
0020 readonly property bool vertical: Plasmoid.formFactor === PlasmaCore.Types.Vertical
0021
0022 LayoutMirroring.enabled: !vertical && Qt.application.layoutDirection === Qt.RightToLeft
0023 LayoutMirroring.childrenInherit: true
0024
0025 Layout.minimumWidth: vertical ? Kirigami.Units.iconSizes.small : mainLayout.implicitWidth
0026 Layout.minimumHeight: vertical ? mainLayout.implicitHeight : Kirigami.Units.iconSizes.small
0027 Layout.preferredWidth: vertical ? kimpanel.width : mainLayout.implicitWidth
0028 Layout.preferredHeight: !vertical ? kimpanel.height : mainLayout.implicitHeight
0029
0030 preferredRepresentation:fullRepresentation
0031
0032 Component.onCompleted: {
0033 timer.restart();
0034 }
0035
0036 InputPanel { }
0037
0038 GridLayout {
0039 id: mainLayout
0040
0041 rowSpacing: 0
0042 columnSpacing: 0
0043 anchors.fill: parent
0044
0045 GridView {
0046 id: items
0047
0048 Layout.alignment: Qt.AlignCenter
0049
0050 interactive: false
0051 flow: kimpanel.vertical ? GridView.FlowLeftToRight : GridView.FlowTopToBottom
0052
0053 // The icon size to display when not using the auto-scaling setting
0054 readonly property int smallIconSize: Kirigami.Units.iconSizes.smallMedium
0055 readonly property bool autoSize: Plasmoid.configuration.scaleIconsToFit
0056
0057 readonly property int gridThickness: kimpanel.vertical ? kimpanel.width : kimpanel.height
0058 // Should change to 2 rows/columns on a 56px panel (in standard DPI)
0059 readonly property int rowsOrColumns: autoSize ? 1 : Math.max(1, Math.min(count, Math.floor(gridThickness / smallSizeCellLength)))
0060
0061 // Add margins only if the panel is larger than a small icon (to avoid large gaps between tiny icons)
0062 readonly property int smallSizeCellLength: gridThickness < smallIconSize ? gridThickness : smallIconSize + Kirigami.Units.smallSpacing
0063 cellHeight: {
0064 if (kimpanel.vertical) {
0065 return autoSize ? kimpanel.width : smallSizeCellLength
0066 } else {
0067 return autoSize ? kimpanel.height : Math.floor(kimpanel.height / rowsOrColumns)
0068 }
0069 }
0070 cellWidth: {
0071 if (kimpanel.vertical) {
0072 return autoSize ? kimpanel.width : Math.floor(kimpanel.width / rowsOrColumns)
0073 } else {
0074 return autoSize ? kimpanel.height : smallSizeCellLength
0075 }
0076 }
0077
0078 //depending on the form factor, we are calculating only one dimension, second is always the same as root/parent
0079 implicitHeight: kimpanel.vertical ? cellHeight * Math.ceil(count / rowsOrColumns) : kimpanel.height
0080 implicitWidth: !kimpanel.vertical ? cellWidth * Math.ceil(count / rowsOrColumns) : kimpanel.width
0081
0082 readonly property int iconSize: {
0083 var size;
0084 if (autoSize) {
0085 size = Math.min(implicitWidth / rowsOrColumns, implicitHeight / rowsOrColumns)
0086 } else {
0087 size = Math.min(gridThickness, smallIconSize)
0088 }
0089 return Kirigami.Units.iconSizes.roundedIconSize(Math.min(size, Kirigami.Units.iconSizes.enormous))
0090 }
0091
0092 model: ListModel {
0093 id: list
0094 dynamicRoles: true
0095 }
0096
0097 delegate: Item {
0098 width: items.cellWidth
0099 height: items.cellHeight
0100
0101 activeFocusOnTab: true
0102
0103 Keys.onPressed: {
0104 switch (event.key) {
0105 case Qt.Key_Space:
0106 case Qt.Key_Enter:
0107 case Qt.Key_Return:
0108 case Qt.Key_Select:
0109 statusIcon.triggered(Qt.LeftButton);
0110 break;
0111 case Qt.Key_Menu:
0112 statusIcon.triggered(Qt.RightButton);
0113 break;
0114 }
0115 }
0116 Accessible.name: statusIcon.label
0117 Accessible.description: statusIcon.tip
0118 Accessible.role: Accessible.Button
0119
0120 StatusIcon {
0121 id: statusIcon
0122 anchors.centerIn: parent
0123 Layout.alignment: Qt.AlignCenter
0124
0125 width: items.iconSize
0126 height: items.iconSize
0127 label: model.label
0128 tip: model.tip
0129 icon: model.icon
0130 hint: model.hint
0131
0132 onTriggered : {
0133 if (button === Qt.LeftButton) {
0134 if (model.key == 'kimpanel-placeholder') {
0135 return;
0136 }
0137 helper.triggerProperty(model.key);
0138 actionMenu.visualParent = statusIcon;
0139 } else {
0140 contextMenu.open(statusIcon, {key: model.key, label: model.label});
0141 }
0142 }
0143 }
0144 }
0145 }
0146 }
0147
0148 function hideAction(key) {
0149 // We must use assignment to change the configuration property,
0150 // otherwise it won't get notified.
0151 var hiddenList = Plasmoid.configuration.hiddenList;
0152 if (hiddenList.indexOf(key) === -1) {
0153 hiddenList.push(key);
0154 Plasmoid.configuration.hiddenList = hiddenList;
0155 }
0156 timer.restart();
0157 }
0158
0159 function showAction(key) {
0160 // We must use assignment to change the configuration property,
0161 // otherwise it won't get notified.
0162 var hiddenList = Plasmoid.configuration.hiddenList;
0163 var index = hiddenList.indexOf(key);
0164 if (index !== -1) {
0165 hiddenList.splice(index, 1);
0166 Plasmoid.configuration.hiddenList = hiddenList;
0167 }
0168 timer.restart();
0169 }
0170
0171 function showMenu(menu, menuData) {
0172 var actionList = [];
0173 for (var i = 0; i < menuData.length; i++ ) {
0174 actionList.push({"actionId": menuData[i].key, "icon": menuData[i].icon, "text": menuData[i].label, hint: menuData[i].hint});
0175 }
0176 if (actionList.length > 0) {
0177 menu.actionList = actionList;
0178 menu.open();
0179 }
0180 }
0181
0182 ActionMenu {
0183 id: actionMenu
0184 onActionClicked: {
0185 helper.triggerProperty(actionId);
0186 }
0187 }
0188
0189 ContextMenu {
0190 id: contextMenu
0191 }
0192
0193 Timer {
0194 id: timer
0195 interval: 50
0196 onTriggered: {
0197 var data = helper.properties;
0198 var nodata = data.length == 0;
0199 var count = list.count;
0200 var c = 0, i;
0201 var hiddenActions = [];
0202 for (i = 0; i < data.length; i ++) {
0203 if (Plasmoid.configuration.hiddenList.indexOf(data[i].key) !== -1) {
0204 hiddenActions.push({'key': data[i].key,
0205 'icon': data[i].icon,
0206 'label': data[i].label});
0207 } else {
0208 c = c + 1;
0209 }
0210 }
0211 if (c < count) {
0212 list.remove(c, count - c);
0213 }
0214 kimpanel.visibleButtons = c;
0215
0216 c = 0;
0217 for (i = 0; i < data.length; i ++) {
0218 if (Plasmoid.configuration.hiddenList.indexOf(data[i].key) !== -1) {
0219 continue;
0220 }
0221 var itemData = {'key': data[i].key,
0222 'icon': data[i].icon,
0223 'label': data[i].label,
0224 'tip': data[i].tip,
0225 'hint': data[i].hint };
0226 if (c < count) {
0227 list.set(c, itemData);
0228 } else {
0229 list.append(itemData);
0230 }
0231 c = c + 1;
0232 }
0233 contextMenu.actionList = hiddenActions;
0234
0235 // Add a place holder if there is nothing.
0236 if (list.count == 0 && !nodata) {
0237 var itemData = {'key': 'kimpanel-placeholder',
0238 'icon': 'draw-freehand',
0239 'label': i18n("Input Method Panel"),
0240 'tip': '',
0241 'hint': ''};
0242 list.append(itemData);
0243 }
0244 }
0245 }
0246
0247 Kimpanel.Kimpanel {
0248 id: helper
0249 }
0250
0251 Connections {
0252 target: helper
0253 function onPropertiesChanged() {
0254 timer.restart();
0255 }
0256 function onMenuTriggered(menu) {
0257 showMenu(actionMenu, menu);
0258 }
0259 }
0260 }
0261