diff --git a/src/java/com/threerings/media/AbstractMedia.java b/src/java/com/threerings/media/AbstractMedia.java index 18551d423..f7144f771 100644 --- a/src/java/com/threerings/media/AbstractMedia.java +++ b/src/java/com/threerings/media/AbstractMedia.java @@ -174,16 +174,19 @@ public abstract class AbstractMedia * (least to greatest). Those with the same render order value will be * rendered in arbitrary order. * - *
This must be set before the media is added to the - * appropriate manager and must not change while the manager is - * managing it. If you wish to change the render order, remove the - * media from the manager, change the order and add it back again. + *
This method may not be called during a tick. * * @see #HUD_LAYER */ public void setRenderOrder (int renderOrder) { - _renderOrder = renderOrder; + if (_renderOrder != renderOrder) { + _renderOrder = renderOrder; + if (_mgr != null) { + _mgr.renderOrderDidChange(this); + invalidate(); + } + } } /** diff --git a/src/java/com/threerings/media/AbstractMediaManager.java b/src/java/com/threerings/media/AbstractMediaManager.java index 497978e04..06978e4a5 100644 --- a/src/java/com/threerings/media/AbstractMediaManager.java +++ b/src/java/com/threerings/media/AbstractMediaManager.java @@ -163,6 +163,20 @@ public abstract class AbstractMediaManager } } + /** + * Called by a {@link AbstractMedia} when its render order has changed. + */ + public void renderOrderDidChange (AbstractMedia media) + { + if (_tickStamp > 0) { + Log.warning("Egads! Render order changed during a tick."); + Thread.dumpStack(); + } + + _media.remove(media); + _media.insertSorted(media, RENDER_ORDER); + } + /** * Calls {@link AbstractMedia#tick} on all media to give them a chance * to move about, change their look, generate dirty regions, and so diff --git a/src/java/com/threerings/parlor/card/client/CardPanel.java b/src/java/com/threerings/parlor/card/client/CardPanel.java index 155100c38..200725be4 100644 --- a/src/java/com/threerings/parlor/card/client/CardPanel.java +++ b/src/java/com/threerings/parlor/card/client/CardPanel.java @@ -684,9 +684,7 @@ public abstract class CardPanel extends VirtualMediaPanel continue; } if (updateLayers) { - removeSprite(cs); cs.setRenderOrder(i); - addSprite(cs); } LinePath adjust = new LinePath(new Point(getHandX(size, i), _handLocation.y), adjustDuration); @@ -805,9 +803,7 @@ public abstract class CardPanel extends VirtualMediaPanel int size = _boardSprites.size(), adjustment = layer - highest; for (int i = 0; i < size; i++) { CardSprite cs = (CardSprite)_boardSprites.get(i); - removeSprite(cs); cs.setRenderOrder(cs.getRenderOrder() + adjustment); - addSprite(cs); } }