Esempio n. 1
0
def event_handler():
    for event in pygame.event.get():
        if event.type == QUIT:
            EditorExit()
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                EditorExit()
            Ced.levelname.handle_event(event)
        elif event.type == MOUSEBUTTONDOWN:
            # prev ?
            if Ced.b_prev.handle_event(event):
                Ced.b_prev.setClicked(True)
                Config.level -= 1
                if Config.level < 1:
                    # on boucle
                    Config.level = Config.maxlevel
                Ced.levelname.setText('level-{0:03d}.txt'.format(Config.level))
            # next ?
            elif Ced.b_next.handle_event(event):
                Ced.b_next.setClicked(True)
                Config.level += 1
                if Config.level > Config.maxlevel:
                    # on boucle
                    Config.level = 1
                Ced.levelname.setText('level-{0:03d}.txt'.format(Config.level))
            # save ?
            elif Ced.b_save.handle_event(event):
                Ced.b_save.setClicked(True)
                SaveLevel()
            # load ?
            elif Ced.b_load.handle_event(event):
                Ced.b_load.setClicked(True)
                LoadLevel()
            # reset ?
            elif Ced.b_raz.handle_event(event):
                Ced.b_raz.setClicked(True)
                PushUndos()
                RazLevel()
                Config.bossLevel = False
                Ced.b_test.setClicked(False)
                Config.testMode  = False
            # select ?
            elif Ced.b_select.handle_event(event) and not Config.bossLevel:
                if Ced.in_select:
                    Ced.b_select.setClicked(False)
                    Ced.in_select = False
                else:
                    Ced.b_select.setClicked(True)
                    Ced.in_select = True
            # copy ?
            elif Ced.b_copy.handle_event(event) and Ced.z_select is not None and not Config.bossLevel:
                Ced.b_copy.setClicked(True)
                Ced.z_select.copySelect()
                Ced.in_copy = True
            # cut ?
            elif Ced.b_cut.handle_event(event) and Ced.z_select is not None and not Config.bossLevel:
                Ced.b_cut.setClicked(True)
                Ced.z_select.cutSelect()
                Ced.in_cut = True
            # paste ?
            elif Ced.b_paste.handle_event(event) and Ced.z_select is not None and (Ced.in_copy or Ced.in_cut) and not Config.bossLevel:
                if Ced.in_copy:
                    Ced.b_copy.setClicked(False)
                    Ced.in_copy  = False
                elif Ced.in_cut:
                    Ced.b_cut.setClicked(False)
                    Ced.in_cut   = False
                Ced.b_paste.setClicked(True)
                Ced.in_paste = True
            # undo ?
            elif Ced.b_undo.handle_event(event) and ((Ced.z_select is not None) or (len(Ced.undos) > 0)) and not Config.bossLevel:
                if Ced.z_select is not None:
                    Ced.b_undo.setClicked(True)
                    # on reset la sélection
                    Ced.z_select.undoSelect()
                    # fin de sélection
                    del Ced.z_select
                    Ced.z_select  = None
                    Ced.in_copy   = False
                    Ced.in_select = False
                    Ced.in_cut    = False
                    # reset des boutons
                    for btn in [ Ced.b_select, Ced.b_copy, Ced.b_cut, Ced.b_paste ]:
                        btn.setClicked(False)
                elif len(Ced.undos) > 0:
                    Ced.b_undo.setClicked(True)
                    PopUndos()
            # cancel ?
            elif Ced.b_cancel.handle_event(event) and Ced.z_select is not None and not Config.bossLevel:
                Ced.b_cancel.setClicked(True)
                # fin de sélection
                del Ced.z_select
                Ced.z_select  = None
                Ced.in_copy   = False
                Ced.in_select = False
                Ced.in_cut    = False
                # reset des boutons
                for btn in [ Ced.b_select, Ced.b_copy, Ced.b_cut, Ced.b_paste ]:
                    btn.setClicked(False)
            # view_grid ?
            elif Ced.b_grid.handle_event(event):
                Ced.view_grid = not Ced.view_grid
                Ced.b_grid.setClicked(Ced.view_grid)
            # test ?
            elif Ced.b_test.handle_event(event):
                fname = Ced.levelname.getText()
                if len(fname) > 0 and ((not isLevelEmpty()) or Config.bossLevel):
                    Ced.b_test.setClicked(True)
                    Ced.b_test.draw()
                    pygame.display.update()
                    pygame.event.pump()
                    # on sauve le niveau dans le répertoire tempo
                    Config.testMode = True
                    SaveLevel()
                    # on lance le programme pour tester le niveau
                    if platform.system() == 'Windows':
                        os.system('{0} {1} -t {2}'.format(sys.executable, os.path.join(Config.path_app, '', 'briks.py'), fname))
                    elif platform.system() == 'Linux':
                        os.system('{0} {1} -t {2}'.format(sys.executable, os.path.join(Config.path_app, '', 'briks.py'), fname))
                    # on supprime le niveau temporaire
                    try:
                        os.remove(os.path.join(os.path.abspath(os.sep), tempfile.gettempdir(), fname))
                    except:
                        pass
                    Ced.b_test.setClicked(False)
                    Config.testMode = False
            elif not Ced.in_paste:
                # une brique du menu ?
                if not Config.bossLevel:
                    for i in range(1, len(Ced.ico_br)):
                        if Ced.ico_br[i][1].collidepoint(event.pos):
                            # clic droit déselectionne
                            if event.button == 3 and Ced.bsel_i == i:
                                Ced.bsel_i = 0
                            elif event.button != 3:
                                Ced.bsel_i = i
                            break
                # la brique du bossLevel ?
                if Ced.boss_br[1].collidepoint(event.pos):
                    # clic droit déselectionne
                    if event.button == 3:
                        Config.bossLevel = False
                    elif event.button != 3:
                        Config.bossLevel = True
                        Ced.bsel_i       = 0
                        doBossLevel()
                # une brique du niveau ?
                if not Config.bossLevel:
                    for cl in range(Config.maxli):
                        for i in range(Config.maxbr):
                            if Ced.lmap[cl][i][2].collidepoint(event.pos):
                                if event.button == 1 and Ced.in_select:
                                    # clic gauche, début de sélection
                                    if Ced.z_select is None:
                                        Ced.z_select = Gui.SelectionRect((cl, i))
                                        Ced.z_select.draw()
                                else:
                                    PushUndos()
                                    if Ced.bsel_i > 0:
                                        # on met la brique sélectionnée
                                        Ced.lmap[cl][i][0] = Ced.bsel_i
                                        Ced.lmap[cl][i][1] = Ced.ico_br[Ced.bsel_i][0]
                                    elif Ced.lmap[cl][i][0] > 0:
                                        # clic sur une case pleine, on la vide
                                        Ced.lmap[cl][i][0] = 0
                                        Ced.lmap[cl][i][1] = pygame.Surface([Config.brw, Config.brh])
                Ced.levelname.handle_event(event)
        elif event.type == MOUSEMOTION:
            if event.buttons[0] == 1:
                # bouton gauche appuyé en mouvement
                for cl in range(Config.maxli):
                    for i in range(Config.maxbr):
                        if Ced.lmap[cl][i][2].collidepoint(event.pos):
                            if Ced.in_select and Ced.z_select is not None:
                                Ced.z_select.updateRect((cl, i))
                                Ced.z_select.draw()
                            else:
                                if Ced.bsel_i > 0:
                                    # on met la brique sélectionnée
                                    Ced.lmap[cl][i][0] = Ced.bsel_i
                                    Ced.lmap[cl][i][1] = Ced.ico_br[Ced.bsel_i][0]
                                elif Ced.lmap[cl][i][0] > 0:
                                    # clic sur une case pleine, on la vide
                                    Ced.lmap[cl][i][0] = 0
                                    Ced.lmap[cl][i][1] = pygame.Surface([Config.brw, Config.brh])
        elif event.type == MOUSEBUTTONUP:
            if event.button == 1 and Ced.in_select and Ced.z_select is not None:
                # fin de sélection
                Ced.b_select.setClicked(False)
                Ced.in_select = False
                rect      = None
                # update final
                for cl in range(Config.maxli):
                    for i in range(Config.maxbr):
                        if Ced.lmap[cl][i][2].collidepoint(event.pos):
                            rect = Ced.z_select.updateRect((cl, i))
                            Ced.z_select.draw()
                            break
                    if rect is not None:
                        break
            elif event.button == 1 and Ced.in_paste:
                paste_finish = False
                for cl in range(Config.maxli):
                    for i in range(Config.maxbr):
                        if Ced.lmap[cl][i][2].collidepoint(event.pos):
                            # copie de la sélection
                            Ced.z_select.pasteSelect((cl, i))
                            Ced.in_paste = False
                            Ced.b_paste.setClicked(False)
                            paste_finish = True
                            break
                    if paste_finish:
                        break
            else:
                for btn in [ Ced.b_prev, Ced.b_next, Ced.b_save, Ced.b_load, Ced.b_raz, Ced.b_undo, Ced.b_cancel ]:
                    if btn.handle_event(event):
                        btn.setClicked(False)