Skip to content

Commit

Permalink
Add overlay menu for overlay toggle
Browse files Browse the repository at this point in the history
- Add an overlay menu that allows each overlay to be turned on and off
- Feature discussed in RPTools#1425
  • Loading branch information
Merudo committed Apr 14, 2020
1 parent 07a6cc0 commit afd2b80
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 4 deletions.
30 changes: 30 additions & 0 deletions src/main/java/net/rptools/maptool/client/AppActions.java
Expand Up @@ -82,6 +82,7 @@
import net.rptools.maptool.client.ui.assetpanel.AssetPanel;
import net.rptools.maptool.client.ui.assetpanel.Directory;
import net.rptools.maptool.client.ui.campaignproperties.CampaignPropertiesDialog;
import net.rptools.maptool.client.ui.htmlframe.HTMLOverlayManager;
import net.rptools.maptool.client.ui.io.FTPClient;
import net.rptools.maptool.client.ui.io.FTPTransferObject;
import net.rptools.maptool.client.ui.io.FTPTransferObject.Direction;
Expand Down Expand Up @@ -3045,6 +3046,35 @@ protected void executeAction(ActionEvent ae) {
}
};

/** Class representing the turn on / turn off action of an overlay. */
public static class ToggleOverlayAction extends ClientAction {
private final HTMLOverlayManager overlayManager;

/**
* Creates a toggle action from an overlayManager.
*
* @param overlayManager the overlayManager to toggle
*/
public ToggleOverlayAction(HTMLOverlayManager overlayManager) {
this.overlayManager = overlayManager;
}

@Override
public boolean isSelected() {
return overlayManager.isVisible();
}

@Override
public boolean isAvailable() {
return true;
}

@Override
protected void executeAction(ActionEvent e) {
overlayManager.setVisible(!isSelected());
}
}

public static class ToggleWindowAction extends ClientAction {
private final MTFrame mtFrame;

Expand Down
51 changes: 51 additions & 0 deletions src/main/java/net/rptools/maptool/client/ui/AppMenuBar.java
Expand Up @@ -22,6 +22,7 @@
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
Expand All @@ -37,12 +38,20 @@
import net.rptools.maptool.client.MRUCampaignManager;
import net.rptools.maptool.client.MapTool;
import net.rptools.maptool.client.ui.MapToolFrame.MTFrame;
import net.rptools.maptool.client.ui.htmlframe.HTMLOverlayManager;
import net.rptools.maptool.language.I18N;
import net.rptools.maptool.model.Zone;

public class AppMenuBar extends JMenuBar {
/** The manager of the Most Recently Used campaigns. */
private static MRUCampaignManager mruManager;

/** The menu for the overlays. */
private static JMenu overlayMenu;

/** The map containing the overlay items. */
private static final Map<String, JCheckBoxMenuItem> overlayItems = new HashMap<>();

public AppMenuBar() {
add(createFileMenu());
add(createEditMenu());
Expand Down Expand Up @@ -400,9 +409,50 @@ protected JMenu createZoomMenu() {
return menu;
}

/** @return an overlay menu. */
protected JMenu createOverlayMenu() {
overlayMenu = I18N.createMenu("menu.overlay");
overlayMenu.setEnabled(false); // empty by default
return overlayMenu;
}

/**
* Creates and add an overlay toggle menu item based on a overlayManager.
*
* @param overlayManager the overlayManager correspond to the overlay to toggle
*/
public static void addToOverlayMenu(HTMLOverlayManager overlayManager) {
JCheckBoxMenuItem menuItem =
new RPCheckBoxMenuItem(new AppActions.ToggleOverlayAction(overlayManager), overlayMenu);
menuItem.setText(overlayManager.getName());
overlayMenu.add(menuItem);
overlayMenu.setEnabled(true);
overlayItems.put(overlayManager.getName(), menuItem);
}

/**
* Removes an overlay menu item based on its name.
*
* @param overlayName the name of the overlay
*/
public static void removeFromOverlayMenu(String overlayName) {
JCheckBoxMenuItem menuItem = overlayItems.get(overlayName);
if (menuItem != null) {
overlayItems.remove(overlayName);
overlayMenu.remove(menuItem);
}
if (overlayItems.isEmpty()) {
overlayMenu.setEnabled(false);
}
}

protected JMenu createWindowMenu() {
JMenu menu = I18N.createMenu("menu.window");

menu.add(createOverlayMenu());

menu.addSeparator();

menu.add(
new AbstractAction() {
{
Expand All @@ -414,6 +464,7 @@ public void actionPerformed(ActionEvent e) {
MapTool.getFrame().getDockingManager().resetToDefault();
}
});

menu.addSeparator();

for (MTFrame frame : MapToolFrame.MTFrame.values()) {
Expand Down
Expand Up @@ -23,6 +23,7 @@
import java.util.Map;
import javafx.geometry.Rectangle2D;
import javafx.scene.web.WebView;
import javax.swing.*;
import net.rptools.maptool.client.AppPreferences;
import net.rptools.maptool.client.MapTool;
import net.rptools.maptool.client.functions.MacroLinkFunction;
Expand Down Expand Up @@ -89,6 +90,11 @@ void setZOrder(int zOrder) {
this.zOrder = zOrder;
}

/** @return the name of the overlay. */
public String getName() {
return name;
}

@Override
public int compareTo(@NotNull HTMLOverlayManager o) {
return getZOrder() - o.getZOrder();
Expand Down Expand Up @@ -155,6 +161,9 @@ private void makeWebEngineTransparent() {
* @return false if the element has --pointermap=block, true otherwise
*/
HTMLOverlayPanel.mousePassResult getMousePassResult(int x, int y) {
if (!isVisible()) {
return HTMLOverlayPanel.mousePassResult.PASS;
}
JSObject element =
(JSObject) getWebEngine().executeScript(String.format(SCRIPT_GET_FROM_POINT, x, y));
if (element == null) {
Expand Down
Expand Up @@ -33,6 +33,7 @@
import net.rptools.lib.swing.SwingUtil;
import net.rptools.maptool.client.MapTool;
import net.rptools.maptool.client.tool.DefaultTool;
import net.rptools.maptool.client.ui.AppMenuBar;
import net.rptools.maptool.client.ui.Tool;
import net.rptools.maptool.model.Token;
import org.apache.logging.log4j.LogManager;
Expand Down Expand Up @@ -78,7 +79,9 @@ void setupScene() {
event -> {
// Passes the mouse event to all overlays
for (HTMLOverlayManager overlay : overlays.values()) {
overlay.getWebView().fireEvent(event);
if (overlay.isVisible()) {
overlay.getWebView().fireEvent(event);
}
}
});

Expand Down Expand Up @@ -111,9 +114,11 @@ public void setOverlayCursor(java.awt.Cursor cursor) {
/** @return whether all overlay WebViews have the default cursor. */
public boolean areWebViewCursorsDefault() {
for (HTMLOverlayManager overlay : overlays.values()) {
Cursor cursor = overlay.getWebView().getCursor();
if (cursor == null || !"DEFAULT".equals(cursor.toString())) {
return false;
if (overlay.isVisible()) {
Cursor cursor = overlay.getWebView().getCursor();
if (cursor == null || !"DEFAULT".equals(cursor.toString())) {
return false;
}
}
}
return true;
Expand All @@ -128,6 +133,7 @@ void removeOverlay(String name) {
if (overlays.containsKey(name)) {
root.getChildren().remove(overlays.get(name).getWebView());
overlays.remove(name);
AppMenuBar.removeFromOverlayMenu(name);
if (overlays.isEmpty()) {
setVisible(false); // hide overlay panel if all are gone
}
Expand All @@ -142,6 +148,7 @@ public void removeAllOverlays() {
ObservableList<Node> listChildren = root.getChildren();
for (HTMLOverlayManager overlay : overlays.values()) {
listChildren.remove(overlay.getWebView());
AppMenuBar.removeFromOverlayMenu(overlay.getName());
}
overlays.clear();
setVisible(false);
Expand Down Expand Up @@ -177,6 +184,7 @@ public void showOverlay(String name, int zOrder, String html) {
overlayManager.setupWebView(new WebView());
overlays.put(name, overlayManager);
root.getChildren().add(overlayManager.getWebView());
AppMenuBar.addToOverlayMenu(overlayManager);
needsSorting = true;
}
if (needsSorting) {
Expand Down
Expand Up @@ -1020,6 +1020,7 @@ menu.export = Export
menu.file = &File
menu.help = &Help
menu.map = &Map
menu.overlay = &Overlays
menu.recent = &Recent Campaigns
menu.tools = &Tool
menu.view = &View
Expand Down

0 comments on commit afd2b80

Please sign in to comment.