There is some info here:
http://esotericsoftware.com/spine/building-spine/#tech
Using a good scene graph helps with UIs, both with being productive and organizing your code. Selection in Spine is pretty complex, as it tries to be smart about it: there is no select tool, you just click and it does what you'd expect.
Undo can be tricky. At first I just snapshotted the whole project. This worked fine until projects got to be about 8MB in memory, then it was too slow. I now snapshot only the objects that change. Eg...
Undo.next();
Undo.add(object.stuff);
object.stuff[0] =123;
Undo.add does a shallow copy using Kryo. This code is enough to know what the object was before and after the change, so it can move forward and backward through the history.
I'm very anal about having nice code, especially for my OSS. For a personal project, having nice code can waste a lot of time. I start by building the app in a single file. As it becomes complex, I refactor break portions out into static classes, still in the same file. By the time it gets even more complex, I have a good idea of how to organize it properly and I break things into their own files.
It's a balancing act, if you refactor too soon your program will change a lot and you'll have wasted time making things nice that you then throw away. If you refactor too much and have fancy interfaces, tons of separate files, etc then your over engineering makes it harder to work on and harder to refactor later. In a complex app that only you work on, you want reasonable organization without wasting too much time.
Be aware of decoupling but don't be afraid to use public fields, don't worry about optimizations (especially for a desktop app), and don't worry about making the code too nice. Refactor periodically to clean up your mess, but don't go crazy with it. 🙂 The goal is to get things working, not a code beauty contest. You need nice code so you can be productive and implement everything you want, but making it any nicer than that is a waste of time. If you get stuck because your code gets messy, hard to read, hard to change before you can implement everything, maybe you should refactor sooner. Identify why that happens and maybe I can give better feedback.
Choosing good technologies is also important. Having experience with a bunch of technologies can really help. You'll work faster, choose good libraries right off the bat, etc.
That said, using a tool someone else has built can save you a massive amount of time. Do you want to make games or do you want to make tools?
If you can find a tool that costs "C" that does (or almost does) what you want...do the math:
1) T = Guess of time savings.
2) Account for opportunity cost: 2T
3) How much is my time worth: E
4) If 2TE >= C: buy and move on to important stuff.
https://www.iforce2d.net/rube/
http://gleed2d.codeplex.com/
http://www.mapeditor.org/
Here is someone building a level editor with some of the same technologies Spine uses:
http://www.badlogicgames.com/forum/view ... =16&t=8951