Warning, /plasma/plasma-desktop/emojier/app/ui/CategoryPage.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2019 Aleix Pol Gonzalez <aleixpol@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 import QtQuick 2.15 0008 import QtQuick.Layouts 1.3 0009 import org.kde.kirigami 2.15 as Kirigami 0010 import QtQuick.Controls 2.11 as QQC2 0011 import org.kde.plasma.emoji 0012 0013 Kirigami.ScrollablePage 0014 { 0015 id: view 0016 property alias model: emojiModel.sourceModel 0017 property string searchText: "" 0018 property alias category: filter.category 0019 property bool showSearch: false 0020 property bool showClearHistoryButton: false 0021 leftPadding: 0 0022 rightPadding: 0 0023 0024 Keys.onPressed: { 0025 if (event.key == Qt.Key_Escape) { 0026 Qt.quit() 0027 } 0028 if (event.text.length > 0 && !view.showSearch && event.modifiers === Qt.NoModifier) { 0029 // We want to prevent unprintable characters like backspace 0030 model = emoji 0031 searchText += /[\x00-\x1F\x7F]/.test(event.text) ? "" : event.text 0032 showSearch = true 0033 title = i18n("Search") 0034 category = "" 0035 } 0036 } 0037 0038 titleDelegate: RowLayout { 0039 Layout.fillWidth: true 0040 Layout.preferredWidth: view.width 0041 Kirigami.Heading { 0042 text: view.title 0043 textFormat: Text.PlainText 0044 Layout.fillWidth: true 0045 } 0046 0047 Kirigami.SearchField { 0048 id: searchField 0049 Layout.fillWidth: true 0050 text: view.searchText 0051 visible: view.showSearch 0052 inputMethodHints: Qt.ImhNoPredictiveText 0053 Keys.onEnterPressed: event => Keys.returnPressed(event) 0054 Keys.onReturnPressed: event => { 0055 if (emojiView.count > 0) { 0056 emojiView.itemAtIndex(0).Keys.returnPressed(event); 0057 } 0058 } 0059 onTextChanged: { 0060 forceActiveFocus() 0061 emojiModel.search = text 0062 if (emojiView.currentIndex < 0) { 0063 Qt.callLater(function() { 0064 emojiView.currentIndex = 0 0065 }) 0066 } 0067 } 0068 Component.onCompleted: if (visible) Qt.callLater(forceActiveFocus) 0069 Keys.onEscapePressed: { 0070 if (text) { 0071 clear() 0072 } else { 0073 Qt.quit() 0074 } 0075 } 0076 Keys.forwardTo: emojiView 0077 } 0078 0079 QQC2.ToolButton { 0080 visible: view.showClearHistoryButton 0081 text: i18n("Clear History") 0082 icon.name: "edit-clear-history" 0083 onClicked: { recentEmojiModel.clearHistory(); } 0084 } 0085 } 0086 0087 Shortcut { 0088 sequence: StandardKey.Copy 0089 enabled: emojiView.currentItem 0090 onActivated: { 0091 emojiView.currentItem.Keys.returnPressed(null) 0092 } 0093 } 0094 0095 Component { 0096 id: menuComponent 0097 0098 QQC2.Menu { 0099 required property QQC2.Label label 0100 0101 onClosed: destroy() 0102 0103 QQC2.MenuItem { 0104 icon.name: "edit-copy" 0105 text: i18nc("@item:inmenu", "Copy Character") 0106 onClicked: { 0107 CopyHelper.copyTextToClipboard(label.text); 0108 window.showPassiveNotification(i18n("%1 copied to the clipboard", label.text)); 0109 } 0110 } 0111 QQC2.MenuItem { 0112 icon.name: "edit-copy" 0113 text: i18nc("@item:inmenu", "Copy Description") 0114 onClicked: { 0115 CopyHelper.copyTextToClipboard(label.QQC2.ToolTip.text); 0116 window.showPassiveNotification(i18n("%1 copied to the clipboard", label.QQC2.ToolTip.text)); 0117 } 0118 } 0119 } 0120 } 0121 0122 GridView { 0123 id: emojiView 0124 0125 readonly property real desiredSize: Kirigami.Units.gridUnit * 3 0126 readonly property int columnsToHave: Math.ceil(width / desiredSize) 0127 readonly property int delayInterval: Math.min(300, columnsToHave * 10) 0128 0129 cellWidth: width/columnsToHave 0130 cellHeight: desiredSize 0131 0132 model: CategoryModelFilter { 0133 id: filter 0134 sourceModel: SearchModelFilter { 0135 id: emojiModel 0136 } 0137 } 0138 0139 currentIndex: -1 0140 reuseItems: true 0141 0142 delegate: QQC2.Label { 0143 id: emojiLabel 0144 width: emojiView.cellWidth 0145 height: emojiView.cellHeight 0146 0147 font.pointSize: 25 0148 font.family: 'emoji' // Avoid monochrome fonts like DejaVu Sans 0149 fontSizeMode: model.display.length > 5 ? Text.Fit : Text.FixedSize 0150 minimumPointSize: 10 0151 text: model.display 0152 textFormat: Text.PlainText 0153 horizontalAlignment: Text.AlignHCenter 0154 0155 Accessible.name: model.toolTip 0156 Accessible.onPressAction: tapHandler.tapped(null, null) 0157 QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay 0158 QQC2.ToolTip.text: model.toolTip 0159 QQC2.ToolTip.visible: hoverHandler.hovered 0160 0161 opacity: hoverHandler.hovered ? 0.7 : 1 0162 scale: tapHandler.pressed ? 0.6 : 1 0163 0164 Keys.onMenuPressed: contextMenuHandler.tapped(null, null) 0165 Keys.onReturnPressed: tapHandler.tapped(null, null) 0166 0167 HoverHandler { 0168 id: hoverHandler 0169 } 0170 0171 TapHandler { 0172 id: tapHandler 0173 onTapped: window.report(model.display, model.toolTip) 0174 } 0175 0176 TapHandler { 0177 acceptedButtons: Qt.LeftButton 0178 acceptedDevices: PointerDevice.TouchScreen | PointerDevice.Stylus 0179 onLongPressed: contextMenuHandler.tapped(null, null) 0180 } 0181 0182 TapHandler { 0183 id: contextMenuHandler 0184 acceptedButtons: Qt.RightButton 0185 onTapped: { 0186 const menu = menuComponent.createObject(emojiLabel, { 0187 "label": emojiLabel, 0188 }); 0189 menu.popup(); 0190 } 0191 } 0192 0193 Behavior on opacity { 0194 OpacityAnimator { 0195 duration: Kirigami.Units.longDuration 0196 } 0197 } 0198 0199 Behavior on scale { 0200 NumberAnimation { 0201 duration: Kirigami.Units.longDuration 0202 } 0203 } 0204 } 0205 0206 Kirigami.PlaceholderMessage { 0207 anchors.centerIn: parent 0208 width: parent.width - (Kirigami.Units.largeSpacing * 8) 0209 text: i18n("No recent Emojis") 0210 visible: emojiView.count === 0 && view.showClearHistoryButton 0211 } 0212 } 0213 }