From 234949922e0aa69d8142f8e3c4befa7c9fb57ec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Candice=20Bent=C3=A9jac?= Date: Mon, 19 Aug 2024 16:47:50 +0200 Subject: [PATCH] [Controls] Prevent the filter text field from being out of the window The filter text field is now always placed at the position of the attribute, meaning it is always in sight. The list of values is then either dropped downwards or opened upwards depending on its size and where there is the most free space. --- meshroom/ui/qml/Controls/FilterComboBox.qml | 36 +++++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/meshroom/ui/qml/Controls/FilterComboBox.qml b/meshroom/ui/qml/Controls/FilterComboBox.qml index c51d9314d4..2463b35489 100644 --- a/meshroom/ui/qml/Controls/FilterComboBox.qml +++ b/meshroom/ui/qml/Controls/FilterComboBox.qml @@ -66,15 +66,34 @@ ComboBox { popup: Popup { width: combo.width - implicitHeight: contentItem.implicitHeight + implicitHeight: contentItem.implicitHeight + + x: 0 + y: 0 onAboutToShow: { filterTextArea.forceActiveFocus() - if (mapToGlobal(popup.x, popup.y).y + root.implicitHeight * (model.length + 1) > _window.contentItem.height) { - y = -((combo.height * (combo.model.length + 1) > _window.contentItem.height) ? _window.contentItem.height*2/3 : combo.height * (combo.model.length + 1)) + var dropDown = true + var posY = mapToGlobal(popup.x, popup.y).y + + /* If the list will go out of the screen by dropping down AND if there is more space up than down, + * then open it upwards. + * Having both conditions allows to naturally drop down short lists that are visually located close + * to the lower border of the window, while opening upwards long lists that are in that same location + * AND opening these same lists downwards if they are located closer to the upper border. + */ + if (posY + root.implicitHeight * (model.length * 1) > _window.contentItem.height + && posY > _window.contentItem.height / 2) { + dropDown = false + } + + if (dropDown) { + listView.anchors.bottom = undefined + listView.anchors.top = filterTextArea.bottom } else { - y = 0 + listView.anchors.bottom = filterTextArea.top + listView.anchors.top = undefined } } @@ -141,9 +160,14 @@ ComboBox { clip: true anchors.left: parent.left anchors.right: parent.right - anchors.top: filterTextArea.bottom - implicitHeight: (combo.height * (combo.model.length + 1) > _window.contentItem.height) ? _window.contentItem.height*2/3 : contentHeight + implicitHeight: { + if (combo.height * (combo.model.length + 1) > _window.contentItem.height) { + return _window.contentItem.height * 2 / 3 + } else { + return contentHeight + } + } model: combo.popup.visible ? combo.delegateModel : null ScrollBar.vertical: ScrollBar {