def configure_keybindings(self):
        InGameState.configure_keybindings(self)

        self.keydown_action_map.update({
            CAMERA_UP:              lambda: self.set_keystate("up", True), 
            CAMERA_LEFT:            lambda: self.set_keystate("left", True), 
            CAMERA_RIGHT:           lambda: self.set_keystate("right", True), 
            CAMERA_DOWN:            lambda: self.set_keystate("down", True), 
            RESIZE_LEFT:            lambda: self.resize_selected(-self._val(), 0),
            RESIZE_UP:              lambda: self.resize_selected(0, -self._val()),
            RESIZE_RIGHT:           lambda: self.resize_selected(self._val(), 0),
            RESIZE_DOWN:            lambda: self.resize_selected(0, self._val()),
            TRANSLATE_LEFT:         lambda: self.move_selected(-self._val(), 0),
            TRANSLATE_UP:           lambda: self.move_selected(0, -self._val()),
            TRANSLATE_RIGHT:        lambda: self.move_selected(self._val(), 0),
            TRANSLATE_DOWN:         lambda: self.move_selected(0, self._val()),
            TOGGLE_EDIT_MODE:       lambda: self.state_manager.set_current_state(GameStateManager.PLAYING_STATE),
            SAVE_LEVEL:             lambda: self.do_save(),
            DUPLICATE_SELECTED:     lambda: self.duplicate_selected(),
            CYCLE_SELECTED_TYPE:    lambda: self.cylcle_type_of_selected(),
            DELETE_SELECTED:        lambda: self.delete_selected()
        })
        self.keyup_action_map.update({
            CAMERA_UP:      lambda: self.set_keystate("up", False), 
            CAMERA_LEFT:    lambda: self.set_keystate("left", False), 
            CAMERA_RIGHT:   lambda: self.set_keystate("right", False), 
            CAMERA_DOWN:    lambda: self.set_keystate("down", False), 
        })
 def handle_event(self, event):
     InGameState.handle_event(self, event)
     if event.type == pygame.MOUSEBUTTONDOWN or event.type == pygame.MOUSEBUTTONUP:
         x, y = self.get_drawer().screen_to_game_position((event.pos[0], event.pos[1]), snap_to_grid=False)
         grid_x, grid_y = self.get_drawer().screen_to_game_position((event.pos[0], event.pos[1]), snap_to_grid=True)
         
         if event.type == pygame.MOUSEBUTTONDOWN:
             self._mouse_down_pos = (grid_x, grid_y)
         elif event.type == pygame.MOUSEBUTTONUP:
             # using grid position values to prevent tiny drag annoyances
             if self._mouse_down_pos == None or (grid_x, grid_y) == self._mouse_down_pos:
                 utilities.log("Click at: ("+str(x)+", "+str(y)+") ["+str(grid_x)+", "+str(grid_y)+"]")
                 self._click_and_release_at(x,y)
             else:
                 x1 = self._mouse_down_pos[0]
                 y1 = self._mouse_down_pos[1]
                 x2 = grid_x
                 y2 = grid_y
                 xavg = (x1 + x2) / 2
                 yavg = (y1 + y2) / 2
                 utilities.log("Drag from: ["+str(x1)+", "+str(y1)+"] to ["+str(x2)+", "+str(y2)+"]")
                 x_path_str = str(xavg)+" + "+str((x2 - x1) / 2)+"*cos(t*0.03)"
                 y_path_str = str(yavg)+" + "+str((y2 - y1) / 2)+"*sin(t*0.03)"
                 path_json_str = "\"path\": {\"type\": \"path\", \"x_path\": \""+x_path_str+"\", \"y_path\": \""+y_path_str+"\"}"
                 utilities.log(path_json_str)
 def __init__(self, settings, platformer_instance):
     InGameState.__init__(self, settings, platformer_instance)
     self.selected = None
     self.selected_old_color = None
     
     # used to alternate which block gets selected if user clicks on an overlapping position
     self._last_clicked_objs = []
     self._last_idx_used = -1
     
     self._mouse_down_pos = None