kdeconnect-kde/plasmoid/package/contents/ui/DeviceDelegate.qml
Nicolas Fella 4d8863bacc Start cleaning up RemoteKeyboard QML code
Summary:
The code for visually disabling the input field is not needed any more since the field is completely hidden when not needed. Also drop the custom available property from the text field.

More cleanups will follow. My long-term goal is to reuse the code in the app to enable remote keyboard input on non-Plasma DEs

Test Plan: (De)activate the remote keyboard on Android.

Reviewers: #kde_connect, apol

Reviewed By: #kde_connect, apol

Subscribers: apol, #kde_connect

Tags: #kde_connect

Differential Revision: https://phabricator.kde.org/D12669
2018-05-09 01:15:14 +02:00

253 lines
9.8 KiB
QML

/**
* Copyright 2013 Albert Vaca <albertvaka@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.1
import QtQuick.Layouts 1.1
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.components 2.0 as PlasmaComponents
import org.kde.kdeconnect 1.0
import QtQuick.Controls.Styles 1.4
PlasmaComponents.ListItem
{
id: root
readonly property QtObject device: DeviceDbusInterfaceFactory.create(model.deviceId)
RemoteKeyboard {
id: remoteKeyboard
device: root.device
onKeyPressReceived: {
// console.log("XXX received keypress key=" + key + " special=" + specialKey + " shift=" + shift + " ctrl=" + ctrl + " text=" + remoteKeyboardInput.text + " cursorPos=" + remoteKeyboardInput.cursorPosition);
// interpret some special keys:
if (specialKey == 12 || specialKey == 14) // Return/Esc -> clear
remoteKeyboardInput.text = "";
else if (specialKey == 4 // Left
&& remoteKeyboardInput.cursorPosition > 0)
--remoteKeyboardInput.cursorPosition;
else if (specialKey == 6 // Right
&& remoteKeyboardInput.cursorPosition < remoteKeyboardInput.text.length)
++remoteKeyboardInput.cursorPosition;
else if (specialKey == 1) { // Backspace -> delete left
var pos = remoteKeyboardInput.cursorPosition;
if (pos > 0) {
remoteKeyboardInput.text = remoteKeyboardInput.text.substring(0, pos-1)
+ remoteKeyboardInput.text.substring(pos, remoteKeyboardInput.text.length);
remoteKeyboardInput.cursorPosition = pos - 1;
}
} else if (specialKey == 13) { // Delete -> delete right
var pos = remoteKeyboardInput.cursorPosition;
if (pos < remoteKeyboardInput.text.length) {
remoteKeyboardInput.text = remoteKeyboardInput.text.substring(0, pos)
+ remoteKeyboardInput.text.substring(pos+1, remoteKeyboardInput.text.length);
remoteKeyboardInput.cursorPosition = pos; // seems to be set to text.length automatically!
}
} else if (specialKey == 10) // Home
remoteKeyboardInput.cursorPosition = 0;
else if (specialKey == 11) // End
remoteKeyboardInput.cursorPosition = remoteKeyboardInput.text.length;
else {
// echo visible keys
var sanitized = "";
for (var i = 0; i < key.length; i++) {
if (key.charCodeAt(i) > 31)
sanitized += key.charAt(i);
}
if (sanitized.length > 0 && !ctrl && !alt) {
// insert sanitized at current pos:
var pos = remoteKeyboardInput.cursorPosition;
remoteKeyboardInput.text = remoteKeyboardInput.text.substring(0, pos)
+ sanitized
+ remoteKeyboardInput.text.substring(pos, remoteKeyboardInput.text.length);
remoteKeyboardInput.cursorPosition = pos + 1; // seems to be set to text.length automatically!
}
}
// console.log("XXX After received keypress key=" + key + " special=" + specialKey + " shift=" + shift + " ctrl=" + ctrl + " text=" + remoteKeyboardInput.text + " cursorPos=" + remoteKeyboardInput.cursorPosition);
}
}
Column {
width: parent.width
RowLayout
{
Item {
//spacer to make the label centre aligned in a row yet still elide and everything
implicitWidth: (ring.visible? ring.width : 0) + (browse.visible? browse.width : 0) + parent.spacing
}
Battery {
id: battery
device: root.device
}
PlasmaComponents.Label {
horizontalAlignment: Text.AlignHCenter
elide: Text.ElideRight
text: (battery.available && battery.charge > -1) ? i18n("%1 (%2)", display, battery.displayString) : display
Layout.fillWidth: true
textFormat: Text.PlainText
}
//Find my phone
PlasmaComponents.Button
{
FindMyPhone {
id: findmyphone
device: root.device
}
id: ring
iconSource: "irc-voice"
visible: findmyphone.available
tooltip: i18n("Ring my phone")
onClicked: {
findmyphone.ring()
}
}
//SFTP
PlasmaComponents.Button
{
Sftp {
id: sftp
device: root.device
}
id: browse
iconSource: "document-open-folder"
visible: sftp.available
tooltip: i18n("Browse this device")
onClicked: {
sftp.browse()
}
}
height: browse.height
width: parent.width
}
//RemoteKeyboard
PlasmaComponents.ListItem {
visible: remoteKeyboard.remoteState
width: parent.width
Row {
width: parent.width
spacing: 5
PlasmaComponents.Label {
id: remoteKeyboardLabel
text: i18n("Remote Keyboard")
}
PlasmaComponents.TextField {
id: remoteKeyboardInput
height: parent.height
width: parent.width - 5 - remoteKeyboardLabel.width
verticalAlignment: TextInput.AlignVCenter
style: TextFieldStyle {
background: Rectangle {
radius: 2
border.color: "gray"
border.width: 1
color: "white"
}
}
Keys.onPressed: {
if (remoteKeyboard.available)
remoteKeyboard.sendEvent(event);
event.accepted = true;
}
}
}
}
//Notifications
PlasmaComponents.ListItem {
visible: notificationsModel.count>0
enabled: true
PlasmaComponents.Label {
text: i18n("Notifications:")
}
PlasmaComponents.ToolButton {
enabled: true
visible: notificationsModel.isAnyDimissable;
anchors.right: parent.right
iconSource: "window-close"
tooltip: i18n("Dismiss all notifications")
onClicked: notificationsModel.dismissAll();
}
}
Repeater {
id: notificationsView
model: NotificationsModel {
id: notificationsModel
deviceId: root.device.id()
}
delegate: PlasmaComponents.ListItem {
id: listitem
enabled: true
onClicked: checked = !checked
PlasmaCore.IconItem {
id: notificationIcon
source: appIcon
width: (valid && appIcon.length) ? dismissButton.width : 0
height: width
anchors.left: parent.left
}
PlasmaComponents.Label {
text: appName + ": " + (title.length>0 ? (appName==title?notitext:title+": "+notitext) : display)
anchors.right: replyButton.left
anchors.left: notificationIcon.right
elide: listitem.checked ? Text.ElideNone : Text.ElideRight
maximumLineCount: listitem.checked ? 0 : 1
wrapMode: Text.WordWrap
}
PlasmaComponents.ToolButton {
id: replyButton
visible: repliable
enabled: repliable
anchors.right: dismissButton.left
iconSource: "mail-reply-sender"
tooltip: i18n("Reply")
onClicked: dbusInterface.reply();
}
PlasmaComponents.ToolButton {
id: dismissButton
visible: notificationsModel.isAnyDimissable;
enabled: dismissable
anchors.right: parent.right
iconSource: "window-close"
tooltip: i18n("Dismiss")
onClicked: dbusInterface.dismiss();
}
}
}
//NOTE: More information could be displayed here
}
}