From 2055c75f8ba710e8950a55aa3c41a9cec9f26ad7 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sun, 27 Oct 2019 22:01:40 +0100 Subject: Organize qml files a bit --- resources/qml/Avatar.qml | 1 + resources/qml/RowDelegateChooser.qml | 51 -------- resources/qml/TimelineRow.qml | 144 +++++++++++++++++++++ resources/qml/TimelineView.qml | 3 +- resources/qml/delegates/FileMessage.qml | 2 +- resources/qml/delegates/ImageMessage.qml | 2 +- resources/qml/delegates/MessageDelegate.qml | 50 ++++++++ resources/qml/delegates/NoticeMessage.qml | 2 +- resources/qml/delegates/Placeholder.qml | 2 +- resources/qml/delegates/PlayableMediaMessage.qml | 2 +- resources/qml/delegates/TextMessage.qml | 2 +- resources/qml/delegates/TimelineRow.qml | 151 ----------------------- resources/res.qrc | 4 +- 13 files changed, 204 insertions(+), 212 deletions(-) delete mode 100644 resources/qml/RowDelegateChooser.qml create mode 100644 resources/qml/TimelineRow.qml create mode 100644 resources/qml/delegates/MessageDelegate.qml delete mode 100644 resources/qml/delegates/TimelineRow.qml (limited to 'resources') diff --git a/resources/qml/Avatar.qml b/resources/qml/Avatar.qml index 9d7b54fe..131e6b46 100644 --- a/resources/qml/Avatar.qml +++ b/resources/qml/Avatar.qml @@ -30,6 +30,7 @@ Rectangle { id: img anchors.fill: parent asynchronous: true + fillMode: Image.PreserveAspectCrop layer.enabled: true layer.effect: OpacityMask { diff --git a/resources/qml/RowDelegateChooser.qml b/resources/qml/RowDelegateChooser.qml deleted file mode 100644 index bacd970a..00000000 --- a/resources/qml/RowDelegateChooser.qml +++ /dev/null @@ -1,51 +0,0 @@ -import QtQuick 2.6 -import Qt.labs.qmlmodels 1.0 -import com.github.nheko 1.0 - -import "./delegates" - -DelegateChooser { - //role: "type" //< not supported in our custom implementation, have to use roleValue - width: chat.width - roleValue: model.type - - DelegateChoice { - roleValue: MtxEvent.TextMessage - TimelineRow { view: chat; TextMessage { id: kid } } - } - DelegateChoice { - roleValue: MtxEvent.NoticeMessage - TimelineRow { view: chat; NoticeMessage { id: kid } } - } - DelegateChoice { - roleValue: MtxEvent.EmoteMessage - TimelineRow { view: chat; TextMessage { id: kid } } - } - DelegateChoice { - roleValue: MtxEvent.ImageMessage - TimelineRow { view: chat; ImageMessage { id: kid } } - } - DelegateChoice { - roleValue: MtxEvent.Sticker - TimelineRow { view: chat; ImageMessage { id: kid } } - } - DelegateChoice { - roleValue: MtxEvent.FileMessage - TimelineRow { view: chat; FileMessage { id: kid } } - } - DelegateChoice { - roleValue: MtxEvent.VideoMessage - TimelineRow { view: chat; PlayableMediaMessage { id: kid } } - } - DelegateChoice { - roleValue: MtxEvent.AudioMessage - TimelineRow { view: chat; PlayableMediaMessage { id: kid } } - } - DelegateChoice { - roleValue: MtxEvent.Redacted - TimelineRow { view: chat; Redacted { id: kid } } - } - DelegateChoice { - TimelineRow { view: chat; Placeholder { id: kid } } - } -} diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml new file mode 100644 index 00000000..fdc2ec95 --- /dev/null +++ b/resources/qml/TimelineRow.qml @@ -0,0 +1,144 @@ +import QtQuick 2.6 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.2 +import QtGraphicalEffects 1.0 +import QtQuick.Window 2.2 + +import com.github.nheko 1.0 + +import "./delegates" + +RowLayout { + property var view: chat + + anchors.leftMargin: avatarSize + 4 + anchors.rightMargin: scrollbar.width + anchors.left: parent.left + anchors.right: parent.right + + height: contentItem.height + + MessageDelegate { + Layout.fillWidth: true + Layout.alignment: Qt.AlignTop + id: contentItem + } + + StatusIndicator { + state: model.state + Layout.alignment: Qt.AlignRight | Qt.AlignTop + Layout.preferredHeight: 16 + } + + EncryptionIndicator { + visible: model.isEncrypted + Layout.alignment: Qt.AlignRight | Qt.AlignTop + Layout.preferredHeight: 16 + } + + Button { + Layout.alignment: Qt.AlignRight | Qt.AlignTop + id: replyButton + flat: true + Layout.preferredHeight: 16 + + ToolTip { + visible: replyButton.hovered + text: qsTr("Reply") + palette: colors + } + + // disable background, because we don't want a border on hover + background: Item { + } + + Image { + id: replyButtonImg + // Workaround, can't get icon.source working for now... + anchors.fill: parent + source: "qrc:/icons/icons/ui/mail-reply.png" + } + ColorOverlay { + anchors.fill: replyButtonImg + source: replyButtonImg + color: replyButton.hovered ? colors.highlight : colors.buttonText + } + + onClicked: view.model.replyAction(model.id) + } + Button { + Layout.alignment: Qt.AlignRight | Qt.AlignTop + id: optionsButton + flat: true + Layout.preferredHeight: 16 + + ToolTip { + visible: optionsButton.hovered + text: qsTr("Options") + palette: colors + } + + // disable background, because we don't want a border on hover + background: Item { + } + + Image { + id: optionsButtonImg + // Workaround, can't get icon.source working for now... + anchors.fill: parent + source: "qrc:/icons/icons/ui/vertical-ellipsis.png" + } + ColorOverlay { + anchors.fill: optionsButtonImg + source: optionsButtonImg + color: optionsButton.hovered ? colors.highlight : colors.buttonText + } + + onClicked: contextMenu.open() + + Menu { + y: optionsButton.height + id: contextMenu + palette: colors + + MenuItem { + text: qsTr("Read receipts") + onTriggered: view.model.readReceiptsAction(model.id) + } + MenuItem { + text: qsTr("Mark as read") + } + MenuItem { + text: qsTr("View raw message") + onTriggered: view.model.viewRawMessage(model.id) + } + MenuItem { + text: qsTr("Redact message") + onTriggered: view.model.redactEvent(model.id) + } + MenuItem { + visible: model.type == MtxEvent.ImageMessage || model.type == MtxEvent.VideoMessage || model.type == MtxEvent.AudioMessage || model.type == MtxEvent.FileMessage || model.type == MtxEvent.Sticker + text: qsTr("Save as") + onTriggered: timelineManager.saveMedia(model.url, model.filename, model.mimetype, model.type) + } + } + } + + Text { + Layout.alignment: Qt.AlignRight | Qt.AlignTop + text: model.timestamp.toLocaleTimeString("HH:mm") + color: inactiveColors.text + + MouseArea{ + id: ma + anchors.fill: parent + hoverEnabled: true + } + + ToolTip { + visible: ma.containsMouse + text: Qt.formatDateTime(model.timestamp, Qt.DefaultLocaleLongDate) + palette: colors + } + } +} diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml index 046f7800..e5c1bda6 100644 --- a/resources/qml/TimelineView.qml +++ b/resources/qml/TimelineView.qml @@ -90,14 +90,13 @@ Rectangle { onMovementEnded: updatePosition() spacing: 4 - delegate: RowDelegateChooser { + delegate: TimelineRow { function isFullyVisible() { return height > 1 && (y - chat.contentY - 1) + height < chat.height } function getIndex() { return index; } - } section { diff --git a/resources/qml/delegates/FileMessage.qml b/resources/qml/delegates/FileMessage.qml index ad2c695d..f4cf3f15 100644 --- a/resources/qml/delegates/FileMessage.qml +++ b/resources/qml/delegates/FileMessage.qml @@ -5,7 +5,7 @@ Rectangle { radius: 10 color: colors.dark height: row.height + 24 - width: parent.width + width: parent ? parent.width : undefined RowLayout { id: row diff --git a/resources/qml/delegates/ImageMessage.qml b/resources/qml/delegates/ImageMessage.qml index f1e95e3d..802ef721 100644 --- a/resources/qml/delegates/ImageMessage.qml +++ b/resources/qml/delegates/ImageMessage.qml @@ -3,7 +3,7 @@ import QtQuick 2.6 import com.github.nheko 1.0 Item { - width: Math.min(parent.width, model.width) + width: Math.min(parent ? parent.width : undefined, model.width) height: width * model.proportionalHeight Image { diff --git a/resources/qml/delegates/MessageDelegate.qml b/resources/qml/delegates/MessageDelegate.qml new file mode 100644 index 00000000..3d342a02 --- /dev/null +++ b/resources/qml/delegates/MessageDelegate.qml @@ -0,0 +1,50 @@ +import QtQuick 2.6 +import Qt.labs.qmlmodels 1.0 +import com.github.nheko 1.0 + +DelegateChooser { + //role: "type" //< not supported in our custom implementation, have to use roleValue + roleValue: model.type + + width: parent.width + + DelegateChoice { + roleValue: MtxEvent.TextMessage + TextMessage {} + } + DelegateChoice { + roleValue: MtxEvent.NoticeMessage + NoticeMessage {} + } + DelegateChoice { + roleValue: MtxEvent.EmoteMessage + TextMessage {} + } + DelegateChoice { + roleValue: MtxEvent.ImageMessage + ImageMessage {} + } + DelegateChoice { + roleValue: MtxEvent.Sticker + ImageMessage {} + } + DelegateChoice { + roleValue: MtxEvent.FileMessage + FileMessage {} + } + DelegateChoice { + roleValue: MtxEvent.VideoMessage + PlayableMediaMessage {} + } + DelegateChoice { + roleValue: MtxEvent.AudioMessage + PlayableMediaMessage {} + } + DelegateChoice { + roleValue: MtxEvent.Redacted + Redacted {} + } + DelegateChoice { + Placeholder {} + } +} diff --git a/resources/qml/delegates/NoticeMessage.qml b/resources/qml/delegates/NoticeMessage.qml index b916d65a..59e051be 100644 --- a/resources/qml/delegates/NoticeMessage.qml +++ b/resources/qml/delegates/NoticeMessage.qml @@ -5,7 +5,7 @@ TextEdit { textFormat: TextEdit.RichText readOnly: true wrapMode: Text.Wrap - width: parent.width + width: parent ? parent.width : undefined selectByMouse: true font.italic: true color: inactiveColors.text diff --git a/resources/qml/delegates/Placeholder.qml b/resources/qml/delegates/Placeholder.qml index 462af2db..171bf18d 100644 --- a/resources/qml/delegates/Placeholder.qml +++ b/resources/qml/delegates/Placeholder.qml @@ -5,6 +5,6 @@ Label { text: qsTr("unimplemented event: ") + model.type textFormat: Text.PlainText wrapMode: Text.Wrap - width: parent.width + width: parent ? parent.width : undefined color: inactiveColors.text } diff --git a/resources/qml/delegates/PlayableMediaMessage.qml b/resources/qml/delegates/PlayableMediaMessage.qml index 3a518617..68b09f7b 100644 --- a/resources/qml/delegates/PlayableMediaMessage.qml +++ b/resources/qml/delegates/PlayableMediaMessage.qml @@ -10,7 +10,7 @@ Rectangle { radius: 10 color: colors.dark height: content.height + 24 - width: parent.width + width: parent ? parent.width : undefined Column { id: content diff --git a/resources/qml/delegates/TextMessage.qml b/resources/qml/delegates/TextMessage.qml index 3a3492ed..713be868 100644 --- a/resources/qml/delegates/TextMessage.qml +++ b/resources/qml/delegates/TextMessage.qml @@ -5,7 +5,7 @@ TextEdit { textFormat: TextEdit.RichText readOnly: true wrapMode: Text.Wrap - width: parent.width + width: parent ? parent.width : undefined selectByMouse: true color: colors.text } diff --git a/resources/qml/delegates/TimelineRow.qml b/resources/qml/delegates/TimelineRow.qml deleted file mode 100644 index 3019deb1..00000000 --- a/resources/qml/delegates/TimelineRow.qml +++ /dev/null @@ -1,151 +0,0 @@ -import QtQuick 2.6 -import QtQuick.Controls 2.3 -import QtQuick.Layouts 1.2 -import QtGraphicalEffects 1.0 -import QtQuick.Window 2.2 - -import com.github.nheko 1.0 - -import ".." - -RowLayout { - property var view: undefined - default property alias data: contentItem.data - - height: kid.height // TODO: fix this, we shouldn't need to give the child of contentItem this id! - anchors.leftMargin: avatarSize + 4 - anchors.left: parent.left - anchors.right: parent.right - anchors.rightMargin: scrollbar.width - - function isFullyVisible() { - return (y - view.contentY - 1) + height < view.height - } - function getIndex() { - return index; - } - - Item { - id: contentItem - Layout.fillWidth: true - Layout.alignment: Qt.AlignTop - } - - StatusIndicator { - state: model.state - Layout.alignment: Qt.AlignRight | Qt.AlignTop - Layout.preferredHeight: 16 - } - - EncryptionIndicator { - visible: model.isEncrypted - Layout.alignment: Qt.AlignRight | Qt.AlignTop - Layout.preferredHeight: 16 - } - - Button { - Layout.alignment: Qt.AlignRight | Qt.AlignTop - id: replyButton - flat: true - Layout.preferredHeight: 16 - - ToolTip { - visible: replyButton.hovered - text: qsTr("Reply") - palette: colors - } - - // disable background, because we don't want a border on hover - background: Item { - } - - Image { - id: replyButtonImg - // Workaround, can't get icon.source working for now... - anchors.fill: parent - source: "qrc:/icons/icons/ui/mail-reply.png" - } - ColorOverlay { - anchors.fill: replyButtonImg - source: replyButtonImg - color: replyButton.hovered ? colors.highlight : colors.buttonText - } - - onClicked: view.model.replyAction(model.id) - } - Button { - Layout.alignment: Qt.AlignRight | Qt.AlignTop - id: optionsButton - flat: true - Layout.preferredHeight: 16 - - ToolTip { - visible: optionsButton.hovered - text: qsTr("Options") - palette: colors - } - - // disable background, because we don't want a border on hover - background: Item { - } - - Image { - id: optionsButtonImg - // Workaround, can't get icon.source working for now... - anchors.fill: parent - source: "qrc:/icons/icons/ui/vertical-ellipsis.png" - } - ColorOverlay { - anchors.fill: optionsButtonImg - source: optionsButtonImg - color: optionsButton.hovered ? colors.highlight : colors.buttonText - } - - onClicked: contextMenu.open() - - Menu { - y: optionsButton.height - id: contextMenu - palette: colors - - MenuItem { - text: qsTr("Read receipts") - onTriggered: view.model.readReceiptsAction(model.id) - } - MenuItem { - text: qsTr("Mark as read") - } - MenuItem { - text: qsTr("View raw message") - onTriggered: view.model.viewRawMessage(model.id) - } - MenuItem { - text: qsTr("Redact message") - onTriggered: view.model.redactEvent(model.id) - } - MenuItem { - visible: model.type == MtxEvent.ImageMessage || model.type == MtxEvent.VideoMessage || model.type == MtxEvent.AudioMessage || model.type == MtxEvent.FileMessage || model.type == MtxEvent.Sticker - text: qsTr("Save as") - onTriggered: timelineManager.saveMedia(model.url, model.filename, model.mimetype, model.type) - } - } - } - - Text { - Layout.alignment: Qt.AlignRight | Qt.AlignTop - text: model.timestamp.toLocaleTimeString("HH:mm") - color: inactiveColors.text - - MouseArea{ - id: ma - anchors.fill: parent - hoverEnabled: true - } - - ToolTip { - visible: ma.containsMouse - text: Qt.formatDateTime(model.timestamp, Qt.DefaultLocaleLongDate) - palette: colors - } - } -} diff --git a/resources/res.qrc b/resources/res.qrc index 4816ffad..86b1364c 100644 --- a/resources/res.qrc +++ b/resources/res.qrc @@ -116,11 +116,11 @@ qml/TimelineView.qml - qml/RowDelegateChooser.qml qml/Avatar.qml qml/StatusIndicator.qml qml/EncryptionIndicator.qml - qml/delegates/TimelineRow.qml + qml/TimelineRow.qml + qml/delegates/MessageDelegate.qml qml/delegates/TextMessage.qml qml/delegates/NoticeMessage.qml qml/delegates/ImageMessage.qml -- cgit 1.5.1