Warning, /network/tokodon/src/content/ui/Components/Emoji/EmojiPicker.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2022 Tobias Fella <tobias.fella@kde.org>
0002 // SPDX-License-Identifier: GPL-2.0-or-later
0003 
0004 import QtQuick
0005 import QtQuick.Controls 2 as QQC2
0006 import QtQuick.Layouts
0007 import org.kde.kirigami 2 as Kirigami
0008 import org.kde.tokodon
0009 
0010 ColumnLayout {
0011     id: root
0012 
0013     readonly property var currentEmojiModel: EmojiModel.categories
0014     readonly property int categoryIconSize: Math.round(Kirigami.Units.gridUnit * 2.5)
0015     readonly property var currentCategory: currentEmojiModel[categories.currentIndex].category
0016     readonly property alias categoryCount: categories.count
0017 
0018     signal chosen(string emoji)
0019 
0020     function clearSearchField() {
0021         searchField.text = ""
0022     }
0023 
0024     onActiveFocusChanged: if (activeFocus) {
0025         searchField.forceActiveFocus();
0026     }
0027 
0028     spacing: 0
0029 
0030     QQC2.ScrollView {
0031         Layout.fillWidth: true
0032         Layout.preferredHeight: root.categoryIconSize + QQC2.ScrollBar.horizontal.height
0033         QQC2.ScrollBar.horizontal.height: QQC2.ScrollBar.horizontal.visible ? QQC2.ScrollBar.horizontal.implicitHeight : 0
0034 
0035         ListView {
0036             id: categories
0037             clip: true
0038             focus: true
0039             orientation: ListView.Horizontal
0040 
0041             Keys.onReturnPressed: if (emojiGrid.count > 0) emojiGrid.focus = true
0042             Keys.onEnterPressed: if (emojiGrid.count > 0) emojiGrid.focus = true
0043 
0044             KeyNavigation.down: emojiGrid.count > 0 ? emojiGrid : categories
0045             KeyNavigation.tab: emojiGrid.count > 0 ? emojiGrid : categories
0046 
0047             keyNavigationEnabled: true
0048             keyNavigationWraps: true
0049             Keys.forwardTo: searchField
0050             interactive: width !== contentWidth
0051 
0052             model: root.currentEmojiModel
0053             Component.onCompleted: categories.forceActiveFocus()
0054 
0055             delegate: emojiDelegate
0056         }
0057     }
0058 
0059     Kirigami.Separator {
0060         Layout.fillWidth: true
0061         Layout.preferredHeight: 1
0062     }
0063 
0064     Kirigami.SearchField {
0065         id: searchField
0066         Layout.margins: Kirigami.Units.smallSpacing
0067         Layout.fillWidth: true
0068 
0069         /**
0070          * The focus is manged by the parent and we don't want to use the standard
0071          * shortcut as it could block other SearchFields from using it.
0072          */
0073         focusSequence: ""
0074     }
0075 
0076     EmojiGrid {
0077         id: emojiGrid
0078         targetIconSize: root.categoryIconSize  // Custom emojis are bigger
0079         model: searchField.text.length === 0 ? EmojiModel.emojis(AccountManager.selectedAccount, root.currentCategory) : EmojiModel.filterModel(AccountManager.selectedAccount, searchField.text)
0080         Layout.fillWidth: true
0081         Layout.fillHeight: true
0082         withCustom: true
0083         onChosen: root.chosen(unicode)
0084         header: categories
0085         Keys.forwardTo: searchField
0086     }
0087 
0088     Component {
0089         id: emojiDelegate
0090         Kirigami.NavigationTabButton {
0091             width: root.categoryIconSize
0092             height: width
0093             checked: categories.currentIndex === model.index
0094             text: modelData ? modelData.emoji : ""
0095             QQC2.ToolTip.text: modelData ? modelData.name : ""
0096             QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
0097             QQC2.ToolTip.visible: hovered && QQC2.ToolTip.text !== ""
0098             onClicked: {
0099                 categories.currentIndex = index;
0100                 categories.focus = true;
0101             }
0102         }
0103     }
0104 }