Merge pull request #99 from moulins/menu-fix-shortcuts

Fix menu shortcuts on OS X
master
Stefan Dollase 2016-02-29 14:55:56 +01:00
commit 127e4ca50f
5 changed files with 61 additions and 36 deletions

View File

@ -50,12 +50,12 @@ public class AmidstMenuBuilder {
JMenu result = new JMenu("File");
result.setMnemonic(KeyEvent.VK_F);
// @formatter:off
Menus.item(result, actions::newFromSeed, "New from seed", KeyEvent.VK_N, "ctrl N");
Menus.item(result, actions::newFromRandom, "New from random seed", KeyEvent.VK_R, "ctrl R");
Menus.item(result, actions::openSaveGame, "Open save game ...", KeyEvent.VK_O, "ctrl O");
Menus.item(result, actions::newFromSeed, "New from seed", KeyEvent.VK_N, "N");
Menus.item(result, actions::newFromRandom, "New from random seed", KeyEvent.VK_R, "R");
Menus.item(result, actions::openSaveGame, "Open save game ...", KeyEvent.VK_O, "O");
result.addSeparator();
Menus.item(result, actions::switchProfile, "Switch profile ...", KeyEvent.VK_P, "ctrl W");
Menus.item(result, actions::exit, "Exit", KeyEvent.VK_X, "ctrl Q");
Menus.item(result, actions::switchProfile, "Switch profile ...", KeyEvent.VK_P, "W");
Menus.item(result, actions::exit, "Exit", KeyEvent.VK_X, "Q");
// @formatter:on
return result;
}
@ -65,21 +65,21 @@ public class AmidstMenuBuilder {
result.setEnabled(false);
result.setMnemonic(KeyEvent.VK_W);
// @formatter:off
Menus.item(result, actions::goToCoordinate, "Go to Coordinate", KeyEvent.VK_C, "ctrl shift C");
Menus.item(result, actions::goToSpawn, "Go to World Spawn", KeyEvent.VK_S, "ctrl shift S");
Menus.item(result, actions::goToStronghold, "Go to Stronghold", KeyEvent.VK_H, "ctrl shift H");
Menus.item(result, actions::goToPlayer, "Go to Player", KeyEvent.VK_P, "ctrl shift P");
Menus.item(result, actions::goToCoordinate, "Go to Coordinate", KeyEvent.VK_C, "shift C");
Menus.item(result, actions::goToSpawn, "Go to World Spawn", KeyEvent.VK_S, "shift S");
Menus.item(result, actions::goToStronghold, "Go to Stronghold", KeyEvent.VK_H, "shift H");
Menus.item(result, actions::goToPlayer, "Go to Player", KeyEvent.VK_P, "shift P");
result.addSeparator();
savePlayerLocationsMenu =
Menus.item(result, actions::savePlayerLocations, "Save player locations", KeyEvent.VK_V, "ctrl S");
Menus.item(result, actions::savePlayerLocations, "Save player locations", KeyEvent.VK_V, "S");
savePlayerLocationsMenu.setEnabled(false);
reloadPlayerLocationsMenu =
Menus.item(result, actions::reloadPlayerLocations, "Reload player locations", KeyEvent.VK_R, "F5");
Menus.item(result, actions::reloadPlayerLocations, "Reload player locations", KeyEvent.VK_R, "@F5");
reloadPlayerLocationsMenu.setEnabled(false);
Menus.item(result, actions::howCanIMoveAPlayer, "How can I move a player?", KeyEvent.VK_M);
result.addSeparator();
Menus.item(result, actions::copySeedToClipboard, "Copy Seed to Clipboard", KeyEvent.VK_B, "ctrl C");
Menus.item(result, actions::saveCaptureImage, "Save capture image ...", KeyEvent.VK_I, "ctrl T");
Menus.item(result, actions::copySeedToClipboard, "Copy Seed to Clipboard", KeyEvent.VK_B, "C");
Menus.item(result, actions::saveCaptureImage, "Save capture image ...", KeyEvent.VK_I, "T");
// @formatter:on
return result;
}
@ -100,11 +100,11 @@ public class AmidstMenuBuilder {
}
result.addSeparator();
// @formatter:off
Menus.checkbox(result, settings.smoothScrolling, "Smooth Scrolling", "ctrl I");
Menus.checkbox(result, settings.smoothScrolling, "Smooth Scrolling", "I");
Menus.checkbox(result, settings.fragmentFading, "Fragment Fading");
Menus.checkbox(result, settings.maxZoom, "Restrict Maximum Zoom", "ctrl Z");
Menus.checkbox(result, settings.showFPS, "Show Framerate", "ctrl L");
Menus.checkbox(result, settings.showScale, "Show Scale", "ctrl K");
Menus.checkbox(result, settings.maxZoom, "Restrict Maximum Zoom", "Z");
Menus.checkbox(result, settings.showFPS, "Show Framerate", "L");
Menus.checkbox(result, settings.showScale, "Show Scale", "K");
Menus.checkbox(result, settings.showDebug, "Show Debug Information");
// @formatter:on
return result;

View File

@ -90,40 +90,40 @@ public class LayersMenu {
private void createOverworldAndEndLayers(Dimension dimension) {
// @formatter:off
ButtonGroup group = new ButtonGroup();
Menus.radio( menu, dimensionSetting, group, Dimension.OVERWORLD, "ctrl shift 1");
Menus.radio( menu, dimensionSetting, group, Dimension.OVERWORLD, "shift 1");
createOverworldLayers(dimension);
menu.addSeparator();
Menus.radio( menu, dimensionSetting, group, Dimension.END, "ctrl shift 2");
endLayer( settings.showEndCities, "End City Icons", getIcon("end_city.png"), "ctrl 9", dimension, LayerIds.END_CITY);
Menus.radio( menu, dimensionSetting, group, Dimension.END, "shift 2");
endLayer( settings.showEndCities, "End City Icons", getIcon("end_city.png"), "9", dimension, LayerIds.END_CITY);
// @formatter:on
}
@CalledOnlyBy(AmidstThread.EDT)
private void createOverworldLayers(Dimension dimension) {
// @formatter:off
overworldLayer(settings.showSlimeChunks, "Slime Chunks", getIcon("slime.png"), "ctrl 1", dimension, LayerIds.SLIME);
overworldLayer(settings.showSpawn, "Spawn Location Icon", getIcon("spawn.png"), "ctrl 2", dimension, LayerIds.SPAWN);
overworldLayer(settings.showStrongholds, "Stronghold Icons", getIcon("stronghold.png"), "ctrl 3", dimension, LayerIds.STRONGHOLD);
overworldLayer(settings.showVillages, "Village Icons", getIcon("village.png"), "ctrl 4", dimension, LayerIds.VILLAGE);
overworldLayer(settings.showTemples, "Temple/Witch Hut Icons", getIcon("desert.png"), "ctrl 5", dimension, LayerIds.TEMPLE);
overworldLayer(settings.showMineshafts, "Mineshaft Icons", getIcon("mineshaft.png"), "ctrl 6", dimension, LayerIds.MINESHAFT);
overworldLayer(settings.showOceanMonuments, "Ocean Monument Icons", getIcon("ocean_monument.png"), "ctrl 7", dimension, LayerIds.OCEAN_MONUMENT);
overworldLayer(settings.showNetherFortresses, "Nether Fortress Icons", getIcon("nether_fortress.png"), "ctrl 8", dimension, LayerIds.NETHER_FORTRESS);
overworldLayer(settings.showSlimeChunks, "Slime Chunks", getIcon("slime.png"), "1", dimension, LayerIds.SLIME);
overworldLayer(settings.showSpawn, "Spawn Location Icon", getIcon("spawn.png"), "2", dimension, LayerIds.SPAWN);
overworldLayer(settings.showStrongholds, "Stronghold Icons", getIcon("stronghold.png"), "3", dimension, LayerIds.STRONGHOLD);
overworldLayer(settings.showVillages, "Village Icons", getIcon("village.png"), "4", dimension, LayerIds.VILLAGE);
overworldLayer(settings.showTemples, "Temple/Witch Hut Icons", getIcon("desert.png"), "5", dimension, LayerIds.TEMPLE);
overworldLayer(settings.showMineshafts, "Mineshaft Icons", getIcon("mineshaft.png"), "6", dimension, LayerIds.MINESHAFT);
overworldLayer(settings.showOceanMonuments, "Ocean Monument Icons", getIcon("ocean_monument.png"), "7", dimension, LayerIds.OCEAN_MONUMENT);
overworldLayer(settings.showNetherFortresses, "Nether Fortress Icons", getIcon("nether_fortress.png"), "8", dimension, LayerIds.NETHER_FORTRESS);
// @formatter:on
}
@CalledOnlyBy(AmidstThread.EDT)
private void createAllDimensions() {
// @formatter:off
Menus.checkbox(menu, settings.showGrid, "Grid", getIcon("grid.png"), "ctrl G");
Menus.checkbox(menu, settings.showPlayers, "Player Icons", getIcon("player.png"), "ctrl P");
Menus.checkbox(menu, settings.showGrid, "Grid", getIcon("grid.png"), "G");
Menus.checkbox(menu, settings.showPlayers, "Player Icons", getIcon("player.png"), "P");
// @formatter:on
}
@CalledOnlyBy(AmidstThread.EDT)
private void createEnableAllLayers() {
// @formatter:off
Menus.checkbox(menu, enableAllLayersSetting, "Enable All Layers", "ctrl E");
Menus.checkbox(menu, enableAllLayersSetting, "Enable All Layers", "E");
// @formatter:on
}

View File

@ -1,5 +1,6 @@
package amidst.gui.main.menu;
import java.awt.Toolkit;
import java.util.Objects;
import javax.swing.ButtonGroup;
@ -49,7 +50,7 @@ public enum Menus {
Setting<T> setting, ButtonGroup group, T value, String accelerator) {
JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem(
value.toString());
menuItem.setAccelerator(KeyStroke.getKeyStroke(accelerator));
menuItem.setAccelerator(getAcceleratorKeyStroke(accelerator));
return radio(menu, setting, group, menuItem, value);
}
@ -58,7 +59,7 @@ public enum Menus {
String accelerator) {
JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem(
value.toString(), icon);
menuItem.setAccelerator(KeyStroke.getKeyStroke(accelerator));
menuItem.setAccelerator(getAcceleratorKeyStroke(accelerator));
return radio(menu, setting, group, menuItem, value);
}
@ -86,7 +87,7 @@ public enum Menus {
public static JCheckBoxMenuItem checkbox(JMenu menu,
Setting<Boolean> setting, String text, String accelerator) {
JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(text);
menuItem.setAccelerator(KeyStroke.getKeyStroke(accelerator));
menuItem.setAccelerator(getAcceleratorKeyStroke(accelerator));
return checkbox(menu, setting, menuItem);
}
@ -94,7 +95,7 @@ public enum Menus {
Setting<Boolean> setting, String text, ImageIcon icon,
String accelerator) {
JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(text, icon);
menuItem.setAccelerator(KeyStroke.getKeyStroke(accelerator));
menuItem.setAccelerator(getAcceleratorKeyStroke(accelerator));
return checkbox(menu, setting, menuItem);
}
@ -115,7 +116,9 @@ public enum Menus {
public static JMenuItem item(JMenu menu, Runnable runnable, String text,
int mnemonic, String accelerator) {
JMenuItem menuItem = new JMenuItem(text);
menuItem.setAccelerator(KeyStroke.getKeyStroke(accelerator));
menuItem.setAccelerator(getAcceleratorKeyStroke(accelerator));
return item(menu, runnable, menuItem, mnemonic);
}
@ -126,4 +129,24 @@ public enum Menus {
menu.add(menuItem);
return menuItem;
}
public static KeyStroke getAcceleratorKeyStroke(String accelerator) {
if(accelerator == null)
return null;
boolean addMenuMask = true;
if(accelerator.startsWith("@")) {
accelerator = accelerator.substring(1);
addMenuMask = false;
}
KeyStroke shortcut = KeyStroke.getKeyStroke(accelerator);
int keycode = shortcut.getKeyCode();
int keymask = shortcut.getModifiers();
if(addMenuMask)
keymask |= Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
return KeyStroke.getKeyStroke(keycode, keymask);
}
}

View File

@ -5,6 +5,7 @@ import java.util.function.Supplier;
import amidst.documentation.NotNull;
public interface Setting<T> extends Supplier<T> {
@Override
@NotNull
T get();

View File

@ -13,6 +13,7 @@ import amidst.documentation.ThreadSafe;
@ThreadSafe
public class ThreadMaster {
private static final Runnable NOOP = new Runnable() {
@Override
public void run() {
// noop
}