def __init__(self, display, cube_size):
        self.cube_size = cube_size

        self.current_cube = None

        self._start_cube = VRubiksCube(self.cube_size, None, None, None, True)
        self._start_cube.set_cube_visible(False)
        #self.start_turn_cube =
        self._result_cube = VRubiksCube(self.cube_size, None, None, None, True)
        self._result_cube.set_cube_visible(False)
    def __init__(self):

        # create GUI
        self.cube_gui = CubeGui("Artificial Intelligence Cube")

        # create cube display
        self.cube_display = CubeDisplay(self.cube_gui.get_window(), False)

        #Cube Storage
        self._storage = CubeStorage(self, 3)

        # generate cube
        self.cube = VRubiksCube(3)

        # xml handler
        self.handle_xml = HandleFiles(self)

        # create cube handler
        cube_handler = CubeHandler(self.cube)

        self.create_gui_items(cube_handler, self.cube_gui)

        # create keyboard handler
        keyboard_handler = KeyboardHandler(self.cube_display.get_display(), self.cube)
        # bind keyboard keys to display
        displayc = self.cube_display.get_display()
        displayc.bind('keydown', keyboard_handler.on_key_down)

        mouse_handler = MouseHandler(self)
    def to_visual_cube(input_cube):
        if input_cube.__class__ == VRubiksCube().__class__:
            return input_cube

        cube = VRubiksCube(input_cube.get_size(),None, None, None, False)
        for side in Helper.CUBE_SIDES:
            current_side = input_cube.get_side(side)
            for x in range(input_cube.get_size()):
                for y in range(input_cube.get_size()):
                    if current_side[x][y] < len(Helper.CUBE_COLOR) and current_side[x][y] >= 0:
                        current_side[x][y] = Helper.CUBE_COLOR[current_side[x][y]]
                    else:
                        current_side[x][y] = Helper.CUBE_DUMMIE_COLOR

            cube.set_side(side, current_side)
        return cube
class CubeStorage:

    def __init__(self, display, cube_size):
        self.cube_size = cube_size

        self.current_cube = None

        self._start_cube = VRubiksCube(self.cube_size, None, None, None, True)
        self._start_cube.set_cube_visible(False)
        #self.start_turn_cube =
        self._result_cube = VRubiksCube(self.cube_size, None, None, None, True)
        self._result_cube.set_cube_visible(False)
        #self.result_turn_cube =

    def load_from_xml_object(self, xml_object):
        self._start_cube = RubiksCubeConverter.to_visual_cube(xml_object._start_cube)
        self._result_cube = RubiksCubeConverter.to_visual_cube(xml_object._result_cube)

    def _turn_invisible(self):
        if self.current_cube is not None:
            self.current_cube.set_cube_visible(False)

    def switch_to_start(self):
        self._turn_invisible()
        self.current_cube = self._start_cube
        self.current_cube.set_cube_visible(True)

    def switch_to_result(self):
        self._turn_invisible()
        self.current_cube = self._result_cube
        self.current_cube.set_cube_visible(True)

    def switch_to_code(self):
        self._turn_invisible()
        self.current_cube = RubiksCubeConverter.to_visual_cube(RubiksCubeConverter.to_code_cube(self._start_cube))
        self.current_cube.set_cube_visible(True)
class SolveDisplay():

    __default_button_width = 88
    __default_button_height = 26

    def __init__(self):

        # create GUI
        self.cube_gui = CubeGui("Artificial Intelligence Cube")

        # create cube display
        self.cube_display = CubeDisplay(self.cube_gui.get_window(), False)

        #Cube Storage
        self._storage = CubeStorage(self, 3)

        # generate cube
        self.cube = VRubiksCube(3)

        # xml handler
        self.handle_xml = HandleFiles(self)

        # create cube handler
        cube_handler = CubeHandler(self.cube)

        self.create_gui_items(cube_handler, self.cube_gui)

        # create keyboard handler
        keyboard_handler = KeyboardHandler(self.cube_display.get_display(), self.cube)
        # bind keyboard keys to display
        displayc = self.cube_display.get_display()
        displayc.bind('keydown', keyboard_handler.on_key_down)

        mouse_handler = MouseHandler(self)
# lambda event: self._button_x_y_z('z', self.action_combo_box.GetValue(),
#                                                                         cube_turnable_checkbox.GetSelection())
        #self.cube_display.get_display().bind('click', lambda event: mouse_handler.mouse_block_click(self))

    def create_gui_items(self, cube_handler, cube_gui):

        # generate GUI items
        gui_items = GuiItems(self, cube_gui, cube_gui.get_window_panel())

        # generate GUI Menu
        gui_items.gen_menu(cube_gui.get_window())

        # generate rotate buttons
        x_button = gui_items.gen_button("- Turn X - ", 10, 10 + (self.__default_button_height*0))  # X
        y_button = gui_items.gen_button("- Turn Y -", 10, 10 + self.__default_button_height)       # Y
        z_button = gui_items.gen_button("- Turn Z -", 10, 10 + (self.__default_button_height*2))   # Z
        # bind rotate buttons
        gui_items.bind_element(x_button, wx.EVT_BUTTON, cube_handler.turn_x)  # X
        gui_items.bind_element(y_button, wx.EVT_BUTTON, cube_handler.turn_y)  # Y
        gui_items.bind_element(z_button, wx.EVT_BUTTON, cube_handler.turn_z)  # Z

        # generate solve button
        solve_button = gui_items.gen_button("Solve Cube!", 10, 10 + (self.__default_button_height*5))
        # bind solve button
        gui_items.bind_element(solve_button, wx.EVT_BUTTON, cube_handler.solve)

        # generate dropdown menu
        combo_box_items = []
        for size in range(self.cube.get_size()):
            combo_box_items.append(str(size+1))
        combo_box = gui_items.gen_combobox((150, 10), (150, -1), combo_box_items)
        combo_box.SetSelection(0)
        # bind dropdown menu
        gui_items.bind_element(combo_box, wx.EVT_COMBOBOX, cube_handler.set_index)

        # generate radiobuttons for direction
        directions = ['Clockwise', 'Counterclockwise']
        radio_buttons = gui_items.gen_radiobox(150, 50, (180, -1), wx.RA_SPECIFY_ROWS, directions)
        # bind radiobuttons
        gui_items.bind_element(radio_buttons, wx.EVT_RADIOBOX, cube_handler.set_direction)
 def generateRubiksCube(self, size):
     cube = VRubiksCube(size, None, None, None, True)
     cube.set_cube_visible(False)
     cubeG = RubiksCubeG(cube)
     return cubeG