Everything is initialised in the constructor, I used object initialiser syntax
where possible, layout is done with FLPs instead of absolute positioning, and I
changed the text a little
Functionally:
Fixed TabIndex (mostly by removing it), made the documentation link actually
visible, reordered the tabs, and changed some text.
In the code:
Did away with the designer's code style, moving declarations as close to their
init as possible.
To that end, most controls now use the object initialiser syntax, including
nested ControlCollections where possible (basically everything that isn't
assigned to a field).
The four TabPages and the more complex GroupBoxes are each constructed in a
helper method to make maintainance easier.
All event handlers are inlined as lambdas, the OK button's handler calls a
helper method to write out the config so it's easier to maintain.
Added some custom controls, and a float equality ext. method which I'm
definitely going to forget exists.
* add MAME to OpenAdvanced
* make mame launch games
limited to arcades that only need rom name. other devices require machine name and rom name, and won't run. nor they are meant to be supported anyway: we have enough emulators that do the job better for particular devices.
dunno if direct disk access will be avoidable, there are quite some files it might want to load other than the rom (parent rom, bios, artwork). trapping all of these might be a future task.
it is also known that mame can load "romname.zip" file just as well as "romname" folder, which would represent an unarchived zip. I make use of it to send it zip name with extension. it's easy, and we're not obliged to recognize mere folder paths in the mame-advanced-loader logic.
* ability to run lua code inside mame
CellHeight/_vBar/_hBar were being read *while the ctor was running* due to
unexplained Mono magic (and hence their values were 0/null/null, respectively)