diff --git a/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java b/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java index fd007b08ad1..c8d288df2a3 100644 --- a/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java +++ b/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java @@ -29,10 +29,9 @@ import forge.quest.QuestUtil; @SuppressWarnings("serial") public class FDeckChooser extends JPanel implements IDecksComboBoxListener { - private boolean isUISetup = false; - - private DecksComboBox decksComboBox = new DecksComboBox(); - private DeckType selectedDeckType = DeckType.COLOR_DECK; + private DecksComboBox decksComboBox; + private DeckType selectedDeckType; + private ItemManagerContainer lstDecksContainer; private final DeckManager lstDecks = new DeckManager(GameType.Constructed); private final FLabel btnViewDeck = new FLabel.ButtonBuilder().text("View Deck").fontSize(14).build(); @@ -267,17 +266,24 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { } public void populate() { - removeAll(); + if (decksComboBox == null) { //initialize components with delayed initialization the first time this is populated + decksComboBox = new DecksComboBox(); + lstDecksContainer = new ItemManagerContainer(lstDecks); + restoreSavedState(); + decksComboBox.addListener(this); + } + else { + removeAll(); + } this.setLayout(new MigLayout("insets 0, gap 0")); decksComboBox.addTo(this, "w 100%, h 30px!, gapbottom 5px, spanx 2, wrap"); - this.add(new ItemManagerContainer(lstDecks), "w 100%, growy, pushy, spanx 2, wrap"); + this.add(lstDecksContainer, "w 100%, growy, pushy, spanx 2, wrap"); this.add(btnViewDeck, "w 50%-3px, h 30px!, gaptop 5px, gapright 6px"); this.add(btnRandom, "w 50%-3px, h 30px!, gaptop 5px"); if (isShowing()) { - validate(); + revalidate(); repaint(); } - setupUI(); } public final boolean isAi() { @@ -296,23 +302,6 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { refreshDecksList(ev.getDeckType(), false, ev); } - /** - * Creates the various UI components that make up the Deck Chooser. - *

- * Only needs to be called once from populate() method so that - * components are "lazy-loaded" when Deck Chooser is first displayed. - */ - private void setupUI() { - if (!isUISetup) { - // Only do this once. - isUISetup = true; - // monitor events generated by these components. - decksComboBox.addListener(this); - // now everything is in place, fire initial populate event. - restoreSavedState(); - } - } - private void refreshDecksList(DeckType deckType, boolean forceRefresh, DecksComboBoxEvent ev) { if (selectedDeckType == deckType && !forceRefresh) { return; } selectedDeckType = deckType; diff --git a/forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java b/forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java index c2ca2277c62..616015a1716 100644 --- a/forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java +++ b/forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java @@ -483,14 +483,13 @@ public enum VSubmenuConstructed implements IVSubmenu { */ @Override public void populate() { - JPanel container = VHomeUI.SINGLETON_INSTANCE.getPnlDisplay(); container.removeAll(); container.setLayout(new MigLayout("insets 0, gap 0, wrap 1, ax right")); container.add(lblTitle, "w 80%, h 40px!, gap 0 0 15px 15px, span 2, al right, pushx"); - for(FDeckChooser fdc : deckChoosers) { + for (FDeckChooser fdc : deckChoosers) { fdc.populate(); } updateDeckSelectorLabels(); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java index e0b1d27ce71..dd394bce315 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java @@ -19,6 +19,8 @@ package forge.gui.toolbox.itemmanager; import java.awt.Component; import java.awt.Toolkit; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyAdapter; @@ -86,6 +88,7 @@ public abstract class ItemManager extends JPanel { private boolean alwaysNonUnique = false; private boolean allowMultipleSelections = false; private boolean hideFilters = false; + private int viewHeightBackup; private Command itemActivateCommand; private ContextMenuBuilder contextMenuBuilder; private final Class genericType; @@ -154,6 +157,17 @@ public abstract class ItemManager extends JPanel { this.viewScroller.setBorder(null); this.viewScroller.getViewport().setBorder(null); this.viewScroller.getVerticalScrollBar().addAdjustmentListener(new ToolTipListener()); + this.viewScroller.addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + //scroll selection into view whenever view height changes + int height = e.getComponent().getHeight(); + if (height != viewHeightBackup) { + viewHeightBackup = height; + scrollSelectionIntoView(); + } + } + }); //build enable filters checkbox ItemFilter.layoutCheckbox(this.chkEnableFilters);