浏览代码

Reduce excess positioning calls for ComboBox popup. (#11808)

- If an open popup is reset to its default position on every update from
the server before getting adjusted again to the actual expected
position, on heavier applications some of those intermediate positions
might get rendered. If the ComboBox is positioned at the right edge and
the popup contents are longer than the input field (i.e. popup should
open to the left, not right) this might cause flickering.
- Setting the default position is only actually needed when the popup is
opened in order to give it a baseline, otherwise it's better to simply
adjust the position if needed.

Continues on #11718
tags/8.10.0.alpha1
Anna Koskinen 4 年前
父节点
当前提交
a8310a63c6
没有帐户链接到提交者的电子邮件
共有 1 个文件被更改,包括 21 次插入8 次删除
  1. 21
    8
      client/src/main/java/com/vaadin/client/ui/VComboBox.java

+ 21
- 8
client/src/main/java/com/vaadin/client/ui/VComboBox.java 查看文件

@@ -428,10 +428,15 @@ public class VComboBox extends Composite implements Field, KeyDownHandler,
// Add TT anchor point
getElement().setId("VAADIN_COMBOBOX_OPTIONLIST");

leftPosition = getDesiredLeftPosition();
topPosition = getDesiredTopPosition();
// Set the default position if the popup isn't already visible,
// the setPopupPositionAndShow call later on can deal with any
// adjustments that might be needed
if (!popup.isShowing()) {
leftPosition = getDesiredLeftPosition();
topPosition = getDesiredTopPosition();

setPopupPosition(leftPosition, topPosition);
setPopupPosition(leftPosition, topPosition);
}

int nullOffset = getNullSelectionItemShouldBeVisible() ? 1 : 0;
boolean firstPage = currentPage == 0;
@@ -894,16 +899,24 @@ public class VComboBox extends Composite implements Field, KeyDownHandler,
}
}

if (offsetWidth + menuMarginBorderPaddingWidth
+ left < VComboBox.this.getAbsoluteLeft()
+ VComboBox.this.getOffsetWidth()) {
// Popup doesn't reach all the way to the end of the input
// field, filtering may have changed the popup width.
left = VComboBox.this.getAbsoluteLeft();
}
if (offsetWidth + menuMarginBorderPaddingWidth + left > Window
.getClientWidth()) {
// Popup doesn't fit the view, needs to be opened to the left
// instead.
left = VComboBox.this.getAbsoluteLeft()
+ VComboBox.this.getOffsetWidth() - offsetWidth
- (int) menuMarginBorderPaddingWidth;
if (left < 0) {
left = 0;
menu.setWidth(Window.getClientWidth() + "px");

}
}
if (left < 0) {
left = 0;
menu.setWidth(Window.getClientWidth() + "px");
}

setPopupPosition(left, top);

正在加载...
取消
保存