diff --git a/src/main/java/bdv/tools/links/LinkActions.java b/src/main/java/bdv/tools/links/LinkActions.java index a6514b50..9c47d5f2 100644 --- a/src/main/java/bdv/tools/links/LinkActions.java +++ b/src/main/java/bdv/tools/links/LinkActions.java @@ -30,6 +30,8 @@ import static bdv.tools.links.ClipboardUtils.getFromClipboard; +import java.io.UnsupportedEncodingException; + import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; import org.scijava.ui.behaviour.io.gui.CommandDescriptions; @@ -53,9 +55,11 @@ public class LinkActions public static final String COPY_VIEWER_STATE = "copy viewer state"; public static final String PASTE_VIEWER_STATE = "paste viewer state"; + public static final String GENERATE_LINK_VIEWER_STATE = "generate link viewer state"; public static final String[] COPY_VIEWER_STATE_KEYS = new String[] { "ctrl C", "meta C" }; public static final String[] PASTE_VIEWER_STATE_KEYS = new String[] { "ctrl V", "meta V" }; + public static final String[] GENERATE_LINK_VIEWER_STATE_KEYS = new String[] { "ctrl L", "meta L" }; /* * Command descriptions for all provided commands @@ -73,6 +77,7 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) { descriptions.add( COPY_VIEWER_STATE, COPY_VIEWER_STATE_KEYS, "Copy the current viewer state as a string." ); descriptions.add( PASTE_VIEWER_STATE, PASTE_VIEWER_STATE_KEYS, "Paste the current viewer state from a string." ); + descriptions.add( GENERATE_LINK_VIEWER_STATE, GENERATE_LINK_VIEWER_STATE_KEYS, "Generate a fiji uri link to the current viewer state and copy it to the clipboard." ); } } @@ -85,6 +90,22 @@ private static void copyViewerState( ClipboardUtils.copyToClipboard( json.toString() ); } + private static void generateLinkViewerState( + final AbstractViewerPanel panel, + final ConverterSetups converterSetups, + final ResourceManager resources ) +{ + final JsonElement json = Links.copyJson( panel, converterSetups, resources ); + try{ + final String link = Links.generateLink( json ); + ClipboardUtils.copyToClipboard( link); + LOG.debug( "Generated link: {}", link ); + } + catch (final UnsupportedEncodingException e) { + LOG.debug( "couldn't generate link from JSON:\n\"{}\"", json, e ); + } +} + private static void pasteViewerState( final AbstractViewerPanel panel, final ConverterSetups converterSetups, @@ -133,5 +154,8 @@ public static void install( COPY_VIEWER_STATE, COPY_VIEWER_STATE_KEYS ); actions.runnableAction( () -> pasteViewerState( panel, converterSetups, pasteSettings, resources ), PASTE_VIEWER_STATE, PASTE_VIEWER_STATE_KEYS ); + actions.runnableAction( () -> generateLinkViewerState( panel, converterSetups, resources ), + GENERATE_LINK_VIEWER_STATE, GENERATE_LINK_VIEWER_STATE_KEYS ); + } } diff --git a/src/main/java/bdv/tools/links/Links.java b/src/main/java/bdv/tools/links/Links.java index 7f92eb80..fa2c4287 100644 --- a/src/main/java/bdv/tools/links/Links.java +++ b/src/main/java/bdv/tools/links/Links.java @@ -6,7 +6,10 @@ import static bdv.tools.links.PasteSettings.SourceMatchingMethod.BY_INDEX; import static bdv.tools.links.PasteSettings.SourceMatchingMethod.BY_SPEC_LOAD_MISSING; +import java.io.UnsupportedEncodingException; import java.lang.reflect.Type; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; @@ -41,6 +44,8 @@ class Links { private static final Logger LOG = LoggerFactory.getLogger( Links.class ); + final static String BASE_URL = "fiji://bdv?"; + static JsonElement copyJson( final AbstractViewerPanel panel, final ConverterSetups converterSetups, @@ -413,5 +418,11 @@ public JsonElement serialize( } } } + + public static String generateLink(JsonElement json) throws UnsupportedEncodingException{ + final String jsonString = json.toString(); + return BASE_URL + java.net.URLEncoder.encode(jsonString, java.nio.charset.StandardCharsets.UTF_8.name()); + } + } diff --git a/src/main/resources/bdv/ui/keymap/default.yaml b/src/main/resources/bdv/ui/keymap/default.yaml index 918ca1a2..abba40a2 100644 --- a/src/main/resources/bdv/ui/keymap/default.yaml +++ b/src/main/resources/bdv/ui/keymap/default.yaml @@ -394,4 +394,8 @@ - !mapping action: paste viewer state contexts: [bdv] - triggers: [ctrl V, meta V] \ No newline at end of file + triggers: [ctrl V, meta V] +- !mapping + action: generate link viewer state + contexts: [bdv] + triggers: [ctrl L, meta L] \ No newline at end of file