From d44f3a5aeb208f29bda36e94deec70e436fbacba Mon Sep 17 00:00:00 2001 From: lukasmonk Date: Sat, 19 Nov 2016 12:26:31 +0100 Subject: [PATCH] Version 10.08 --- Code/Configuracion.py | 4 + Code/GM.py | 10 +- Code/Gestor.py | 20 +++- Code/GestorEntPos.py | 15 ++- Code/GestorEntTac.py | 13 ++- Code/GestorPartida.py | 9 +- Code/GestorSolo.py | 74 ++++++++----- Code/Init.py | 2 +- Code/Procesador.py | 20 ++-- Code/QT/PantallaConfig.py | 50 +++++---- Code/QT/Tablero.py | 166 ++++++++++++++++++++-------- Code/QT/WBase.py | 60 +++++++--- Locale/es/LC_MESSAGES/lucaschess.mo | Bin 298783 -> 300206 bytes Lucas.py | 2 + bug.log | 2 +- 15 files changed, 318 insertions(+), 129 deletions(-) diff --git a/Code/Configuracion.py b/Code/Configuracion.py index c14ac5c..52fab59 100644 --- a/Code/Configuracion.py +++ b/Code/Configuracion.py @@ -4,6 +4,7 @@ import os from PyQt4 import QtGui +from PyQt4.QtCore import Qt from Code import BaseConfig from Code import CajonDesastre @@ -110,6 +111,7 @@ def __init__(self, user): self.puntosTB = 11 self.boldTB = False + self.iconsTB = Qt.ToolButtonTextUnderIcon self.centipawns = False @@ -467,6 +469,7 @@ def graba(self, aplazamiento=None): dic["PUNTOSTB"] = self.puntosTB dic["BOLDTB"] = self.boldTB + dic["ICONSTB"] = self.iconsTB dic["COLOR_NAG1"] = self.color_nag1 dic["COLOR_NAG2"] = self.color_nag2 @@ -591,6 +594,7 @@ def lee(self): self.puntosTB = dg("PUNTOSTB", self.puntosTB) self.boldTB = dg("BOLDTB", self.boldTB) + self.iconsTB = dg("ICONSTB", self.iconsTB) self.color_nag1 = dg("COLOR_NAG1", self.color_nag1) self.color_nag2 = dg("COLOR_NAG2", self.color_nag2) diff --git a/Code/GM.py b/Code/GM.py index d3497c6..29d50f8 100644 --- a/Code/GM.py +++ b/Code/GM.py @@ -226,7 +226,10 @@ def listaGMpersonal(carpeta): siW = siB = False with open(os.path.join(carpeta, fich)) as f: for linea in f: - gmp = GMpartida(linea.strip()) + try: + gmp = GMpartida(linea.strip()) + except: + continue if not siW: siW = gmp.isWhite(True) if not siB: @@ -337,7 +340,10 @@ def masMaderaUno(self, dic, partida, xblancas, xnegras, tpResult): else: if not (siEmpate or (xblancas and siGanaBlancas) or (xnegras and siGanaNegras)): return - self.write("%s|%s|%s|%s|%s|%s|%s\n" % (pv2xpv(pk.strip()), event, oponente, date, eco, result, color)) + def nopipe(txt): + return txt.replace("|", " ").strip() if "|" in txt else txt + + self.write("%s|%s|%s|%s|%s|%s|%s\n" % (pv2xpv(pk.strip()), nopipe(event), nopipe(oponente), nopipe(date), eco, result, color)) def xprocesa(self): self.close() diff --git a/Code/Gestor.py b/Code/Gestor.py index 10cc782..e2335d7 100644 --- a/Code/Gestor.py +++ b/Code/Gestor.py @@ -97,6 +97,8 @@ def __init__(self, procesador): # Informacion self.informacionActivable = True + self.nonDistract = None + # x Control del tutor # asi sabemos si ha habido intento de analisis previo (por ejemplo el usuario mientras piensa decide activar el tutor) self.siIniAnalizaTutor = False @@ -127,6 +129,8 @@ def ponFinJuego(self): def finGestor(self): # se llama desde procesador.inicio, antes de borrar el gestor self.tablero.atajosRaton = None + if self.nonDistract: + self.pantalla.base.tb.setVisible(True) def atajosRatonReset(self): self.atajosRatonDestino = None @@ -711,7 +715,6 @@ def guardarPGN(self): "It is saved in the clipboard to paste it wherever you want."))) def guardarGanados(self, siGanado): - conf = self.configuracion if siGanado: @@ -758,6 +761,21 @@ def quitaCapturas(self): self.pantalla.activaCapturas(False) self.ponVista() + def rightMouse(self, siShift, siControl, siAlt): + if siControl: + self.capturas() + elif siAlt: + self.nonDistract = self.pantalla.base.nonDistractMode(self.nonDistract) + else: + self.pgnInformacion(None, None) + self.pantalla.ajustaTam() + + def boardRightMouse(self, siShift, siControl, siAlt): + self.rightMouse(siShift, siControl, siAlt) + + def gridRightMouse(self, siShift, siControl, siAlt): + self.rightMouse(siShift, siControl, siAlt) + def listado(self, tipo): if tipo == "pgn": return self.pgn.actual() diff --git a/Code/GestorEntPos.py b/Code/GestorEntPos.py index 7285e14..c79e835 100644 --- a/Code/GestorEntPos.py +++ b/Code/GestorEntPos.py @@ -1,6 +1,8 @@ import codecs import os +from PyQt4.QtCore import Qt + from Code import ControlPosicion from Code import Gestor from Code import Jugada @@ -239,15 +241,22 @@ def ent_siguiente(self, tipo): self.inicio(pos, self.numEntrenos, self.titEntreno, self.liEntrenos, self.siTutorActivado, self.jump) def controlTeclado(self, nkey): - if nkey in (43, 16777239): # pulsado + o avpag + if nkey in (Qt.Key_Plus, Qt.Key_PageDown): self.ent_siguiente(k_siguiente) - elif nkey in (45, 16777238): # pulsado - o repag + elif nkey in (Qt.Key_Minus, Qt.Key_PageUp): self.ent_siguiente(k_anterior) - elif nkey == 80: # P: salva + elif nkey == Qt.Key_T: li = self.fenInicial.split("|") li[2] = self.partida.pgnBaseRAW() self.saveSelectedPosition("|".join(li)) + def listHelpTeclado(self): + return [ + ("+/%s"%_("Page Down"), _("Next position")), + ("-/%s"%_("Page Up"), _("Previous position")), + ("T", _("Save position in 'Selected positions' file")), + ] + def finPartida(self): self.procesador.inicio() diff --git a/Code/GestorEntTac.py b/Code/GestorEntTac.py index ac87391..6c37790 100644 --- a/Code/GestorEntTac.py +++ b/Code/GestorEntTac.py @@ -1,5 +1,8 @@ import time +from PyQt4.QtCore import Qt + + from Code import ControlPosicion from Code import Gestor from Code import Jugada @@ -226,12 +229,18 @@ def procesarAccion(self, clave): Gestor.Gestor.rutinaAccionDef(self, clave) def controlTeclado(self, nkey): - if nkey in (43, 16777239): # pulsado + o avpag + if nkey in (Qt.Key_Plus, Qt.Key_PageDown): if self.estado == kFinJuego: self.ent_siguiente() - elif nkey == 80: + elif nkey == Qt.Key_T: self.saveSelectedPosition(self.fenInicial) + def listHelpTeclado(self): + return [ + ("+/%s"%_("Page Down"), _("Next position")), + ("T", _("Save position in 'Selected positions' file")), + ] + def reiniciar(self): cp = ControlPosicion.ControlPosicion() cp.leeFen(self.fen) diff --git a/Code/GestorPartida.py b/Code/GestorPartida.py index 2c2033b..09e5d49 100644 --- a/Code/GestorPartida.py +++ b/Code/GestorPartida.py @@ -1,5 +1,7 @@ import time +from PyQt4.QtCore import Qt + from Code import Partida from Code import ControlPosicion from Code import Gestor @@ -411,9 +413,14 @@ def configurarGS(self): self.reiniciar(dic) def controlTeclado(self, nkey): - if nkey in (86, 80): # V,P + if nkey in Qt.Key_V: # V self.paste(QTUtil.traePortapapeles()) + def listHelpTeclado(self): + return [ + ("V", _("Paste position")), + ] + def paste(self, texto): cp = ControlPosicion.ControlPosicion() try: diff --git a/Code/GestorSolo.py b/Code/GestorSolo.py index 1bf27eb..779387d 100644 --- a/Code/GestorSolo.py +++ b/Code/GestorSolo.py @@ -2,6 +2,8 @@ import sys import time +from PyQt4.QtCore import Qt + from Code import ControlPosicion from Code import Gestor from Code import PGN @@ -676,34 +678,7 @@ def configurarGS(self): self.reiniciar() elif resp == "posicion": - resp = XVoyager.xVoyagerFEN(self.pantalla, self.configuracion, self.fen) - if resp is not None: - self.fen = resp - self.bloqueApertura = None - self.posicApertura = None - - if self.xpgn: - siInicio = self.fen == ControlPosicion.FEN_INICIAL - li = self.xpgn.split("\n") - lin = [] - siFen = False - for linea in li: - if linea.startswith("["): - if "FEN " in linea: - siFen = True - if siInicio: - continue - linea = '[FEN "%s"]' % self.fen - lin.append(linea) - else: - break - if not siFen: - linea = '[FEN "%s"]' % self.fen - lin.append(linea) - self.liPGN = lin - self.xpgn = "\n".join(lin) + "\n\n*" - - self.reiniciar() + self.startPosition() elif resp == "pasteposicion": texto = QTUtil.traePortapapeles() @@ -771,11 +746,50 @@ def configurarGS(self): self.reiniciar(dic) def controlTeclado(self, nkey): - if nkey == 86: # V + if nkey == Qt.Key_V: self.paste(QTUtil.traePortapapeles()) - elif nkey == 80: # P + elif nkey == Qt.Key_T: li = [self.fen if self.fen else ControlPosicion.FEN_INICIAL,"",self.partida.pgnBaseRAW()] self.saveSelectedPosition("|".join(li)) + elif nkey == Qt.Key_S: + self.startPosition() + + def listHelpTeclado(self): + return [ + ("V", _("Paste position")), + ("T", _("Save position in 'Selected positions' file")), + ("S", _("Set start position")) + ] + + def startPosition(self): + resp = XVoyager.xVoyagerFEN(self.pantalla, self.configuracion, self.fen) + if resp is not None: + self.fen = resp + self.bloqueApertura = None + self.posicApertura = None + + if self.xpgn: + siInicio = self.fen == ControlPosicion.FEN_INICIAL + li = self.xpgn.split("\n") + lin = [] + siFen = False + for linea in li: + if linea.startswith("["): + if "FEN " in linea: + siFen = True + if siInicio: + continue + linea = '[FEN "%s"]' % self.fen + lin.append(linea) + else: + break + if not siFen: + linea = '[FEN "%s"]' % self.fen + lin.append(linea) + self.liPGN = lin + self.xpgn = "\n".join(lin) + "\n\n*" + + self.reiniciar() def paste(self, texto): cp = ControlPosicion.ControlPosicion() diff --git a/Code/Init.py b/Code/Init.py index fdd64dd..d44c0c9 100644 --- a/Code/Init.py +++ b/Code/Init.py @@ -1,5 +1,5 @@ DEBUG = False -VERSION = "10.07.2" +VERSION = "10.08" import os import sys diff --git a/Code/Procesador.py b/Code/Procesador.py index a2e724b..e7d7c69 100644 --- a/Code/Procesador.py +++ b/Code/Procesador.py @@ -72,7 +72,7 @@ def iniciaConUsuario(self, user): self.web = "http://www-lucaschess.rhcloud.com" self.blog = "http://lucaschess.blogspot.com" - self.liOpcionesInicio = [k_terminar, k_play, k_competicion, k_elo, + self.liOpcionesInicio = [k_terminar, k_play, k_entrenamiento, k_tools, k_opciones, k_informacion] # Lo incluimos aqui porque sino no lo lee, en caso de aplazada self.configuracion = Configuracion.Configuracion(user) @@ -320,6 +320,12 @@ def menuPlay(self): menu.opcion(("free", None), _("Play against an engine of your choice"), Iconos.Libre()) menu.separador() + menu.opcion(("competition", None), _("Competition"), Iconos.NuevaPartida()) + menu.separador() + + menu.opcion(("elo", None), _("Elo-Rating"), Iconos.Elo()) + menu.separador() + # Principiantes ---------------------------------------------------------------------------------------- menu1 = menu.submenu(_("Opponents for young players"), Iconos.RivalesMP()) @@ -357,6 +363,12 @@ def menuPlay(self): if tipo == "free": self.procesarAccion(k_libre) + elif tipo == "competition": + self.competicion() + + elif tipo == "elo": + self.elo() + elif tipo == "person": self.playPerson(rival) elif tipo == "animales": @@ -440,9 +452,6 @@ def procesarAccion(self, clave): elif clave == k_libre: self.libre() - elif clave == k_competicion: - self.competicion() - elif clave == k_entrenamiento: self.entrenamientos.lanza() @@ -452,9 +461,6 @@ def procesarAccion(self, clave): elif clave == k_tools: self.tools() - elif clave == k_elo: - self.elo() - elif clave == k_informacion: self.informacion() diff --git a/Code/QT/PantallaConfig.py b/Code/QT/PantallaConfig.py index 5a34b19..347a857 100644 --- a/Code/QT/PantallaConfig.py +++ b/Code/QT/PantallaConfig.py @@ -1,3 +1,5 @@ +from PyQt4.QtCore import Qt + from Code import DGT from Code.QT import FormLayout from Code.QT import Iconos @@ -54,6 +56,15 @@ def opciones(parent, configuracion): liAsp.append((None, _("Toolbars") + ":")) liAsp.append((FormLayout.Spinbox(_("Font size"), 5, 64, 60), configuracion.puntosTB)) liAsp.append((_("Bold") + ":", configuracion.boldTB)) + li = ( + (_("Only display the icon"), Qt.ToolButtonIconOnly), + (_("Only display the text"), Qt.ToolButtonTextOnly), + (_("The text appears beside the icon"), Qt.ToolButtonTextBesideIcon), + (_("The text appears under the icon"), Qt.ToolButtonTextUnderIcon) + ) + config = FormLayout.Combobox(_("Icons"), li) + liAsp.append((config, configuracion.iconsTB)) + # PGN table liAsp.append(separador) @@ -171,7 +182,7 @@ def opciones(parent, configuracion): liGen, liSon, liTT, liT, liEng, liAsp, liSA, liNC = resp - configuracion.jugador, configuracion.estilo, configuracion.traductor = liGen + (configuracion.jugador, configuracion.estilo, configuracion.traductor) = liGen porDefecto = liAsp[0] if porDefecto: @@ -179,40 +190,39 @@ def opciones(parent, configuracion): else: del liAsp[0] - configuracion.familia, configuracion.puntosMenu, configuracion.boldMenu, \ - configuracion.puntosTB, configuracion.boldTB, \ - configuracion.anchoPGN, configuracion.altoFilaPGN, configuracion.puntosPGN, \ - configuracion.siNomPiezasEN, configuracion.figurinesPGN, \ - configuracion.tamFontRotulos = liAsp + (configuracion.familia, configuracion.puntosMenu, configuracion.boldMenu, + configuracion.puntosTB, configuracion.boldTB, configuracion.iconsTB, + configuracion.anchoPGN, configuracion.altoFilaPGN, configuracion.puntosPGN, + configuracion.siNomPiezasEN, configuracion.figurinesPGN, + configuracion.tamFontRotulos) = liAsp if configuracion.familia == "System": configuracion.familia = "" - configuracion.siSuenaBeep, configuracion.siSuenaResultados, configuracion.siSuenaJugada, \ - configuracion.siSuenaNuestro = liSon + (configuracion.siSuenaBeep, configuracion.siSuenaResultados, configuracion.siSuenaJugada, configuracion.siSuenaNuestro) = liSon - configuracion.tutor.clave, tiempoTutor, configuracion.tutorMultiPV, \ - configuracion.tutorActivoPorDefecto, configuracion.tutorDifPts, configuracion.tutorDifPorc = liTT + (configuracion.tutor.clave, tiempoTutor, configuracion.tutorMultiPV, + configuracion.tutorActivoPorDefecto, configuracion.tutorDifPts, configuracion.tutorDifPorc) = liTT configuracion.tiempoTutor = int(tiempoTutor * 1000) - configuracion.eloNC, configuracion.micheloNC, configuracion.ficsNC, configuracion.fideNC = liNC + (configuracion.eloNC, configuracion.micheloNC, configuracion.ficsNC, configuracion.fideNC) = liNC - configuracion.centipawns, configuracion.bmi2, configuracion.notbackground = liEng + (configuracion.centipawns, configuracion.bmi2, configuracion.notbackground) = liEng - configuracion.vistaTutor, \ - configuracion.efectosVisuales, rapidezMovPiezas, \ - configuracion.siAtajosRaton, configuracion.showCandidates, configuracion.showVariantes, \ - configuracion.siActivarCapturas, configuracion.tipoMaterial, \ - configuracion.siActivarInformacion, siDGT = liT + (configuracion.vistaTutor, + configuracion.efectosVisuales, rapidezMovPiezas, + configuracion.siAtajosRaton, configuracion.showCandidates, configuracion.showVariantes, + configuracion.siActivarCapturas, configuracion.tipoMaterial, + configuracion.siActivarInformacion, siDGT) = liT configuracion.rapidezMovPiezas = drap[rapidezMovPiezas] if configuracion.siDGT != siDGT: if siDGT: DGT.ponON() configuracion.siDGT = siDGT - configuracion.salvarFichero, configuracion.salvarGanados, configuracion.salvarPerdidos, \ - configuracion.salvarAbandonados, configuracion.guardarVariantesTutor, \ - configuracion.salvarCSV = liSA + (configuracion.salvarFichero, configuracion.salvarGanados, configuracion.salvarPerdidos, + configuracion.salvarAbandonados, configuracion.guardarVariantesTutor, + configuracion.salvarCSV) = liSA configuracion.salvarCSV = Util.dirRelativo(configuracion.salvarCSV) return True diff --git a/Code/QT/Tablero.py b/Code/QT/Tablero.py index 9f8791e..a1c0c53 100644 --- a/Code/QT/Tablero.py +++ b/Code/QT/Tablero.py @@ -4,6 +4,8 @@ import os from PyQt4 import QtCore, QtGui +from PyQt4.QtCore import Qt + from Code.QT import Colocacion from Code.QT import Controles @@ -22,17 +24,18 @@ from Code import VarGen from Code.Constantes import * + class RegKB: def __init__(self, key, flags): self.key = key self.flags = flags + class Tablero(QtGui.QGraphicsView): def __init__(self, parent, confTablero, siMenuVisual=True): super(Tablero, self).__init__(None) - self.setRenderHints( - QtGui.QPainter.Antialiasing | QtGui.QPainter.TextAntialiasing | QtGui.QPainter.SmoothPixmapTransform) + self.setRenderHints(QtGui.QPainter.Antialiasing | QtGui.QPainter.TextAntialiasing | QtGui.QPainter.SmoothPixmapTransform) self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.setDragMode(self.NoDrag) @@ -78,8 +81,8 @@ def init_kb_buffer(self): self.kb_buffer = [] def exec_kb_buffer(self, key, flags): - if 16777264 <= key <= 16777273: # F1..F10 - f = key - 16777263 + if Qt.Key_F1 <= key <= Qt.Key_F10: + f = key - Qt.Key_F1 + 1 if self.liMouse: if len(self.liMouse) >= 2: desde = self.liMouse[-2] @@ -94,11 +97,11 @@ def exec_kb_buffer(self, key, flags): self.init_kb_buffer() return - if key == 16777216: # ESC + if key == Qt.Key_Escape: self.init_kb_buffer() return - if key in (16777220, 16777221): # intros + if key in (Qt.Key_Enter, Qt.Key_Return): if self.kb_buffer: last = self.kb_buffer[-1] key = last.key @@ -106,36 +109,61 @@ def exec_kb_buffer(self, key, flags): else: return - # Operations -> needs Alt - if flags & QtCore.Qt.AltModifier: - siCtrl = (flags & QtCore.Qt.ControlModifier) > 0 - ok = True - if key == 67: # C salvar PGN - self.salvaPGN(siClipboard=siCtrl) - - elif key == 73: # I copiar tablero - self.salvaEnImagen(siCtrl=siCtrl) - elif key == 83: # S copiar tablero en fichero - resp = QTUtil2.salvaFichero(self, _("File to save"), self.configuracion.dirSalvados, - "%s PNG (*.png)" % _("File"), False) - if resp: - self.salvaEnImagen(resp, "png", siCtrl=siCtrl) - elif key == 70: # Alt-F girar tablero ALt-Ctrl-F = copy FEN to clipboard - if siCtrl: - QTUtil.ponPortapapeles(self.ultPosicion.fen()) - QTUtil2.mensajeTemporal(self.pantalla, _("FEN is in clipboard"), 1) - else: - self.intentaRotarTablero(None) + siAlt = (flags & QtCore.Qt.AltModifier) > 0 + siCtrl = (flags & QtCore.Qt.ControlModifier) > 0 - elif key == 68: # D director director - if not self.siTableroDirector(): - self.lanzaDirector() - else: - ok = False - if ok: - if self.kb_buffer: - self.kb_buffer = self.kb_buffer[:-1] - return + okseguir = False + + # CTRL-C : copy fen al clipboard + if siCtrl and key == Qt.Key_C: + QTUtil.ponPortapapeles(self.ultPosicion.fen()) + QTUtil2.mensajeTemporal(self.pantalla, _("FEN is in clipboard"), 1) + + # ALT-D -> Director + elif siAlt and key == Qt.Key_D: + if not self.siTableroDirector(): + self.lanzaDirector() + + # ALT-F -> Rota tablero + elif siAlt and key == Qt.Key_F: + self.intentaRotarTablero(None) + + # ALT-I Save image to clipboard (CTRL->no border) + elif key == Qt.Key_I: + self.salvaEnImagen(siCtrl=siCtrl) + QTUtil2.mensaje(self, _("Board image is in clipboard")) + + # ALT-J Save image to file (CTRL->no border) + elif key == Qt.Key_J: + path = QTUtil2.salvaFichero(self, _("File to save"), self.configuracion.dirSalvados, "%s PNG (*.png)" % _("File"), False) + if path: + self.salvaEnImagen(path, "png", siCtrl=siCtrl) + self.configuracion.dirSalvados = os.path.dirname(path) + self.configuracion.graba() + + # ALT-K + elif key == Qt.Key_K: + self.showKeys() + + elif hasattr(self.pantalla, "gestor") and self.pantalla.gestor and hasattr(self.pantalla.gestor, "rightMouse") \ + and key in (Qt.Key_P, Qt.Key_N, Qt.Key_C): + # P -> show information + if key == Qt.Key_P: + self.pantalla.gestor.rightMouse(False, False, False) + # ALT-N -> non distract mode + elif key == Qt.Key_N and siAlt: + self.pantalla.gestor.rightMouse(False, False, True) + # ALT-C -> show captures + elif key == Qt.Key_C and siAlt: + self.pantalla.gestor.rightMouse(False, True, False) + + else: + okseguir = True + + if not okseguir: + if self.kb_buffer: + self.kb_buffer = self.kb_buffer[:-1] + return if self.mensajero and self.siActivasPiezas: nk = len(self.kb_buffer) @@ -193,10 +221,7 @@ def exec_kb_buffer(self, key, flags): return def sizeHint(self): - return QtCore.QSize(self.ancho+6, self.ancho+6) - - # def adjustSize(self): - # return + return QtCore.QSize(self.ancho + 6, self.ancho + 6) def keyPressEvent(self, event): k = event.key() @@ -544,6 +569,41 @@ def norm(x): self.init_kb_buffer() + def showKeys(self): + liKeys = [ + (_("CTRL") + "-C", _("Copy FEN to clipboard")), + ("I", _("Copy board as image to clipboard")), + (_("CTRL") + "-I", _("Copy board as image to clipboard") + " (%s)" % _("without border")), + ("J", _("Copy board as image to a file")), + (_("CTRL") + "-J", _("Copy board as image to a file") + " (%s)" % _("without border")), + ] + if self.siActivasPiezas: + liKeys.append((None, None)) + liKeys.append(("a1 ... h8", _("To indicate origin and destination of a move"))) + + + if hasattr(self.pantalla, "gestor") and self.pantalla.gestor: + if hasattr(self.pantalla.gestor, "rightMouse"): + liKeys.append((None, None)) + liKeys.append(("P", _("Show/Hide PGN information"))) + liKeys.append((_("ALT") + "-C", _("Show/Hide captures"))) + liKeys.append((_("ALT") + "-N", _("Activate/Deactivate non distract mode"))) + + if hasattr(self.pantalla.gestor, "listHelpTeclado"): + liKeys.append((None, None)) + liKeys.extend(self.pantalla.gestor.listHelpTeclado()) + + rondo = QTVarios.rondoPuntos() + menu = QTVarios.LCMenu(self) + menu.opcion(None, _("Active keys"), Iconos.Rename()) + menu.separador() + for key, mess in liKeys: + if key is None: + menu.separador() + else: + menu.opcion(None, "%s [%s]" % (mess, key), rondo.otro()) + menu.lanza() + def lanzaMenuVisual(self, siIzquierdo): if not self.siMenuVisual: return @@ -577,6 +637,9 @@ def lanzaMenuVisual(self, siIzquierdo): smenu.separador() smenu.opcion("def_resto", _("The other"), Iconos.PuntoVerde()) + menu.separador() + menu.opcion("keys", _("Active keys")+ " [%s-K]" % _("ALT"), Iconos.Rename()) + resp = menu.lanza() if resp is None: return @@ -637,6 +700,9 @@ def lanzaMenuVisual(self, siIzquierdo): # w.exec_() # QTUtil.refreshGUI() + elif resp == "keys": + self.showKeys() + elif resp.startswith("def_"): self.confTablero.porDefecto(resp[4:]) self.confTablero.guardaEnDisco() @@ -727,6 +793,12 @@ def mousePressEvent(self, event): if event.button() == QtCore.Qt.RightButton: if not siDentro: self.lanzaMenuVisual(False) + elif hasattr(self.pantalla, "boardRightMouse"): + m = int(event.modifiers()) + siShift = (m & QtCore.Qt.ShiftModifier) > 0 + siControl = (m & QtCore.Qt.ControlModifier) > 0 + siAlt = (m & QtCore.Qt.AltModifier) > 0 + self.pantalla.boardRightMouse(siShift, siControl, siAlt) # QtGui.QGraphicsView.mousePressEvent(self,event) return if not siDentro: @@ -1175,8 +1247,8 @@ def num2alg(self, fila, columna): return chr(96 + columna) + str(fila) def alg2num(self, a1): - x = self.columna2punto(ord(a1[0])-96) - y = self.fila2punto(ord(a1[1])-48) + x = self.columna2punto(ord(a1[0]) - 96) + y = self.fila2punto(ord(a1[1]) - 48) return x, y def intentaMover(self, piezaSC, posCursor, eventButton): @@ -1443,15 +1515,10 @@ def salvaEnImagen(self, fichero=None, tipo=None, siCtrl=False): pm = QtGui.QPixmap.grabWidget(self) if fichero is None: QTUtil.ponPortapapeles(pm, tipo="p") + else: pm.save(fichero, tipo) - def salvaPGN(self, siClipboard=None): - if hasattr(self.pantalla, "gestor") and hasattr(self.pantalla.gestor, "salvaFEN_PGN"): - self.pantalla.gestor.salvaFEN_PGN("pgn", not siClipboard) - if siClipboard: - QTUtil2.mensajeTemporal(self, _("PGN is in clipboard"), 1) - def thumbnail(self, ancho): # escondemos piezas+flechas for pieza, piezaSC, siVisible in self.liPiezas: @@ -1646,6 +1713,7 @@ def fenActual(self): return "/".join(lineas) + " " + resto + class WTamTablero(QtGui.QDialog): def __init__(self, tablero): @@ -1780,6 +1848,7 @@ def closeEvent(self, event): if self.confTablero.siBase: self.tablero.permitidoResizeExterno(self.confTablero.siBase) + class PosTablero(Tablero): def activaTodas(self): for pieza, piezaSC, siActiva in self.liPiezas: @@ -1856,6 +1925,7 @@ def dropEvent(self, event): event.setDropAction(QtCore.Qt.IgnoreAction) event.ignore() + class TableroEstatico(Tablero): def mousePressEvent(self, event): pos = event.pos() @@ -1883,6 +1953,7 @@ def mousePressEvent(self, event): Tablero.mousePressEvent(self, event) + class TableroVisual(Tablero): EVENTO_DERECHO, EVENTO_DERECHO_PIEZA, EVENTO_DROP, EVENTO_BORRAR, EVENTO_FUNCION = range(5) @@ -2059,6 +2130,7 @@ def ponPosicion(self, posicion): self.baseCasillasSC.setAcceptDrops(True) self.activaTodas() + class TableroDirector(TableroVisual): def keyPressEvent(self, event): diff --git a/Code/QT/WBase.py b/Code/QT/WBase.py index d961a70..05528d8 100644 --- a/Code/QT/WBase.py +++ b/Code/QT/WBase.py @@ -20,7 +20,9 @@ def __init__(self, parent, gestor): self.gestor = gestor - self.centipawns = VarGen.configuracion.centipawns + self.configuracion = VarGen.configuracion + + self.centipawns = self.configuracion.centipawns self.procesandoEventos = None @@ -57,11 +59,11 @@ def ponGestor(self, gestor): def creaToolBar(self): self.tb = QtGui.QToolBar("BASICO", self) - self.tb.setIconSize(QtCore.QSize(32, 32)) - self.tb.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) - # self.tb.setStyleSheet("QWidget { background: #AFC3D7 }") - # self.tb.setStyleSheet("QToolBar {background: #AFC3D7;border-bottom: 1px solid black; border-top: 1px solid black;}"); - + iconsTB = self.configuracion.iconsTB + self.tb.setToolButtonStyle(iconsTB) + sz = 32 if iconsTB == QtCore.Qt.ToolButtonTextUnderIcon else 16 + self.tb.setIconSize(QtCore.QSize(sz, sz)) + self.tb.setStyleSheet("QToolBar {border-bottom: 1px solid gray; border-top: 1px solid gray;}"); self.preparaTB() def creaTablero(self): @@ -174,9 +176,14 @@ def creaBloqueInformacion(self): # Ayudas lyAyudas = Colocacion.H().relleno().control(self.lbCredito).control(self.ayudasUD).relleno().ponSeparacion(1) + # Abajo + lyAbajo = Colocacion.V() + lyAbajo.setSizeConstraint(lyAbajo.SetFixedSize) + lyAbajo.control(self.lbRevision).otro(lyAyudas).control(self.btActivarTutor) + lyAbajo.control(self.lbRotulo1).control(self.lbRotulo2).control(self.lbRotulo3) + lyV = Colocacion.V().otro(lyColor).control(self.pgn) - lyV.control(self.lbRevision).otro(lyAyudas).control(self.btActivarTutor) - lyV.control(self.lbRotulo1).control(self.lbRotulo2).control(self.lbRotulo3) + lyV.otro(lyAbajo) return lyV @@ -186,8 +193,8 @@ def preparaTB(self): liOpciones = ((_("Quit"), Iconos.Terminar(), k_terminar), (_("Play"), Iconos.Libre(), k_play), - (_("Competition"), Iconos.NuevaPartida(), k_competicion), - (_("Elo-Rating"), Iconos.Elo(), k_elo), + # (_("Competition"), Iconos.NuevaPartida(), k_competicion), + # (_("Elo-Rating"), Iconos.Elo(), k_elo), (_("Training"), Iconos.Entrenamiento(), k_entrenamiento), (_("Options"), Iconos.Opciones(), k_opciones), (_("Information"), Iconos.Informacion(), k_informacion), @@ -306,11 +313,11 @@ def gridBotonIzquierdo(self, grid, fila, columna): def gridBotonDerecho(self, grid, fila, columna, modificadores): self.gestor.pgnMueveBase(fila, columna.clave) + self.gestor.rightMouse(modificadores.siShift, modificadores.siControl, modificadores.siAlt) - if modificadores.siControl: - self.gestor.capturas() - else: - self.gestor.pgnInformacion(fila, columna.clave) + def boardRightMouse(self, siShift, siControl, siAlt): + if hasattr(self.gestor, "boardRightMouse"): + self.gestor.boardRightMouse(siShift, siControl, siAlt) def gridDobleClick(self, grid, fila, columna): if columna.clave == "NUMERO": @@ -534,6 +541,31 @@ def activaJuego(self, siActivar, siReloj, siAyudas=None): self.lbRelojBlancas.setVisible(siReloj) self.lbRelojNegras.setVisible(siReloj) + def nonDistractMode(self, nonDistract): + if nonDistract: + for widget in nonDistract: + widget.setVisible(True) + nonDistract = None + else: + nonDistract = [] + for widget in (self.tb, + self.pgn, + self.lbRevision, + self.ayudasUD, + self.lbCredito, + self.btActivarTutor, + self.lbRotulo1, + self.lbRotulo2, + self.lbRotulo3, + self.lbJugBlancas, + self.lbJugNegras, + self.lbRelojBlancas, + self.lbRelojNegras ): + if widget.isVisible(): + nonDistract.append(widget) + widget.setVisible(False) + return nonDistract + def ponDatosReloj(self, bl, rb, ng, rn): self.lbJugBlancas.altoMinimo(0) self.lbJugNegras.altoMinimo(0) diff --git a/Locale/es/LC_MESSAGES/lucaschess.mo b/Locale/es/LC_MESSAGES/lucaschess.mo index 80991ed6f75c44e1b798f29b74b16d2bdb32589c..a381d0dea6f511516a37bb5931ce3ff936d800f2 100644 GIT binary patch delta 61842 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
  • SrRfnOQR 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 Rr3={>sbE|2+fAAE{}0=(BI5u6 delta 60549 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