Add a new wacky feature to the editor - ctrl-clicking in add tile mode will select the tile you've clicked on as the new selected tile for future placement.

git-svn-id: svn+ssh://src.earth.threerings.net/vilya/trunk@977 c613c5cb-e716-0410-b11b-feb51c14d237
This commit is contained in:
Mike Thomas
2010-10-14 00:59:11 +00:00
parent 2cf9d3abe0
commit 78f56f881a
3 changed files with 58 additions and 5 deletions
@@ -525,6 +525,11 @@ public class EditorFrame extends ManagedJFrame
_svpanel.redo();
}
public void updateTileInfo ()
{
_tpanel.updateTileTable();
}
/**
* Handles a request to open the preferences dialog.
*/
@@ -334,6 +334,20 @@ public class EditorScenePanel extends StageScenePanel
EditorDialogUtil.display(_frame, _objEditor);
}
protected void selectTile (int x, int y)
{
// bail if we're not hovering over a scene object
if (_hobject == null || !(_hobject instanceof SceneObject)) {
return;
}
SceneObject scObj = (SceneObject)_hobject;
int tileSetId = TileUtil.getTileSetId(scObj.info.tileId);
int tileIndex = TileUtil.getTileIndex(scObj.info.tileId);
_emodel.setTile(scObj.tile.key.tileSet, tileSetId, tileIndex);
_emodel.setLayerIndex(EditorModel.OBJECT_LAYER);
}
/**
* Called by the {@link ObjectEditorDialog} when it is dismissed.
*/
@@ -459,8 +473,14 @@ public class EditorScenePanel extends StageScenePanel
case EditorModel.ACTION_PLACE_TILE:
switch (e.getButton()) {
case MouseEvent.BUTTON1:
if ((e.getModifiers() & MouseEvent.CTRL_MASK) != 0) {
// They've got ctrl down, let's select that tile instead.
clearTileSelectRegion(tc.x, tc.y);
selectTile(tc.x, tc.y);
} else {
placeTile(tc.x, tc.y);
_refreshBox = true;
}
break;
case MouseEvent.BUTTON2:
@@ -79,7 +79,7 @@ import static com.threerings.stage.Log.log;
* tile to be applied to the scene.
*/
public class TileInfoPanel extends JSplitPane
implements ListSelectionListener, TreeSelectionListener
implements ListSelectionListener, TreeSelectionListener, EditorModelListener
{
/**
* Constructs the tile info panel.
@@ -92,6 +92,7 @@ public class TileInfoPanel extends JSplitPane
registerKeyListener(ctx);
_model = model;
_model.addListener(this);
_ctx = ctx;
// we're going to sort all of the available tilesets into those
@@ -110,7 +111,8 @@ public class TileInfoPanel extends JSplitPane
// determine which layer to which this tileset applies
int lidx = TileSetUtil.getLayerIndex(set);
if (lidx != -1) {
_layerSets.get(lidx).add(new TileSetRecord(lidx, tsid.intValue(), set));
TileSetRecord rec = new TileSetRecord(lidx, tsid.intValue(), set);
_layerSets.get(lidx).add(rec);
}
}
@@ -195,6 +197,19 @@ public class TileInfoPanel extends JSplitPane
setDividerLocation(230);
}
// documentation inherited
public void modelChanged (int event)
{
if (event == TILE_CHANGED && !_settingTileOurselves) {
updateTileTable();
// Find the selected tileset and select it.
TreePath path = _idToTreePathMap.get(_model.getTileSetId());
_tsettree.setSelectionPath(path);
_tsettree.scrollPathToVisible(path);
}
}
/**
* Register key listeners to do things with the quick list.
*/
@@ -300,7 +315,9 @@ public class TileInfoPanel extends JSplitPane
// update the model to reflect new tile set and select tile
// zero by default
_settingTileOurselves = true;
_model.setTile(trec.tileSet, trec.tileSetId, 0);
_settingTileOurselves = false;
// update the tile table to reflect the new tileset
updateTileTable();
@@ -342,7 +359,8 @@ public class TileInfoPanel extends JSplitPane
int lidx = TileSetUtil.getLayerIndex(set);
if (lidx != -1) {
// make up a negative number to refer to this temporary tileset
_layerSets.get(lidx).add(new TileSetRecord(lidx, tsid, set));
TileSetRecord rec = new TileSetRecord(lidx, tsid, set);
_layerSets.get(lidx).add(rec);
}
if (tileMgr instanceof EditorTileManager) {
@@ -359,6 +377,7 @@ public class TileInfoPanel extends JSplitPane
*/
public void updateTileSetTree ()
{
_idToTreePathMap.clear();
// first clear out the tree
DefaultTreeModel model = (DefaultTreeModel) _tsettree.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
@@ -448,6 +467,8 @@ public class TileInfoPanel extends JSplitPane
_selected = item;
}
_idToTreePathMap.put(list[ii].tileSetId, new TreePath(item.getPath()));
ii++;
} else {
@@ -537,7 +558,9 @@ public class TileInfoPanel extends JSplitPane
// otherwise they clicked on the tile table.
ListSelectionModel lsm = (ListSelectionModel) src;
if (!lsm.isSelectionEmpty()) {
_settingTileOurselves = true;
_model.setTileId(lsm.getMinSelectionIndex());
_settingTileOurselves = false;
}
}
}
@@ -711,6 +734,9 @@ public class TileInfoPanel extends JSplitPane
/** An ArrayList of TileSetRecords for each layer. */
protected Map<Integer,List<TileSetRecord>> _layerSets = Maps.newHashMap();
/** Map of tileset ID to TreePath. */
protected Map<Integer, TreePath> _idToTreePathMap = Maps.newHashMap();
/** The original number of TileSetRecords for each layer. */
protected int[] _layerLengths;
@@ -743,4 +769,6 @@ public class TileInfoPanel extends JSplitPane
/** The tile table data model. */
protected TileTableModel _tablemodel;
protected boolean _settingTileOurselves;
}