summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--resources/qml/CommunitiesList.qml33
-rw-r--r--resources/qml/Completer.qml16
-rw-r--r--resources/qml/MatrixTextField.qml11
-rw-r--r--resources/qml/MessageInput.qml20
-rw-r--r--resources/qml/MessageView.qml25
-rw-r--r--resources/qml/PrivacyScreen.qml16
-rw-r--r--resources/qml/QuickSwitcher.qml7
-rw-r--r--resources/qml/RoomList.qml66
-rw-r--r--resources/qml/Root.qml5
-rw-r--r--resources/qml/TimelineBubbleMessageStyle.qml9
-rw-r--r--resources/qml/TimelineDefaultMessageStyle.qml7
-rw-r--r--resources/qml/TimelineEvent.qml5
-rw-r--r--resources/qml/TimelineMetadata.qml26
-rw-r--r--resources/qml/TimelineSectionHeader.qml2
-rw-r--r--resources/qml/TimelineView.qml16
-rw-r--r--resources/qml/ToggleButton.qml12
-rw-r--r--resources/qml/device-verification/EmojiElement.qml8
-rw-r--r--resources/qml/dialogs/AliasEditor.qml1
-rw-r--r--resources/qml/dialogs/AllowedRoomsSettingsDialog.qml12
-rw-r--r--resources/qml/dialogs/ConfirmJoinRoomDialog.qml5
-rw-r--r--resources/qml/dialogs/CreateDirect.qml11
-rw-r--r--resources/qml/dialogs/ImagePackEditorDialog.qml8
-rw-r--r--resources/qml/dialogs/ImagePackSettingsDialog.qml8
-rw-r--r--resources/qml/dialogs/InviteDialog.qml10
-rw-r--r--resources/qml/dialogs/LeaveRoomDialog.qml6
-rw-r--r--resources/qml/dialogs/LogoutDialog.qml5
-rw-r--r--resources/qml/dialogs/PowerLevelEditor.qml2
-rw-r--r--resources/qml/dialogs/PowerLevelSpacesApplyDialog.qml12
-rw-r--r--resources/qml/dialogs/ReadReceipts.qml4
-rw-r--r--resources/qml/dialogs/RoomDirectory.qml8
-rw-r--r--resources/qml/dialogs/RoomMembers.qml9
-rw-r--r--resources/qml/dialogs/RoomSettingsDialog.qml4
-rw-r--r--resources/qml/dialogs/UserProfile.qml9
-rw-r--r--resources/qml/pages/LoginPage.qml8
-rw-r--r--resources/qml/pages/RegisterPage.qml12
-rw-r--r--resources/qml/pages/UserSettingsPage.qml2
-rw-r--r--resources/qml/pages/WelcomePage.qml4
-rw-r--r--resources/qml/voip/ActiveCallBar.qml48
-rw-r--r--resources/qml/voip/CallInviteBar.qml10
39 files changed, 198 insertions, 284 deletions
diff --git a/resources/qml/CommunitiesList.qml b/resources/qml/CommunitiesList.qml
index 53578cd0..c9f259e2 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 "./dialogs"
 import Qt.labs.platform 1.1 as Platform
 import QtQml
 import QtQuick
@@ -71,12 +70,13 @@ Page {
                     when: (communityItem.hovered || model.hidden) && !(Communities.currentTagId === model.id)
 
                     PropertyChanges {
-                        backgroundColor: palette.dark
-                        bubbleBackground: palette.highlight
-                        bubbleText: palette.highlightedText
-                        importantText: palette.brightText
-                        target: communityItem
-                        unimportantText: palette.brightText
+                        communityItem {
+                            backgroundColor: palette.dark
+                            bubbleBackground: palette.highlight
+                            bubbleText: palette.highlightedText
+                            importantText: palette.brightText
+                            unimportantText: palette.brightText
+                        }
                     }
                 },
                 State {
@@ -84,12 +84,13 @@ Page {
                     when: Communities.currentTagId == model.id
 
                     PropertyChanges {
-                        backgroundColor: palette.highlight
-                        bubbleBackground: palette.highlightedText
-                        bubbleText: palette.highlight
-                        importantText: palette.highlightedText
-                        target: communityItem
-                        unimportantText: palette.highlightedText
+                        communityItem {
+                            backgroundColor: palette.highlight
+                            bubbleBackground: palette.highlightedText
+                            bubbleText: palette.highlight
+                            importantText: palette.highlightedText
+                            unimportantText: palette.highlightedText
+                        }
                     }
                 }
             ]
@@ -123,11 +124,9 @@ Page {
                     ToolTip.delay: Nheko.tooltipDelay
                     ToolTip.text: model.collapsed ? qsTr("Expand") : qsTr("Collapse")
                     ToolTip.visible: hovered
-                    height: fontMetrics.lineSpacing
                     hoverEnabled: true
                     image: model.collapsed ? ":/icons/icons/ui/collapsed.svg" : ":/icons/icons/ui/expanded.svg"
                     visible: !communitySidebar.collapsed && model.collapsible
-                    width: fontMetrics.lineSpacing
 
                     onClicked: model.collapsed = !model.collapsed
                 }
@@ -142,7 +141,7 @@ Page {
                     color: communityItem.backgroundColor
                     displayName: model.displayName
                     enabled: false
-                    height: avatarSize
+                    Layout.preferredHeight: avatarSize
                     roomid: model.id
                     textColor: model.avatarUrl?.startsWith(":/") == true ? communityItem.unimportantText : communityItem.importantText
                     url: {
@@ -153,7 +152,7 @@ Page {
                         else
                             return "";
                     }
-                    width: avatarSize
+                    Layout.preferredWidth: avatarSize
 
                     NotificationBubble {
                         anchors.bottom: avatar.bottom
diff --git a/resources/qml/Completer.qml b/resources/qml/Completer.qml
index 9ebe0a40..d8205988 100644
--- a/resources/qml/Completer.qml
+++ b/resources/qml/Completer.qml
@@ -151,10 +151,10 @@ Control {
                         Avatar {
                             displayName: model.displayName
                             enabled: false
-                            height: popup.avatarHeight
+                            Layout.preferredHeight: popup.avatarHeight
+                            Layout.preferredWidth: popup.avatarWidth
                             url: model.avatarUrl.replace("mxc://", "image://MxcImage/")
                             userid: model.userid
-                            width: popup.avatarWidth
                         }
                         Label {
                             color: model.index == popup.currentIndex ? palette.highlightedText : palette.text
@@ -183,11 +183,11 @@ Control {
                             crop: false
                             displayName: model.shortcode
                             enabled: false
-                            height: popup.avatarHeight
+                            Layout.preferredHeight: popup.avatarHeight
                             //userid: model.shortcode
                             url: (model.url ? model.url : "").replace("mxc://", "image://MxcImage/")
                             visible: !model.unicode
-                            width: popup.avatarWidth
+                            Layout.preferredWidth: popup.avatarWidth
                         }
                         Label {
                             Layout.leftMargin: Nheko.paddingSmall
@@ -229,10 +229,10 @@ Control {
                         Avatar {
                             displayName: model.roomName
                             enabled: false
-                            height: popup.avatarHeight
+                            Layout.preferredHeight: popup.avatarHeight
                             roomid: model.roomid
                             url: model.avatarUrl.replace("mxc://", "image://MxcImage/")
-                            width: popup.avatarWidth
+                            Layout.preferredWidth: popup.avatarWidth
                         }
                         Label {
                             color: model.index == popup.currentIndex ? palette.highlightedText : palette.text
@@ -253,10 +253,10 @@ Control {
                         Avatar {
                             displayName: model.roomName
                             enabled: false
-                            height: popup.avatarHeight
+                            Layout.preferredHeight: popup.avatarHeight
                             roomid: model.roomid
                             url: model.avatarUrl.replace("mxc://", "image://MxcImage/")
-                            width: popup.avatarWidth
+                            Layout.preferredWidth: popup.avatarWidth
                         }
                         Label {
                             color: model.index == popup.currentIndex ? palette.highlightedText : palette.text
diff --git a/resources/qml/MatrixTextField.qml b/resources/qml/MatrixTextField.qml
index 7209a5aa..4ceadf6c 100644
--- a/resources/qml/MatrixTextField.qml
+++ b/resources/qml/MatrixTextField.qml
@@ -69,12 +69,10 @@ ColumnLayout {
                 name: "focused"
 
                 PropertyChanges {
-                    target: labelC
-                    y: 0
+                    labelC.y: 0
                 }
                 PropertyChanges {
-                    opacity: 1
-                    target: input
+                    input.opacity: 1
                 }
             }
             transitions: Transition {
@@ -143,7 +141,7 @@ ColumnLayout {
 
         Layout.fillWidth: true
         color: palette.highlight
-        height: 1
+        Layout.preferredHeight: 1
 
         Rectangle {
             id: blackBar
@@ -159,8 +157,7 @@ ColumnLayout {
                 when: input.activeFocus == true
 
                 PropertyChanges {
-                    target: blackBar
-                    width: blueBar.width
+                    blackBar.width: blueBar.width
                 }
             }
             transitions: Transition {
diff --git a/resources/qml/MessageInput.qml b/resources/qml/MessageInput.qml
index a1d3ac7b..37793751 100644
--- a/resources/qml/MessageInput.qml
+++ b/resources/qml/MessageInput.qml
@@ -46,12 +46,12 @@ Rectangle {
             Layout.margins: 8
             ToolTip.text: CallManager.isOnCall ? qsTr("Hang up") : (CallManager.isOnCallOnOtherDevice ? qsTr("Already on a call") : qsTr("Place a call"))
             ToolTip.visible: hovered
-            height: 22
+            Layout.preferredHeight: 22
             hoverEnabled: true
             image: CallManager.isOnCall ? ":/icons/icons/ui/end-call.svg" : ":/icons/icons/ui/place-call.svg"
             opacity: (CallManager.haveCallInvite || CallManager.isOnCallOnOtherDevice) ? 0.3 : 1
             visible: CallManager.callsSupported && showAllButtons
-            width: 22
+            Layout.preferredWidth: 22
 
             onClicked: {
                 if (room) {
@@ -74,11 +74,11 @@ Rectangle {
             Layout.margins: 8
             ToolTip.text: qsTr("Send a file")
             ToolTip.visible: hovered
-            height: 22
+            Layout.preferredHeight: 22
             hoverEnabled: true
             image: ":/icons/icons/ui/attach.svg"
             visible: showAllButtons
-            width: 22
+            Layout.preferredWidth: 22
 
             onClicked: room.input.openFileSelection()
 
@@ -395,11 +395,11 @@ Rectangle {
             Layout.margins: 8
             ToolTip.text: qsTr("Stickers")
             ToolTip.visible: hovered
-            height: 22
+            Layout.preferredHeight: 22
             hoverEnabled: true
             image: ":/icons/icons/ui/sticky-note-solid.svg"
             visible: showAllButtons
-            width: 22
+            Layout.preferredWidth: 22
 
             onClicked: stickerPopup.visible ? stickerPopup.close() : stickerPopup.show(stickerButton, room.roomId, function (row) {
                     room.input.sticker(row);
@@ -419,10 +419,10 @@ Rectangle {
             Layout.margins: 8
             ToolTip.text: qsTr("Emoji")
             ToolTip.visible: hovered
-            height: 22
+            Layout.preferredHeight: 22
             hoverEnabled: true
             image: ":/icons/icons/ui/smile.svg"
-            width: 22
+            Layout.preferredWidth: 22
 
             onClicked: emojiPopup.visible ? emojiPopup.close() : emojiPopup.show(emojiButton, room.roomId, function (plaintext, markdown) {
                     messageInput.insert(messageInput.cursorPosition, markdown);
@@ -441,10 +441,10 @@ Rectangle {
             Layout.rightMargin: 8
             ToolTip.text: qsTr("Send")
             ToolTip.visible: hovered
-            height: 22
+            Layout.preferredHeight: 22
             hoverEnabled: true
             image: ":/icons/icons/ui/send.svg"
-            width: 22
+            Layout.preferredWidth: 22
 
             onClicked: {
                 room.input.send();
diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml
index 80ec87c2..97a121eb 100644
--- a/resources/qml/MessageView.qml
+++ b/resources/qml/MessageView.qml
@@ -2,9 +2,6 @@
 //
 // SPDX-License-Identifier: GPL-3.0-or-later
 
-import "./components"
-import "./delegates"
-import "./emoji"
 import "./ui"
 import "./dialogs"
 import Qt.labs.platform 1.1 as Platform
@@ -186,8 +183,6 @@ Item {
                             visible: !button.showImage
                         }
                         Image {
-                            id: buttonImg
-
                             // Workaround, can't get icon.source working for now...
                             anchors.fill: parent
                             fillMode: Image.PreserveAspectFit
@@ -212,7 +207,7 @@ Item {
                     hoverEnabled: true
                     image: ":/icons/icons/ui/edit.svg"
                     visible: !!row.model && row.model.isEditable
-                    width: 16
+                    Layout.preferredWidth: 16
 
                     onClicked: {
                         if (row.model.isEditable)
@@ -228,7 +223,7 @@ Item {
                     hoverEnabled: true
                     image: ":/icons/icons/ui/smile-add.svg"
                     visible: room ? room.permissions.canSend(MtxEvent.Reaction) : false
-                    width: 16
+                    Layout.preferredWidth: 16
 
                     onClicked: emojiPopup.visible ? emojiPopup.close() : emojiPopup.show(reactButton, room.roomId, function (plaintext, markdown) {
                             var event_id = row.model ? row.model.eventId : "";
@@ -243,7 +238,7 @@ Item {
                     hoverEnabled: true
                     image: (row.model && row.model.threadId) ? ":/icons/icons/ui/thread.svg" : ":/icons/icons/ui/new-thread.svg"
                     visible: room ? room.permissions.canSend(MtxEvent.TextMessage) : false
-                    width: 16
+                    Layout.preferredWidth: 16
 
                     onClicked: room.thread = (row.model.threadId || row.model.eventId)
                 }
@@ -254,7 +249,7 @@ Item {
                     hoverEnabled: true
                     image: ":/icons/icons/ui/reply.svg"
                     visible: room ? room.permissions.canSend(MtxEvent.TextMessage) : false
-                    width: 16
+                    Layout.preferredWidth: 16
 
                     onClicked: room.reply = row.model.eventId
                 }
@@ -266,7 +261,7 @@ Item {
                     hoverEnabled: true
                     image: ":/icons/icons/ui/go-to.svg"
                     visible: !!row.model && filteredTimeline.filterByContent
-                    width: 16
+                    Layout.preferredWidth: 16
 
                     onClicked: {
                         topBar.searchString = "";
@@ -281,7 +276,7 @@ Item {
                     ToolTip.visible: hovered
                     hoverEnabled: true
                     image: ":/icons/icons/ui/options.svg"
-                    width: 16
+                    Layout.preferredWidth: 16
 
                     onClicked: messageContextMenuC.show(row.model.eventId, row.model.threadId, row.model.type, row.model.isSender, row.model.isEncrypted, row.model.isEditable, "", row.model.body, optionsButton)
                 }
@@ -624,8 +619,7 @@ Item {
                 name: ""
 
                 PropertyChanges {
-                    target: toEndButton
-                    width: 0
+                    toEndButton.width: 0
                 }
             },
             State {
@@ -633,8 +627,7 @@ Item {
                 when: !chat.atYEnd
 
                 PropertyChanges {
-                    target: toEndButton
-                    width: toEndButton.fullWidth
+                    toEndButton.width: toEndButton.fullWidth
                 }
             }
         ]
@@ -668,8 +661,6 @@ Item {
             rightMargin: Nheko.paddingMedium + (fullWidth - width) / 2
         }
         Image {
-            id: buttonImg
-
             anchors.fill: parent
             anchors.margins: Nheko.paddingMedium
             fillMode: Image.PreserveAspectFit
diff --git a/resources/qml/PrivacyScreen.qml b/resources/qml/PrivacyScreen.qml
index a3539df7..764bdf62 100644
--- a/resources/qml/PrivacyScreen.qml
+++ b/resources/qml/PrivacyScreen.qml
@@ -50,24 +50,16 @@ Item {
                 name: "Visible"
 
                 PropertyChanges {
-                    target: screenSaver
-                    visible: true
-                }
-                PropertyChanges {
-                    opacity: 1
-                    target: screenSaver
+                    screenSaver.visible: true
+                    screenSaver.opacity: 1
                 }
             },
             State {
                 name: "Invisible"
 
                 PropertyChanges {
-                    opacity: 0
-                    target: screenSaver
-                }
-                PropertyChanges {
-                    target: screenSaver
-                    visible: false
+                    screenSaver.opacity: 0
+                    screenSaver.visible: false
                 }
             }
         ]
diff --git a/resources/qml/QuickSwitcher.qml b/resources/qml/QuickSwitcher.qml
index 67718ecb..10b9bf25 100644
--- a/resources/qml/QuickSwitcher.qml
+++ b/resources/qml/QuickSwitcher.qml
@@ -2,10 +2,9 @@
 //
 // SPDX-License-Identifier: GPL-3.0-or-later
 
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQuick.Layouts 1.15
-import im.nheko 1.0
+import QtQuick
+import QtQuick.Controls
+import im.nheko
 
 Popup {
     id: quickSwitcher
diff --git a/resources/qml/RoomList.qml b/resources/qml/RoomList.qml
index 0f8dc24a..350b3846 100644
--- a/resources/qml/RoomList.qml
+++ b/resources/qml/RoomList.qml
@@ -27,7 +27,7 @@ Page {
         Rectangle {
             Layout.fillWidth: true
             color: Nheko.theme.separator
-            height: 1
+            Layout.preferredHeight: 1
         }
         Pane {
             Layout.alignment: Qt.AlignBottom
@@ -48,10 +48,10 @@ Page {
                     ToolTip.delay: Nheko.tooltipDelay
                     ToolTip.text: qsTr("Start a new chat")
                     ToolTip.visible: hovered
-                    height: 22
+                    Layout.preferredHeight: 22
+                    Layout.preferredWidth: 22
                     hoverEnabled: true
                     image: ":/icons/icons/ui/add-square-button.svg"
-                    width: 22
 
                     onClicked: roomJoinCreateMenu.open(parent)
 
@@ -100,11 +100,11 @@ Page {
                     ToolTip.delay: Nheko.tooltipDelay
                     ToolTip.text: qsTr("Room directory")
                     ToolTip.visible: hovered
-                    height: 22
+                    Layout.preferredHeight: 22
+                    Layout.preferredWidth: 22
                     hoverEnabled: true
                     image: ":/icons/icons/ui/room-directory.svg"
                     visible: !collapsed
-                    width: 22
 
                     onClicked: {
                         var win = roomDirectoryComponent.createObject(timelineRoot);
@@ -118,12 +118,12 @@ Page {
                     ToolTip.delay: Nheko.tooltipDelay
                     ToolTip.text: qsTr("Search rooms (Ctrl+K)")
                     ToolTip.visible: hovered
-                    height: 22
+                    Layout.preferredHeight: 22
+                    Layout.preferredWidth: 22
                     hoverEnabled: true
                     image: ":/icons/icons/ui/search.svg"
                     ripple: false
                     visible: !collapsed
-                    width: 22
 
                     onClicked: {
                         var component = Qt.createComponent("qrc:/resources/qml/QuickSwitcher.qml");
@@ -142,12 +142,12 @@ Page {
                     ToolTip.delay: Nheko.tooltipDelay
                     ToolTip.text: qsTr("User settings")
                     ToolTip.visible: hovered
-                    height: 22
+                    Layout.preferredHeight: 22
+                    Layout.preferredWidth: 22
                     hoverEnabled: true
                     image: ":/icons/icons/ui/settings.svg"
                     ripple: false
                     visible: !collapsed
-                    width: 22
 
                     onClicked: mainWindow.push(userSettingsPage)
                 }
@@ -191,7 +191,7 @@ Page {
                 spacing: Nheko.paddingMedium
 
                 Avatar {
-                    id: avatar
+                    id: headerAvatar
 
                     Layout.alignment: Qt.AlignVCenter
                     Layout.preferredHeight: fontMetrics.lineSpacing * 2
@@ -206,10 +206,9 @@ Page {
 
                     Layout.alignment: Qt.AlignLeft
                     Layout.fillWidth: true
-                    Layout.preferredWidth: parent.width - avatar.width - logoutButton.width - Nheko.paddingMedium * 2
+                    Layout.preferredWidth: parent.width - headerAvatar.width - logoutButton.width - Nheko.paddingMedium * 2
                     spacing: 0
                     visible: !collapsed
-                    width: parent.width - avatar.width - logoutButton.width - Nheko.paddingMedium * 2
 
                     ElidedLabel {
                         Layout.alignment: Qt.AlignBottom
@@ -321,7 +320,7 @@ Page {
         Rectangle {
             Layout.fillWidth: true
             color: Nheko.theme.separator
-            height: 2
+            Layout.preferredHeight: 2
         }
         Rectangle {
             id: unverifiedStuffBubble
@@ -371,10 +370,10 @@ Page {
                     ToolTip.delay: Nheko.tooltipDelay
                     ToolTip.text: qsTr("Close")
                     ToolTip.visible: closeUnverifiedBubble.hovered
-                    height: fontMetrics.font.pixelSize
+                    Layout.preferredHeight: fontMetrics.font.pixelSize
                     hoverEnabled: true
                     image: ":/icons/icons/ui/dismiss.svg"
-                    width: fontMetrics.font.pixelSize
+                    Layout.preferredWidth: fontMetrics.font.pixelSize
 
                     onClicked: unverifiedStuffBubble.visible = false
                 }
@@ -400,7 +399,7 @@ Page {
         Rectangle {
             Layout.fillWidth: true
             color: Nheko.theme.separator
-            height: 1
+            Layout.preferredHeight: 1
             visible: unverifiedStuffBubble.visible
         }
     }
@@ -485,12 +484,13 @@ Page {
                     when: roomItem.hovered && !((Rooms.currentRoom && roomId == Rooms.currentRoom.roomId) || Rooms.currentRoomPreview.roomid == roomId)
 
                     PropertyChanges {
-                        backgroundColor: palette.dark
-                        bubbleBackground: palette.highlight
-                        bubbleText: palette.highlightedText
-                        importantText: palette.brightText
-                        target: roomItem
-                        unimportantText: palette.brightText
+                        roomItem {
+                            backgroundColor: palette.dark
+                            bubbleBackground: palette.highlight
+                            bubbleText: palette.highlightedText
+                            importantText: palette.brightText
+                            unimportantText: palette.brightText
+                        }
                     }
                 },
                 State {
@@ -498,12 +498,13 @@ Page {
                     when: (Rooms.currentRoom && roomId == Rooms.currentRoom.roomId) || Rooms.currentRoomPreview.roomid == roomId
 
                     PropertyChanges {
-                        backgroundColor: palette.highlight
-                        bubbleBackground: palette.highlightedText
-                        bubbleText: palette.highlight
-                        importantText: palette.highlightedText
-                        target: roomItem
-                        unimportantText: palette.highlightedText
+                        roomItem {
+                            backgroundColor: palette.highlight
+                            bubbleBackground: palette.highlightedText
+                            bubbleText: palette.highlight
+                            importantText: palette.highlightedText
+                            unimportantText: palette.highlightedText
+                        }
                     }
                 }
             ]
@@ -551,11 +552,11 @@ Page {
                     Layout.alignment: Qt.AlignVCenter
                     displayName: roomName
                     enabled: false
-                    height: avatarSize
                     roomid: roomId
                     url: avatarUrl.replace("mxc://", "image://MxcImage/")
                     userid: isDirect ? directChatOtherUserId : ""
-                    width: avatarSize
+                    Layout.preferredWidth: avatarSize
+                    Layout.preferredHeight: avatarSize
 
                     NotificationBubble {
                         id: collapsedNotificationBubble
@@ -575,11 +576,10 @@ Page {
 
                     Layout.alignment: Qt.AlignLeft
                     Layout.minimumWidth: 100
-                    Layout.preferredWidth: parent.width - avatar.width
-                    height: avatar.height
+                    Layout.preferredWidth: roomItem.width - avatar.width
+                    Layout.preferredHeight: avatar.height
                     spacing: Nheko.paddingSmall
                     visible: !collapsed
-                    width: roomItem.width - avatar.width
 
                     Item {
                         id: titleRow
diff --git a/resources/qml/Root.qml b/resources/qml/Root.qml
index 2b1454e4..4acf3e73 100644
--- a/resources/qml/Root.qml
+++ b/resources/qml/Root.qml
@@ -2,17 +2,12 @@
 //
 // SPDX-License-Identifier: GPL-3.0-or-later
 
-import "./delegates"
-import "./device-verification"
 import "./dialogs"
-import "./emoji"
 import "./pages"
-import "./voip"
 import "./ui"
 import Qt.labs.platform 1.1 as Platform
 import QtQuick
 import QtQuick.Controls
-import QtQuick.Layouts
 import QtQuick.Window
 import im.nheko
 
diff --git a/resources/qml/TimelineBubbleMessageStyle.qml b/resources/qml/TimelineBubbleMessageStyle.qml
index 2df3d917..6ca5c8e1 100644
--- a/resources/qml/TimelineBubbleMessageStyle.qml
+++ b/resources/qml/TimelineBubbleMessageStyle.qml
@@ -2,15 +2,8 @@
 //
 // SPDX-License-Identifier: GPL-3.0-or-later
 
-import "./components"
-import "./delegates"
-import "./emoji"
-import "./ui"
-import "./dialogs"
-import Qt.labs.platform 1.1 as Platform
 import QtQuick
 import QtQuick.Controls
-import QtQuick.Layouts
 import QtQuick.Window
 import im.nheko
 
@@ -165,7 +158,7 @@ TimelineEvent {
             AbstractButton {
                 id: messageBubble
 
-                anchors.left: (wrapper.isStateEvent || wrapper.isSender) ? undefined : parent.left
+                anchors.left: (wrapper.isStateEvent || wrapper.isSender) ? undefined : parent.left // qmllint disable Quick.anchor-combinations
                 anchors.right: (wrapper.isStateEvent || !wrapper.isSender) ? undefined : parent.right
                 anchors.horizontalCenter: wrapper.isStateEvent ? parent.horizontalCenter : undefined
 
diff --git a/resources/qml/TimelineDefaultMessageStyle.qml b/resources/qml/TimelineDefaultMessageStyle.qml
index e9a0712d..f09fbc79 100644
--- a/resources/qml/TimelineDefaultMessageStyle.qml
+++ b/resources/qml/TimelineDefaultMessageStyle.qml
@@ -2,15 +2,8 @@
 //
 // SPDX-License-Identifier: GPL-3.0-or-later
 
-import "./components"
-import "./delegates"
-import "./emoji"
-import "./ui"
-import "./dialogs"
-import Qt.labs.platform 1.1 as Platform
 import QtQuick
 import QtQuick.Controls
-import QtQuick.Layouts
 import QtQuick.Window
 import im.nheko
 
diff --git a/resources/qml/TimelineEvent.qml b/resources/qml/TimelineEvent.qml
index ed6eb87e..c6f432ee 100644
--- a/resources/qml/TimelineEvent.qml
+++ b/resources/qml/TimelineEvent.qml
@@ -2,12 +2,7 @@
 //
 // SPDX-License-Identifier: GPL-3.0-or-later
 
-import "./components"
 import "./delegates"
-import "./emoji"
-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
diff --git a/resources/qml/TimelineMetadata.qml b/resources/qml/TimelineMetadata.qml
index d57c56d9..0085b950 100644
--- a/resources/qml/TimelineMetadata.qml
+++ b/resources/qml/TimelineMetadata.qml
@@ -2,12 +2,6 @@
 //
 // SPDX-License-Identifier: GPL-3.0-or-later
 
-import "./components"
-import "./delegates"
-import "./emoji"
-import "./ui"
-import "./dialogs"
-import Qt.labs.platform 1.1 as Platform
 import QtQuick
 import QtQuick.Controls
 import QtQuick.Layouts
@@ -33,24 +27,22 @@ RowLayout {
 
     StatusIndicator {
         Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
+        Layout.preferredHeight: parent.iconSize
+        Layout.preferredWidth: parent.iconSize
         eventId: metadata.eventId
-        height: parent.iconSize
         status: metadata.status
-        width: parent.iconSize
     }
     Image {
         Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
+        Layout.preferredHeight: parent.iconSize
+        Layout.preferredWidth: parent.iconSize
         ToolTip.delay: Nheko.tooltipDelay
         ToolTip.text: qsTr("Edited")
         ToolTip.visible: editHovered.hovered
-        height: parent.iconSize
         source: "image://colorimage/:/icons/icons/ui/edit.svg?" + ((metadata.eventId == metadata.room.edit) ? palette.highlight : palette.buttonText)
         sourceSize.height: parent.iconSize * Screen.devicePixelRatio
         sourceSize.width: parent.iconSize * Screen.devicePixelRatio
         visible: metadata.isEdited || metadata.eventId == metadata.room.edit
-        width: parent.iconSize
-        Layout.preferredWidth: parent.iconSize
-        Layout.preferredHeight: parent.iconSize
         HoverHandler {
             id: editHovered
 
@@ -58,28 +50,26 @@ RowLayout {
     }
     ImageButton {
         Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
+        Layout.preferredHeight: parent.iconSize
+        Layout.preferredWidth: parent.iconSize
         ToolTip.delay: Nheko.tooltipDelay
         ToolTip.text: qsTr("Part of a thread")
         ToolTip.visible: hovered
         buttonTextColor: TimelineManager.userColor(metadata.threadId, palette.base)
-        height: parent.iconSize
         image: ":/icons/icons/ui/thread.svg"
         visible: metadata.threadId
-        width: parent.iconSize
 
         onClicked: metadata.room.thread = threadId
     }
     EncryptionIndicator {
         Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
+        Layout.preferredHeight: parent.iconSize
+        Layout.preferredWidth: parent.iconSize
         encrypted: metadata.isEncrypted
-        height: parent.iconSize
         sourceSize.height: parent.iconSize * Screen.devicePixelRatio
         sourceSize.width: parent.iconSize * Screen.devicePixelRatio
         trust: metadata.trustlevel
         visible: metadata.room.isEncrypted
-        width: parent.iconSize
-        Layout.preferredWidth: parent.iconSize
-        Layout.preferredHeight: parent.iconSize
     }
     Label {
         id: ts
diff --git a/resources/qml/TimelineSectionHeader.qml b/resources/qml/TimelineSectionHeader.qml
index 9376d8f5..99fc1ad9 100644
--- a/resources/qml/TimelineSectionHeader.qml
+++ b/resources/qml/TimelineSectionHeader.qml
@@ -2,10 +2,8 @@
 //
 // SPDX-License-Identifier: GPL-3.0-or-later
 
-import Qt.labs.platform as Platform
 import QtQuick
 import QtQuick.Controls
-import QtQuick.Layouts
 import QtQuick.Window
 import im.nheko
 
diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index 8db866df..006eb57f 100644
--- a/resources/qml/TimelineView.qml
+++ b/resources/qml/TimelineView.qml
@@ -3,16 +3,12 @@
 // SPDX-License-Identifier: GPL-3.0-or-later
 
 import "./components"
-import "./delegates"
-import "./device-verification"
 import "./emoji"
 import "./ui"
 import "./voip"
-import Qt.labs.platform as Platform
 import QtQuick
 import QtQuick.Controls
 import QtQuick.Layouts
-import QtQuick.Particles
 import QtQuick.Window
 import im.nheko
 
@@ -90,7 +86,7 @@ Item {
         Rectangle {
             Layout.fillWidth: true
             color: Nheko.theme.separator
-            height: 1
+            implicitHeight: 1
             z: 3
         }
         Rectangle {
@@ -146,7 +142,7 @@ Item {
         Rectangle {
             Layout.fillWidth: true
             color: Nheko.theme.separator
-            height: 1
+            implicitHeight: 1
             z: 3
         }
         UploadBox {
@@ -191,10 +187,10 @@ Item {
             Layout.alignment: Qt.AlignHCenter
             displayName: parent.roomName
             enabled: false
-            height: 130
+            implicitHeight: 130
             roomid: parent.roomId
             url: parent.avatarUrl.replace("mxc://", "image://MxcImage/")
-            width: 130
+            implicitWidth: 130
         }
         RowLayout {
             Layout.alignment: Qt.AlignHCenter
@@ -296,11 +292,11 @@ Item {
                 Layout.alignment: Qt.AlignHCenter
                 displayName: roomPreview?.inviterDisplayName ?? ""
                 enabled: true
-                height: 48
+                implicitHeight: 48
                 roomid: preview.roomId
                 url: (roomPreview?.inviterAvatarUrl ?? "").replace("mxc://", "image://MxcImage/")
                 userid: roomPreview?.inviterUserId ?? ""
-                width: 48
+                implicitWidth: 48
 
                 onClicked: TimelineManager.openGlobalUserProfile(roomPreview.inviterUserId)
             }
diff --git a/resources/qml/ToggleButton.qml b/resources/qml/ToggleButton.qml
index f3bd5cce..f48fcb68 100644
--- a/resources/qml/ToggleButton.qml
+++ b/resources/qml/ToggleButton.qml
@@ -46,24 +46,20 @@ Switch {
             name: "off"
 
             PropertyChanges {
-                border.color: "#767676"
-                target: track
+                track.border.color: "#767676"
             }
             PropertyChanges {
-                target: handle
-                x: 0
+                handle.x: 0
             }
         },
         State {
             name: "on"
 
             PropertyChanges {
-                border.color: palette.highlight
-                target: track
+                track.border.color: palette.highlight
             }
             PropertyChanges {
-                target: handle
-                x: indicatorItem.width - handle.width
+                handle.x: indicatorItem.width - handle.width
             }
         }
     ]
diff --git a/resources/qml/device-verification/EmojiElement.qml b/resources/qml/device-verification/EmojiElement.qml
index d32f93c1..519b4a8e 100644
--- a/resources/qml/device-verification/EmojiElement.qml
+++ b/resources/qml/device-verification/EmojiElement.qml
@@ -2,9 +2,9 @@
 //
 // SPDX-License-Identifier: GPL-3.0-or-later
 
-import QtQuick 2.3
-import QtQuick.Controls 2.3
-import QtQuick.Layouts 1.10
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
 
 Rectangle {
     color: "red"
@@ -21,7 +21,7 @@ Rectangle {
         anchors.bottom: parent.bottom
 
         Label {
-            height: font.pixelSize * 2
+            Layout.preferredHeight: font.pixelSize * 2
             Layout.alignment: Qt.AlignHCenter
             text: col.emoji.emoji
             font.pixelSize: Qt.application.font.pixelSize * 2
diff --git a/resources/qml/dialogs/AliasEditor.qml b/resources/qml/dialogs/AliasEditor.qml
index df2938ef..82f12750 100644
--- a/resources/qml/dialogs/AliasEditor.qml
+++ b/resources/qml/dialogs/AliasEditor.qml
@@ -3,7 +3,6 @@
 // SPDX-License-Identifier: GPL-3.0-or-later
 
 import ".."
-import "../components"
 import QtQuick
 import QtQuick.Controls
 import QtQuick.Layouts
diff --git a/resources/qml/dialogs/AllowedRoomsSettingsDialog.qml b/resources/qml/dialogs/AllowedRoomsSettingsDialog.qml
index 89ea5e04..82b5506e 100644
--- a/resources/qml/dialogs/AllowedRoomsSettingsDialog.qml
+++ b/resources/qml/dialogs/AllowedRoomsSettingsDialog.qml
@@ -3,13 +3,11 @@
 // SPDX-License-Identifier: GPL-3.0-or-later
 
 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 im.nheko 1.0
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import QtQuick.Window
+import im.nheko
 
 ApplicationWindow {
     id: allowedDialog
diff --git a/resources/qml/dialogs/ConfirmJoinRoomDialog.qml b/resources/qml/dialogs/ConfirmJoinRoomDialog.qml
index a3fb9831..eb33cfc3 100644
--- a/resources/qml/dialogs/ConfirmJoinRoomDialog.qml
+++ b/resources/qml/dialogs/ConfirmJoinRoomDialog.qml
@@ -4,7 +4,6 @@
 
 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
@@ -39,8 +38,8 @@ ApplicationWindow {
             url: summary.roomAvatarUrl.replace("mxc://", "image://MxcImage/")
             roomid: summary.roomid
             displayName: summary.roomName
-            height: 130
-            width: 130
+            Layout.preferredHeight: 130
+            Layout.preferredWidth: 130
             Layout.alignment: Qt.AlignHCenter
         }
 
diff --git a/resources/qml/dialogs/CreateDirect.qml b/resources/qml/dialogs/CreateDirect.qml
index 75013970..d411c5f2 100644
--- a/resources/qml/dialogs/CreateDirect.qml
+++ b/resources/qml/dialogs/CreateDirect.qml
@@ -3,12 +3,11 @@
 // SPDX-License-Identifier: GPL-3.0-or-later
 
 import ".."
-import QtQuick 2.15
-import QtQuick.Window 2.13
-import QtQuick.Layouts 1.3
-import QtQuick.Controls 2.3
-import QtQml.Models 2.15
-import im.nheko 1.0
+import QtQuick
+import QtQuick.Window
+import QtQuick.Layouts
+import QtQuick.Controls
+import im.nheko
 
 ApplicationWindow {
     id: createDirectRoot
diff --git a/resources/qml/dialogs/ImagePackEditorDialog.qml b/resources/qml/dialogs/ImagePackEditorDialog.qml
index 4cb2c1f6..9416ec97 100644
--- a/resources/qml/dialogs/ImagePackEditorDialog.qml
+++ b/resources/qml/dialogs/ImagePackEditorDialog.qml
@@ -137,8 +137,8 @@ ApplicationWindow {
                         url: imagePack.avatarUrl.replace("mxc://", "image://MxcImage/")
                         displayName: imagePack.packname
                         roomid: imagePack.statekey
-                        height: 130
-                        width: 130
+                        Layout.preferredHeight: 130
+                        Layout.preferredWidth: 130
                         crop: false
                         Layout.alignment: Qt.AlignHCenter
 
@@ -238,8 +238,8 @@ ApplicationWindow {
                         url: imagePack.data(imagePack.index(currentImageIndex, 0), SingleImagePackModel.Url).replace("mxc://", "image://MxcImage/") + "?scale"
                         displayName: imagePack.data(imagePack.index(currentImageIndex, 0), SingleImagePackModel.ShortCode)
                         roomid: displayName
-                        height: 130
-                        width: 130
+                        Layout.preferredHeight: 130
+                        Layout.preferredWidth: 130
                         crop: false
                         Layout.alignment: Qt.AlignHCenter
                     }
diff --git a/resources/qml/dialogs/ImagePackSettingsDialog.qml b/resources/qml/dialogs/ImagePackSettingsDialog.qml
index b7aab2a6..9f807e65 100644
--- a/resources/qml/dialogs/ImagePackSettingsDialog.qml
+++ b/resources/qml/dialogs/ImagePackSettingsDialog.qml
@@ -66,7 +66,7 @@ ApplicationWindow {
                             dialog.show();
                             timelineRoot.destroyOnClose(dialog);
                         }
-                        width: packlistC.width
+                        Layout.preferredWidth: packlistC.width
                         visible: !packlist.containsAccountPack
                         text: qsTr("Create account pack")
                     }
@@ -79,7 +79,7 @@ ApplicationWindow {
                             dialog.show();
                             timelineRoot.destroyOnClose(dialog);
                         }
-                        width: packlistC.width
+                        Layout.preferredWidth: packlistC.width
                         visible: room.permissions.canChange(MtxEvent.ImagePackInRoom)
                         text: qsTr("New room pack")
                     }
@@ -146,8 +146,8 @@ ApplicationWindow {
                         url: packinfo.avatarUrl.replace("mxc://", "image://MxcImage/")
                         displayName: packinfo.packName
                         roomid: packinfo.statekey
-                        height: 100
-                        width: 100
+                        Layout.preferredHeight: 100
+                        Layout.preferredWidth: 100
                         Layout.alignment: Qt.AlignHCenter
                         enabled: false
                     }
diff --git a/resources/qml/dialogs/InviteDialog.qml b/resources/qml/dialogs/InviteDialog.qml
index ce17bd0f..9fc165c7 100644
--- a/resources/qml/dialogs/InviteDialog.qml
+++ b/resources/qml/dialogs/InviteDialog.qml
@@ -4,10 +4,10 @@
 
 import ".."
 import "../components"
-import QtQuick 2.12
-import QtQuick.Controls 2.12
-import QtQuick.Layouts 1.12
-import im.nheko 1.0
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import im.nheko
 
 ApplicationWindow {
     id: inviteDialogRoot
@@ -180,7 +180,7 @@ ApplicationWindow {
             Rectangle {
                 Layout.fillHeight: true
                 visible: inviteesList.visible
-                width: 1
+                Layout.preferredWidth: 1
                 color: Nheko.theme.separator
             }
             ListView {
diff --git a/resources/qml/dialogs/LeaveRoomDialog.qml b/resources/qml/dialogs/LeaveRoomDialog.qml
index 3e78fb3b..c70a4ac0 100644
--- a/resources/qml/dialogs/LeaveRoomDialog.qml
+++ b/resources/qml/dialogs/LeaveRoomDialog.qml
@@ -3,10 +3,8 @@
 // SPDX-License-Identifier: GPL-3.0-or-later
 
 import Qt.labs.platform 1.1 as P
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import im.nheko 1.0
-import "../voip"
+import QtQuick
+import im.nheko
 
 P.MessageDialog {
     id: leaveRoomRoot
diff --git a/resources/qml/dialogs/LogoutDialog.qml b/resources/qml/dialogs/LogoutDialog.qml
index e0e1f231..e79a3e0d 100644
--- a/resources/qml/dialogs/LogoutDialog.qml
+++ b/resources/qml/dialogs/LogoutDialog.qml
@@ -3,9 +3,8 @@
 // SPDX-License-Identifier: GPL-3.0-or-later
 
 import Qt.labs.platform 1.1 as P
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import im.nheko 1.0
+import QtQuick
+import im.nheko
 
 P.MessageDialog {
     id: logoutRoot
diff --git a/resources/qml/dialogs/PowerLevelEditor.qml b/resources/qml/dialogs/PowerLevelEditor.qml
index 9fc9ee15..17b19c25 100644
--- a/resources/qml/dialogs/PowerLevelEditor.qml
+++ b/resources/qml/dialogs/PowerLevelEditor.qml
@@ -47,7 +47,7 @@ ApplicationWindow {
 
         TabBar {
             id: bar
-            width: parent.width
+            Layout.preferredWidth: parent.width
 
             NhekoTabButton {
                 text: qsTr("Roles")
diff --git a/resources/qml/dialogs/PowerLevelSpacesApplyDialog.qml b/resources/qml/dialogs/PowerLevelSpacesApplyDialog.qml
index 01ec8b61..6a2e74b2 100644
--- a/resources/qml/dialogs/PowerLevelSpacesApplyDialog.qml
+++ b/resources/qml/dialogs/PowerLevelSpacesApplyDialog.qml
@@ -3,13 +3,11 @@
 // SPDX-License-Identifier: GPL-3.0-or-later
 
 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 im.nheko 1.0
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import QtQuick.Window
+import im.nheko
 
 ApplicationWindow {
     id: applyDialog
diff --git a/resources/qml/dialogs/ReadReceipts.qml b/resources/qml/dialogs/ReadReceipts.qml
index d65de73c..74a4d1d8 100644
--- a/resources/qml/dialogs/ReadReceipts.qml
+++ b/resources/qml/dialogs/ReadReceipts.qml
@@ -78,8 +78,8 @@ ApplicationWindow {
                         Avatar {
                             id: avatar
 
-                            width: Nheko.avatarSize
-                            height: Nheko.avatarSize
+                            Layout.preferredWidth: Nheko.avatarSize
+                            Layout.preferredHeight: Nheko.avatarSize
                             userid: model.mxid
                             url: model.avatarUrl.replace("mxc://", "image://MxcImage/")
                             displayName: model.displayName
diff --git a/resources/qml/dialogs/RoomDirectory.qml b/resources/qml/dialogs/RoomDirectory.qml
index 97943e93..dbf3b459 100644
--- a/resources/qml/dialogs/RoomDirectory.qml
+++ b/resources/qml/dialogs/RoomDirectory.qml
@@ -57,8 +57,9 @@ ApplicationWindow {
 
                     Layout.alignment: Qt.AlignVCenter
                     Layout.rightMargin: Nheko.paddingMedium
-                    width: avatarSize
-                    height: avatarSize
+                    Layout.preferredWidth: roomDirDelegate.avatarSize
+                    Layout.preferredHeight: roomDirDelegate.avatarSize
+
                     url: model.avatarUrl.replace("mxc://", "image://MxcImage/")
                     roomid: model.roomid
                     displayName: model.name
@@ -70,8 +71,7 @@ ApplicationWindow {
                     columns: 2
 
                     Layout.alignment: Qt.AlignLeft
-                    width: parent.width - avatar.width
-                    Layout.preferredWidth: parent.width - avatar.width
+                    Layout.preferredWidth: parent.width - roomAvatar.width
 
                     ElidedLabel {
                         Layout.row: 0
diff --git a/resources/qml/dialogs/RoomMembers.qml b/resources/qml/dialogs/RoomMembers.qml
index 64f21381..afb76398 100644
--- a/resources/qml/dialogs/RoomMembers.qml
+++ b/resources/qml/dialogs/RoomMembers.qml
@@ -37,8 +37,9 @@ ApplicationWindow {
         Avatar {
             id: roomAvatar
 
-            width: 130
-            height: width
+            Layout.preferredHeight: 130
+            Layout.preferredWidth: 130
+
             roomid: members.roomId
             displayName: members.roomName
             Layout.alignment: Qt.AlignHCenter
@@ -130,8 +131,8 @@ ApplicationWindow {
                         Avatar {
                             id: avatar
 
-                            width: Nheko.avatarSize
-                            height: Nheko.avatarSize
+                            Layout.preferredWidth: Nheko.avatarSize
+                            Layout.preferredHeight: Nheko.avatarSize
                             userid: model.mxid
                             url: model.avatarUrl.replace("mxc://", "image://MxcImage/")
                             displayName: model.displayName
diff --git a/resources/qml/dialogs/RoomSettingsDialog.qml b/resources/qml/dialogs/RoomSettingsDialog.qml
index 73dcac8c..9276a9d3 100644
--- a/resources/qml/dialogs/RoomSettingsDialog.qml
+++ b/resources/qml/dialogs/RoomSettingsDialog.qml
@@ -50,8 +50,8 @@ ApplicationWindow {
                 url: roomSettings.roomAvatarUrl.replace("mxc://", "image://MxcImage/")
                 roomid: roomSettings.roomId
                 displayName: roomSettings.roomName
-                height: 130
-                width: 130
+                Layout.preferredHeight: 130
+                Layout.preferredWidth: 130
                 Layout.alignment: Qt.AlignHCenter
                 onClicked: TimelineManager.openImageOverlay(null, roomSettings.roomAvatarUrl, "", 0, 0)
 
diff --git a/resources/qml/dialogs/UserProfile.qml b/resources/qml/dialogs/UserProfile.qml
index 6cf747e3..614ecb56 100644
--- a/resources/qml/dialogs/UserProfile.qml
+++ b/resources/qml/dialogs/UserProfile.qml
@@ -3,7 +3,6 @@
 // SPDX-License-Identifier: GPL-3.0-or-later
 
 import ".."
-import "../device-verification"
 import "../ui"
 import "../components"
 import QtQuick 2.15
@@ -56,8 +55,8 @@ ApplicationWindow {
                 id: displayAvatar
 
                 url: profile.avatarUrl.replace("mxc://", "image://MxcImage/")
-                height: 130
-                width: 130
+                Layout.preferredHeight: 130
+                Layout.preferredWidth: 130
                 displayName: profile.displayName
                 userid: profile.userid
                 Layout.alignment: Qt.AlignHCenter
@@ -498,8 +497,8 @@ ApplicationWindow {
                     Layout.leftMargin: Nheko.paddingMedium
 
                     property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 1.6)
-                    height: avatarSize
-                    width: avatarSize
+                    Layout.preferredHeight: avatarSize
+                    Layout.preferredWidth: avatarSize
                     url: avatarUrl.replace("mxc://", "image://MxcImage/")
                     roomid: roomId
                     displayName: roomName
diff --git a/resources/qml/pages/LoginPage.qml b/resources/qml/pages/LoginPage.qml
index f94e0082..86188918 100644
--- a/resources/qml/pages/LoginPage.qml
+++ b/resources/qml/pages/LoginPage.qml
@@ -45,8 +45,8 @@ Item {
             Image {
                 Layout.alignment: Qt.AlignHCenter
                 source: "qrc:/logos/login.png"
-                height: 128
-                width: 128
+                Layout.preferredHeight: 128
+                Layout.preferredWidth: 128
             }
 
             RowLayout {
@@ -65,7 +65,7 @@ Item {
 
 
                 Spinner {
-                    height: matrixIdLabel.height/2
+                    Layout.preferredHeight: matrixIdLabel.height/2
                     Layout.alignment: Qt.AlignBottom
 
                     visible: running
@@ -117,7 +117,7 @@ Item {
             }
 
             Item {
-                height: Nheko.avatarSize
+                Layout.preferredHeight: Nheko.avatarSize
                 Layout.fillWidth: true
 
                 Spinner {
diff --git a/resources/qml/pages/RegisterPage.qml b/resources/qml/pages/RegisterPage.qml
index c1bc5310..ad9143f7 100644
--- a/resources/qml/pages/RegisterPage.qml
+++ b/resources/qml/pages/RegisterPage.qml
@@ -45,8 +45,8 @@ Item {
             Image {
                 Layout.alignment: Qt.AlignHCenter
                 source: "qrc:/logos/login.png"
-                height: 128
-                width: 128
+                Layout.preferredHeight: 128
+                Layout.preferredWidth: 128
             }
 
             RowLayout {
@@ -64,7 +64,7 @@ Item {
 
 
                 Spinner {
-                    height: hsLabel.height/2
+                    Layout.preferredHeight: hsLabel.height/2
                     Layout.alignment: Qt.AlignBottom
 
                     visible: running
@@ -96,7 +96,7 @@ Item {
                     onEditingFinished: regis.checkUsername(text)
                 }
                 Spinner {
-                    height: usernameLabel.height/2
+                    Layout.preferredHeight: usernameLabel.height/2
                     Layout.alignment: Qt.AlignBottom
 
                     visible: running
@@ -105,8 +105,6 @@ Item {
                 }
 
                 Image {
-                    width: usernameLabel.height/2
-                    height: width
                     Layout.preferredHeight: usernameLabel.height/2
                     Layout.preferredWidth: usernameLabel.height/2
                     Layout.alignment: Qt.AlignBottom
@@ -168,7 +166,7 @@ Item {
             }
 
             Item {
-                height: Nheko.avatarSize
+                Layout.preferredHeight: Nheko.avatarSize
                 Layout.fillWidth: true
 
                 Spinner {
diff --git a/resources/qml/pages/UserSettingsPage.qml b/resources/qml/pages/UserSettingsPage.qml
index 2dc4684d..365366c7 100644
--- a/resources/qml/pages/UserSettingsPage.qml
+++ b/resources/qml/pages/UserSettingsPage.qml
@@ -4,9 +4,7 @@
 
 pragma ComponentBehavior: Bound
 import ".."
-import "../ui"
 import "../dialogs"
-import Qt.labs.platform as Platform
 import QtQuick
 import QtQuick.Controls
 import QtQuick.Layouts
diff --git a/resources/qml/pages/WelcomePage.qml b/resources/qml/pages/WelcomePage.qml
index 3acdc18f..161785ac 100644
--- a/resources/qml/pages/WelcomePage.qml
+++ b/resources/qml/pages/WelcomePage.qml
@@ -18,8 +18,8 @@ ColumnLayout {
     Image {
         Layout.alignment: Qt.AlignHCenter
         source: "qrc:/logos/splash.png"
-        height: 256
-        width: 256
+        Layout.preferredHeight: 256
+        Layout.preferredWidth: 256
     }
 
     Label {
diff --git a/resources/qml/voip/ActiveCallBar.qml b/resources/qml/voip/ActiveCallBar.qml
index 45afedab..eb7fce76 100644
--- a/resources/qml/voip/ActiveCallBar.qml
+++ b/resources/qml/voip/ActiveCallBar.qml
@@ -31,8 +31,8 @@ Rectangle {
         anchors.leftMargin: 8
 
         Avatar {
-            width: Nheko.avatarSize
-            height: Nheko.avatarSize
+            implicitWidth: Nheko.avatarSize
+            implicitHeight: Nheko.avatarSize
             url: CallManager.callPartyAvatarUrl.replace("mxc://", "image://MxcImage/")
             userid: CallManager.callParty
             displayName: CallManager.callPartyDisplayName
@@ -61,8 +61,7 @@ Rectangle {
                     when: CallManager.callType == Voip.VOICE
 
                     PropertyChanges {
-                        target: callTypeIcon
-                        source: "qrc:/icons/icons/ui/place-call.svg"
+                        callTypeIcon.source: "qrc:/icons/icons/ui/place-call.svg"
                     }
 
                 },
@@ -71,8 +70,7 @@ Rectangle {
                     when: CallManager.callType == Voip.VIDEO
 
                     PropertyChanges {
-                        target: callTypeIcon
-                        source: "qrc:/icons/icons/ui/video.svg"
+                        callTypeIcon.source: "qrc:/icons/icons/ui/video.svg"
                     }
 
                 },
@@ -81,8 +79,7 @@ Rectangle {
                     when: CallManager.callType == Voip.SCREEN
 
                     PropertyChanges {
-                        target: callTypeIcon
-                        source: "qrc:/icons/icons/ui/screen-share.svg"
+                        callTypeIcon.source: "qrc:/icons/icons/ui/screen-share.svg"
                     }
 
                 }
@@ -103,8 +100,7 @@ Rectangle {
                     when: CallManager.callState == Voip.OFFERSENT
 
                     PropertyChanges {
-                        target: callStateLabel
-                        text: qsTr("Calling...")
+                        callStateLabel.text: qsTr("Calling...")
                     }
 
                 },
@@ -113,8 +109,7 @@ Rectangle {
                     when: CallManager.callState == Voip.CONNECTING
 
                     PropertyChanges {
-                        target: callStateLabel
-                        text: qsTr("Connecting...")
+                        callStateLabel.text: qsTr("Connecting...")
                     }
 
                 },
@@ -123,8 +118,7 @@ Rectangle {
                     when: CallManager.callState == Voip.ANSWERSENT
 
                     PropertyChanges {
-                        target: callStateLabel
-                        text: qsTr("Connecting...")
+                        callStateLabel.text: qsTr("Connecting...")
                     }
 
                 },
@@ -133,18 +127,15 @@ Rectangle {
                     when: CallManager.callState == Voip.CONNECTED
 
                     PropertyChanges {
-                        target: callStateLabel
-                        text: "00:00"
+                        callStateLabel.text: "00:00"
                     }
 
                     PropertyChanges {
-                        target: callTimer
-                        startTime: Math.floor((new Date()).getTime() / 1000)
+                        callTimer.startTime: Math.floor((new Date()).getTime() / 1000)
                     }
 
                     PropertyChanges {
-                        target: stackLayout
-                        currentIndex: CallManager.callType != Voip.VOICE ? 1 : 0
+                        stackLayout.currentIndex: CallManager.callType != Voip.VOICE ? 1 : 0
                     }
 
                 },
@@ -153,13 +144,16 @@ Rectangle {
                     when: CallManager.callState == Voip.DISCONNECTED
 
                     PropertyChanges {
-                        target: callStateLabel
-                        text: ""
+                        callStateLabel.text: ""
                     }
 
+                    // HACK(Nico): Somehow this causes a crash when not using the custom parser for that property change...
+                    //PropertyChanges {
+                    //    stackLayout.currentIndex: 0
+                    //}
                     PropertyChanges {
                         target: stackLayout
-                        currentIndex: 0
+                        currentIndex: 0 // qmllint disable Quick.property-changes-parsed
                     }
 
                 }
@@ -202,8 +196,8 @@ Rectangle {
 
         ImageButton {
             visible: CallManager.haveLocalPiP
-            width: 24
-            height: 24
+            Layout.preferredWidth: 24
+            Layout.preferredHeight: 24
             buttonTextColor: "#000000"
             image: ":/icons/icons/ui/picture-in-picture.svg"
             hoverEnabled: true
@@ -215,8 +209,8 @@ Rectangle {
         ImageButton {
             Layout.leftMargin: 8
             Layout.rightMargin: 16
-            width: 24
-            height: 24
+            Layout.preferredWidth: 24
+            Layout.preferredHeight: 24
             buttonTextColor: "#000000"
             image: CallManager.isMicMuted ? ":/icons/icons/ui/microphone-unmute.svg" : ":/icons/icons/ui/microphone-mute.svg"
             hoverEnabled: true
diff --git a/resources/qml/voip/CallInviteBar.qml b/resources/qml/voip/CallInviteBar.qml
index 419181ca..c2ce8066 100644
--- a/resources/qml/voip/CallInviteBar.qml
+++ b/resources/qml/voip/CallInviteBar.qml
@@ -38,8 +38,8 @@ Rectangle {
         anchors.leftMargin: 8
 
         Avatar {
-            width: Nheko.avatarSize
-            height: Nheko.avatarSize
+            implicitWidth: Nheko.avatarSize
+            implicitHeight: Nheko.avatarSize
             url: CallManager.callPartyAvatarUrl.replace("mxc://", "image://MxcImage/")
             userid: CallManager.callParty
             displayName: CallManager.callPartyDisplayName
@@ -72,8 +72,8 @@ Rectangle {
 
         ImageButton {
             Layout.rightMargin: 16
-            width: 20
-            height: 20
+            Layout.preferredWidth: 20
+            Layout.preferredHeight: 20
             buttonTextColor: "#000000"
             image: ":/icons/icons/ui/settings.svg"
             hoverEnabled: true
@@ -82,7 +82,7 @@ Rectangle {
             onClicked: {
                 var dialog = devicesDialog.createObject(timelineRoot);
                 dialog.open();
-            timelineRoot.destroyOnClose(dialog);
+                timelineRoot.destroyOnClose(dialog);
             }
         }