TODO: * Port over and improve clusterview and it's opengl stuff. It should use k-means point and cluster, as well as the math library from kmeans (add a test to dist). Additionally, the point and cluster of the clusterview should inherit from k-means point and cluster so that it can use the algorithm correctly. All other aspects of point and cluster in the clusterview program can be kept. * See note in opengl_widget. Make it a static class. * Do the same thing you did for opengl_widget in mode_handlers, leave the MODE_HANDLERS constant global. * Port over all tests from clusterview except the math tests. Improve point tests to include weight. * Turn kmeans into a python package and import it here. * Add a property to the point called weight, which is set when you click edit point. It will give a popup that allows you to specify a point weight. DEFAULT WEIGHT IS 1 * Use kmeans to do the stuff - strip down point x y to refer to it's kmeans parent. * Weighted cluster mean is rendered as a hollow circle and unweighted k-means mean is a x. * Saving should save the weights, load should load the weights. * Make the current context exception string in opengl widget a constant and use that instead. * Add typing to every function except setters and __XYZ__ functions (__init__ can still have typing)