From 9aba2a4c55977703d81f1a22962d05474db1341c Mon Sep 17 00:00:00 2001 From: Lucia Jelinkova Date: Wed, 4 May 2022 12:40:07 +0200 Subject: [PATCH] webadmin: Fix reseting of graphics When the BIOS type changed, the graphics list was always reset even though the video type stayed the same. This was because the setting of the items and selected item was separated in https://gerrit.ovirt.org/c/ovirt-engine/+/118132 This patch goes back to setting the items and selected item at once but making sure that the selection model is not used to avoid issues fixed by https://gerrit.ovirt.org/c/ovirt-engine/+/118132 Bug-Url: https://bugzilla.redhat.com/2078193 --- .../ui/uicommonweb/models/ListModel.java | 27 +++++++++++++++++-- .../uicommonweb/models/vms/UnitVmModel.java | 10 +++---- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ListModel.java index 6c0c2908a41..20e76bce2f3 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/ListModel.java @@ -100,10 +100,27 @@ public void setItems(Collection value) { } public void setItems(Collection value, T selectedItem) { + setItems(value, selectedItem, true); + } + + /** + * Sets the values and the selected item at once. + * + * If the code uses this method to set items and in other places method + * setSelectedItem(), it is advised not to use the selection model (useSelectionModel = false) + * because there might be synchronization issues between the selection model and + * the selected item where the selected item is overwritten by the selection model's + * selected item. + * + * @param value Items to be set to the model + * @param selectedItem Selected item + * @param useSelectionModel Whether to use or not the selection model + */ + public void setItems(Collection value, T selectedItem, boolean useSelectionModel) { if (items != value) { itemsChanging(value, items); items = value; - itemsChanged(selectedItem); + itemsChanged(selectedItem, useSelectionModel); getItemsChangedEvent().raise(this, EventArgs.EMPTY); onPropertyChanged(new PropertyChangedEventArgs("Items")); //$NON-NLS-1$ } @@ -222,6 +239,10 @@ protected void itemPropertyChanged(Object sender, PropertyChangedEventArgs e) { } protected void itemsChanged(T selectedItem) { + itemsChanged(selectedItem, true); + } + + protected void itemsChanged(T selectedItem, boolean useSelectionModel) { if (selectedItem == null) { itemsChanged(); } else { @@ -229,7 +250,9 @@ protected void itemsChanged(T selectedItem) { selectedItems.add(selectedItem); setSelectedItem(selectedItem); setSelectedItems(selectedItems); - getSelectionModel().setSelected(selectedItem, true); + if (useSelectionModel) { + getSelectionModel().setSelected(selectedItem, true); + } } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java index 84bfc0d4ff1..ef3c4ddf17e 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java @@ -2598,13 +2598,13 @@ public void initDisplayModels(Set displayTypes) { } public void initDisplayModels(Set displayTypes, DisplayType selectedDisplayType) { - // set items and set selected one + // set items and set the selected display type but do not use selection model. The selection + // model causes synchronization problems because in other places we use setSelectedItem() that + // does not use the selection model too if (displayTypes.contains(selectedDisplayType)) { - getDisplayType().setItems(displayTypes); - getDisplayType().setSelectedItem(selectedDisplayType); + getDisplayType().setItems(displayTypes, selectedDisplayType, false); } else if (displayTypes.size() > 0) { - getDisplayType().setItems(displayTypes); - getDisplayType().setSelectedItem(displayTypes.iterator().next()); + getDisplayType().setItems(displayTypes, displayTypes.iterator().next(), false); } }