Added a filter to minimize number of repaints of PlayArea when a number of similiar actions is performed, ex: Gavony Township, Storm Herd

This commit is contained in:
Maxmtg
2013-03-26 23:14:15 +00:00
parent 21868b6889
commit b74196b769

View File

@@ -24,10 +24,12 @@ import java.awt.event.MouseEvent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import forge.Card; import forge.Card;
import forge.FThreads;
import forge.view.arcane.util.Animation; import forge.view.arcane.util.Animation;
import forge.view.arcane.util.CardPanelMouseListener; import forge.view.arcane.util.CardPanelMouseListener;
@@ -497,7 +499,27 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen
* @param newList * @param newList
* an array of {@link forge.Card} objects. * an array of {@link forge.Card} objects.
*/ */
private final AtomicBoolean wantRedraw = new AtomicBoolean(false);
public void setupPlayZone() { public void setupPlayZone() {
boolean wasSet = wantRedraw.getAndSet(true);
if(wasSet) return;
FThreads.invokeInEDT(new Runnable() {
@Override
public void run() {
try { // user won't notice, but the requests coming in that interval won't trigger re-draw
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
wantRedraw.set(false);
final List<Card> modelshot = new ArrayList<Card>(model); // I am afraid of ConcurrentModificationExceptions
setupPlayZone(modelshot);
}
});
}
public void setupPlayZone(final List<Card> model) {
List<Card> oldCards, toDelete; List<Card> oldCards, toDelete;
oldCards = new ArrayList<Card>(); oldCards = new ArrayList<Card>();
for (final CardPanel cpa : getCardPanels()) { for (final CardPanel cpa : getCardPanels()) {