def intentar_guardar_objeto_anterior_antes_de_actualizar(self, objeto_anterior): """ Primero verifica si hay cambios pendientes de guardar en la ventana actual antes de actualizar el objeto en pantalla. La forma de hacerlo es mirar si b_guardar está habilitado. En ese caso intenta guardar los cambios del objeto anterior antes de sustituirlo en pantalla por el nuevo (que es lo que se está intentando "actualizar" en realidad, el self.objeto que aún no está en pantalla). Devuelve True si se ha guardado y se puede continuar la actualización del nuevo objeto para mostrarlo en pantalla o False si se debe interrumpir y dejar que el usuario guarde o descarte antes de pasar a otro objeto como self.objeto. """ if not self.objeto: # Evito falsas alarmas al abrir ventanas. res = False else: res = True if ("b_guardar" in self.wids.keys() and self.wids['b_guardar'] != None and self.wids['b_guardar'].get_property("sensitive") and objeto_anterior != None and objeto_anterior != self.objeto): # Importantísimo esto # último. A veces se da al abrir ventanas lentas desde otras. print "Cambios pendientes de guardar... ¡PERO EL OBJETO YA "\ "HA CAMBIADO!" #print self.objeto.id, objeto_anterior.id respuesta = ui.dialogo('Hay cambios pendientes de guardar.\n' '¿Desea hacerlo ahora?', '¿GUARDAR CAMBIOS?', padre = self.wids['ventana'], icono = gtk.STOCK_DIALOG_WARNING, cancelar = True, defecto = "Cancelar") if respuesta: try: tmp = self.objeto self.objeto = objeto_anterior #self.guardar(None) # Puede no llamarse así el callback, mejor simular el # click. self.wids['b_guardar'].clicked() objeto_anterior = self.objeto self.objeto = tmp except: ui.dialogo_info(titulo = 'NO SE PUDO GUARDAR', texto = 'Los cambios no se pudieron guardar ' 'automáticamente.\nDebe hacerlo de f' 'orma manual', padre = self.wids['ventana']) elif respuesta == gtk.RESPONSE_CANCEL: # Cancelará el resto de eventos siempre que sea posible. # No va a poder cancelar una cadena de acciones # "programáticamente" definida (por ejemplo, no cancelará # la asignación de un contador a un cliente en clientes.py, # aunque sí cancelará la acción de guardar información # modificada y tal). res = False return res
def actualizar_ventana(self, widget = None, objeto_anterior = None): """ Actualiza el contenido de los controles de la ventana para que muestren todos los datos del objeto actual. widget no se usa. Se recibe para el caso en que se llama a la función desde un botón. objeto_anterior es un objeo de pclases. Sería el que se muestra en pantalla justo antes de llamar a actualizar_ventana y recargar los datos. Si se recibe y hay cambios pendientes de guardar, el contenido de la ventana se guarda en ese objeto ANTES de mostrar el nuevo (o el mismo con nueva información) en los widgets de pantalla. """ if "ventana" in self.wids.keys() and self.wids['ventana'] != None: cursor_reloj = gtk.gdk.Cursor(gtk.gdk.WATCH) self.wids['ventana'].window.set_cursor(cursor_reloj) ui.set_unset_urgency_hint(self.wids['ventana'], False) while gtk.events_pending(): gtk.main_iteration(False) seguir = self.intentar_guardar_objeto_anterior_antes_de_actualizar( objeto_anterior) if seguir: if self.objeto != None: try: # Empiezo a probar actualización profunda de cachés y demás # para evitar errores de concurrencia (espero que no # sobrecargue mucho la red) # refrescar_cache_sqlobject() # Actualiza (sync) _todos_ los objetos de pclases # en memoria. self.actualizar_objeto_y_enlaces( actualizar_ventana_tambien = False) # Actualiza (sync) el objeto de la ventana y # todas sus relaciones. # self.objeto.sync() # Por si acaso hay cambios remotos que aún no han # llegado al objeto. self.rellenar_widgets() self.objeto.make_swap() # Me mantengo sincronizado con mi caché local. except sqlobject.SQLObjectNotFound: ui.dialogo_info(titulo = 'REGISTRO ELIMINADO', texto = 'El registro ha sido borrado desde otro puesto.', padre = self.wids['ventana']) self.objeto = None try: self.wids['b_actualizar'].set_sensitive(False) except KeyError: pass # No hay botón de actualizar. "Passssa nara". #print "I like big butts" try: self.activar_widgets(self.objeto != None) except AttributeError: pass except Exception, msg: print "ventana.py::actualizar_ventana -> "\ "Excepción al activar_widgets.", msg
def salir(self, boton, event = None, mostrar_ventana = True): """ Muestra una ventana de confirmación y sale de la ventana cerrando el bucle local de gtk_main. Si mostrar_ventana es False, sale directamente sin preguntar al usuario. """ try: b_guardar = self.wids['b_guardar'] except KeyError: b_guardar = None if b_guardar != None and b_guardar.get_property('sensitive'): # Hay cambios pendientes de guardar. if ui.dialogo('Hay cambios pendientes de guardar.\n¿Desea' ' hacerlo ahora?', '¿GUARDAR CAMBIOS?', padre = self.wids['ventana'], icono = gtk.STOCK_SAVE, defecto = "Sí"): try: self.guardar(None) except: ui.dialogo_info(titulo = 'NO SE PUDO GUARDAR', texto = 'Los cambios no se pudieron guardar automáticamente.\nDebe hacerlo de forma manual', padre = self.wids['ventana']) return True # Si devuelvo False, None, etc... continúa la cadena de eventos y destruye la ventana. # Devuelvo True para cancelar el cierre de la ventana. if event == None: # Me ha invocado el botón if not mostrar_ventana or \ ui.dialogo('¿Desea salir de la ventana actual?', 'SALIR', padre = self.wids['ventana'], icono = gtk.STOCK_QUIT): self.wids['ventana'].destroy() return False else: return True else: return not mostrar_ventana or \ not ui.dialogo('¿Desea salir de la ventana actual?', 'SALIR', padre = self.wids['ventana'], icono = gtk.STOCK_QUIT)
def aviso_actualizacion(self): """ Muestra una ventana modal con el mensaje de objeto actualizado. """ # TODO: OJO: Si la ventana abre otra ventana y se cierra la primera, # pero la segunda no, es posible que se intente ejecutar esta función. # Por ejemplo: abrir partes_de_fabricacion_balas.py y el depurador # (Ctr+Alt+q). Cambiar un valor del parte desde ipython y cerrar el # parte pero no el depurador. En consola aparecerá el WARNING del # except. try: self.wids['b_actualizar'].set_sensitive(True) ui.dialogo_info(titulo = 'ACTUALIZAR', texto = 'Los datos han sido modificados remotamente.\nDebe ' 'actualizar la información mostrada en pantalla.\nP' 'ulse el botón «Actualizar»', padre = self.wids['ventana']) except Exception, msg: if pclases.DEBUG: print "WARNING: Botón «Actualizar» o "\ "self.wids['ventana'] no encontrado. "\ "Excepción: %s""" % (msg)