Code source de labpyproject.apps.labpyrinthe.gui.skinBase.zone_menu_base

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Sous écran Menu : logique applicative.
Implémentation générique de AbstractZoneMenu.
"""
# imports
from labpyproject.apps.labpyrinthe.gui.skinBase.interfaces import AbstractZoneMenu
from labpyproject.apps.labpyrinthe.gui.skinBase.interfaces import AbstractSwitch

# Evite l'ajout non désiré de certains imports à la doc sphinx
__all__ = ["ZoneMenuBase"]
# classe :
[docs]class ZoneMenuBase(AbstractZoneMenu): """ Sous écran menu """ def __init__(self, Mngr, skin): """ Constructeur """ # Manager : GUI self.Mngr = Mngr # ref au skin : self.skin = skin # choix : self._selected_level = None self._selected_mode = None # création de l'interface : self.btn_niveaux = dict() # crls niveaux (clef = n° niveau) self.btn_modes = dict() # (clefs partie, demo) self.draw_interface()
[docs] def re_initialise(self): """ Ré initialise l'objet """ # choix : self._selected_level = None self._selected_mode = None # désélections : listniv = [ self.btn_niveaux["1"], self.btn_niveaux["2"], self.btn_niveaux["3"], ] self.handle_change_states(listniv, AbstractSwitch.UNSELECTED) list_modes = [self.btn_modes["partie"], self.btn_modes["demo"]] self.handle_change_states(list_modes, AbstractSwitch.UNSELECTED)
#-----> Publication
[docs] def draw_interface(self): """ Création de l'interface Prend en charge l'enregistrement des ctrl niveau, mode et des items de description """
# à subclasser #-----> Etats
[docs] def handle_change_states(self, changelist, newstate): """ Applique le changement d'état à la liste """ for elt in changelist: if isinstance(elt, AbstractSwitch): elt.set_state(newstate) elif isinstance(elt, str): d = self._ctrls[elt] for c in d.keys(): c.set_state(newstate)
#-----> Commandes
[docs] def control_callback(self, ctrl, state): """ Méthode appelée lorsqu'un contrôle est cliqué state : * AbstractSwitch.OVER * AbstractSwitch.PRESSED * AbstractSwitch.SELECTED * AbstractSwitch.UNSELECTED """ if not isinstance(ctrl, AbstractSwitch): return prevstate = ctrl.get_state() # vars : deslectlist = list() selectlist = list() desactivelist = list() activelist = list() # niveau : listniv = [ self.btn_niveaux["1"], self.btn_niveaux["2"], self.btn_niveaux["3"], ] if ctrl in listniv: indice = None for k, v in self.btn_niveaux.items(): if ctrl == v: indice = k break # sélection / désélection : if state == AbstractSwitch.PRESSED: deslectlist = listniv if prevstate == AbstractSwitch.UNSELECTED: self._selected_level = indice selectlist.append(ctrl) elif prevstate == AbstractSwitch.SELECTED: self._selected_level = None # Partie / démo : list_modes = [self.btn_modes["partie"], self.btn_modes["demo"]] if ctrl in list_modes: mode = None for k, v in self.btn_modes.items(): if ctrl == v: mode = k[0] break # sélection / désélection : if state == AbstractSwitch.PRESSED: deslectlist = list_modes if prevstate == AbstractSwitch.UNSELECTED: self._selected_mode = mode selectlist.append(ctrl) elif prevstate == AbstractSwitch.SELECTED: self._selected_mode = None # Gestion des états : self.handle_change_states(deslectlist, AbstractSwitch.UNSELECTED) self.handle_change_states(desactivelist, AbstractSwitch.DISABLED) self.handle_change_states(activelist, AbstractSwitch.ENABLED) self.handle_change_states(selectlist, AbstractSwitch.SELECTED) # Validation : if state == AbstractSwitch.PRESSED: if self._selected_level != None and self._selected_mode != None: # passage de la cmd à la GUI cmd = str(self._selected_level) + str(self._selected_mode) self.Mngr.on_choice_made(cmd) # post traitement : self.post_control_callback()
[docs] def post_control_callback(self): """ Post traitement éventuel après gestion des callbacks de boutons """
# à subclasser