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 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)