From 0717f155e8a0cee1742edc4b667ebff9c8135391 Mon Sep 17 00:00:00 2001 From: PavelS Date: Wed, 31 Aug 2022 11:19:20 +0300 Subject: [PATCH] feat(StatusScrollView): add ensureVisible function to Utils (#868) Replace local ensureVisible with ensureVisible function from Utils Required for https://github.com/status-im/status-desktop/issues/7093 --- .../src/StatusQ/Controls/StatusBaseInput.qml | 14 ++------------ .../StatusQ/Controls/StatusSelectableText.qml | 15 ++------------- .../src/StatusQ/Core/StatusScrollView.qml | 5 +++++ ui/StatusQ/src/StatusQ/Core/Utils/Utils.qml | 17 +++++++++++++++++ 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/ui/StatusQ/src/StatusQ/Controls/StatusBaseInput.qml b/ui/StatusQ/src/StatusQ/Controls/StatusBaseInput.qml index 246b1a109d..fb04889a46 100644 --- a/ui/StatusQ/src/StatusQ/Controls/StatusBaseInput.qml +++ b/ui/StatusQ/src/StatusQ/Controls/StatusBaseInput.qml @@ -7,6 +7,7 @@ import StatusQ.Components 0.1 import StatusQ.Controls 0.1 import StatusQ.Core 0.1 import StatusQ.Core.Theme 0.1 +import StatusQ.Core.Utils 0.1 /*! \qmltype StatusBaseInput @@ -339,17 +340,6 @@ Item { } clip: true - function ensureVisible(r) { - if (contentX >= r.x) - contentX = r.x - else if (contentX + width <= r.x + r.width) - contentX = r.x + r.width - width - if (contentY >= r.y) - contentY = r.y - else if (contentY + height <= r.y + r.height) - contentY = r.y + r.height - height - } - TextEdit { id: edit property string previousText: text @@ -374,7 +364,7 @@ Item { edit.keyEvent = event.key root.keyPressed(event); } - onCursorRectangleChanged: flick.ensureVisible(cursorRectangle) + onCursorRectangleChanged: Utils.ensureVisible(flick, cursorRectangle) onActiveFocusChanged: if (root.pristine) root.pristine = false onTextChanged: { if (previousText === text) { diff --git a/ui/StatusQ/src/StatusQ/Controls/StatusSelectableText.qml b/ui/StatusQ/src/StatusQ/Controls/StatusSelectableText.qml index d5a657659b..1163cda844 100644 --- a/ui/StatusQ/src/StatusQ/Controls/StatusSelectableText.qml +++ b/ui/StatusQ/src/StatusQ/Controls/StatusSelectableText.qml @@ -57,18 +57,7 @@ Item { contentHeight: edit.paintedHeight boundsBehavior: Flickable.StopAtBounds QC.ScrollBar.vertical: QC.ScrollBar { interactive: multiline; enabled: multiline } - function ensureVisible(r) { - if (width-contentX >= r.x) { - contentX = 0; - } - else if (contentX+width <= r.x+r.width) { - contentX = r.x+r.width-width; - } - if (contentY >= r.y) - contentY = r.y; - else if (contentY+height <= r.y+r.height) - contentY = r.y+r.height-height; - } + TextEdit { id: edit width: flick.width @@ -83,7 +72,7 @@ Item { font.family: Theme.palette.baseFont.name color: Theme.palette.directColor1 textFormat: Text.RichText - onCursorRectangleChanged: flick.ensureVisible(cursorRectangle) + onCursorRectangleChanged: Utils.ensureVisible(flick, cursorRectangle) wrapMode: statusSelectableText.multiline ? Text.WrapAtWordBoundaryOrAnywhere : TextEdit.NoWrap Keys.forwardTo: [statusSelectableText] diff --git a/ui/StatusQ/src/StatusQ/Core/StatusScrollView.qml b/ui/StatusQ/src/StatusQ/Core/StatusScrollView.qml index 63f497d6db..c814ddec29 100644 --- a/ui/StatusQ/src/StatusQ/Core/StatusScrollView.qml +++ b/ui/StatusQ/src/StatusQ/Core/StatusScrollView.qml @@ -2,6 +2,7 @@ import QtQuick 2.14 import QtQuick.Controls 2.14 import StatusQ.Controls 0.1 +import StatusQ.Core.Utils 0.1 /*! \qmltype StatusScrollView @@ -63,4 +64,8 @@ Flickable { policy: ScrollBar.AsNeeded visible: resolveVisibility(policy, root.height, root.contentHeight) } + + function ensureVisible(rect) { + Utils.ensureVisible(this, rect) + } } diff --git a/ui/StatusQ/src/StatusQ/Core/Utils/Utils.qml b/ui/StatusQ/src/StatusQ/Core/Utils/Utils.qml index e8f8317dd1..9e15ef061b 100644 --- a/ui/StatusQ/src/StatusQ/Core/Utils/Utils.qml +++ b/ui/StatusQ/src/StatusQ/Core/Utils/Utils.qml @@ -244,6 +244,23 @@ QtObject { function elideText(text, leftCharsCount, rightCharsCount = leftCharsCount) { return text.substr(0, leftCharsCount) + "..." + text.substr(text.length - rightCharsCount) } + + function ensureVisible(flickable, rect) { + const rectRight = rect.x + rect.width + const rectBottom = rect.y + rect.height + const flickableRight = flickable.contentX + flickable.width + const flickableBottom = flickable.contentY + flickable.height + + if (flickable.contentX >= rect.x) + flickable.contentX = rect.x + else if (flickableRight <= rectRight) + flickable.contentX = rectRight - flickable.width + + if (flickable.contentY >= rect.y) + flickable.contentY = rect.y + else if (flickableBottom <= rectBottom) + flickable.contentY = rectBottom - flickable.height + } }