diff --git a/changelog.md b/changelog.md index 63ae7d9baa67354322460e20154e6b6754377d2e..9e582e05ec2e16703b2cda3acc9deba71d834b82 100644 --- a/changelog.md +++ b/changelog.md @@ -1,203 +1,14 @@ -# 2020-03-16 - -## Bug Fixes - -+ Fixed the bug that the system notification cannot be disabled -+ Fixed video device enumeration for higher framerates -+ More reliable high dpi adaption -+ Prevent crash when video device events happen with no account - -## New Features - -+ Add type indicator -+ Movable splitter in main view -+ Connectivity improvement for calls and messages - -# 2019-12-13 - -## Bug Fixes - -+ Fixed the bug that caused lag on call overlay -+ Fixed a typo on about dialog - -## New Features - -+ Add various useful shortcuts - -# 2019-11-20 - -## Bug Fixes - -+ Fixed bug that prevented pasting multiline text into chat - -## New Features - -+ Calls now automatically un-hold when the conversation is selected -+ SIP dialpad now has A,B,C,D dtmf options - -# 2019-11-19 - -## Bug Fixes - -+ Fixed notifications popping up for outgoing calls -+ Removing conference participant selects a remaining participant conversation - -# 2019-11-15 - -## Notes - -Change version name to 'Free as in Freedom' -Linux: ffmpeg now embedded in official package for auto bitrate + hardware acceleration - -## Features - -+ callview: rework conference ui ([#1052](https://git.jami.net/savoirfairelinux/ring-client-gnome/issues/1052)) -+ JAMS: support login to an account manager -+ wizard: re-work account creation -+ chatview: add video recorder -+ chatview: add audio recorder -+ conversation: automatically accepts < 20Mb files -+ video: auto adapt bitrate -+ Beta version -+ Change logs -+ Save draft text messages - -## Bugfixes - -+ Fix multiple crash with SIP accounts -+ Fix DTMF for SIP -+ chatview: show generated avatar into the chatview ([#947](https://git.jami.net/savoirfairelinux/ring-client-gnome/issues/947)) -+ Fix account migration -+ Fix alignment in settings view -+ call: handle PEER_BUSY state -+ lrc: fix clearAllHistory -+ avmodel: sort framerates -+ sip: fix temporary item removal -+ avmodel: getCurrentRenderedDevice support conferences -+ upnp: now async -+ some deadlocks are fixed -+ some segfault are fixed -+ sip_transport: avoid PJ_ENOTSUITABLE when ipv4<->ipv6 -+ sipcall: fix rotation -+ ffmpeg: handle ebusy when opening devices -+ file transfer: fix cancel -+ conference: fix color inversion during conferences -+ lan: improve pjsip behavior in a LAN -+ [trustrequests: handle removed contacts](https://git.jami.net/savoirfairelinux/ring-daemon/issues/129) -+ dbus: only authorize one daemon per DBUS_SESSION_BUS_ADDRESS -+ Fixed crash when user has no account -+ Fixed display name changes not saving -+ Fixed not being able to change back to camera from screen share -+ Fixed utf-8 handling on display names - -## Internal changes - -+ chatview code is now in LRC and shared with the desktop clients -+ database: migrate to per account database -+ avmodel: optionally switchInput using a callId -+ video sender: send only 1 keyframe at start -+ contrib: various bump (opendht, upnp, ffmpeg, etc) -+ p2p: use one IceTransport by sub transfer -+ decoder: set fpsprobesize, use default probesize -+ ice: enable aggressive nomination to avoid latencies -+ accel: remove libdrm code -+ sipvoiplink: remove wait for completed transactions in dtor -+ Remove some thread creations -+ replace restbed by restinio -+ namedirectory: don't create temporary items during lookup -+ file transfer: use different ice for each transfer -+ manager: allow switchInput on conference - - -# 2019-08-24 - -## Features - -+ [Erase data securely before removing account](https://git.jami.net/savoirfairelinux/ring-daemon/issues/60) -+ [Negotiate calls in TCP and UDP and prefer TCP if necessary](https://git.jami.net/savoirfairelinux/ring-daemon/issues/103) -+ Improve negotiation for p2p file transfer -+ Auto change the video quality -+ Add hardware acceleration support for NVidia -+ SIP fix SMS issues - -## Bugfixes - -+ Improve connectivityChange detection and account switching. -+ Translate strings from daemon. -+ Sort resolutions by width -+ [Sort conversations when clearing history](https://git.jami.net/savoirfairelinux/ring-lrc/issues/411) -+ Fix subscriptions for new contacts -+ Hangup if contact is deleted -+ [Various deadlocks](https://git.jami.net/savoirfairelinux/ring-daemon/issues/120) - -## Internal changes - -+ LRC remove unused code -+ Change from enableAccount() to setAccountEnabled() -+ Update msgpack, gnutls, opendht -+ Rewrite code for UPnP support - -# 2019-06-20 - -## Bugfixes - -+ Improve name registration errors detection -+ Improve SIP text/plain detection -+ Fix temporary item when copy/paste a full ring id -+ SIP: Fix online status -+ [Fix audio recorder](https://git.jami.net/savoirfairelinux/ring-daemon/issues/95) -+ Fix some deadlocks -+ [Fix calls via TURN](https://git.jami.net/savoirfairelinux/ring-daemon/issues/105) -+ [Fix multi devices support for calls](https://git.jami.net/savoirfairelinux/ring-daemon/issues/120) - - -## Internal changes - -+ Cleanup daemon side -+ Update restbed -+ Update opendht to 1.9.5 -+ [Improve UPnP implementation](https://git.jami.net/savoirfairelinux/ring-daemon/issues/96) -+ Increase default video bitrate - -# 2019-05-16 - -## Features - -+ [Add peer to peer file transfer support](https://git.jami.net/savoirfairelinux/ring-project/issues/486) -+ Advanced settings: add DHT peer discovery support -+ Media Settings: add hardware acceleration support -+ [UPnP add TCP mapping support](https://git.jami.net/savoirfairelinux/ring-daemon/issues/86) - -## Bugfixes - -+ Name registration: better handling for wrong archive password -+ tls_session: close transport after cleanup -+ sip: check message utf8 validity before emitting signal - -## Internal changes - -+ Bump OpenDHT to 1.9.4 -+ Bump GNUTls to 3.6.7 -+ Bump Pjsip to (6b9212dcb4b3f781c1e922ae544b063880bc46ac + patches) -+ Internal renaming from Ring to Jami -+ Use new methods from LRC -+ Fix some data races -+ dring/dbus: unregister signals on exit - -# 2019-04-12 - -## Features - -+ (Not linked to the UI for now) Hardware encoding support - -## Bugfixes - -+ Sets up video streams upon receiving the first video frame. -+ Pulseaudio: start streams when ready - -## Internal changes - -+ Continue name migration, change data locations, binary names and methods names. -+ Nettle 3.4.1 is now required -+ Support video rotation when recording -+ Some code clean \ No newline at end of file +::: {style="margin:1.5em;"} +2020-09-24 {#section style="font-size:2.25em;"} +========== + +New Features {#new-features style="font-size:2.0em;"} +------------ +::: {style="font-size:1.5em"} +- Rendezvous points: easily create meeting points +- Control conference layout and see participant names +- New and improved user interface +- Better support for screen scaling (high DPI) +::: +------------ +::: \ No newline at end of file diff --git a/src/constant/JamiStrings.qml b/src/constant/JamiStrings.qml index 19a0d1d155a6f6bfa6fa23a9d721fad555b95b3f..999e4e0dc364cba02a6a94208c725a2f99eb61be 100644 --- a/src/constant/JamiStrings.qml +++ b/src/constant/JamiStrings.qml @@ -30,7 +30,8 @@ Item { // AboutPopUp property string version: qsTr("Version") - property string slogan: qsTr("Together") + property string companyDeclarationYear: "© 2015-2020 Savoir-faire Linux Inc." + property string slogan: "Together" property string declaration: qsTr("Jami is a free software for universal communication which respects the freedom and privacy of its users.") property string changelog: qsTr("Changelog") property string credits: qsTr("Credits") diff --git a/src/mainview/components/AboutPopUp.qml b/src/mainview/components/AboutPopUp.qml index 83e1cb33fd83ff63b5b2fba8989d5664c527117b..3edd87b03a3057600f6402bdfc6aad2625fd87b5 100644 --- a/src/mainview/components/AboutPopUp.qml +++ b/src/mainview/components/AboutPopUp.qml @@ -27,6 +27,9 @@ import "../../commoncomponents" BaseDialog { id: root + + height: aboutPopUpContentRectColumnLayout.implicitHeight + title: qsTr("About") ProjectCreditsScrollView { @@ -42,258 +45,275 @@ BaseDialog { } contentItem: Rectangle { - id: aboutPopUpContentRect + id: contentRect implicitWidth: 400 - implicitHeight: 600 - ColumnLayout { - id: aboutPopUpContentRectColumnLayout - anchors.centerIn: parent + ScrollView { + id: aboutPopUpScrollView + anchors.fill: parent - Image { - id: aboutPopUPJamiLogoImage + ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + ScrollBar.vertical.policy: ScrollBar.AsNeeded - Layout.alignment: Qt.AlignCenter - Layout.topMargin: JamiTheme.preferredMarginSize - Layout.preferredWidth: aboutPopUpContentRect.width - Layout.preferredHeight: 100 + clip: true - fillMode: Image.PreserveAspectFit - source: "qrc:/images/logo-jami-standard-coul.png" - mipmap: true - } + ColumnLayout { + width: Math.max(root.width, implicitWidth) + height: Math.max(aboutPopUpScrollView.height, implicitHeight) - Label { - id: jamiVersionText + spacing: 0 - Layout.alignment: Qt.AlignCenter - Layout.preferredWidth: aboutPopUpContentRect.width - Layout.preferredHeight: textMetricsjamiVersionText.boundingRect.height + ColumnLayout { + id: aboutPopUpContentRectColumnLayout - font.pointSize: JamiTheme.textFontSize + Layout.alignment: Qt.AlignCenter - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter + Image { + id: aboutPopUPJamiLogoImage - text: textMetricsjamiVersionText.text + Layout.alignment: Qt.AlignCenter + Layout.topMargin: JamiTheme.preferredMarginSize + Layout.preferredWidth: contentRect.width + Layout.preferredHeight: 100 - TextMetrics { - id: textMetricsjamiVersionText - font: jamiVersionText.font - text: JamiStrings.version + ": " + UtilsAdapter.getVersionStr() - } - } + fillMode: Image.PreserveAspectFit + source: "qrc:/images/logo-jami-standard-coul.png" + mipmap: true + } - Label { - id: jamiSlogansText + Label { + id: jamiVersionText - Layout.alignment: Qt.AlignCenter - Layout.preferredWidth: aboutPopUpContentRect.width - Layout.preferredHeight: textMetricsjamiSlogansText.boundingRect.height - Layout.topMargin: 5 + Layout.alignment: Qt.AlignCenter + Layout.preferredWidth: contentRect.width + Layout.preferredHeight: textMetricsjamiVersionText.boundingRect.height - wrapMode: Text.WordWrap - font.pointSize: JamiTheme.textFontSize + font.pointSize: JamiTheme.textFontSize - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter - text: textMetricsjamiSlogansText.text + text: textMetricsjamiVersionText.text - TextMetrics { - id: textMetricsjamiSlogansText - font: jamiSlogansText.font - text: JamiStrings.slogan - } - } + TextMetrics { + id: textMetricsjamiVersionText + font: jamiVersionText.font + text: JamiStrings.version + ": " + UtilsAdapter.getVersionStr() + } + } - Label { - id: jamiDeclarationText + Label { + id: jamiSlogansText - Layout.alignment: Qt.AlignCenter - Layout.preferredWidth: aboutPopUpContentRect.width - Layout.preferredHeight: 40 - Layout.topMargin: 5 + Layout.alignment: Qt.AlignCenter + Layout.preferredWidth: contentRect.width + Layout.preferredHeight: textMetricsjamiSlogansText.boundingRect.height + Layout.topMargin: 5 - wrapMode: Text.WordWrap - font.pointSize: JamiTheme.textFontSize + wrapMode: Text.WordWrap + font.pointSize: JamiTheme.textFontSize - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + text: textMetricsjamiSlogansText.text - // TextMetrics does not work for multi-line. - text: JamiStrings.declaration - } - - Label { - id: jamiDeclarationHyperText + TextMetrics { + id: textMetricsjamiSlogansText + font: jamiSlogansText.font + text: JamiStrings.slogan + } + } - Layout.alignment: Qt.AlignCenter + Label { + id: jamiDeclarationText - // Strangely, hoveredLink works badly when width grows too large - Layout.preferredWidth: 50 - Layout.preferredHeight: textMetricsjamiDeclarationHyperText.boundingRect.height - Layout.topMargin: 5 - Layout.bottomMargin: 5 + Layout.alignment: Qt.AlignCenter + Layout.preferredWidth: contentRect.width + Layout.preferredHeight: 40 + Layout.topMargin: 5 - font.pointSize: JamiTheme.textFontSize - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter + wrapMode: Text.WordWrap + font.pointSize: JamiTheme.textFontSize - text: textMetricsjamiDeclarationHyperText.text - onLinkActivated: Qt.openUrlExternally(link) + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter - TextMetrics { - id: textMetricsjamiDeclarationHyperText - font: jamiDeclarationHyperText.font - text: '<html><style type="text/css"></style><a href="https://jami.net">jami.net</a></html>' - } - MouseArea { - anchors.fill: parent + // TextMetrics does not work for multi-line. + text: JamiStrings.declaration + } - // We don't want to eat clicks on the Text. - acceptedButtons: Qt.NoButton - cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor - } - } + Label { + id: jamiDeclarationHyperText - Label { - id: jamiDeclarationYearText + Layout.alignment: Qt.AlignCenter - Layout.alignment: Qt.AlignCenter - Layout.preferredWidth: aboutPopUpContentRect.width - Layout.preferredHeight: textMetricsjamiDeclarationYearText.boundingRect.height - Layout.bottomMargin: 5 + // Strangely, hoveredLink works badly when width grows too large + Layout.preferredWidth: 50 + Layout.preferredHeight: textMetricsjamiDeclarationHyperText.boundingRect.height + Layout.topMargin: 5 + Layout.bottomMargin: 5 - font.pointSize: JamiTheme.textFontSize + font.pointSize: JamiTheme.textFontSize + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter + text: textMetricsjamiDeclarationHyperText.text + onLinkActivated: Qt.openUrlExternally(link) - text: textMetricsjamiDeclarationYearText.text + TextMetrics { + id: textMetricsjamiDeclarationHyperText + font: jamiDeclarationHyperText.font + text: '<html><style type="text/css"></style><a href="https://jami.net">jami.net</a></html>' + } - TextMetrics { - id: textMetricsjamiDeclarationYearText - font: jamiDeclarationYearText.font - text: "© 2015-2020 Savoir-faire Linux" - } - } + MouseArea { + anchors.fill: parent - Label { - id: jamiNoneWarrantyHyperText + // We don't want to eat clicks on the Text. + acceptedButtons: Qt.NoButton + cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor + } + } - Layout.alignment: Qt.AlignCenter - Layout.preferredWidth: Math.min(300, aboutPopUpContentRect.width) - Layout.preferredHeight: textMetricsjamiNoneWarrantyHyperText.boundingRect.height * 2 - Layout.bottomMargin: 10 + Label { + id: jamiDeclarationYearText - wrapMode: Text.WordWrap - font.pointSize: JamiTheme.tinyFontSize + Layout.alignment: Qt.AlignCenter + Layout.preferredWidth: contentRect.width + Layout.preferredHeight: textMetricsjamiDeclarationYearText.boundingRect.height + Layout.bottomMargin: 5 - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter + font.pointSize: JamiTheme.textFontSize - text: textMetricsjamiNoneWarrantyHyperText.text - onLinkActivated: Qt.openUrlExternally(link) + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter - TextMetrics { - id: textMetricsjamiNoneWarrantyHyperText - font: jamiDeclarationHyperText.font - text: '<html><style type="text/css"></style>This program comes with absolutely no warranty.<br\>See the <a href="http://www.gnu.org/licenses/gpl-3.0.html">GNU General Public License, version 3 or later</a> for details.</html>' - } + text: textMetricsjamiDeclarationYearText.text - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.NoButton - cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor - } - } + TextMetrics { + id: textMetricsjamiDeclarationYearText + font: jamiDeclarationYearText.font + text: JamiStrings.companyDeclarationYear + } + } - Rectangle { - id: buttonGroupChangeLogAndCredits + Label { + id: jamiNoneWarrantyHyperText - Layout.alignment: Qt.AlignCenter - Layout.preferredWidth: aboutPopUpContentRect.width - Layout.preferredHeight: 32 + Layout.alignment: Qt.AlignCenter + Layout.preferredWidth: 300 + Layout.preferredHeight: textMetricsjamiNoneWarrantyHyperText.boundingRect.height * 2 + Layout.bottomMargin: 10 - RowLayout { - id: buttonGroupChangeLogAndCreditsRowLayout + wrapMode: Text.WordWrap + font.pointSize: JamiTheme.tinyFontSize - anchors.fill: parent + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter - MaterialButton { - id: changeLogButton - text: JamiStrings.changelog - color: projectCreditsScrollView.visible? JamiTheme.buttonTintedGreyInactive : - JamiTheme.buttonTintedGrey - hoveredColor: JamiTheme.buttonTintedGreyHovered - pressedColor: JamiTheme.buttonTintedGreyPressed + text: textMetricsjamiNoneWarrantyHyperText.text + onLinkActivated: Qt.openUrlExternally(link) - Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: JamiTheme.preferredFieldWidth / 2 - Layout.preferredHeight: JamiTheme.preferredFieldHeight + TextMetrics { + id: textMetricsjamiNoneWarrantyHyperText + font: jamiDeclarationHyperText.font + text: '<html><style type="text/css"></style>This program comes with absolutely no warranty.<br\>See the <a href="http://www.gnu.org/licenses/gpl-3.0.html">GNU General Public License, version 3 or later</a> for details.</html>' + } - onClicked: { - if (changeLogOrCreditsStack.depth > 1) { - changeLogOrCreditsStack.pop() - } + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.NoButton + cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor } } - MaterialButton { - id: creditsButton - text: JamiStrings.credits - color: projectCreditsScrollView.visible? JamiTheme.buttonTintedGrey : - JamiTheme.buttonTintedGreyInactive - hoveredColor: JamiTheme.buttonTintedGreyHovered - pressedColor: JamiTheme.buttonTintedGreyPressed - Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: JamiTheme.preferredFieldWidth / 2 - Layout.preferredHeight: JamiTheme.preferredFieldHeight + Rectangle { + id: buttonGroupChangeLogAndCredits - onClicked: { - if (changeLogOrCreditsStack.depth == 1) { - changeLogOrCreditsStack.push( - projectCreditsScrollView) + Layout.alignment: Qt.AlignCenter + Layout.preferredWidth: contentRect.width + Layout.preferredHeight: 32 + + RowLayout { + id: buttonGroupChangeLogAndCreditsRowLayout + + anchors.fill: parent + + MaterialButton { + id: changeLogButton + text: JamiStrings.changelog + color: projectCreditsScrollView.visible? JamiTheme.buttonTintedGreyInactive : + JamiTheme.buttonTintedGrey + hoveredColor: JamiTheme.buttonTintedGreyHovered + pressedColor: JamiTheme.buttonTintedGreyPressed + + Layout.alignment: Qt.AlignHCenter + Layout.preferredWidth: JamiTheme.preferredFieldWidth / 2 + Layout.preferredHeight: JamiTheme.preferredFieldHeight + + onClicked: { + if (changeLogOrCreditsStack.depth > 1) { + changeLogOrCreditsStack.pop() + } + } + } + + MaterialButton { + id: creditsButton + text: JamiStrings.credits + color: projectCreditsScrollView.visible? JamiTheme.buttonTintedGrey : + JamiTheme.buttonTintedGreyInactive + hoveredColor: JamiTheme.buttonTintedGreyHovered + pressedColor: JamiTheme.buttonTintedGreyPressed + Layout.alignment: Qt.AlignHCenter + Layout.preferredWidth: JamiTheme.preferredFieldWidth / 2 + Layout.preferredHeight: JamiTheme.preferredFieldHeight + + onClicked: { + if (changeLogOrCreditsStack.depth == 1) { + changeLogOrCreditsStack.push( + projectCreditsScrollView) + } + } } } } - } - } - StackView { - id: changeLogOrCreditsStack + StackView { + id: changeLogOrCreditsStack - Layout.alignment: Qt.AlignCenter - Layout.preferredWidth: aboutPopUpContentRect.width - JamiTheme.preferredMarginSize*2 - Layout.preferredHeight: aboutPopUpContentRect.height - 460 - Layout.margins: JamiTheme.preferredMarginSize + Layout.alignment: Qt.AlignCenter + Layout.preferredWidth: contentRect.width - JamiTheme.preferredMarginSize * 2 + Layout.preferredHeight: 150 + Layout.margins: JamiTheme.preferredMarginSize - initialItem: changeLogScrollView + initialItem: changeLogScrollView - clip: true - } + clip: true + } - MaterialButton { - id: btnClose + MaterialButton { + id: btnClose - Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: JamiTheme.preferredFieldWidth / 2 - Layout.preferredHeight: JamiTheme.preferredFieldHeight - Layout.bottomMargin: JamiTheme.preferredMarginSize + Layout.alignment: Qt.AlignHCenter + Layout.preferredWidth: JamiTheme.preferredFieldWidth / 2 + Layout.preferredHeight: JamiTheme.preferredFieldHeight + Layout.bottomMargin: JamiTheme.preferredMarginSize - text: qsTr("Close") - color: enabled? JamiTheme.buttonTintedBlack : JamiTheme.buttonTintedGrey - hoveredColor: JamiTheme.buttonTintedBlackHovered - pressedColor: JamiTheme.buttonTintedBlackPressed - outlined: true + text: qsTr("Close") + color: enabled? JamiTheme.buttonTintedBlack : JamiTheme.buttonTintedGrey + hoveredColor: JamiTheme.buttonTintedBlackHovered + pressedColor: JamiTheme.buttonTintedBlackPressed + outlined: true - onClicked: { - close() + onClicked: { + close() + } + } } } } diff --git a/src/mainview/components/ChangeLogScrollView.qml b/src/mainview/components/ChangeLogScrollView.qml index b4962cfcf62e9c28d651bc71128a629254d6164c..601c4ffacc3b19b08e42421b8ce8a983a7b3b371 100644 --- a/src/mainview/components/ChangeLogScrollView.qml +++ b/src/mainview/components/ChangeLogScrollView.qml @@ -35,20 +35,12 @@ ScrollView { width: changeLogScrollView.width - selectByMouse: false readOnly: true wrapMode: Text.WordWrap - font.pointSize: JamiTheme.textFontSize - 3 + font.pointSize: JamiTheme.textFontSize + 1 text: UtilsAdapter.getChangeLog() textFormat: TextEdit.RichText - - MouseArea { - anchors.fill: parent - propagateComposedEvents: true - cursorShape: Qt.ArrowCursor - acceptedButtons: Qt.NoButton - } } background: Rectangle {