diff options
-rw-r--r-- | resources/qml/EncryptionIndicator.qml | 30 | ||||
-rw-r--r-- | resources/qml/MessageView.qml | 108 | ||||
-rw-r--r-- | resources/qml/TimelineRow.qml | 71 | ||||
-rw-r--r-- | resources/qml/delegates/NoticeMessage.qml | 2 |
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 } |