From 458c54e1443a695a27a890a9bcfb546a4f92b272 Mon Sep 17 00:00:00 2001 From: hATrayflood Date: Tue, 20 Oct 2015 00:20:30 +0900 Subject: [PATCH] fix #53: enable auto goto --- .../src/micropolisj/engine/Micropolis.java | 8 +++- .../src/micropolisj/gui/MainWindow.java | 40 ++++++++++++++++++- .../src/micropolisj/gui/NotificationPane.java | 25 +++++++++++- micropolis-java/strings/GuiStrings.properties | 3 ++ 4 files changed, 72 insertions(+), 4 deletions(-) diff --git a/micropolis-java/src/micropolisj/engine/Micropolis.java b/micropolis-java/src/micropolisj/engine/Micropolis.java index 1a1454c4..e3a83904 100644 --- a/micropolis-java/src/micropolisj/engine/Micropolis.java +++ b/micropolis-java/src/micropolisj/engine/Micropolis.java @@ -102,7 +102,7 @@ public class Micropolis public int gameLevel; - boolean autoGo; + public boolean autoGo = true; // census numbers, reset in phase 0 of each cycle, summed during map scan int poweredZoneCount; @@ -2169,6 +2169,12 @@ public void toggleAutoBulldoze() fireOptionsChanged(); } + public void toggleAutoGo() + { + autoGo = !autoGo; + fireOptionsChanged(); + } + public void toggleDisasters() { noDisasters = !noDisasters; diff --git a/micropolis-java/src/micropolisj/gui/MainWindow.java b/micropolis-java/src/micropolisj/gui/MainWindow.java index 47fc7146..7ebc64a8 100644 --- a/micropolis-java/src/micropolisj/gui/MainWindow.java +++ b/micropolis-java/src/micropolisj/gui/MainWindow.java @@ -177,7 +177,7 @@ public MainWindow(Micropolis engine) c.gridy = 3; c.weighty = 0.0; - notificationPane = new NotificationPane(engine); + notificationPane = new NotificationPane(engine, this); leftPane.add(notificationPane, c); pack(); @@ -545,6 +545,17 @@ public void actionPerformed(ActionEvent ev) })); optionsMenu.add(autoBulldozeMenuItem); + autoGoMenuItem = new JCheckBoxMenuItem(strings.getString("menu.options.auto_go")); + setupKeys(autoGoMenuItem, "menu.options.auto_go"); + autoGoMenuItem.addActionListener(wrapActionListener( + new ActionListener() { + public void actionPerformed(ActionEvent ev) + { + onAutoGoClicked(); + } + })); + optionsMenu.add(autoGoMenuItem); + disastersMenuItem = new JCheckBoxMenuItem(strings.getString("menu.options.disasters")); setupKeys(disastersMenuItem, "menu.options.disasters"); disastersMenuItem.addActionListener(wrapActionListener( @@ -793,6 +804,7 @@ private Micropolis getEngine() JMenuItem autoBudgetMenuItem; JMenuItem autoBulldozeMenuItem; + JMenuItem autoGoMenuItem; JMenuItem disastersMenuItem; JMenuItem soundsMenuItem; Map priorityMenuItems; @@ -810,6 +822,12 @@ private void onAutoBulldozeClicked() getEngine().toggleAutoBulldoze(); } + private void onAutoGoClicked() + { + dirty1 = true; + getEngine().toggleAutoGo(); + } + private void onDisastersClicked() { dirty1 = true; @@ -1109,6 +1127,21 @@ void doQueryTool(int xpos, int ypos) notificationPane.showZoneStatus(engine, xpos, ypos, z); } + public void centering(CityLocation loc) + { + Dimension d = drawingAreaScroll.getViewport().getExtentSize(); + Dimension mapSize = drawingAreaScroll.getViewport().getViewSize(); + + Point np = new Point( + loc.x * drawingArea.getTileSize() - d.width / 2, + loc.y * drawingArea.getTileSize() - d.height / 2 + ); + np.x = Math.max(0, Math.min(np.x, mapSize.width - d.width)); + np.y = Math.max(0, Math.min(np.y, mapSize.height - d.height)); + + drawingAreaScroll.getViewport().setViewPosition(np); + } + private void doZoom(int dir, Point mousePt) { int oldZoom = drawingArea.getTileSize(); @@ -1562,6 +1595,10 @@ public void cityMessage(MicropolisMessage m, CityLocation p) { notificationPane.showMessage(engine, m, p.x, p.y); } + if (getEngine().autoGo && p != null) + { + centering(p); + } } //implements Micropolis.Listener @@ -1580,6 +1617,7 @@ private void reloadOptions() { autoBudgetMenuItem.setSelected(getEngine().autoBudget); autoBulldozeMenuItem.setSelected(getEngine().autoBulldoze); + autoGoMenuItem.setSelected(getEngine().autoGo); disastersMenuItem.setSelected(!getEngine().noDisasters); soundsMenuItem.setSelected(doSounds); for (Speed spd : priorityMenuItems.keySet()) diff --git a/micropolis-java/src/micropolisj/gui/NotificationPane.java b/micropolis-java/src/micropolisj/gui/NotificationPane.java index f46d30c2..ba6fa3bb 100644 --- a/micropolis-java/src/micropolisj/gui/NotificationPane.java +++ b/micropolis-java/src/micropolisj/gui/NotificationPane.java @@ -23,6 +23,8 @@ public class NotificationPane extends JPanel MicropolisDrawingArea mapView; JPanel mainPane; JComponent infoPane; + MainWindow mainWindow; + CityLocation loc = null; static final Dimension VIEWPORT_SIZE = new Dimension(160,160); static final Color QUERY_COLOR = new Color(255,165,0); @@ -30,16 +32,27 @@ public class NotificationPane extends JPanel static final ResourceBundle mstrings = ResourceBundle.getBundle("micropolisj.CityMessages"); static final ResourceBundle s_strings = ResourceBundle.getBundle("micropolisj.StatusMessages"); - public NotificationPane(Micropolis engine) + public NotificationPane(Micropolis engine, MainWindow mainWindow) { super(new BorderLayout()); + this.mainWindow = mainWindow; setVisible(false); headerLbl = new JLabel(); headerLbl.setOpaque(true); headerLbl.setHorizontalAlignment(SwingConstants.CENTER); headerLbl.setBorder(BorderFactory.createRaisedBevelBorder()); - add(headerLbl, BorderLayout.NORTH); + + JButton goBtn = new JButton(strings.getString("notification.go_btn")); + goBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + onGoClicked(); + }}); + + JPanel headerPane = new JPanel(new BorderLayout()); + headerPane.add(headerLbl, BorderLayout.CENTER); + headerPane.add(goBtn, BorderLayout.EAST); + add(headerPane, BorderLayout.NORTH); JButton dismissBtn = new JButton(strings.getString("notification.dismiss")); dismissBtn.addActionListener(new ActionListener() { @@ -74,8 +87,16 @@ private void onDismissClicked() setVisible(false); } + private void onGoClicked() + { + if (loc != null) { + mainWindow.centering(loc); + } + } + void setPicture(Micropolis engine, int xpos, int ypos) { + loc = new CityLocation(xpos, ypos); Dimension sz = VIEWPORT_SIZE; mapView.setEngine(engine); diff --git a/micropolis-java/strings/GuiStrings.properties b/micropolis-java/strings/GuiStrings.properties index 950076e1..3eb555b6 100644 --- a/micropolis-java/strings/GuiStrings.properties +++ b/micropolis-java/strings/GuiStrings.properties @@ -106,6 +106,8 @@ menu.options.auto_budget = Auto Budget menu.options.auto_budget.key = A menu.options.auto_bulldoze = Auto Bulldoze menu.options.auto_bulldoze.key = Z +menu.options.auto_go = Auto Goto +menu.options.auto_go.key = G menu.options.disasters = Disasters menu.options.disasters.key = D menu.options.sound = Sound @@ -372,3 +374,4 @@ notification.value_lbl = Value: notification.crime_lbl = Crime: notification.pollution_lbl = Pollution: notification.growth_lbl = Growth: +notification.go_btn = GO!