diff --git a/meshroom/ui/qml/Controls/FilterComboBox.qml b/meshroom/ui/qml/Controls/FilterComboBox.qml index c51d9314d4..e9e717af71 100644 --- a/meshroom/ui/qml/Controls/FilterComboBox.qml +++ b/meshroom/ui/qml/Controls/FilterComboBox.qml @@ -66,15 +66,33 @@ 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 + listView.implicitHeight > _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 +159,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 {