diff --git a/applets/kimpanel/backend/ibus/emojier/ui/CategoryPage.qml b/applets/kimpanel/backend/ibus/emojier/ui/CategoryPage.qml index 0f90e3985..eb53462d5 100644 --- a/applets/kimpanel/backend/ibus/emojier/ui/CategoryPage.qml +++ b/applets/kimpanel/backend/ibus/emojier/ui/CategoryPage.qml @@ -1,124 +1,132 @@ /* * Copyright (C) 2019 Aleix Pol Gonzalez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.11 import QtQuick.Layouts 1.3 import org.kde.kirigami 2.6 as Kirigami import QtQuick.Controls 2.11 as QQC2 import org.kde.plasma.emoji 1.0 Kirigami.ScrollablePage { id: view property alias model: emojiModel.sourceModel + property string searchText: "" property alias category: filter.category property bool showSearch: false leftPadding: 0 rightPadding: 0 + Keys.onPressed: { + if(event.text.length > 0 && !view.showSearch && event.modifiers === Qt.NoModifier) { + window.startSearch(event.text) + } + } + titleDelegate: RowLayout { Layout.fillWidth: true Layout.preferredWidth: view.width Kirigami.Heading { text: view.title Layout.fillWidth: true } QQC2.TextField { id: searchField Layout.fillWidth: true + text: view.searchText placeholderText: i18n("Search...") visible: view.showSearch onTextChanged: { emojiModel.search = text if (emojiView.currentIndex < 0) { emojiView.currentIndex = 0 } } onAccepted: { if (emojiView.currentItem) emojiView.currentItem.reportEmoji() } Component.onCompleted: if (visible) Qt.callLater(forceActiveFocus) Keys.onEscapePressed: { selectAll() } } } GridView { id: emojiView readonly property real desiredSize: Kirigami.Units.gridUnit * 3 readonly property real columnsToHave: Math.ceil(width/desiredSize) cellWidth: width/columnsToHave cellHeight: desiredSize model: CategoryModelFilter { id: filter sourceModel: SearchModelFilter { id: emojiModel } } highlight: Rectangle { Kirigami.Theme.inherit: false Kirigami.Theme.colorSet: Kirigami.Theme.Selection color: Kirigami.Theme.backgroundColor z: -1 } currentIndex: -1 delegate: MouseArea { QQC2.Label { font.pointSize: 25 fontSizeMode: model.display.length > 5 ? Text.Fit : Text.FixedSize minimumPointSize: 10 text: model.display horizontalAlignment: Text.AlignHCenter anchors.fill: parent anchors.margins: 1 } width: emojiView.cellWidth height: emojiView.cellHeight QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay QQC2.ToolTip.text: model.toolTip QQC2.ToolTip.visible: mouse.containsMouse opacity: mouse.containsMouse ? 0.7 : 1 Keys.onReturnPressed: { reportEmoji() } function reportEmoji() { window.report(model.display, model.toolTip) } id: mouse hoverEnabled: true onClicked: reportEmoji() } } } diff --git a/applets/kimpanel/backend/ibus/emojier/ui/emojier.qml b/applets/kimpanel/backend/ibus/emojier/ui/emojier.qml index 509853a3b..8d255d7ff 100644 --- a/applets/kimpanel/backend/ibus/emojier/ui/emojier.qml +++ b/applets/kimpanel/backend/ibus/emojier/ui/emojier.qml @@ -1,114 +1,118 @@ /* * Copyright (C) 2019 Aleix Pol Gonzalez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.11 import QtQuick.Layouts 1.3 import QtQuick.Controls 2.11 as QQC2 import org.kde.kirigami 2.6 as Kirigami import org.kde.plasma.emoji 1.0 Kirigami.ApplicationWindow { id: window minimumWidth: Math.round(minimumHeight * 1.25) minimumHeight: drawer.contentHeight width: Kirigami.Units.gridUnit * 25 height: Kirigami.Units.gridUnit * 25 EmojiModel { id: emoji } RecentEmojiModel { id: recentEmojiModel } function report(thing, description) { if (!visible) return; console.log("Copied to clipboard:", thing) CopyHelper.copyTextToClipboard(thing) recentEmojiModel.includeRecent(thing, description); window.showPassiveNotification(i18n("%1 copied to the clipboard", thing)) } + function startSearch(typedText) { + window.pageStack.replace(categoryComponent, {title: i18n("Search"), category: "", model: emoji, showSearch: true, searchText: typedText}) + } + onVisibilityChanged: { if (visible) globalDrawer.actions[recentEmojiModel.count === 0 ? 1 : 0].trigger() } Kirigami.Action { id: recentAction checked: window.pageStack.get(0).title === text text: i18n("Recent") enabled: recentEmojiModel.count > 0 icon.name: "document-open-recent-symbolic" onTriggered: { window.pageStack.replace("qrc:/ui/CategoryPage.qml", {title: text, category: "", model: recentEmojiModel}) } } Kirigami.Action { id: searchAction checked: window.pageStack.get(0).title === text text: i18n("Search") icon.name: "search" shortcut: StandardKey.Find onTriggered: { window.pageStack.replace("qrc:/ui/CategoryPage.qml", {title: text, category: "", model: emoji, showSearch: true }) } } CategoryAction { id: allAction text: i18n("All") icon.name: "view-list-icons" category: "" } globalDrawer: Kirigami.GlobalDrawer { id: drawer title: i18n("Categories") collapsible: !topContent.activeFocus collapsed: true modal: false function createCategoryActions(categories) { var actions = [] for(var i in categories) { var cat = categories[i] actions.push(cat === ":recent:" ? recentAction : cat === ":find:" ? searchAction : cat.length === 0 ? allAction : categoryActionComponent.createObject(drawer, { category: cat })) } return actions; } actions: createCategoryActions(emoji.categories) Component { id: categoryActionComponent CategoryAction {} } } }