- fixed two more issues with recent update code!
- re-applied a more rigorously tested 'invalid subtag' replacement for any user that has experienced incomplete update code in the past few weeks
- added some tag rendering options to options->tags that affect most user-facing, non-editing windows:
- added custom namespace-subtag connector (i.e. instead of ':')
- added 'show namespaces' checkbox (i.e. to keep the colour but lose the namespace, like how most boorus display tags)
- created a basic framework for the duplicate filter--it doesn't do anything yet, but you can launch it from the duplicates page to check it out
- updated 'reset processing cache' action and added it to review services repository pages
- review services now always starts on 'my files'
- review services will try to stay looking at the currently selected service through a refresh_services event
- fixed some thread-gui refresh interaction in review services
- all listctrl-attached delete/remove buttons will now ask if you are sure before they go
- reenabled db->maintenance->clear orphans, which it turns out I had already fixed by accident
- serverside services will lock themselves more efficiently while generating updates, ensuring 'server busy' responses can always return promptly
- fixed tag manage parents a/c entry to remove tags when they already exist in the box (previously, the a/c would only ever add, so a double-click was required to remove)
- tuned adminside petition processing so it approves/denies in reasonable-sized chunks
- refactored all the taglist gui code to focus on the underlying tag rather than the string representation
- plenty of misc taglist cleanup besides
- started a unit test suite for listboxes and wrote a thorough test for namespace colour listbox
- misc canvas refactoring