class Ventana: def __init__(self, glade, objeto = None, usuario = None): """ Constructor. glade es una cadena con el nombre del fichero .glade a cargar. objeto es el objeto principal de la ventana. Si usuario se recibe, se guarda en un atributo privado de la clase que servirá únicamente para crear un menú superior en la ventana con las opciones de menú disponibles para el usuario. Si el usuario es None, no se crea ningún menú. """ if isinstance(usuario, int): usuario = pclases.Usuario.get(usuario) self.__usuario = usuario self._is_fullscreen = False import logging self.logger = logging.getLogger('GINN') hdlr = logging.FileHandler('ginn.log') formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') hdlr.setFormatter(formatter) self.logger.addHandler(hdlr) # self.logger.setLevel(logging.INFO) self.wids = Widgets(glade) self.handlers_id = dict([(w, {}) for w in self.wids.keys()]) for w in self.wids.keys(): if isinstance(self.wids[w], gtk.Entry): h_id = self.wids[w].connect("activate", self.refocus_entry) try: self.handlers_id[w]["activate"].append(h_id) except KeyError: self.handlers_id[w]["activate"] = [h_id] config = ConfigConexion() try: self.wids['ventana'].set_border_width(5) # TODO:Cambiar por uno correspondiente al logo de la configuración. logo_xpm = gtk.gdk.pixbuf_new_from_file('logo_w.xpm') self.wids['ventana'].set_icon(logo_xpm) self.wids['barra_estado'] = gtk.Statusbar() label_statusbar = self.wids['barra_estado'].get_children()[0].child font = pango.FontDescription("Monospace oblique 7") label_statusbar.modify_font(font) label_statusbar.modify_fg(gtk.STATE_NORMAL, label_statusbar.get_colormap().alloc_color("darkgray")) contenido_anterior = self.wids['ventana'].get_child() self.wids['ventana'].remove(contenido_anterior) self.wids['contenedor_exterior'] = gtk.VBox() self.wids['ventana'].add(self.wids['contenedor_exterior']) self.wids['menu_superior'] = self.build_menu_superior() self.wids['contenedor_exterior'].pack_start( self.wids['menu_superior'], False) self.wids['contenedor_exterior'].add(contenido_anterior) self.wids['contenedor_exterior'].pack_end( self.wids['barra_estado'], False) self.wids['contenedor_exterior'].show() self.wids['barra_estado'].show() info_conexion = "%s://%s:xxxxxxxx@%s:%s/%s" % (config.get_tipobd(), config.get_user(), config.get_host(), config.get_puerto(), config.get_dbname()) info_usuario = "" if hasattr(self, "usuario") and self.usuario != None: info_usuario = " usuario: %s." % (self.usuario.usuario) if self.__usuario != None: info_usuario = " __usuario: %s." % (self.__usuario.usuario) utils.escribir_barra_estado(self.wids['barra_estado'], "Conectado a %s.%s" % (info_conexion, info_usuario)) except Exception, msg: txt = "ventana.py::__init__ -> No se pudo establecer ancho de borde, icono de ventana o barra de estado. Excepción: %s." % (msg) self.logger.warning(txt) self.objeto = objeto self.make_connections() self.make_funciones_ociosas() try: if "tpv.glade" in glade: tecla_fullscreen = "F10" # Es la de abrir el cajón en el TPV, grrrr... # Lo suyo sería mirar en los accelerators si ya está pillado # el F11, pero no sé cómo hacerlo si lo ha hecho libglade por # mí y no manualmente con add_accelerator* else: tecla_fullscreen = "F11" def view_key_press(widget, event): if event.keyval == gtk.gdk.keyval_from_name("F5"): if event.state == gtk.gdk.SHIFT_MASK: refrescar_cache_sqlobject() # print "Shift+F5" self.actualizar_objeto_y_enlaces() try: self.actualizar_ventana() except AttributeError: # No tiene actualizar_ventana pass elif event.keyval == gtk.gdk.keyval_from_name('q') \ and event.state & gtk.gdk.CONTROL_MASK \ and event.state & gtk.gdk.MOD1_MASK: # print "CONTROL+ALT+q" import trazabilidad t = trazabilidad.Trazabilidad(self.objeto, ventana_padre = self) elif event.keyval == gtk.gdk.keyval_from_name(tecla_fullscreen): self._full_unfull() else: # DONE: Aquí debería hacer algo para propagar el evento, # porque si no la barra de menú superior no # es capaz de interceptar el Ctrl+Q que lanzaría # el "Cerrar ventana". # Ya se propaga, el motivo de por qué no funciona # el Ctrl+Q no es no propagar el evento. #widget.propagate_key_event(event) #print event.keyval, event.state, event.string pass h_id=self.wids['ventana'].connect("key_press_event",view_key_press) try: self.handlers_id['ventana']["key_press_event"].append(h_id) except KeyError: self.handlers_id['ventana']["key_press_event"] = [h_id] except Exception, msg: txtexcp = "ventana.py::__init__ -> Mnemonics no añadidos. %s"%msg print txtexcp self.logger.warning(txtexcp)
class Ventana(object): def refocus_enter(self): self.handlers_id = dict([(w, {}) for w in self.wids.keys()]) for w in self.wids.keys(): widget = self.wids[w] if isinstance(widget, gtk.ComboBoxEntry): widget = widget.child if isinstance(widget, gtk.Entry): h_id = widget.connect("activate", self.refocus_entry) try: self.handlers_id[w]["activate"].append(h_id) except KeyError: self.handlers_id[w]["activate"] = [h_id] def __init__(self, glade, objeto = None, usuario = None): """ Constructor. glade es una cadena con el nombre del fichero .glade a cargar. objeto es el objeto principal de la ventana. Si usuario se recibe, se guarda en un atributo privado de la clase que servirá únicamente para crear un menú superior en la ventana con las opciones de menú disponibles para el usuario. Si el usuario es None, no se crea ningún menú. """ if isinstance(usuario, int): usuario = pclases.Usuario.get(usuario) self.__usuario = usuario self._is_fullscreen = False import logging self.logger = logging.getLogger('GINN') # El fichero de log lo voy a plantar en el raíz del proyecto. rutalogger = os.path.join(os.path.dirname(__file__), "..", 'ginn.log') hdlr = logging.FileHandler(rutalogger) formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') hdlr.setFormatter(formatter) self.logger.addHandler(hdlr) # self.logger.setLevel(logging.INFO) try: self.wids = Widgets(glade) # Puede que venga la ruta ya y no # haga falta combinar con os.path.join. except RuntimeError: try: self.wids = Widgets(os.path.join("formularios","glades",glade)) except RuntimeError: try: self.wids = Widgets(os.path.join("glades", glade)) except RuntimeError: try: self.wids = Widgets(os.path.join( "..", "formularios", "glades", glade)) except RuntimeError: if pclases.DEBUG and pclases.VERBOSE: print "ventana.py::Ventana.__init__ -> "\ "No encuentro el glade. Estoy en %s. "\ "Intento cargar de nuevo desde donde "\ "se supone que debería estar." % ( os.path.abspath(os.path.curdir)) self.wids = Widgets(glade) self.refocus_enter() try: self.wids['ventana'].set_border_width(5) # TODO:Cambiar por uno correspondiente al logo de la configuración. ruta_logo = os.path.join("imagenes", 'logo.xpm') logo_xpm = gtk.gdk.pixbuf_new_from_file(ruta_logo) self.wids['ventana'].set_icon(logo_xpm) self.wids['barra_estado'] = gtk.Statusbar() label_statusbar = self.wids['barra_estado'].get_children()[0].child font = pango.FontDescription("Monospace oblique 7") label_statusbar.modify_font(font) label_statusbar.modify_fg(gtk.STATE_NORMAL, label_statusbar.get_colormap().alloc_color("darkgray")) contenido_anterior = self.wids['ventana'].get_child() self.wids['ventana'].remove(contenido_anterior) self.wids['contenedor_exterior'] = gtk.VBox() self.wids['ventana'].add(self.wids['contenedor_exterior']) self.wids['menu_superior'] = self.build_menu_superior() self.wids['contenedor_exterior'].pack_start( self.wids['menu_superior'], False) self.wids['contenedor_exterior'].add(contenido_anterior) self.wids['contenedor_exterior'].pack_end( self.wids['barra_estado'], False) self.wids['contenedor_exterior'].show() self.wids['barra_estado'].show() config = ConfigConexion() info_conexion = "%s://%s:xxxxxxxx@%s:%s/%s" % (config.get_tipobd(), config.get_user(), config.get_host(), config.get_puerto(), config.get_dbname()) info_usuario = "" if hasattr(self, "usuario") and self.__usuario != None: info_usuario = " usuario: %s." % (self.__usuario.usuario) if self.__usuario != None: info_usuario = " __usuario: %s." % (self.__usuario.usuario) ui.escribir_barra_estado(self.wids['barra_estado'], "Conectado a %s.%s" % (info_conexion, info_usuario)) except Exception, msg: txt = "ventana.py::__init__ -> No se pudo establecer ancho "\ "de borde, icono de ventana o barra de estado. "\ "Excepción: %s." % (msg) self.logger.warning(txt) self.objeto = objeto self.make_connections() try: tecla_fullscreen = "F11" def view_key_press(widget, event): if event.keyval == gtk.gdk.keyval_from_name("F5"): if event.state == gtk.gdk.SHIFT_MASK: refrescar_cache_sqlobject() # print "Shift+F5" self.actualizar_objeto_y_enlaces() try: self.actualizar_ventana() except AttributeError: # No tiene actualizar_ventana pass elif event.keyval == gtk.gdk.keyval_from_name('q') \ and event.state & gtk.gdk.CONTROL_MASK \ and event.state & gtk.gdk.MOD1_MASK: # print "CONTROL+ALT+q" import trazabilidad trazabilidad.Trazabilidad(self.objeto, ventana_padre = self) elif event.keyval == gtk.gdk.keyval_from_name(tecla_fullscreen): self._full_unfull() elif event.keyval == gtk.gdk.keyval_from_name("Escape"): widget_focusado = self.wids['ventana'].get_focus() # Si estoy editando una celda no le cierro la ventana sin # avisar para que no pierda los cambios. mostrar_salir = (widget_focusado and isinstance(widget_focusado, gtk.Entry) and widget_focusado.parent and isinstance(widget_focusado.parent, gtk.TreeView)) self.salir(None, mostrar_ventana = mostrar_salir) # NAV plagiarism one more time! elif event.keyval == gtk.gdk.keyval_from_name('z') \ and event.state & gtk.gdk.CONTROL_MASK: # Deshacer en todos los botones de la ventana. for wname in self.wids.keys(): w = self.wids[wname] if w.name.startswith("b_undo"): w.clicked() else: # DONE: Aquí debería hacer algo para propagar el evento, # porque si no la barra de menú superior no # es capaz de interceptar el Ctrl+Q que lanzaría # el "Cerrar ventana". # Ya se propaga, el motivo de por qué no funciona # el Ctrl+Q no es no propagar el evento. #widget.propagate_key_event(event) #print event.keyval, event.state, event.string pass h_id=self.wids['ventana'].connect("key_press_event",view_key_press) try: self.handlers_id['ventana']["key_press_event"].append(h_id) except KeyError: self.handlers_id['ventana']["key_press_event"] = [h_id] except Exception, msg: txtexcp = "ventana.py::__init__ -> Mnemonics no añadidos. %s"%msg print txtexcp self.logger.warning(txtexcp)