Tasks already do what I was wanting to do (manage work timing), and do it better with more features, and do it in a way that other developers will more easily understand. Stop being weird, just use a Task.
UseShellExecute defaults to false in .Net Core. Give it an explicit value of 'true' to allow windows to run non-executable files. In this case, we want to look for whatever program is registered to run the *.gba file, which will very much not be an executable.
Add the ability to open the new scripts folder from within the app. Add sub-menus to organize the pokedex vs expansion utilities, since I'll be adding more expansion utilities soon.
Instead of initializing the model right away, launch a background task to do that. This allows the metadata to load while the tab draws itself. When initialization is complete, Refresh the ViewPort.
For the tests, use InstantDispatcher
Battle Backgrounds use palettes 2,3, and 4. But only palettes 2 and 3 flash when you let out a pokemon. Palette 4 is used for the obfuscation image that covers the screen as you scroll in, like grass or rocks or waves.
When importing an image that shares a palette with another image / tileset, the user may be curious to know what all images use the palette. The input window now has the ability to display "additional details", which right now is only used for sprites. But this would allow me to add other information to the options dialog in the future.
Files reload whenever they detect that the data changes. But this included if HMA changed the file itself o_O so I fixed that.
Re-initializing should not cause a duplicate dictionary addition for pointer offsets. Fixed.
* Pull some important info / links down from the help menu to the start page.
* Remove the Help -> About option, because it's now redundant.
* Add support for opening recent files from the start screen
* Remove concept of palettes from open/save images, since the actual code doesn't use this anymore.
* Refactor the bulk of short[]-and-width conversion into helper methods so they can be used by the new property.
* Add a new property, CopyImage, that can access an image in the clipboard.
The ability to Dispatch work to another thread is a scheduler concern, not a filesystem concern. These sets of operations should not be tied to the same object.
The idea here is that we still want to do work on the UI thread (because we're doing a bunch of command and collection notifications, which can't cleanly be done from a background thread). So we break the long "paste" operations into chunks, and allow UI updates between.
* When exporting an image, also export the original palette.
* When importing an image, if that palette is included, use it. Otherwise, use whatever the current loaded palette is as a comparison point.