|  |  |  | @ -12,7 +12,12 @@ that widget. | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | from enum import Enum | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | from OpenGL.GL import glClearColor, glEnable, GL_LIGHT0, GL_LIGHTING | 
			
		
	
		
			
				
					|  |  |  |  | from OpenGL.GL import (glBegin, glClearColor, glColor4f, glEnable, | 
			
		
	
		
			
				
					|  |  |  |  |                        glEnd, GL_LIGHT0, GL_LIGHTING, GL_POINTS, | 
			
		
	
		
			
				
					|  |  |  |  |                        glVertex3f) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | from clusterview.exceptions import InvalidStateError | 
			
		
	
		
			
				
					|  |  |  |  | from clusterview.mode import InvalidMode, Mode | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | class Color(Enum): | 
			
		
	
		
			
				
					|  |  |  |  |     BLUE = 0 | 
			
		
	
	
		
			
				
					|  |  |  | @ -22,6 +27,37 @@ COLOR_TO_RGBA = { | 
			
		
	
		
			
				
					|  |  |  |  |     Color.BLUE: (0, 128, 255, 255) | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | __current_mode = None | 
			
		
	
		
			
				
					|  |  |  |  | __current_event = None | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def set_drawing_mode(mode, event=None): | 
			
		
	
		
			
				
					|  |  |  |  |     """ | 
			
		
	
		
			
				
					|  |  |  |  |     State management function. It is useful to look at the | 
			
		
	
		
			
				
					|  |  |  |  |     different drawing modes as modes in a state machine. | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     Calling this function when a mode changes allows the | 
			
		
	
		
			
				
					|  |  |  |  |     OpenGL functions to take the correct drawing action | 
			
		
	
		
			
				
					|  |  |  |  |     on the OpenGL Widget. | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     @param mode The current mode. | 
			
		
	
		
			
				
					|  |  |  |  |     @param event The current event (Mostly used for passing coordinates). | 
			
		
	
		
			
				
					|  |  |  |  |     """ | 
			
		
	
		
			
				
					|  |  |  |  |     if not isinstance(mode, Mode): | 
			
		
	
		
			
				
					|  |  |  |  |         raise ValueError("Mode in set_drawing_mode must be of type Mode") | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     __current_mode = mode | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if event is not None: | 
			
		
	
		
			
				
					|  |  |  |  |         __current_event = event | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def get_current_mode(): | 
			
		
	
		
			
				
					|  |  |  |  |     """ | 
			
		
	
		
			
				
					|  |  |  |  |     Returns the current mode according to the OpenGL Widget. | 
			
		
	
		
			
				
					|  |  |  |  |     """ | 
			
		
	
		
			
				
					|  |  |  |  |     return __current_mode | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def initialize_gl(): | 
			
		
	
		
			
				
					|  |  |  |  |     """ | 
			
		
	
		
			
				
					|  |  |  |  |     Initializes the OpenGL context on the Window. | 
			
		
	
	
		
			
				
					|  |  |  | @ -35,6 +71,28 @@ def initialize_gl(): | 
			
		
	
		
			
				
					|  |  |  |  |     glClearColor(255, 255, 255, 0) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def paint_gl(): | 
			
		
	
		
			
				
					|  |  |  |  |     """ | 
			
		
	
		
			
				
					|  |  |  |  |     Stock PaintGL function from OpenGL that switches | 
			
		
	
		
			
				
					|  |  |  |  |     on the current mode to determine what action to | 
			
		
	
		
			
				
					|  |  |  |  |     perform on the current event. | 
			
		
	
		
			
				
					|  |  |  |  |     """ | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if (__current_mode in [Mode.ADD, Mode.EDIT, Mode.MOVE, Mode.DELETE] and | 
			
		
	
		
			
				
					|  |  |  |  |         __current_event is None): | 
			
		
	
		
			
				
					|  |  |  |  |         raise InvalidStateError("Event must exist for ADD, EDIT, MOVE, " + | 
			
		
	
		
			
				
					|  |  |  |  |                                 "and DELETE") | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if __current_mode is Mode.ADD: | 
			
		
	
		
			
				
					|  |  |  |  |         raise NotImplementedError("Drawing for ADD not implemented.") | 
			
		
	
		
			
				
					|  |  |  |  |     elif __current_mode is Mode.EDIT: | 
			
		
	
		
			
				
					|  |  |  |  |         raise NotImplementedError("Drawing for EDIT not implemented.") | 
			
		
	
		
			
				
					|  |  |  |  |     elif __current_mode is Mode.MOVE: | 
			
		
	
		
			
				
					|  |  |  |  |         raise NotImplementedError("Drawing for MOVE not implemented.") | 
			
		
	
		
			
				
					|  |  |  |  |     elif __current_mode is Mode.DELETE: | 
			
		
	
		
			
				
					|  |  |  |  |         raise NotImplementedError("Drawing for DELETE not implemented.") | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | def draw_point(x, y, color): | 
			
		
	
		
			
				
					|  |  |  |  |     """ | 
			
		
	
		
			
				
					|  |  |  |  |     Simple point drawing function. | 
			
		
	
	
		
			
				
					|  |  |  | @ -50,3 +108,10 @@ def draw_point(x, y, color): | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if not isinstance(color, Color): | 
			
		
	
		
			
				
					|  |  |  |  |         raise ValueError("Color must exist in the Color enumeration") | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     ct = COLOR_TO_RGBA[color] | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     glBegin(GL_POINTS) | 
			
		
	
		
			
				
					|  |  |  |  |     glColor4f(ct[0], ct[1], ct[2], ct[3]) | 
			
		
	
		
			
				
					|  |  |  |  |     glVertex3f(x, y, 0.0)                 # Z is currently fixed to 0 | 
			
		
	
		
			
				
					|  |  |  |  |     glEnd() | 
			
		
	
	
		
			
				
					|  |  |  | 
 |