The SetImageList gives ListCtrl a pointer to use for the images, which we can then asynchronously load its items from. There's no locking, but before we upgraded it to use the new API it has never really caused any issues. In 40302a706b I upgraded to the recommended API that's mentioned in the wxWidgets docs.
However, the performance, especially with a lot of game titles installed, was quite terrible with this new API due to us needing to call wxListCtrl::Set*Images each time a new icon was loaded, which it'll have to rescale each time for the user's DPI (at least, it seems to spend a long time in a bitmap/icon rescaling method). https://github.com/cemu-project/Cemu/issues/1672 brought this up. So ultimately I think it's just better from a usability standpoint to use the old methods.
Also, I removed some of the hacks that were used for the icon column width size, now that its using the new upstreamed fix. I also added a flag to draw vertical lines between the columns.
This is a full rewrite of our nn_boss (SpotPass) implementation. The previous code was based on a lot of incorrect guesswork so rather than updating that it made more sense to redo it all.
In short what changed:
- More API implemented than before, but nn_boss is very complex so we are still missing stuff (e.g. PlayReports and Task scheduling)
- Avoids redownloading nbdl files if they are already present locally (matches IOSU behavior)
- The API should be more robust in general and file hashes are now verified
- Emulated IOSU interface is compatible with nn_boss.rpl
- Added an UI option to clear the SpotPass cache
* Fix black text after graphic pack is disabled in dark mode
* Fix background colour of audio debugger in dark mode
* Make placeholder game list icons black when using dark mode
* Some tweaks to the HotkeySettings window:
- Make strings translatable
- Makes the column headers bold for clarity
- Makes the border darker on Linux, fixed by @goeiecool9999
- Make the column headers have some padding to make it look nicer.
Closing the settings window will immediately flush a temporary 0, 0 value it writes for the size which gets overwritten by the MainWindow a few seconds later.
In the code, -1 is considered the "off" state, and 0 is considered a "it should be saved, but only whenever the value is available". The save gamepad size/pos option already worked like this new behavior, since you might enable the option but not (previously) have it open yet. When encountering a 0 as the size, it'll just use the default window size of Cemu.