diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 318eb34a..83b8614b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -151,7 +151,7 @@ build-clazy: - apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake ccache liblmdb-dev libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev - qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform + qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qt5keychain-dev ccache libcurl4-openssl-dev libevent-dev libspdlog-dev git nlohmann-json3-dev libcmark-dev asciidoc time # libolm-dev # need recommended deps for wget - apt-get -y install wget @@ -394,7 +394,7 @@ build-flatpak: - apt-get -y install --no-install-suggests --no-install-recommends ca-certificates build-essential ninja-build cmake gcc make automake ccache liblmdb-dev libssl-dev libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediaquick5 libqt5svg5-dev qtmultimedia5-dev qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools qtdeclarative5-dev - qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qt-labs-platform + qml-module-qtmultimedia qml-module-qtquick-controls2 qml-module-qtquick-layouts qt5keychain-dev ccache libcurl4-openssl-dev libevent-dev libspdlog-dev nlohmann-json3-dev libcmark-dev asciidoc libre2-dev libgtest-dev libgl1-mesa-dev qml-module-qtquick-particles2 # Installing the packages needed to build AppImage diff --git a/README.md b/README.md index 74cb8b45..b4c6fa8e 100644 --- a/README.md +++ b/README.md @@ -365,7 +365,7 @@ cmake --build build *Build requirements + qml modules needed at runtime (you may not need all of them, but the following seem to work according to reports):* ```bash sudo apt install --no-install-recommends g++ cmake make zlib1g-dev libssl-dev libolm-dev liblmdb-dev libcmark-dev nlohmann-json3-dev libspdlog-dev libevent-dev libcurl4-openssl-dev libre2-dev libxcb-ewmh-dev asciidoc-base \ -qt{base,declarative,tools,multimedia,quickcontrols2-}5-dev libqt6svg5-dev qt6keychain-dev qml-module-qt{gstreamer,multimedia,quick-extras,-labs-settings,-labs-platform,graphicaleffects,quick-controls2,quick-particles2} \ +qt{base,declarative,tools,multimedia,quickcontrols2-}5-dev libqt6svg5-dev qt6keychain-dev qml-module-qt{gstreamer,multimedia,quick-extras,-labs-settings,graphicaleffects,quick-controls2,quick-particles2} \ libgstreamer1.0-dev libgstreamer-plugins-{base,bad}1.0-dev qtgstreamer-plugins-qt6 libnice-dev ninja-build ``` lmdb++-dev is too old so bundled lmdbxx must be used. diff --git a/resources/qml/CommunitiesList.qml b/resources/qml/CommunitiesList.qml index d95b8e6d..797a72b1 100644 --- a/resources/qml/CommunitiesList.qml +++ b/resources/qml/CommunitiesList.qml @@ -3,7 +3,6 @@ // SPDX-License-Identifier: GPL-3.0-or-later import "./components" -import Qt.labs.platform 1.1 as Platform import QtQml import QtQuick import QtQuick.Controls @@ -195,7 +194,7 @@ Page { } } - Platform.Menu { + Menu { id: communityContextMenu property bool hidden @@ -209,14 +208,14 @@ Page { open(); } - Platform.MenuItem { + MenuItem { checkable: true checked: communityContextMenu.muted text: qsTr("Do not show notification counts for this community or tag.") onTriggered: Communities.toggleTagMute(communityContextMenu.tagId) } - Platform.MenuItem { + MenuItem { checkable: true checked: communityContextMenu.hidden text: qsTr("Hide rooms with this tag or from this community by default.") diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml index f253b7a8..b99e5f63 100644 --- a/resources/qml/MessageView.qml +++ b/resources/qml/MessageView.qml @@ -4,7 +4,6 @@ import "./ui" import "./dialogs" -import Qt.labs.platform 1.1 as Platform import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.2 @@ -393,7 +392,7 @@ Item { } } } - Platform.Menu { + Menu { id: messageContextMenuC property string eventId @@ -448,7 +447,7 @@ Item { ReportMessage {} } - Platform.MenuItem { + MenuItem { enabled: visible text: qsTr("Go to &message") visible: filteredTimeline.filterByContent @@ -458,21 +457,21 @@ Item { room.showEvent(messageContextMenuC.eventId); } } - Platform.MenuItem { + MenuItem { enabled: visible text: qsTr("&Copy") visible: messageContextMenuC.text onTriggered: Clipboard.text = messageContextMenuC.text } - Platform.MenuItem { + MenuItem { enabled: visible text: qsTr("Copy &link location") visible: messageContextMenuC.link onTriggered: Clipboard.text = messageContextMenuC.link } - Platform.MenuItem { + MenuItem { id: reactionOption text: qsTr("Re&act") @@ -483,39 +482,39 @@ Item { TimelineManager.focusMessageInput(); }) } - Platform.MenuItem { + MenuItem { text: qsTr("Repl&y") visible: room ? room.permissions.canSend(MtxEvent.TextMessage) : false onTriggered: room.reply = (messageContextMenuC.eventId) } - Platform.MenuItem { + MenuItem { enabled: visible text: qsTr("&Edit") visible: messageContextMenuC.isEditable && (room ? room.permissions.canSend(MtxEvent.TextMessage) : false) onTriggered: room.edit = (messageContextMenuC.eventId) } - Platform.MenuItem { + MenuItem { enabled: visible text: qsTr("&Thread") visible: (room ? room.permissions.canSend(MtxEvent.TextMessage) : false) onTriggered: room.thread = (messageContextMenuC.threadId || messageContextMenuC.eventId) } - Platform.MenuItem { + MenuItem { enabled: visible text: visible && room.pinnedMessages.includes(messageContextMenuC.eventId) ? qsTr("Un&pin") : qsTr("&Pin") visible: (room ? room.permissions.canChange(MtxEvent.PinnedEvents) : false) onTriggered: visible && room.pinnedMessages.includes(messageContextMenuC.eventId) ? room.unpin(messageContextMenuC.eventId) : room.pin(messageContextMenuC.eventId) } - Platform.MenuItem { + MenuItem { text: qsTr("&Read receipts") onTriggered: room.showReadReceipts(messageContextMenuC.eventId) } - Platform.MenuItem { + MenuItem { text: qsTr("&Forward") visible: messageContextMenuC.eventType == MtxEvent.ImageMessage || messageContextMenuC.eventType == MtxEvent.VideoMessage || messageContextMenuC.eventType == MtxEvent.AudioMessage || messageContextMenuC.eventType == MtxEvent.FileMessage || messageContextMenuC.eventType == MtxEvent.Sticker || messageContextMenuC.eventType == MtxEvent.TextMessage || messageContextMenuC.eventType == MtxEvent.LocationMessage || messageContextMenuC.eventType == MtxEvent.EmoteMessage || messageContextMenuC.eventType == MtxEvent.NoticeMessage @@ -526,15 +525,15 @@ Item { timelineRoot.destroyOnClose(forwardMess); } } - Platform.MenuItem { + MenuItem { text: qsTr("&Mark as read") } - Platform.MenuItem { + MenuItem { text: qsTr("View raw message") onTriggered: room.viewRawMessage(messageContextMenuC.eventId) } - Platform.MenuItem { + MenuItem { enabled: visible text: qsTr("View decrypted raw message") // TODO(Nico): Fix this still being iterated over, when using keyboard to select options @@ -542,7 +541,7 @@ Item { onTriggered: room.viewDecryptedRawMessage(messageContextMenuC.eventId) } - Platform.MenuItem { + MenuItem { text: qsTr("Remo&ve message") visible: (room ? room.permissions.canRedact() : false) || messageContextMenuC.isSender @@ -554,7 +553,7 @@ Item { timelineRoot.destroyOnClose(dialog); } } - Platform.MenuItem { + MenuItem { text: qsTr("Report message") enabled: visible onTriggered: function () { @@ -564,21 +563,21 @@ Item { timelineRoot.destroyOnClose(dialog); } } - Platform.MenuItem { + MenuItem { enabled: visible text: qsTr("&Save as") visible: messageContextMenuC.eventType == MtxEvent.ImageMessage || messageContextMenuC.eventType == MtxEvent.VideoMessage || messageContextMenuC.eventType == MtxEvent.AudioMessage || messageContextMenuC.eventType == MtxEvent.FileMessage || messageContextMenuC.eventType == MtxEvent.Sticker onTriggered: room.saveMedia(messageContextMenuC.eventId) } - Platform.MenuItem { + MenuItem { enabled: visible text: qsTr("&Open in external program") visible: messageContextMenuC.eventType == MtxEvent.ImageMessage || messageContextMenuC.eventType == MtxEvent.VideoMessage || messageContextMenuC.eventType == MtxEvent.AudioMessage || messageContextMenuC.eventType == MtxEvent.FileMessage || messageContextMenuC.eventType == MtxEvent.Sticker onTriggered: room.openMedia(messageContextMenuC.eventId) } - Platform.MenuItem { + MenuItem { enabled: visible text: qsTr("Copy link to eve&nt") visible: messageContextMenuC.eventId @@ -592,7 +591,7 @@ Item { ForwardCompleter { } } - Platform.Menu { + Menu { id: replyContextMenuC property string eventId @@ -606,21 +605,21 @@ Item { open(); } - Platform.MenuItem { + MenuItem { enabled: visible text: qsTr("&Copy") visible: replyContextMenuC.text onTriggered: Clipboard.text = replyContextMenuC.text } - Platform.MenuItem { + MenuItem { enabled: visible text: qsTr("Copy &link location") visible: replyContextMenuC.link onTriggered: Clipboard.text = replyContextMenuC.link } - Platform.MenuItem { + MenuItem { enabled: visible text: qsTr("&Go to quoted message") visible: true diff --git a/resources/qml/RoomList.qml b/resources/qml/RoomList.qml index 746dd164..1d8bff88 100644 --- a/resources/qml/RoomList.qml +++ b/resources/qml/RoomList.qml @@ -5,8 +5,6 @@ import "./components" import "./dialogs" import "./ui" -import Qt.labs.platform 1.1 as Platform -import QtQml import QtQuick import QtQuick.Controls import QtQuick.Layouts @@ -55,15 +53,15 @@ Page { onClicked: roomJoinCreateMenu.open(parent) - Platform.Menu { + Menu { id: roomJoinCreateMenu - Platform.MenuItem { + MenuItem { text: qsTr("Join a room") onTriggered: Nheko.openJoinRoomDialog() } - Platform.MenuItem { + MenuItem { text: qsTr("Create a new room") onTriggered: { @@ -72,7 +70,7 @@ Page { timelineRoot.destroyOnClose(createRoom); } } - Platform.MenuItem { + MenuItem { text: qsTr("Start a direct chat") onTriggered: { @@ -81,7 +79,7 @@ Page { timelineRoot.destroyOnClose(createDirect); } } - Platform.MenuItem { + MenuItem { text: qsTr("Create a new community") onTriggered: { @@ -255,49 +253,49 @@ Page { Nheko.setStatusMessage(text); } } - Platform.Menu { + Menu { id: userInfoMenu - Platform.MenuItem { + MenuItem { text: qsTr("Profile settings") onTriggered: userInfoPanel.openUserProfile() } - Platform.MenuItem { + MenuItem { text: qsTr("Set status message") onTriggered: statusDialog.show() } - Platform.MenuSeparator { + MenuSeparator { } - Platform.MenuItemGroup { + ButtonGroup { id: onlineStateGroup } - Platform.MenuItem { + MenuItem { text: qsTr("Automatic online status") - group: onlineStateGroup + ButtonGroup.group: onlineStateGroup checkable: true checked: Settings.presence == Settings.AutomaticPresence onTriggered: if (checked) Settings.presence = Settings.AutomaticPresence } - Platform.MenuItem { + MenuItem { text: qsTr("Online") - group: onlineStateGroup + ButtonGroup.group: onlineStateGroup checkable: true checked: Settings.presence == Settings.Online onTriggered: if (checked) Settings.presence = Settings.Online } - Platform.MenuItem { + MenuItem { text: qsTr("Unavailable") - group: onlineStateGroup + ButtonGroup.group: onlineStateGroup checkable: true checked: Settings.presence == Settings.Unavailable onTriggered: if (checked) Settings.presence = Settings.Unavailable } - Platform.MenuItem { + MenuItem { text: qsTr("Offline") - group: onlineStateGroup + ButtonGroup.group: onlineStateGroup checkable: true checked: Settings.presence == Settings.Offline onTriggered: if (checked) Settings.presence = Settings.Offline @@ -734,7 +732,7 @@ Page { roomid: roomContextMenu.roomid } } - Platform.Menu { + Menu { id: roomContextMenu property string roomid @@ -756,7 +754,7 @@ Page { Rooms.toggleTag(roomContextMenu.roomid, "u." + text, true); } } - Platform.MenuItem { + MenuItem { text: qsTr("Open separately") onTriggered: { @@ -768,27 +766,27 @@ Page { destroyOnClose(roomWindow); } } - Platform.MenuItem { + MenuItem { text: qsTr("Mark as read") onTriggered: Rooms.getRoomById(roomContextMenu.roomid).markRoomAsRead() } - Platform.MenuItem { + MenuItem { text: qsTr("Room settings") onTriggered: TimelineManager.openRoomSettings(roomContextMenu.roomid) } - Platform.MenuItem { + MenuItem { text: qsTr("Leave room") onTriggered: TimelineManager.openLeaveRoomDialog(roomContextMenu.roomid) } - Platform.MenuItem { + MenuItem { text: qsTr("Copy room link") onTriggered: Rooms.copyLink(roomContextMenu.roomid) } - Platform.Menu { + Menu { id: tagsMenu title: qsTr("Tag room as:") @@ -796,7 +794,7 @@ Page { Instantiator { model: Communities.tagsWithDefault - delegate: Platform.MenuItem { + delegate: MenuItem { property string t: modelData checkable: true @@ -820,7 +818,7 @@ Page { onObjectAdded: (index, object) => tagsMenu.insertItem(index, object) onObjectRemoved: (index, object) => tagsMenu.removeItem(object) } - Platform.MenuItem { + MenuItem { text: qsTr("Create new tag...") onTriggered: newTag.show() diff --git a/resources/qml/Root.qml b/resources/qml/Root.qml index f0a83a24..7ec8cce5 100644 --- a/resources/qml/Root.qml +++ b/resources/qml/Root.qml @@ -5,10 +5,10 @@ import "./dialogs" import "./pages" import "./ui" -import Qt.labs.platform 1.1 as Platform import QtQuick import QtQuick.Controls import QtQuick.Window +import QtQuick.Dialogs import im.nheko Pane { @@ -342,15 +342,13 @@ Pane { return UIA.submit3pidToken(t); } } - Platform.MessageDialog { + MessageDialog { id: uiaConfirmationLinkDialog - buttons: Platform.MessageDialog.Ok + buttons: MessageDialog.Ok text: qsTr("Wait for the confirmation link to arrive, then continue.") - // Broken on macos, see https://bugreports.qt.io/browse/QTBUG-102078 - //onAccepted: UIA.continue3pidReceived() - onOkClicked: UIA.continue3pidReceived() + onAccepted: UIA.continue3pidReceived() } Connections { function onConfirm3pidToken() { diff --git a/resources/qml/TopBar.qml b/resources/qml/TopBar.qml index 281f60d5..e8e90749 100644 --- a/resources/qml/TopBar.qml +++ b/resources/qml/TopBar.qml @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -import Qt.labs.platform 1.1 as Platform import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.2 @@ -237,26 +236,26 @@ Pane { onClicked: roomOptionsMenu.open(roomOptionsButton) - Platform.Menu { + Menu { id: roomOptionsMenu - Platform.MenuItem { + MenuItem { text: qsTr("Invite users") visible: room ? room.permissions.canInvite() : false onTriggered: TimelineManager.openInviteUsers(roomId) } - Platform.MenuItem { + MenuItem { text: qsTr("Members") onTriggered: TimelineManager.openRoomMembers(room) } - Platform.MenuItem { + MenuItem { text: qsTr("Leave room") onTriggered: TimelineManager.openLeaveRoomDialog(roomId) } - Platform.MenuItem { + MenuItem { text: qsTr("Settings") onTriggered: TimelineManager.openRoomSettings(roomId) diff --git a/resources/qml/components/SpaceMenuLevel.qml b/resources/qml/components/SpaceMenuLevel.qml index e35e5ddc..1c4c67f5 100644 --- a/resources/qml/components/SpaceMenuLevel.qml +++ b/resources/qml/components/SpaceMenuLevel.qml @@ -2,11 +2,11 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -import QtQuick 2.15 -import Qt.labs.platform 1.1 as Platform -import im.nheko 1.0 +import QtQuick +import QtQuick.Controls +import im.nheko -Platform.Menu { +Menu { id: spacesMenu property string roomid @@ -19,55 +19,60 @@ Platform.Menu { onAboutToShow: loadChildren = true //onAboutToHide: loadChildren = false - Platform.MenuItemGroup { + ButtonGroup { id: modificationGroup - visible: position != -1 + //visible: position != -1 } - Platform.MenuItem { + MenuItem { text: qsTr("Official community for this room") - group: modificationGroup + ButtonGroup.group: modificationGroup + visible: position != -1 checkable: true checked: spacesMenu.position >= 0 && (modelData.childValid && modelData.parentValid && modelData.canonical) enabled: spacesMenu.position >= 0 && (modelData.canEditChild && modelData.canEditParent) onTriggered: if (checked) Communities.updateSpaceStatus(modelData.roomid, spacesMenu.roomid, true, true, true) } - Platform.MenuItem { + MenuItem { text: qsTr("Affiliated community for this room") - group: modificationGroup + ButtonGroup.group: modificationGroup + visible: position != -1 checkable: true checked: spacesMenu.position >= 0 && (modelData.childValid && modelData.parentValid && !modelData.canonical) enabled: spacesMenu.position >= 0 && (modelData.canEditChild && modelData.canEditParent) onTriggered: if (checked) Communities.updateSpaceStatus(modelData.roomid, spacesMenu.roomid, true, true, false) } - Platform.MenuItem { + MenuItem { text: qsTr("Listed only for community members") - group: modificationGroup + ButtonGroup.group: modificationGroup + visible: position != -1 checkable: true checked: spacesMenu.position >= 0 && (modelData.childValid && !modelData.parentValid) enabled: spacesMenu.position >= 0 && ((modelData.canEditChild || modelData.childValid) && (!modelData.parentValid || modelData.canEditParent)) onTriggered: if (checked) Communities.updateSpaceStatus(modelData.roomid, spacesMenu.roomid, false, true, false) } - Platform.MenuItem { + MenuItem { text: qsTr("Listed only for room members") - group: modificationGroup + ButtonGroup.group: modificationGroup + visible: position != -1 checkable: true checked: spacesMenu.position >= 0 && (!modelData.childValid && modelData.parentValid) enabled: spacesMenu.position >= 0 && ((modelData.canEditChild) && (modelData.parentValid || modelData.canEditParent)) onTriggered: if (checked) Communities.updateSpaceStatus(modelData.roomid, spacesMenu.roomid, true, false, false) } - Platform.MenuItem { + MenuItem { text: qsTr("Not related") - group: modificationGroup + ButtonGroup.group: modificationGroup + visible: position != -1 checkable: true checked: spacesMenu.position >= 0 && (!modelData.childValid && !modelData.parentValid) enabled: spacesMenu.position >= 0 && ((modelData.canEditChild || !modelData.childValid) && (!modelData.parentValid || modelData.canEditParent)) onTriggered: if (checked) Communities.updateSpaceStatus(modelData.roomid, spacesMenu.roomid, false, false, false) } - Platform.MenuSeparator { - text: qsTr("Subcommunities") - group: modificationGroup + MenuSeparator { + //text: qsTr("Subcommunities") + ButtonGroup.group: modificationGroup visible: modificationGroup.visible && inst.model != undefined } diff --git a/resources/qml/dialogs/RoomSettingsDialog.qml b/resources/qml/dialogs/RoomSettingsDialog.qml index 4020f21c..283ad129 100644 --- a/resources/qml/dialogs/RoomSettingsDialog.qml +++ b/resources/qml/dialogs/RoomSettingsDialog.qml @@ -4,11 +4,11 @@ import ".." import "../ui" -import Qt.labs.platform 1.1 as Platform import QtQuick 2.15 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.2 import QtQuick.Window 2.13 +import QtQuick.Dialogs import im.nheko 1.0 ApplicationWindow { @@ -580,26 +580,23 @@ ApplicationWindow { Layout.alignment: Qt.AlignRight } - Platform.MessageDialog { + MessageDialog { id: confirmEncryptionDialog title: qsTr("End-to-End Encryption") text: qsTr(`Encryption is currently experimental and things might break unexpectedly.
Please take note that it can't be disabled afterwards.`) modality: Qt.NonModal - // Broken on macos, see https://bugreports.qt.io/browse/QTBUG-102078 - //onAccepted: { - onOkClicked: { + onAccepted: { if (roomSettings.isEncryptionEnabled) return ; roomSettings.enableEncryption(); } - //onRejected: { - onCancelClicked: { + onRejected: { encryptionToggle.checked = false; } - buttons: Platform.MessageDialog.Ok | Platform.MessageDialog.Cancel + buttons: MessageDialog.Ok | MessageDialog.Cancel } Label {