Giter VIP home page Giter VIP logo

rptools / tokentool Goto Github PK

View Code? Open in Web Editor NEW
158.0 21.0 42.0 42.85 MB

TokenTool removes much of the tedium from creating tokens for use with MapTool or your favorite online gaming application. Just drag an image into the background, select a frame, zoom and pan to suit, and drag off a finished token. The resulting token is transparent around the edges and cropped to the size you wanted.

Home Page: http://www.rptools.net/toolbox/token-tool/

License: GNU Affero General Public License v3.0

Java 98.37% CSS 1.63%
rpg java tabletop role-playing role-playing-game roleplaying virtual-tabletop roleplaying-games

tokentool's Introduction

rptools

Top Level RPTools module

tokentool's People

Contributors

azhrei avatar cnschu avatar cwisniew avatar dependabot-preview[bot] avatar faxn avatar irisiflimsi avatar jamztheman avatar phergus avatar smaudet avatar tdue21 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tokentool's Issues

Changing portrait does not work

Describe the bug
When I load up TokenTool, and am presented with the default token (woman with gear frame), I go to portrait, change portrait, pick any image (and any format) from my hard disk, click OK. After this, the default portrait disappears and my image is not loaded.

Screenshots
where-portrait-go

TokenTool Info

  • Version: 2.2.1
  • Install: Fresh .rpm install

Desktop (please complete the following information):

  • OS: Fedora
  • Version 35

Add a way for users to contribute token overlays

If users want to contribute them, they would currently need to fork the repo and submit a PR. That's a lot of effort for someone who just wants to contribute some graphics assets back to the community.

Ideally, these assets would be stored on RPTools.net and TokenTool could check at launch for new assets and offer to download them (caching anything previously downloaded). Then contributing new ones amounts to adding an upload facility for RPTools.net, perhaps by a WP page that allows users to contribute and our Bard (RPTroll) to "accept" them for "publication" (i.e. approve them to be copied into the distribution directory where users can get them).

We'll need a policy that says we can reject images we don't consider in good taste, and we'll need support both on RPTools.net and in TokenTool...

MacOS: Menubar is on dialog when it should be at top of screen

Describe the bug
The Swing MenuBar is anchored to the top of the window by default, but on macOS is should be attached to the top of the screen.

To Reproduce
Steps to reproduce the behavior:

  1. Open the application on a Mac
  2. Notice where the menu appears.

Expected behavior
Menu should be at the top of the screen.

TokenTool Info

  • Version: 2.1-rc.3

Desktop (please complete the following information):

  • OS: macOS
  • Version 10.14 (tested, but applies to all versions)

Additional context
MapTool has similar code, I believe in AppMenuBar.java

Release build should create an MSI for windows

Is your feature request related to a problem? Please describe.
Like MapTool the release should create an MSI as well as an exe for windows

Describe the solution you'd like
For the release build to create an MSI as well as exe for windows

Describe alternatives you've considered
Not doing it :)

Additional context
For a variety of reasons it may not always be possible to get the exe install working.

The mask seems to not be working

When I make a token, the WHOLE image is being included, with the token overlay on top, but the creature's image also appears - both within the overlay, and ... OUTSIDE of the overlay, which wasn't how it worked in 1.0.

Is that an intended shift?

Unable to resize image in the token tool window?

Maybe I missed something, but I can't find any documentation for Token tool?

If this feature doesn't exist currently, then please consider this a feature enhancement request.

If I import a 800x1029 (eg.
deviantart_264864091_why not zoidberg image, I see no way to resize the image to fit a decent portion of it into the 256x256 token.

Yes I could resize the token larger, but wouldn't I then need to resize the token smaller in Maptool to fit into a 1in sq?

Now, I'm new to this, I just started using maptool a week or two ago, so I'm still learning.

But it seems like we should have some degree of image resizing in token tool, to help us capture the portion of the token that we would like.

WebP support request

Request to have WebP support for both being able to drop into the tool, and as a save option.

PSD not loading into Overlay Manager

I saw that PSD's with Magenta Masks were required for custom tokens, so i set one up as per thnis guide https://wiki.rptools.info/index.php/creating_TokenTool_Overlays, however when i try to import the PSD simply nothing happens.

Edit: I originally made the PSD in photoshop. I opened and re-saved it in Affinity Photo and it works for some reason, so I assume Photoshop has some sort of specific setting that was conflicting with this? (image mode? bit rate? color mode?) so if you run into this same problem, I guess re-open it in another less powerful editor and resave.

MacOS - Issue with Capture Screen function

MacOS Mojave - TokenTool 2.0

When I use the Capture Screen function it works fine the first time. The second and any further times I try it, it captures the transparent green capture box and button as part of the captured image.

I have tried removing and re-installing TokenTool, but same every time...

This does not seem to happen with the Windows version - at least not for me.

Crash when dragging Token from preview to MapTool canvas

Describe the bug
TokenTool crashes suddenly when dragging Token from preview to MapTool canvas.

To Reproduce
Steps to reproduce the behavior:

  1. Create token by dragging PNG from Safari to MapTool canvas
  2. Resize image using scroll on mouse
  3. Left click and drag token from preview pane to MapTool
  4. Experience crash and loss of clipboard on first but sometimes second token.
  5. Mac system error report (Pasted at bottom)

Expected behavior
Should be able to always drag a token from preview to MapTools without crashing.

Screenshots
If applicable, add screenshots to help explain your problem.

TokenTool Info

  • Version: 2.1
  • Install: Fairly new. Installed for a month or so. Seemed to work for a while without error from what I remember.

Desktop (please complete the following information):

  • OS: MacOS
  • Version: Mojave 10.14.6

Additional context
Attached Mac System Error Report

Mac System Error Report.txt

Add Text Label option to token.

Is your feature request related to a problem? Please describe.
Sometimes it's nice to add some text to a token image.

Describe the solution you'd like
Having a layer for one or more text labels could be nice.

Bonus would be if it could load small images for label frames to go under the text.

Describe alternatives you've considered
Currently do this in Gimp.

Additional context
Something like this:
King Louie

token tool not starting

Describe the bug
every time i start the application, about 1 cm loading is done and than everything shuts down

Expected behavior
I would like to start/use the tool again

Screenshots
image

TokenTool Info

  • Version: 2.2.1
  • Install: New,

Desktop (please complete the following information):

  • OS: Windows
  • Version 10

I had that once before, it was possible then to use the *.msi file and reinstall the program. that does NOT help this time

TokenTool crashes on startup on Ubuntu 21.10

Describe the bug
A clear and concise description of what the bug is.

I just installed 2.2.1 on Pop OS 21.10 (an Ubuntu derivative) from the .deb file. Previously (on 21.04 with TokenTool 2.1.x) everything worked perfectly. I can find TokenTool in my list of applications and when I start it I get the "caching overlays" screen and a loading bar, before the application crashes with no error.

To Reproduce
Steps to reproduce the behavior:

  1. Run the application from the app launcher.

Expected behavior
A clear and concise description of what you expected to happen.

Token Tool starts up correctly.

Screenshots
If applicable, add screenshots to help explain your problem.

TokenTool Info

  • Version: 2.2.1
  • Install: Clean install after sudo apt remove --purge tokentool.

Desktop (please complete the following information):

  • OS: Pop OS 21.10 (Ubuntu derivative)
  • Version 21.10

More Detailed Desktop Info

OS: Pop!_OS 21.10 x86_64 
Kernel: 5.15.5-76051505-generic 
Uptime: 5 days, 19 hours, 57 mins 
Packages: 2284 (dpkg), 11 (flatpak) 
Shell: zsh 5.8 
Resolution: 3840x2160 
DE: GNOME 40.5 
WM: Mutter 
WM Theme: Pop 
Theme: Pop-dark [GTK2/3] 
Icons: Pop [GTK2/3] 
Terminal: gnome-terminal 
CPU: AMD Ryzen 5 3600X (12) @ 3.800GHz 
GPU: AMD ATI Radeon RX 5600 OEM/5600 XT / 5700/5700 XT 
Memory: 8215MiB / 32035MiB 

Java Info

openjdk 11.0.12 2021-07-20
OpenJDK Runtime Environment (build 11.0.12+7-Ubuntu-0ubuntu3)
OpenJDK 64-Bit Server VM (build 11.0.12+7-Ubuntu-0ubuntu3, mixed mode, sharing)

Additional context
Add any other context about the problem here.
You can also attach files (drag and drop here or paste from clipboard) such as log files or screenshots. For large files, paste a file sharing link.

Filetype selector on Save As... dialog is stuck on WebP

Describe the bug
When using the File -> Save As... option to save tokens, the file type selector only option is WebP.

To Reproduce
Steps to reproduce the behavior:

  1. Open TokenTool
  2. Create token.
  3. On Save Options choose PNG for save format.
  4. Select File -> Save as and save token somewhere.
  5. Notice that because the file type is set to .webp no other image files file are show.
  6. The token is saved in the selected (PNG) format and will do the same for other formats.

Expected behavior
Expect that the file type selector match the chosen save format and also include the option to display all images.

Screenshots
image

TokenTool Info

  • Version: 2.2.0
  • Install: New.

Desktop (please complete the following information):

  • OS: Windows
  • Version: 10

Additional context
Reported on Discord.

An exception is logged when trying to close application while caching overlays

If the application is caching overlays, e.g. after closing the Overlay Manager, and the close button on the title bar is click, this exception is logged:

10:36:50.613 (TokenTool_Controller.java:1488) [JavaFX Application Thread] INFO  - overlayCount: 168
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
        at net.rptools.tokentool.controller.TokenTool_Controller.updateOverlayTreeViewRecentFolder(TokenTool_Controller.java:1339)
        at net.rptools.tokentool.controller.TokenTool_Controller.exitApplication(TokenTool_Controller.java:1827)
        at net.rptools.tokentool.client.TokenTool.lambda$start$1(TokenTool.java:158)
        at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
        at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
        at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
        at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
        at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
        at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
        at javafx.graphics/com.sun.javafx.stage.WindowPeerListener.closing(WindowPeerListener.java:93)
        at javafx.graphics/com.sun.javafx.tk.quantum.GlassWindowEventHandler.run(GlassWindowEventHandler.java:147)
        at javafx.graphics/com.sun.javafx.tk.quantum.GlassWindowEventHandler.run(GlassWindowEventHandler.java:40)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at javafx.graphics/com.sun.javafx.tk.quantum.GlassWindowEventHandler.lambda$handleWindowEvent$4(GlassWindowEventHandler.java:176)
        at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
        at javafx.graphics/com.sun.javafx.tk.quantum.GlassWindowEventHandler.handleWindowEvent(GlassWindowEventHandler.java:174)
        at javafx.graphics/com.sun.glass.ui.Window.handleWindowEvent(Window.java:1346)
        at javafx.graphics/com.sun.glass.ui.Window.notifyClose(Window.java:1246)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175)
        at java.base/java.lang.Thread.run(Thread.java:844)
[sentry-pool-1-thread-1] WARN io.sentry.connection.AbstractConnection.lockdown - Initiated a temporary lockdown because of exception: An exception occurred while submitting the event to the Sentry server.
[sentry-pool-1-thread-1] ERROR io.sentry.connection.AsyncConnection - An exception occurred while sending the event to Sentry.
io.sentry.connection.ConnectionException: An exception occurred while submitting the event to the Sentry server.
        at io.sentry.connection.HttpConnection.doSend(HttpConnection.java:216)
        at io.sentry.connection.AbstractConnection.send(AbstractConnection.java:76)
        at io.sentry.connection.AsyncConnection$EventSubmitter.run(AsyncConnection.java:185)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.net.SocketTimeoutException: connect timed out
        at java.base/java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
        at java.base/java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
        at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:400)
        at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:243)
        at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:225)
        at java.base/java.net.PlainSocketImpl.connect(PlainSocketImpl.java:148)
        at java.base/java.net.Socket.connect(Socket.java:591)
        at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:177)
        at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:474)
        at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:569)
        at java.base/sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
        at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:341)
        at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:362)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1242)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1181)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1075)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:1009)
        at io.sentry.connection.HttpConnection.doSend(HttpConnection.java:168)
        ... 5 more

It may not be terrible important, but there it is :)

Won't open

I am running Token tool v2.0 and up until this morning. It will not open, I see the loading screen, but then it minimizes and I see it on the windows bar on task bar but I can't ever get a window to open so that I can create tokens.

Capture Screen function freezes TokenTool (Ubuntu 22.04 XFCE)

Describe the bug
When you use screen capture and click on the "Caputer" button of the selection rectangle TokenTool will crash and hang. When starting TokenTool from terminal the following error will appear right after clicking "Capture"

(TokenTool:233909): Gdk-WARNING **: 10:11:01.924: XSetErrorHandler() called with a GDK error trap pushed. Don't do that.
10:11:19.569 (null:-1) [JavaFX Application Thread] DEBUG - Rect: java.awt.Rectangle[x=1302,y=410,width=266,height=241]

To Reproduce
Steps to reproduce the behavior:

  1. Go to 'Edit'
  2. Click on 'Capture Screen'
  3. Click on "Capture" on the selection rectangle
  4. TokenTool freezes

Expected behavior
Selected area is imported to TokenTool

Screenshots
none

TokenTool Info

  • Version: 2.2.1
  • Install: New

Desktop (please complete the following information):

  • OS: Ubuntu
  • Version 22.04

Additional context
When starting the tool there are two initial errors:

2023-10-27 10:20:14,735 JavaFX-Launcher ERROR Appenders contains an invalid element or attribute "Sentry"
2023-10-27 10:20:14,748 JavaFX-Launcher ERROR Unable to locate appender "Sentry" for logger config "root"
10:20:14.804 (null:-1) [JavaFX-Launcher] INFO - Overlays installed: 173
10:20:14.842 (null:-1) [JavaFX-Launcher] INFO - Environment: Production
10:20:14.843 (null:-1) [JavaFX-Launcher] INFO - Sentry DSN: https://[email protected]/1406000
10:20:14.843 (null:-1) [JavaFX-Launcher] INFO - Vendor: rptools
10:20:14.843 (null:-1) [JavaFX-Launcher] INFO - Release: 2.2.1
10:20:14.844 (null:-1) [JavaFX-Launcher] INFO - OS: Linux
10:20:14.844 (null:-1) [JavaFX-Launcher] INFO - 3D Hardware Available? true
10:20:14.851 (null:-1) [JavaFX-Launcher] DEBUG - caching /home/kodi/.tokentool-rptools/overlays

Dragging from upper right panel into main canvas leads to strange behavior

What happens looks consistent to a developer but a layman would consider this sureal.

  1. Drag from "preview" into main canvas and drop
  2. Modify sizes

I propose to make the preview non-draggable. I don't think this is intentional. In fact, when a token is copied from the main canvas, this preview is actually what is dropped. This drop on the main canvas may be intentional with copy and paste, but the drop from the preview is mostly accidental.

At least a one-step undo would be great here too.

[BUG]: TT hangs when clicking "Change Portrait Image"

Describe the bug
Report from a Discord user (link to the Discord post is here):

[...] when clicking "Change Portrait Image" (or background image) on Windows 10, nothing happens. It used to bring up an open file dialog, but now it does nothing. I tried updating to 2.2.1 with the msi, and it still does nothing.

To Reproduce
The user says they moved a directory that TT used to use. (Apparently, the app is looking for the directory at startup and hanging when it no longer exists, but that's just a WAG on my part.)

Expected behavior
If there's a problem, an error message should appear.

TokenTool Info

  • Version: 2.2.1 (latest)
  • Install: Apparently a new install using the .msi approach

Desktop (please complete the following information):

  • OS: Windows
  • Version 10

Additional context
Phergus posted a solution on Discord that involved opening the registry key

Computer\HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs\net\rptools\tokentool\client

and deleting these two entries:

last/Background/Image/File
last/Portrait/Image/File

Finer control over image size needed

Is your feature request related to a problem? Please describe.
When using the mouse-wheel to resize the portrait image the steps can be too large making it difficult to get just the right size.

Describe the solution you'd like
Would like a way to make the size jumps smaller by perhaps using Ctrl-Mouse-Wheel to produce smaller steps.

Additional context
Original posted on forums by EvilNerf.

jar does not launch

Downloaded the jar, as not running Debian based (openSUSE Tumbleweed)

java -jar tokentool-2.0.jar run
Error: Could not find or load main class net.rptools.tokentool.client.TokenTool

Is Oracle required? Currently using java-1_8_0-openjdk. Should I upgrade to OpenJDK 10 or 11?

The 2.2 installer does not contain overlays

Describe the bug
When installing a fresh 2.2 there are no overlays available, but the default Gear, Chrome.

To Reproduce
Steps to reproduce the behavior:

  1. Uninstall any previous TokenTool installations.
  2. Remove the ~.tokentool-rptools if it exists.
  3. Install TokenTool 2.2.
  4. Start TokenTool and observe the lack of overlays.

Expected behavior
I expected the default set of overlays to be included.

TokenTool Info

  • Version: 2.2.?
  • Install: New

Desktop (please complete the following information):

  • OS: Windows
  • Version 10

Additional context
If I install TokenTool 2.1 FIRST, and THEN 2.2., the overlays are present. So it seems that the overlays have been left out of the installer.
Trying to restore default overlays on a clean 2.2. does nothing.

ArrayIndexOutOfBoundsException: 65536

Sentry Issue: TOKENTOOL-2E

ArrayIndexOutOfBoundsException: 65536
    at net.rptools.tokentool.util.ImageUtil.resizeCanvas(ImageUtil.java:177)
    at net.rptools.tokentool.util.ImageUtil.getImage(ImageUtil.java:136)
    at net.rptools.tokentool.util.ImageUtil.getMaskImage(ImageUtil.java:71)
    at net.rptools.tokentool.controller.TokenTool_Controller.updateCompositImageView(TokenTool_Controller.java:1450)
    at net.rptools.tokentool.controller.TokenTool_Controller.lambda$initialize$1(TokenTool_Controller.java:367)
...
(34 additional frame(s) were not displayed)

Processing: C:\Users\Pierre\.tokentool-rptools\overlays\Round\Smooth\Chain Link, Blue.psd

[BUG]: Not opening Portrait images on Windows 11

Describe the bug
I open the tool and try to "Change Portrait Image", but no modal dialog opens. I receive no error nor view that something is wrong.

To Reproduce
Steps to reproduce the behavior:

  1. Go to "Portrait Options"
  2. Click on 'Change Portrait Image'
  3. Nothing happens

Expected behavior
In windows 10, a modal file explorer dialog opens with which I can choose my image.

TokenTool Info

  • Version: 2.2.1
  • Install: Upgrade [2.1]

Desktop (please complete the following information):

  • OS: [Windows]
  • Version [11]

Saving a Portrait with a Background Image ignores background size & placement

Describe the bug
When exporting a Portrait with a background image, the background image sizing and placement on the TokenTool canvas is ignored in the output, making bars of the current background color (or black if transparent). The background image is instead pushed to the top left of the background of the token image.

To Reproduce
Steps to reproduce the behavior:

  1. In TokenTool 2.1 add a partially transparent portrait image and a background image of a different size.
  2. Scale and pan the background image to contain the whole token. You can choose a bright background color as well to help illustrate the error.
  3. In 'Save Options' accordion panel, check 'Save Portrait on Drag & Drop' and 'Use Background Options'
  4. Drag the token into MapTool or the file system.
  5. See error, the background image is in a default location behind the portrait, rather than scaled/panned as in TT

Expected behavior
That the background layer is scaled/panned in the Portrait export the same as I placed it on the TT canvas.

Screenshots
TokenTool, note the background extends to contain the whole token:
image

After Export, note the yellow bars and background size/placement:
image

TokenTool Info

  • Version: 2.1
  • Install: New

Desktop (please complete the following information):

  • OS: Windows 10

Additional context
This is probably a non-issue for most people so maybe a low priority, though with Heroforge's new coloring tools I'll be using the backgrounds in TT a lot more. :)

Here is the portrait image transparency I used for testing: Transparent Portrait Image

Crash to desktop on loading

Describe the bug
Token tool does not launch from a clean install of Ubuntu 22.04

To Reproduce
I have a stack trace.
/opt/tokentool/bin$ ./TokenTool
2022-06-11 14:54:50,178 JavaFX-Launcher ERROR Appenders contains an invalid element or attribute "Sentry"
2022-06-11 14:54:50,190 JavaFX-Launcher ERROR Unable to locate appender "Sentry" for logger config "root"
14:54:50.256 (null:-1) [JavaFX-Launcher] INFO - Overlays installed: 183
14:54:50.293 (null:-1) [JavaFX-Launcher] INFO - Environment: Production
14:54:50.294 (null:-1) [JavaFX-Launcher] INFO - Sentry DSN: https://[email protected]/1406000
14:54:50.294 (null:-1) [JavaFX-Launcher] INFO - Vendor: rptools
14:54:50.294 (null:-1) [JavaFX-Launcher] INFO - Release: 2.2.1
14:54:50.295 (null:-1) [JavaFX-Launcher] INFO - OS: Linux
14:54:50.295 (null:-1) [JavaFX-Launcher] INFO - 3D Hardware Available? false
14:54:50.303 (null:-1) [JavaFX-Launcher] DEBUG - caching /home/matthew/.tokentool-rptools/overlays
14:54:50.303 (null:-1) [JavaFX-Launcher] DEBUG - caching /home/matthew/.tokentool-rptools/overlays/Cards
Exception in Application init method
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application init method
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: Image dimensions must be positive (w,h > 0)
at javafx.graphics/javafx.scene.image.Image.(Unknown Source)
at javafx.graphics/javafx.scene.image.WritableImage.(Unknown Source)
at [email protected]/net.rptools.tokentool.util.ImageUtil.processMagenta(Unknown Source)
at [email protected]/net.rptools.tokentool.util.ImageUtil.getImage(Unknown Source)
at [email protected]/net.rptools.tokentool.util.ImageUtil.getOverlayThumb(Unknown Source)
at [email protected]/net.rptools.tokentool.client.TokenTool.cacheOverlays(Unknown Source)
at [email protected]/net.rptools.tokentool.client.TokenTool.cacheOverlays(Unknown Source)
at [email protected]/net.rptools.tokentool.client.TokenTool.init(Unknown Source)
... 3 more
Exception running application net.rptools.tokentool.client.TokenTool

Expected behavior
Should load.

Screenshots
If applicable, add screenshots to help explain your problem.

TokenTool Info

  • Version: 2.2.1
  • Install: New

Desktop (please complete the following information):

  • OS: Ubuntu Linux
  • Version 22.04

Additional context
Add any other context about the problem here.
You can also attach files (drag and drop here or paste from clipboard) such as log files or screenshots. For large files, paste a file sharing link.

Fails to start with missing image on arch

Describe the bug
Fails to start with missing image

I imagine this is an issue with installation on arch, so I'd appreciate help manually fixing it (and I'll share results with the package maintainer)

To Reproduce
start app, which fails

TokenTool Info

  • Version: 2.2.1
  • Install: New

Desktop (please complete the following information):

  • OS: Arch
  • Version latest

Additional context

Installed from AUR, with a modified pkgbuild to get the latest version installed.

Debug log:

2021-08-30 10:51:41,489 JavaFX-Launcher ERROR Appenders contains an invalid element or attribute "Sentry"
2021-08-30 10:51:41,513 JavaFX-Launcher ERROR Unable to locate appender "Sentry"for logger config "root"
10:51:41.608 (null:-1) [JavaFX-Launcher] INFO  - Overlays installed: 183
10:51:41.665 (null:-1) [JavaFX-Launcher] INFO  - Environment: Production
10:51:41.666 (null:-1) [JavaFX-Launcher] INFO  - Sentry DSN: https://[email protected]/1406000
10:51:41.666 (null:-1) [JavaFX-Launcher] INFO  - Vendor: rptools
10:51:41.667 (null:-1) [JavaFX-Launcher] INFO  - Release: 2.2.1
10:51:41.667 (null:-1) [JavaFX-Launcher] INFO  - OS: Linux
10:51:41.668 (null:-1) [JavaFX-Launcher] INFO  - 3D Hardware Available? true
10:51:41.681 (null:-1) [JavaFX-Launcher] DEBUG - caching /home/user/.tokentool-rptools/overlays
10:51:41.682 (null:-1) [JavaFX-Launcher] DEBUG - caching /home/user/.tokentool-rptools/overlays/Square
10:51:42.180 (null:-1) [JavaFX-Launcher] DEBUG - caching /home/user/.tokentool-rptools/overlays/Round
10:51:42.181 (null:-1) [JavaFX-Launcher] DEBUG - caching /home/user/.tokentool-rptools/overlays/Round/Decorated
10:51:43.914 (null:-1) [JavaFX-Launcher] DEBUG - caching /home/user/.tokentool-rptools/overlays/Round/Smooth
10:51:46.768 (null:-1) [JavaFX-Launcher] DEBUG - caching /home/user/.tokentool-rptools/overlays/Round/Gears
10:51:46.950 (null:-1) [JavaFX-Launcher] DEBUG - caching /home/user/.tokentool-rptools/overlays/Round/Chains
10:51:47.654 (null:-1) [JavaFX-Launcher] DEBUG - caching /home/user/.tokentool-rptools/overlays/Round/Runes
10:51:48.353 (null:-1) [JavaFX-Launcher] DEBUG - caching /home/user/.tokentool-rptools/overlays/Round/Bottlecaps
10:51:49.122 (null:-1) [JavaFX-Launcher] DEBUG - caching /home/user/.tokentool-rptools/overlays/Cards
Exception in Application init method
java.lang.reflect.InvocationTargetException
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.base/java.lang.reflect.Method.invoke(Unknown Source)
 at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
 at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.base/java.lang.reflect.Method.invoke(Unknown Source)
 at java.base/sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application init method
 at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
 at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchA
pplication$2(Unknown Source)
 at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: Image dimensions must be positive(w,h > 0)
 at javafx.graphics/javafx.scene.image.Image.<init>(Unknown Source)
 at javafx.graphics/javafx.scene.image.WritableImage.<init>(Unknown Source)
 at [email protected]/net.rptools.tokentool.util.ImageUtil.processMagenta(Unknown Source)
 at [email protected]/net.rptools.tokentool.util.ImageUtil.getImage(Unknown Source)
 at [email protected]/net.rptools.tokentool.util.ImageUtil.getOverlayThumb(Unknown Source)
 at [email protected]/net.rptools.tokentool.client.TokenTool.cacheOverlays(Unknown Source)
 at [email protected]/net.rptools.tokentool.client.TokenTool.cacheOverlays(Unknown Source)
 at [email protected]/net.rptools.tokentool.client.TokenTool.init(Unknown Source)
 ... 3 more
Exception running application net.rptools.tokentool.client.TokenTool

Translation issues

I have translated TokenTool to danish, but there are a number of issues, that I am unable to handle through translation of i18n properties alone.

Untranslatable

Portrait Options

This button and dropdown are not currently translatable:
image

I realize that the Custom Color dialog is probably a standard component, but still, it should be translatable.

Overlay Options

Likewise the default overlay folders and images are also fixed texts, that is not translatable.
image

Manage Overlays Dialog

Finally, the dialog for managing overlays has a couple of issues as well. The default overlays are not translatable as they seem to be hardcoded.

image

Again, the overlay name is hardcoded, as well as the file type, if it is a Photoshop file.

image

Unable to build source

I am a complete newbie regarding Java, but thought I would be able to fix a simple bug or two. I am completely unable to get the thing to build though. I am doing this:

gradlew.bat build

In the root of the folder, and I end up with this:

Step 'removeUnusedImports' found problem in 'src\main\java\net\rptools\tokentool\AppConstants.java':
javax/tools/JavaFileManager$Location
java.lang.NoClassDefFoundError: javax/tools/JavaFileManager$Location
        at com.diffplug.spotless.java.GoogleJavaFormatStep$State.createRemoveUnusedImportsOnly(GoogleJavaFormatStep.java:113)
        at com.diffplug.spotless.FormatterStepImpl$Standard.format(FormatterStepImpl.java:76)
        at com.diffplug.spotless.FormatterStep$Strict.format(FormatterStep.java:76)
        at com.diffplug.spotless.Formatter.compute(Formatter.java:230)
        at com.diffplug.spotless.Formatter.isClean(Formatter.java:167)
        at com.diffplug.gradle.spotless.SpotlessTask.check(SpotlessTask.java:263)
        at com.diffplug.gradle.spotless.SpotlessTask.performAction(SpotlessTask.java:205)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103)
        at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:73)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$4.run(ExecuteActionsTaskExecuter.java:338)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:327)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:312)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:75)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:158)
        at org.gradle.internal.execution.impl.steps.ExecuteStep.execute(ExecuteStep.java:46)
        at org.gradle.internal.execution.impl.steps.CancelExecutionStep.execute(CancelExecutionStep.java:34)
        at org.gradle.internal.execution.impl.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:69)
        at org.gradle.internal.execution.impl.steps.TimeoutStep.execute(TimeoutStep.java:49)
        at org.gradle.internal.execution.impl.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
        at org.gradle.internal.execution.impl.steps.CreateOutputsStep.execute(CreateOutputsStep.java:49)
        at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:42)
        at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:28)
        at org.gradle.internal.execution.impl.steps.CacheStep.executeWithoutCache(CacheStep.java:133)
        at org.gradle.internal.execution.impl.steps.CacheStep.lambda$execute$5(CacheStep.java:83)
        at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:82)
        at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:37)
        at org.gradle.internal.execution.impl.steps.PrepareCachingStep.execute(PrepareCachingStep.java:33)
        at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:38)
        at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:23)
        at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:95)
        at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:88)
        at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:52)
        at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:34)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.ResolveIncrementalChangesTaskExecuter.execute(ResolveIncrementalChangesTaskExecuter.java:84)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:91)
        at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionStateTaskExecuter.execute(ResolveBeforeExecutionStateTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
        at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:93)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:45)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:94)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:63)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:46)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
        at org.gradle.execution.plan.DefaultPlanExecutor.process(DefaultPlanExecutor.java:74)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.executeWithServices(DefaultTaskExecutionGraph.java:178)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.execute(DefaultTaskExecutionGraph.java:154)
        at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:41)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:40)
        at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:24)
        at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:46)
        at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:49)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:40)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:33)
        at org.gradle.initialization.DefaultGradleLauncher$ExecuteTasks.run(DefaultGradleLauncher.java:383)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.initialization.DefaultGradleLauncher.runTasks(DefaultGradleLauncher.java:247)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:159)
        at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:134)
        at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:58)
        at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:55)
        at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:82)
        at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:75)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:183)
        at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:40)
        at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:75)
        at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:55)
        at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:31)
        at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
        at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:58)
        at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
        at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:39)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:49)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:44)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:44)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:49)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:46)
        at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:78)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:46)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:31)
        at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:42)
        at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:28)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:52)
        at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:59)
        at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:36)
        at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:68)
        at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:38)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:37)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:26)
        at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
        at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:60)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:32)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:41)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:48)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:32)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
        at org.gradle.util.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.ClassNotFoundException: javax.tools.JavaFileManager$Location
        ... 175 more

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':spotlessJava'.
> javax/tools/JavaFileManager$Location

What am I missing?

Add New File Format Support: AVIF

Is your feature request related to a problem? Please describe.
Add support for the AVIF file format, it has a comparable compression ratio to WebP, but less destructive when it comes to image quality. Currently, using WebP with the program, it works well most of the time, but sometimes the loss of quality is very noticeable, this happens far less often with AVIF, especially since most portrait source are already compressed, and we're compressing the image at least twice. I'm a bit loss of information averse.

Describe the solution you'd like
I'm not sure which encoder library you guys use, but the official AVIF one is here, but FFmpeg and SAIL also support it.

Describe alternatives you've considered
Currently, using WebP, it works well most of the time, but sometimes the loss of quality is very noticeable. Could still use JPEG, but I'm not sure if TokenTool can just crop a file losslessly if the output format is the same as the input one.

Additional context
Current browser support 83%.

Token Tool 2.2.1 will not open

Describe the bug
Can not start program. Click Icon and splash screen appears, green bar starts to fill and then crashes with no error message. Have uninstalled and re-downloaded and re-installed. No change.

To Reproduce
Steps to reproduce the behavior:
Try to open Token Tool

Expected behavior
Have token Tool open

TokenTool Info

  • Version: 2.2.1
  • Install: New

Desktop (please complete the following information):

  • OS: Windows 11 Home
  • Version: 22H2

TokenTool won't run if install path has accented characters

Describe the bug
TokenTool won't run after installing to a directory with accented characters in the name.

Known to be an issue are these from the Polish language: ą ę ś ż ź ó ł ń ć

To Reproduce
Steps to reproduce the behavior:

  1. Install TokenTool to a path with one or more of the characters above in the path.
  2. TokenTool won't launch.

Expected behavior
Expect it to handle any valid Windows path.

TokenTool Info

  • Version: 2.1
  • Install: New

Desktop (please complete the following information):

  • OS: Windows
  • Version: 10

Additional context
Reported by wyelky-jaahr on Discord.

jar file doesn't run on Fedora 27

I downloaded tokentool-2.0 on 25 Oct 2018 and attempted to run it on x86_64 Fedora 27:

$ java -jar tokentool-2.0.jar 
Error: Could not find or load main class net.rptools.tokentool.client.TokenTool

I also tried using alien to convert the .deb package, but that quickly degenerated into dependency hell.

I am probably doing something wrong here, but there's no documentation that I can find.

TokenTool does not start

Describe the bug

After installing, TokenTool does not start, and also not appear the splashscreen and any error dialogs.

TokenTool Info

  • Version: 2.2.0-rc.1
  • Install: Upgrade from 2.1, and New

Desktop

  • OS: Windows
  • Version: 10 Pro x64 20H2
  • Locale: Japanese

Additional Context

  • I had tried install two locations, %USERPROFILE%\AppData\Local\TokenTool and C:\App\TokenTool. I got same results.
  • MapTool 1.8.x also did not start in Japanese locale. Perhaps, is it same problem? (I changed locale to English and tried, but TokenTool did not launch.)
  • After trying to start TokenTool, a error log file was produced in installed direcotory.

hs_err_pid15508.log

Updated Overlays

Is your feature request related to a problem? Please describe.
The included overlays are rather low-resolution. They're good options, in theory, but look fuzzy in practice.

Describe the solution you'd like
Do you have higher-resolution originals? Could you update them to something like 800x800?

Describe alternatives you've considered
Alternatively, a new set of overlays would work.

Additional context
N/A

Option to not autocrop/ recentre for asymmetric overlays

Is your feature request related to a problem? Please describe.
I use custom overlays which are mostly hex, but have additional non-transparent pixels on one side of the hex (front facing). These are centred correctly based on the hex centre in the overlay+mask, but when saving an image from tokentool, the token is re-centred based on the extents of non-transparent pixels in the overlay, so the resulting token image is not centred w.r.t. the layout in the overlay.

Describe the solution you'd like
It would be nice to have an option to not auto-crop/re-centre overlay/mask if you know your overlay is asymmetric, but centred within the extent of the overlay psd. Either on overlay import or within overlay options would both be fine.

Describe alternatives you've considered
At the moment I'm post-processing each image to shift the content up vertically about 3% within the frame.

Additional context
Example of overlay and token produced without any portrait or background image (the token is 12px shifted down vertically vs where it should be):
aquaoverlay
overlay_mask

aquatoken

Change Portrait button stopped working

The change portrait button has stopped working

I have a portrait in place. i click on change portrait. nothing happens.

i expect the window to select a file to open up. it doesnt.

Token tool version 2.1
Install NEW removed previous version to ry and fix problem,

Windows 10

Generating two-sided tokens

Is your feature request related to a problem? Please describe.
Currently, only "one-sided" tokens can be generated. It shouldn't be a big problem to add options for "two-sided".
The point is that now, if I want to have a two-sided token, I have to save it in TokenTool, open it in Gimp, duplicate it, turn the second copy 180 degrees and mirror it. These are simple image operations.

All this options could be automated at the TokenTool level.

Describe the solution you'd like
Added option to duplicate and reverse the token.

Additional context
From something like this:
gnome-priest_ramka

Make something like this:
gnome_priest_plaskacz

After printing, cutting and folding, I get a double-sided token.

TokenTool cannot handle UTF8 strings in file names

Describe the bug
When dragging a token from a file whose original name contains accented characters, the accented characters are stripped and replaced with underscores.

To Reproduce
Steps to reproduce the behavior:

  1. Name an image file something with special characters. For example: "Nénuphar di Hevonen.jpg".
  2. Drag it into TokenTool. Size and position it to taste.
  3. Drag the token from the preview area to a folder.
  4. Observe that the resulting file name is "N_nuphar di Hevonen.png", as the é has been converted to a _.

Expected behavior
It retains the original characters.

TokenTool Info

  • Version: 2.1 - not sure if there's a newer one out

Desktop (please complete the following information):

  • OS: Windows
  • Version 10

TokenTool randomly saves last screen position with bad coordinates

Describe the bug
Seemingly at random, TokenTool will save it's last screen position with negative screen coordinates way off the actual available screen space.

HKEY_CURRENT_USER\Software\JavaSoft\Prefs\net\rptools\tokentool\client
window_x = -32000.0
window_y = -32000.0

To Reproduce
Steps to reproduce the behavior:

  1. Unknown but appears to be related to dual monitor setups.

Expected behavior
Expect it not to happen.

TokenTool Info

  • Version: 2.0+
  • Install: Any

Desktop (please complete the following information):

  • OS: Windows
  • Version:

Additional context
See forum post.

Request for increased maximum resolution

It seems the max resolution supported for generated tokens is 1000 px x 1000 px. I would like to have support for printing gargantuan creatures (4 in x 4 in) at 600 dpi. Would it be possible to increase the max token size to 2400 px x 2400 px? Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.