Another question regarding your geometry representation - how do you deal with the fact that none of your faces share common vertices? I mean, implicitly they do, but each face stores its own vertices as far as I can see from your code, which means that translating one vertex of the brush would correspond to translating multiple vertex locations (one for each neighbour face). Also, how do you deal with vertex manipulations possibly causing the vertices of a face to become non-coplanar?
Additionally, in relation to the plugin discussions, the way I was intending Crowbar's toolkit to work was to have everything as a plugin - all tools right down to selection being a module located at runtime, with the possibility of inter-plugin dependencies and of utilising Qt's native support for JS scripts for the less performance-critical plugins. I've also so far implemented a clone of the console from the Source engine, complete with console variables and commands and support for command piping Unix-style, in order to help expose as much of the application to external configuration as possible. I don't know how realistic design choices in this direction would be for Sledge at this stage, considering you've got a fair amount of the core framework done already, but absolutely feel free to re-use any of the console code concepts (albeit physically written in C++) if you feel they'd be helpful.