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
}
|