diff --git a/resources/qml/Completer.qml b/resources/qml/Completer.qml
index 7b71bd7f..27322172 100644
--- a/resources/qml/Completer.qml
+++ b/resources/qml/Completer.qml
@@ -11,6 +11,7 @@ Popup {
property string completerName
property var completer
property bool bottomToTop: true
+ property alias count: listView.count
signal completionClicked(string completion)
@@ -84,7 +85,7 @@ Popup {
anchors.fill: parent
hoverEnabled: true
- onEntered: popup.currentIndex = model.index
+ onPositionChanged: popup.currentIndex = model.index
onClicked: popup.completionClicked(completer.completionAt(model.index))
Ripple {
diff --git a/resources/qml/MessageInput.qml b/resources/qml/MessageInput.qml
index 12362f57..5d335872 100644
--- a/resources/qml/MessageInput.qml
+++ b/resources/qml/MessageInput.qml
@@ -162,6 +162,10 @@ Rectangle {
if (event.matches(StandardKey.Paste)) {
TimelineManager.timeline.input.paste(false);
event.accepted = true;
+ } else if (event.key == Qt.Key_Space) {
+ if (popup.opened && popup.count <= 0)
+ popup.close();
+
} else if (event.modifiers == Qt.ControlModifier && event.key == Qt.Key_U) {
messageInput.clear();
} else if (event.modifiers == Qt.ControlModifier && event.key == Qt.Key_P) {
@@ -202,9 +206,12 @@ Rectangle {
while (pos > -1) {
var t = messageInput.getText(pos, pos + 1);
console.log('"' + t + '"');
- if (t == '@' || t == ' ' || t == '\t') {
+ if (t == '@') {
messageInput.openCompleter(pos, "user");
return ;
+ } else if (t == ' ' || t == '\t') {
+ messageInput.openCompleter(pos + 1, "user");
+ return ;
} else if (t == ':') {
messageInput.openCompleter(pos, "emoji");
return ;
@@ -255,7 +262,7 @@ Rectangle {
Connections {
ignoreUnknownSignals: true
- onReplyChanged: messageInput.forceActiveFocus();
+ onReplyChanged: messageInput.forceActiveFocus()
target: TimelineManager.timeline
}
@@ -267,11 +274,6 @@ Rectangle {
onClicked: TimelineManager.timeline.input.paste(true)
}
- NhekoDropArea {
- anchors.fill: parent
- roomid: TimelineManager.timeline ? TimelineManager.timeline.roomId() : ""
- }
-
}
ScrollBar.vertical: ScrollBar {
diff --git a/resources/qml/PrivacyScreen.qml b/resources/qml/PrivacyScreen.qml
new file mode 100644
index 00000000..76520706
--- /dev/null
+++ b/resources/qml/PrivacyScreen.qml
@@ -0,0 +1,126 @@
+import QtGraphicalEffects 1.0
+import QtQuick 2.12
+import im.nheko 1.0
+
+Item {
+ id: privacyScreen
+
+ property var timelineRoot
+ property int screenTimeout
+
+ Connections {
+ target: TimelineManager
+ onFocusChanged: {
+ if (TimelineManager.isWindowFocused) {
+ screenSaverTimer.stop();
+ screenSaver.state = "Invisible";
+ } else {
+ if (timelineRoot.visible)
+ screenSaverTimer.start();
+
+ }
+ }
+ }
+
+ Timer {
+ id: screenSaverTimer
+
+ interval: screenTimeout * 1000
+ running: true
+ onTriggered: {
+ screenSaver.state = "Visible";
+ }
+ }
+
+ Item {
+ id: screenSaver
+
+ state: "Invisible"
+ anchors.fill: parent
+ visible: false
+ states: [
+ State {
+ name: "Visible"
+
+ PropertyChanges {
+ target: screenSaver
+ visible: true
+ }
+
+ PropertyChanges {
+ target: screenSaver
+ opacity: 1
+ }
+
+ },
+ State {
+ name: "Invisible"
+
+ PropertyChanges {
+ target: screenSaver
+ opacity: 0
+ }
+
+ PropertyChanges {
+ target: screenSaver
+ visible: false
+ }
+
+ }
+ ]
+ transitions: [
+ Transition {
+ from: "Visible"
+ to: "Invisible"
+
+ SequentialAnimation {
+ NumberAnimation {
+ target: screenSaver
+ property: "opacity"
+ duration: 250
+ easing.type: Easing.InQuad
+ }
+
+ NumberAnimation {
+ target: screenSaver
+ property: "visible"
+ duration: 0
+ }
+
+ }
+
+ },
+ Transition {
+ from: "Invisible"
+ to: "Visible"
+
+ SequentialAnimation {
+ NumberAnimation {
+ target: screenSaver
+ property: "visible"
+ duration: 0
+ }
+
+ NumberAnimation {
+ target: screenSaver
+ property: "opacity"
+ duration: 500
+ easing.type: Easing.InQuad
+ }
+
+ }
+
+ }
+ ]
+
+ FastBlur {
+ id: blur
+
+ anchors.fill: parent
+ source: timelineRoot
+ radius: 50
+ }
+
+ }
+
+}
diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml
index c4c18e0e..95a025cf 100644
--- a/resources/qml/TimelineRow.qml
+++ b/resources/qml/TimelineRow.qml
@@ -28,7 +28,7 @@ Item {
if (mouse.button === Qt.RightButton)
messageContextMenu.show(model.id, model.type, model.isEncrypted, row);
else
- event.accepted = false;
+ mouse.accepted = false;
}
onPressAndHold: {
messageContextMenu.show(model.id, model.type, model.isEncrypted, row, mapToItem(timelineRoot, mouse.x, mouse.y));
diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index 2eb0a7c5..c03e8d31 100644
--- a/resources/qml/TimelineView.qml
+++ b/resources/qml/TimelineView.qml
@@ -35,7 +35,7 @@ Page {
colors: palette
model: EmojiProxyModel {
- category: EmojiCategory.People
+ category: Emoji.Category.People
sourceModel: EmojiModel {
}
@@ -194,6 +194,8 @@ Page {
}
ColumnLayout {
+ id: timelineLayout
+
visible: TimelineManager.timeline != null
anchors.fill: parent
spacing: 0
@@ -278,6 +280,18 @@ Page {
}
+ NhekoDropArea {
+ anchors.fill: parent
+ roomid: TimelineManager.timeline ? TimelineManager.timeline.roomId() : ""
+ }
+
+ }
+
+ PrivacyScreen {
+ anchors.fill: parent
+ visible: Settings.privacyScreen
+ screenTimeout: Settings.privacyScreenTimeout
+ timelineRoot: timelineLayout
}
systemInactive: SystemPalette {
diff --git a/resources/qml/UserProfile.qml b/resources/qml/UserProfile.qml
index 65c58382..37ae6de8 100644
--- a/resources/qml/UserProfile.qml
+++ b/resources/qml/UserProfile.qml
@@ -10,6 +10,8 @@ ApplicationWindow {
property var profile
+ x: MainWindow.x + (MainWindow.width / 2) - (width / 2)
+ y: MainWindow.y + (MainWindow.height / 2) - (height / 2)
height: 650
width: 420
minimumHeight: 420
@@ -17,6 +19,11 @@ ApplicationWindow {
color: colors.window
title: profile.isGlobalUserProfile ? "Global User Profile" : "Room User Profile"
+ Shortcut {
+ sequence: StandardKey.Cancel
+ onActivated: userProfileDialog.close()
+ }
+
ColumnLayout {
id: contentL
@@ -84,10 +91,9 @@ ApplicationWindow {
font.bold: true
Layout.alignment: Qt.AlignHCenter
selectByMouse: true
-
onAccepted: {
- profile.changeUsername(displayUsername.text)
- displayUsername.isUsernameEditingAllowed = false
+ profile.changeUsername(displayUsername.text);
+ displayUsername.isUsernameEditingAllowed = false;
}
ImageButton {
@@ -96,18 +102,18 @@ ApplicationWindow {
anchors.left: displayUsername.right
anchors.verticalCenter: displayUsername.verticalCenter
image: displayUsername.isUsernameEditingAllowed ? ":/icons/icons/ui/checkmark.png" : ":/icons/icons/ui/edit.png"
-
onClicked: {
if (displayUsername.isUsernameEditingAllowed) {
- profile.changeUsername(displayUsername.text)
- displayUsername.isUsernameEditingAllowed = false
+ profile.changeUsername(displayUsername.text);
+ displayUsername.isUsernameEditingAllowed = false;
} else {
- displayUsername.isUsernameEditingAllowed = true
- displayUsername.focus = true
- displayUsername.selectAll()
+ displayUsername.isUsernameEditingAllowed = true;
+ displayUsername.focus = true;
+ displayUsername.selectAll();
}
}
}
+
}
MatrixText {
|