summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--resources/qml/EncryptionIndicator.qml30
-rw-r--r--resources/qml/MessageView.qml108
-rw-r--r--resources/qml/TimelineRow.qml71
-rw-r--r--resources/qml/delegates/NoticeMessage.qml2
4 files changed, 131 insertions, 80 deletions
diff --git a/resources/qml/EncryptionIndicator.qml b/resources/qml/EncryptionIndicator.qml
index ebb9031a..58805f48 100644
--- a/resources/qml/EncryptionIndicator.qml
+++ b/resources/qml/EncryptionIndicator.qml
@@ -6,40 +6,24 @@ import QtQuick 2.12
 import QtQuick.Controls 2.1
 import im.nheko 1.0
 
-Rectangle {
-    id: indicator
+Image {
+    id: stateImg
 
     property bool encrypted: false
 
-    function getEncryptionImage() {
+    width: 16
+    height: 16
+    source: {
         if (encrypted)
             return "image://colorimage/:/icons/icons/ui/lock.png?" + colors.buttonText;
         else
             return "image://colorimage/:/icons/icons/ui/unlock.png?#dd3d3d";
     }
-
-    function getEncryptionTooltip() {
-        if (encrypted)
-            return qsTr("Encrypted");
-        else
-            return qsTr("This message is not encrypted!");
-    }
-
-    color: "transparent"
-    width: 16
-    height: 16
-    ToolTip.visible: ma.hovered && indicator.visible
-    ToolTip.text: getEncryptionTooltip()
+    ToolTip.visible: ma.hovered
+    ToolTip.text: encrypted ? qsTr("Encrypted") : qsTr("This message is not encrypted!")
 
     HoverHandler {
         id: ma
     }
 
-    Image {
-        id: stateImg
-
-        anchors.fill: parent
-        source: getEncryptionImage()
-    }
-
 }
diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml
index bdde8d47..49d648b8 100644
--- a/resources/qml/MessageView.qml
+++ b/resources/qml/MessageView.qml
@@ -3,6 +3,7 @@
 // SPDX-License-Identifier: GPL-3.0-or-later
 
 import "./delegates"
+import "./emoji"
 import QtGraphicalEffects 1.0
 import QtQuick 2.12
 import QtQuick.Controls 2.3
@@ -33,6 +34,96 @@ ScrollView {
 
         }
 
+        Rectangle {
+            //closePolicy: Popup.NoAutoClose
+
+            id: messageActions
+
+            property Item attached: null
+            property alias model: row.model
+            // use comma to update on scroll
+            property var attachedPos: chat.contentY, attached ? chat.mapFromItem(attached, attached ? attached.width - width : 0, -height) : null
+            property int padding: 4
+
+            visible: Settings.buttonsInTimeline && !!attached && (attached.hovered || messageActionHover.hovered)
+            x: attached ? attachedPos.x : 0
+            y: attached ? attachedPos.y : 0
+            z: 10
+            height: row.implicitHeight + padding * 2
+            width: row.implicitWidth + padding * 2
+            color: colors.window
+            border.color: colors.buttonText
+            border.width: 1
+            radius: padding
+
+            HoverHandler {
+                id: messageActionHover
+
+                grabPermissions: PointerHandler.CanTakeOverFromAnything
+            }
+
+            Row {
+                id: row
+
+                property var model
+
+                anchors.centerIn: parent
+                spacing: messageActions.padding
+
+                ImageButton {
+                    id: editButton
+
+                    visible: !!row.model && row.model.isEditable
+                    buttonTextColor: colors.buttonText
+                    width: 16
+                    hoverEnabled: true
+                    image: ":/icons/icons/ui/edit.png"
+                    ToolTip.visible: hovered
+                    ToolTip.text: row.model && row.model.isEditable ? qsTr("Edit") : qsTr("Edited")
+                    onClicked: {
+                        if (row.model.isEditable)
+                            chat.model.editAction(row.model.id);
+
+                    }
+                }
+
+                EmojiButton {
+                    id: reactButton
+
+                    width: 16
+                    hoverEnabled: true
+                    ToolTip.visible: hovered
+                    ToolTip.text: qsTr("React")
+                    emojiPicker: emojiPopup
+                    event_id: row.model ? row.model.id : ""
+                }
+
+                ImageButton {
+                    id: replyButton
+
+                    width: 16
+                    hoverEnabled: true
+                    image: ":/icons/icons/ui/mail-reply.png"
+                    ToolTip.visible: hovered
+                    ToolTip.text: qsTr("Reply")
+                    onClicked: chat.model.replyAction(row.model.id)
+                }
+
+                ImageButton {
+                    id: optionsButton
+
+                    width: 16
+                    hoverEnabled: true
+                    image: ":/icons/icons/ui/vertical-ellipsis.png"
+                    ToolTip.visible: hovered
+                    ToolTip.text: qsTr("Options")
+                    onClicked: messageContextMenu.show(row.model.id, row.model.type, row.model.isEncrypted, row.model.isEditable, optionsButton)
+                }
+
+            }
+
+        }
+
         ScrollHelper {
             flickable: parent
             anchors.fill: parent
@@ -207,7 +298,24 @@ ScrollView {
             TimelineRow {
                 id: timelinerow
 
+                property alias hovered: hoverHandler.hovered
+
                 y: section.visible && section.active ? section.y + section.height : 0
+
+                HoverHandler {
+                    id: hoverHandler
+
+                    enabled: !Settings.mobileMode
+                    onHoveredChanged: {
+                        if (hovered) {
+                            if (!messageActionHover.hovered) {
+                                messageActions.attached = timelinerow;
+                                messageActions.model = model;
+                            }
+                        }
+                    }
+                }
+
             }
 
             Connections {
diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml
index 4c010ca4..ace7fc87 100644
--- a/resources/qml/TimelineRow.qml
+++ b/resources/qml/TimelineRow.qml
@@ -39,6 +39,7 @@ Item {
     RowLayout {
         id: row
 
+        anchors.rightMargin: 1
         anchors.leftMargin: avatarSize + 16
         anchors.left: parent.left
         anchors.right: parent.right
@@ -47,6 +48,8 @@ Item {
             Layout.fillWidth: true
             Layout.alignment: Qt.AlignTop
             spacing: 4
+            Layout.topMargin: 1
+            Layout.bottomMargin: 1
 
             // fancy reply, if this is a reply
             Reply {
@@ -83,73 +86,31 @@ Item {
             encrypted: model.isEncrypted
             Layout.alignment: Qt.AlignRight | Qt.AlignTop
             Layout.preferredHeight: 16
-            width: 16
+            Layout.preferredWidth: 16
         }
 
-        ImageButton {
-            id: editButton
-
-            visible: (Settings.buttonsInTimeline && model.isEditable) || model.isEdited
-            buttonTextColor: chat.model.edit == model.id ? colors.highlight : colors.buttonText
+        Image {
+            visible: model.isEdited || model.id == chat.model.edit
             Layout.alignment: Qt.AlignRight | Qt.AlignTop
             Layout.preferredHeight: 16
+            Layout.preferredWidth: 16
+            height: 16
             width: 16
-            hoverEnabled: true
-            image: ":/icons/icons/ui/edit.png"
-            ToolTip.visible: hovered
-            ToolTip.text: model.isEditable ? qsTr("Edit") : qsTr("Edited")
-            onClicked: {
-                if (model.isEditable)
-                    chat.model.editAction(model.id);
+            sourceSize.width: 16
+            sourceSize.height: 16
+            source: "image://colorimage/:/icons/icons/ui/edit.png?" + ((model.id == chat.model.edit) ? colors.highlight : colors.buttonText)
+            ToolTip.visible: editHovered.hovered
+            ToolTip.text: qsTr("Edited")
 
+            HoverHandler {
+                id: editHovered
             }
-        }
-
-        EmojiButton {
-            id: reactButton
-
-            visible: Settings.buttonsInTimeline
-            Layout.alignment: Qt.AlignRight | Qt.AlignTop
-            Layout.preferredHeight: 16
-            width: 16
-            hoverEnabled: true
-            ToolTip.visible: hovered
-            ToolTip.text: qsTr("React")
-            emojiPicker: emojiPopup
-            event_id: model.id
-        }
 
-        ImageButton {
-            id: replyButton
-
-            visible: Settings.buttonsInTimeline
-            Layout.alignment: Qt.AlignRight | Qt.AlignTop
-            Layout.preferredHeight: 16
-            width: 16
-            hoverEnabled: true
-            image: ":/icons/icons/ui/mail-reply.png"
-            ToolTip.visible: hovered
-            ToolTip.text: qsTr("Reply")
-            onClicked: chat.model.replyAction(model.id)
-        }
-
-        ImageButton {
-            id: optionsButton
-
-            visible: Settings.buttonsInTimeline
-            Layout.alignment: Qt.AlignRight | Qt.AlignTop
-            Layout.preferredHeight: 16
-            width: 16
-            hoverEnabled: true
-            image: ":/icons/icons/ui/vertical-ellipsis.png"
-            ToolTip.visible: hovered
-            ToolTip.text: qsTr("Options")
-            onClicked: messageContextMenu.show(model.id, model.type, model.isEncrypted, model.isEditable, optionsButton)
         }
 
         Label {
             Layout.alignment: Qt.AlignRight | Qt.AlignTop
-            text: model.timestamp.toLocaleTimeString("HH:mm")
+            text: model.timestamp.toLocaleTimeString(Locale.ShortFormat)
             width: Math.max(implicitWidth, text.length * fontMetrics.maximumCharacterWidth)
             color: inactiveColors.text
             ToolTip.visible: ma.hovered
diff --git a/resources/qml/delegates/NoticeMessage.qml b/resources/qml/delegates/NoticeMessage.qml
index ef15ac26..4f8fbfd2 100644
--- a/resources/qml/delegates/NoticeMessage.qml
+++ b/resources/qml/delegates/NoticeMessage.qml
@@ -5,6 +5,4 @@
 TextMessage {
     font.italic: true
     color: colors.buttonText
-    height: isReply ? Math.min(timelineRoot.height / 8, implicitHeight) : undefined
-    clip: isReply
 }