class VisorImagenes (Gtk.EventBox): __gtype_name__ = 'JAMediaImagenesVisorImagenes' __gsignals__ = { 'salir': (GObject.SIGNAL_RUN_LAST, GObject.TYPE_NONE, []), 'switch_to': (GObject.SIGNAL_RUN_LAST, GObject.TYPE_NONE, (GObject.TYPE_STRING,))} def __init__(self, path): Gtk.EventBox.__init__(self) self.path = path # Directorio base_box = Gtk.VBox() self.intervalo = False self.actualizador = False self.toolbar = ToolbarImagen(path) self.visor = Visor() self.toolbar_config = ToolbarConfig() self.toolbartry = ToolbarTry() ### En panel scroll = Gtk.ScrolledWindow() scroll.set_policy( Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) scroll.add_with_viewport(self.visor) panel = Gtk.Paned(orientation=Gtk.Orientation.HORIZONTAL) panel.pack1(scroll, resize=True, shrink=False) self.listaiconview = ListaIconView(None) scroll = Gtk.ScrolledWindow() scroll.set_policy( Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) scroll.add_with_viewport(self.listaiconview) panel.pack2(scroll, resize=False, shrink=False) ### base_box.pack_start(self.toolbar, False, False, 0) base_box.pack_start(self.toolbar_config, False, False, 0) base_box.pack_start(panel, True, True, 0) base_box.pack_end(self.toolbartry, False, False, 0) self.add(base_box) self.connect("realize", self.__rescale) self.show_all() self.toolbar.connect('switch_to', self.__emit_switch) self.toolbar.connect('activar', self.__set_accion) self.toolbar.connect('salir', self.__salir) self.toolbar_config.connect('run', self.__set_presentacion) self.visor.connect('changed', self.__set_change_image) self.visor.connect('info', self.__set_info) self.toolbar_config.hide() self.toolbar.set_modo("nochanged") self.toolbar.set_modo("edit") self.connect("motion-notify-event", self.__do_motion_notify_event) self.visor.add_events( Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK ) self.visor.connect("button_press_event", self.__clicks_en_pantalla) self.listaiconview.connect("selected", self.__show_imagen) self.listaiconview.connect("button-press-event", self.__click_derecho_en_lista) def __rescale(self, widget): #rect = self.get_toplevel().get_allocation() self.listaiconview.set_size_request(-1, -1) self.listaiconview.hide() def __clicks_en_pantalla(self, widget, event): pass # FIXME: El visor es fullscreen, pero esta funcionalidad puede ser # insteresante cuando la aplicación está embebida en otra. """ if event.type.value_name == "GDK_2BUTTON_PRESS": self.get_toplevel().set_sensitive(False) ventana = self.get_toplevel() screen = ventana.get_screen() w,h = ventana.get_size() ww, hh = (screen.get_width(), screen.get_height()) if ww == w and hh == h: GLib.idle_add(ventana.unfullscreen) else: GLib.idle_add(ventana.fullscreen) self.get_toplevel().set_sensitive(True) """ def __click_derecho_en_lista(self, widget, event): """ Esto es para abrir un menu de opciones cuando el usuario hace click derecho sobre un elemento en la lista de imágenes, permitiendo copiar, mover y borrar el archivo o simplemente quitarlo de la lista. """ boton = event.button pos = (event.x, event.y) tiempo = event.time if boton == 1: return elif boton == 3: path = widget.get_path_at_pos( int(pos[0]), int(pos[1])) #iter = widget.get_model().get_iter(path) from Widgets import MenuList menu = MenuList( widget, boton, pos, tiempo, path, widget.get_model(), self.path) menu.connect('accion', self.__set_menu_accion) menu.popup(None, None, None, None, boton, tiempo) elif boton == 2: return def __set_menu_accion(self, widget, widget_item, accion, iter, file_path): if accion == "Quitar": widget_item.get_model().remove(iter) elif accion == "Borrar": from JAMediaObjects.JAMFileSystem import borrar widget_item.get_model().remove(iter) borrar(file_path) elif accion == "Copiar": from Globales import get_imagenes_directory from JAMediaObjects.JAMFileSystem import copiar copiar(file_path, get_imagenes_directory()) elif accion == "Mover": from Globales import get_imagenes_directory from JAMediaObjects.JAMFileSystem import mover widget_item.get_model().remove(iter) mover(file_path, get_imagenes_directory()) def __do_motion_notify_event(self, widget, event): """ Cuando se mueve el mouse sobre la ventana se muestran u ocultan las toolbars. """ if self.toolbar_config.get_visible(): return rect = self.toolbar.get_allocation() arriba = range(0, rect.height) root_rect = self.get_toplevel().get_allocation() rect = self.toolbartry.get_allocation() abajo = range(root_rect.height - rect.height, root_rect.height) x, y = self.get_toplevel().get_pointer() rect = self.listaiconview.get_allocation() derecha = range(root_rect.width - rect.width, root_rect.width) if y in arriba or y in abajo or x in derecha: if not self.toolbar.get_visible(): self.toolbar.show() if not self.toolbartry.get_visible(): self.toolbartry.show() if not self.listaiconview.get_visible(): self.listaiconview.show() return else: if self.toolbar.get_visible(): self.toolbar.hide() if self.toolbartry.get_visible(): self.toolbartry.hide() if self.listaiconview.get_visible(): self.listaiconview.hide() return def __set_presentacion(self, widget=None, intervalo=False): """ Lanza el modo diapositivas. """ if self.actualizador: GLib.source_remove(self.actualizador) self.actualizador = False if intervalo: self.intervalo = intervalo self.toolbar.set_modo("player") self.toolbar.set_playing() self.actualizador = GLib.timeout_add( self.intervalo, self.__handle_presentacion) def __stop_presentacion(self): if self.actualizador: GLib.source_remove(self.actualizador) self.actualizador = False self.toolbar.set_paused() def __handle_presentacion(self): """ Cuando está en modo Diapositivas. """ self.listaiconview.seleccionar_siguiente() return True def __set_accion(self, widget, accion): self.get_toplevel().set_sensitive(False) if accion == "Configurar Presentación": self.__stop_presentacion() if self.toolbar_config.get_visible(): self.toolbar_config.hide() else: self.toolbar_config.show() elif accion == "Reproducir": if self.toolbar_config.get_visible(): self.toolbar_config.hide() if self.actualizador: self.__stop_presentacion() else: self.__set_presentacion() elif accion == "Anterior": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.__stop_presentacion() self.listaiconview.seleccionar_anterior() elif accion == "Siguiente": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.__stop_presentacion() self.listaiconview.seleccionar_siguiente() elif accion == "Detener": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.__stop_presentacion() elif accion == "Rotar Izquierda": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.visor.rotar(-1) elif accion == "Rotar Derecha": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.visor.rotar(1) elif accion == "Acercar": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.visor.zoom(1) elif accion == "Alejar": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.visor.zoom(-1) elif accion == "Centrar en Pantalla": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.visor.center_image() elif accion == "Navegar Imágenes": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.__stop_presentacion() if self.toolbar.modo != "edit": self.toolbar.set_modo("edit") elif self.toolbar.modo == "edit": self.toolbar.set_modo("player") elif accion == "Guardar": self.visor.guardar() self.get_toplevel().set_sensitive(True) def __set_change_image(self, widget, valor): """ Cuando el usuario rota la imagen, puede guardarla. """ if valor: self.toolbar.set_modo("changed") else: self.toolbar.set_modo("nochanged") def __emit_switch(self, widget, path): self.__stop_presentacion() self.emit("switch_to", path) def __salir(self, widget): self.__stop_presentacion() self.emit("salir") def run(self): self.listaiconview.load_previews(self.path) def __show_imagen(self, widget, imagen): self.visor.load(imagen) ''' while Gtk.events_pending(): Gtk.main_iteration() ''' self.queue_draw() def __set_info(self, widget, info): self.toolbartry.set_info(info)
class JAMediaLector(Gtk.Plug): """ JAMediaLector: Lector pdf y de archivos de texto. Implementado sobre: python 2.7.3 y Gtk 3 Es un Gtk.Plug para embeber en cualquier contenedor dentro de otra aplicacion. Para ello, es necesario crear en la aplicacion donde será enbebido JAMediaLector, un socket: import JAMediaLector from JAMediaLector.JAMediaLector import JAMediaLector self.socket = Gtk.Socket() self.add(self.socket) self.jamedialector = JAMediaLector() socket.add_id(self.jamedialector.get_id() y luego proceder de la siguiente forma: GLib.idle_add(self.setup_init) def setup_init(self): self.jamedialector.setup_init() # self.jamediaplayer.pack_standar() # Esta última linea no debe ir cuando se embebe NOTA: Tambien se puede ejecutar JAMediaLector directamente mediante python JAMediaLector.py """ __gsignals__ = {"salir": (GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, [])} def __init__(self): """ JAMediaLector: Gtk.Plug para embeber en otra aplicación. """ Gtk.Plug.__init__(self, 0L) self.toolbar_box = None self.toolbar = None self.toolbar_config = None self.toolballector = None self.toolbartray = None self.visor = None self.previewcontainer = None self.toolbarpaginas = None self.textview = None self.toolbar_salir = None self.controlespdf = None self.controlestexto = None self.controles_dinamicos = None self.documento = None self.npaginas = None self.indexpaginaactiva = None self.pagina = None self.show_all() self.connect("embedded", self.embed_event) def setup_init(self): """ Se crea la interfaz grafica, se setea todo y se empaqueta todo. """ ### Contenedor secundario para toda la interfaz. basebox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) ### Contenedor para todas las toolbars. self.toolbar_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) ### Panel para lector y barra de navegación de páginas. hpanel = Gtk.HPaned() self.toolbar = Toolbar() self.toolbar_salir = ToolbarSalir() self.toolbar_config = ToolbarConfig() self.toolbarlector = ToolbarLector() self.toolbartry = ToolbarTry() ### Empaquetado de las tres toolbars superiores de la aplicacion. self.toolbar_box.pack_start(self.toolbar, False, False, 0) self.toolbar_box.pack_start(self.toolbar_salir, False, False, 0) self.toolbar_box.pack_start(self.toolbar_config, False, False, 0) self.visor = DrawingLector() self.previewcontainer = PreviewContainer() self.toolbarpaginas = ToolbarPaginas() self.textview = TextView() # Izquierda vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) scroll = Gtk.ScrolledWindow() scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) scroll.add_with_viewport(self.visor) vbox.pack_start(self.toolbarlector, False, False, 0) vbox.pack_start(scroll, True, True, 0) self.controlespdf = [self.toolbarlector, scroll] scroll = Gtk.ScrolledWindow() scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) scroll.add_with_viewport(self.textview) vbox.pack_start(scroll, True, True, 0) self.controlestexto = [scroll] hpanel.pack1(vbox, resize=True, shrink=True) ### Derecha self.derecha_vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) scroll = Gtk.ScrolledWindow() scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) scroll.add_with_viewport(self.previewcontainer) self.derecha_vbox.pack_start(self.toolbarpaginas, False, False, 0) self.derecha_vbox.pack_start(scroll, True, True, 0) self.controlespdf.append(self.derecha_vbox) hpanel.pack2(self.derecha_vbox, resize=False, shrink=False) basebox.pack_start(self.toolbar_box, False, False, 0) basebox.pack_start(hpanel, True, True, 0) basebox.pack_start(self.toolbartry, False, False, 0) self.controles_dinamicos = [ self.toolbar_box, self.derecha_vbox, self.toolbartry ] self.add(basebox) self.show_all() self.toolbar_salir.hide() self.toolbar.abrir.hide() # Solo cuando no esta embebido self.toolbar_config.hide() self.toolbarlector.connect('original', self.visor.original) self.toolbarlector.connect('alejar', self.visor.alejar) self.toolbarlector.connect('acercar', self.visor.acercar) #self.toolbarlector.connect('rotar_izquierda', self.visor.acercar) #self.toolbarlector.connect('rotar_derecha', self.visor.acercar) self.toolbarpaginas.connect('activar', self.activar) self.previewcontainer.connect('nueva_seleccion', self.nueva_pagina) self.visor.connect("button_press_event", self.clicks_en_pantalla) self.toolbar.connect('abrir', self.show_filechooser) self.toolbar.connect('config', self.mostrar_config) self.toolbar.connect('salir', self.confirmar_salir) self.toolbar_salir.connect('salir', self.emit_salir) map(self.ocultar, self.controlestexto) map(self.ocultar, self.controlespdf) def pack_standar(self): """ Para empaquetar el botón abrir. """ self.toolbar.abrir.show() def mostrar_config(self, widget): """ Muestra u oculta las opciones de configuracion (toolbar_config). """ map(self.ocultar, [self.toolbar_salir]) if self.toolbar_config.get_visible(): self.toolbar_config.hide() else: self.toolbar_config.show_all() def clicks_en_pantalla(self, widget, event): """ Hace fullscreen y unfullscreen sobre la ventana principal cuando el usuario hace doble click en el visor. """ if event.type.value_name == "GDK_2BUTTON_PRESS": ventana = self.get_toplevel() screen = ventana.get_screen() w, h = ventana.get_size() ww, hh = (screen.get_width(), screen.get_height()) if ww == w and hh == h: ventana.unfullscreen() else: ventana.fullscreen() def do_motion_notify_event(self, event): """ Cuando se mueve el mouse sobre la ventana. """ if self.toolbar_config.ocultar_controles: x, y = (int(event.x), int(event.y)) rect = self.get_allocation() xx, yy, ww, hh = (rect.x, rect.y, rect.width, rect.height) arriba = range(0, self.toolbar_box.get_allocation().height) derecha = range(ww - self.derecha_vbox.get_allocation().width, ww) if y in arriba or x in derecha: map(self.mostrar, self.controles_dinamicos) else: map(self.ocultar, self.controles_dinamicos) #map(self.ocultar, [self.toolbar_config, self.toolbar_salir]) else: map(self.mostrar, self.controles_dinamicos) def ocultar(self, objeto): """ Esta funcion es llamada desde self.ocultar_controles() """ if objeto.get_visible(): objeto.hide() def mostrar(self, objeto): """ Esta funcion es llamada desde self.ocultar_controles() """ if not objeto.get_visible(): objeto.show() def show_filechooser(self, widget): selector = Selector_de_Archivos(self) selector.connect('archivos-seleccionados', self.cargar_archivo) def cargar_archivo(self, widget, archivo): """ Recibe un archivo desde el filechooser para abrir en el lector. """ self.abrir(archivo) def limpiar(self): self.toolbartry.label.set_text("") self.documento = None self.previewcontainer.limpiar() self.load_pagina(None) self.textview.get_buffer().set_text("") map(self.ocultar, self.controlestexto) map(self.ocultar, self.controlespdf) def abrir(self, archivo): """ Abre un Archivo. """ descripcion = JAMF.describe_uri(archivo) if descripcion: if descripcion[2]: # Es un Archivo tipo = JAMF.describe_archivo(archivo) if 'pdf' in tipo: self.toolbartry.label.set_text(archivo) archivo = "file://%s" % (archivo) map(self.ocultar, self.controlestexto) map(self.mostrar, self.controlespdf) self.documento = Poppler.Document.new_from_file( archivo, None) self.npaginas = self.documento.get_n_pages() #thread = threading.Thread( target=self.llenar_preview ) #thread.start() self.previewcontainer.llenar(self.documento) elif 'text' in tipo: self.toolbartry.label.set_text(archivo) map(self.ocultar, self.controlespdf) map(self.mostrar, self.controlestexto) arch = open(archivo, "r") lineas = arch.readlines() arch.close() texto = "" for linea in lineas: texto += linea self.textview.get_buffer().set_text(texto) else: self.toolbartry.label.set_text("") self.documento = None self.previewcontainer.limpiar() self.load_pagina(None) self.textview.get_buffer().set_text("") #def llenar_preview(self): # """ Thread para cargar las páginas en preview. """ # self.previewcontainer.llenar(self.documento) def nueva_pagina(self, widget, indice): """ Cuando se selecciona una nueva pagina """ self.load_pagina(indice) def load_pagina(self, indice): """ Carga una página del Archivo pdf abierto actualmente. """ if indice != None: self.indexpaginaactiva = indice self.pagina = self.documento.get_page(self.indexpaginaactiva) self.visor.set_pagina(self.pagina) self.toolbarpaginas.set_pagina(self.indexpaginaactiva + 1, self.npaginas) else: self.indexpaginaactiva = None self.pagina = None self.visor.set_pagina(None) self.toolbarpaginas.set_pagina(None, None) def activar(self, widget, senial): """ Cuando se pasa de pagina. """ if senial == 'atras': if self.indexpaginaactiva > 0: self.previewcontainer.seleccionar(self.indexpaginaactiva - 1) else: self.previewcontainer.seleccionar(self.npaginas - 1) elif senial == 'siguiente': if self.indexpaginaactiva < self.npaginas - 1: self.previewcontainer.seleccionar(self.indexpaginaactiva + 1) else: self.previewcontainer.seleccionar(0) def embed_event(self, widget): """ No hace nada por ahora. """ print "JAMediaLector => OK" def confirmar_salir(self, widget=None, senial=None): """ Recibe salir y lo pasa a la toolbar de confirmación. """ map(self.ocultar, [self.toolbar_config]) self.toolbar_salir.run("JAMediaLector") def emit_salir(self, widget=None, senial=None): """ Emite salir para que cuando esta embebida, la aplicacion decida que hacer, si salir, o cerrar solo JAMediaLector. """ self.emit('salir')
class JAMediaLector(Gtk.Plug): """ JAMediaLector: Lector pdf y de archivos de texto. Implementado sobre: python 2.7.3 y Gtk 3 Es un Gtk.Plug para embeber en cualquier contenedor dentro de otra aplicacion. Para ello, es necesario crear en la aplicacion donde será enbebido JAMediaLector, un socket: import JAMediaLector from JAMediaLector.JAMediaLector import JAMediaLector self.socket = Gtk.Socket() self.add(self.socket) self.jamedialector = JAMediaLector() socket.add_id(self.jamedialector.get_id() y luego proceder de la siguiente forma: GLib.idle_add(self.setup_init) def setup_init(self): self.jamedialector.setup_init() # self.jamediaplayer.pack_standar() # Esta última linea no debe ir cuando se embebe NOTA: Tambien se puede ejecutar JAMediaLector directamente mediante python JAMediaLector.py """ __gsignals__ = { "salir":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, [])} def __init__(self): """ JAMediaLector: Gtk.Plug para embeber en otra aplicación. """ Gtk.Plug.__init__(self, 0L) self.toolbar_box = None self.toolbar = None self.toolbar_config = None self.toolballector = None self.toolbartray = None self.visor = None self.previewcontainer = None self.toolbarpaginas = None self.textview = None self.toolbar_salir = None self.controlespdf = None self.controlestexto = None self.controles_dinamicos = None self.documento = None self.npaginas = None self.indexpaginaactiva = None self.pagina = None self.show_all() self.connect("embedded", self.embed_event) def setup_init(self): """ Se crea la interfaz grafica, se setea todo y se empaqueta todo. """ ### Contenedor secundario para toda la interfaz. basebox = Gtk.Box(orientation = Gtk.Orientation.VERTICAL) ### Contenedor para todas las toolbars. self.toolbar_box = Gtk.Box(orientation = Gtk.Orientation.VERTICAL) ### Panel para lector y barra de navegación de páginas. hpanel = Gtk.HPaned() self.toolbar = Toolbar() self.toolbar_salir = ToolbarSalir() self.toolbar_config = ToolbarConfig() self.toolbarlector = ToolbarLector() self.toolbartry = ToolbarTry() ### Empaquetado de las tres toolbars superiores de la aplicacion. self.toolbar_box.pack_start(self.toolbar, False, False, 0) self.toolbar_box.pack_start(self.toolbar_salir, False, False, 0) self.toolbar_box.pack_start(self.toolbar_config, False, False, 0) self.visor = DrawingLector() self.previewcontainer = PreviewContainer() self.toolbarpaginas = ToolbarPaginas() self.textview = TextView() # Izquierda vbox = Gtk.Box(orientation = Gtk.Orientation.VERTICAL) scroll = Gtk.ScrolledWindow() scroll.set_policy( Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) scroll.add_with_viewport(self.visor) vbox.pack_start(self.toolbarlector, False, False, 0) vbox.pack_start(scroll, True, True, 0) self.controlespdf = [self.toolbarlector, scroll] scroll = Gtk.ScrolledWindow() scroll.set_policy( Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) scroll.add_with_viewport(self.textview) vbox.pack_start(scroll, True, True, 0) self.controlestexto = [scroll] hpanel.pack1(vbox, resize = True, shrink = True) ### Derecha self.derecha_vbox = Gtk.Box(orientation = Gtk.Orientation.VERTICAL) scroll = Gtk.ScrolledWindow() scroll.set_policy( Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) scroll.add_with_viewport(self.previewcontainer) self.derecha_vbox.pack_start(self.toolbarpaginas, False, False, 0) self.derecha_vbox.pack_start(scroll, True, True, 0) self.controlespdf.append(self.derecha_vbox) hpanel.pack2(self.derecha_vbox, resize = False, shrink = False) basebox.pack_start(self.toolbar_box, False, False, 0) basebox.pack_start(hpanel, True, True, 0) basebox.pack_start(self.toolbartry, False, False, 0) self.controles_dinamicos = [ self.toolbar_box, self.derecha_vbox, self.toolbartry] self.add(basebox) self.show_all() self.toolbar_salir.hide() self.toolbar.abrir.hide() # Solo cuando no esta embebido self.toolbar_config.hide() self.toolbarlector.connect('original', self.visor.original) self.toolbarlector.connect('alejar', self.visor.alejar) self.toolbarlector.connect('acercar', self.visor.acercar) #self.toolbarlector.connect('rotar_izquierda', self.visor.acercar) #self.toolbarlector.connect('rotar_derecha', self.visor.acercar) self.toolbarpaginas.connect('activar', self.activar) self.previewcontainer.connect('nueva_seleccion', self.nueva_pagina) self.visor.connect("button_press_event", self.clicks_en_pantalla) self.toolbar.connect('abrir', self.show_filechooser) self.toolbar.connect('config', self.mostrar_config) self.toolbar.connect('salir', self.confirmar_salir) self.toolbar_salir.connect('salir', self.emit_salir) map(self.ocultar, self.controlestexto) map(self.ocultar, self.controlespdf) def pack_standar(self): """ Para empaquetar el botón abrir. """ self.toolbar.abrir.show() def mostrar_config(self, widget): """ Muestra u oculta las opciones de configuracion (toolbar_config). """ map(self.ocultar, [self.toolbar_salir]) if self.toolbar_config.get_visible(): self.toolbar_config.hide() else: self.toolbar_config.show_all() def clicks_en_pantalla(self, widget, event): """ Hace fullscreen y unfullscreen sobre la ventana principal cuando el usuario hace doble click en el visor. """ if event.type.value_name == "GDK_2BUTTON_PRESS": ventana = self.get_toplevel() screen = ventana.get_screen() w,h = ventana.get_size() ww, hh = (screen.get_width(), screen.get_height()) if ww == w and hh == h: ventana.unfullscreen() else: ventana.fullscreen() def do_motion_notify_event(self, event): """ Cuando se mueve el mouse sobre la ventana. """ if self.toolbar_config.ocultar_controles: x, y = (int(event.x), int(event.y)) rect = self.get_allocation() xx, yy, ww, hh = (rect.x, rect.y, rect.width, rect.height) arriba = range(0, self.toolbar_box.get_allocation().height) derecha = range(ww - self.derecha_vbox.get_allocation().width, ww) if y in arriba or x in derecha: map(self.mostrar, self.controles_dinamicos) else: map(self.ocultar, self.controles_dinamicos) #map(self.ocultar, [self.toolbar_config, self.toolbar_salir]) else: map(self.mostrar, self.controles_dinamicos) def ocultar(self, objeto): """ Esta funcion es llamada desde self.ocultar_controles() """ if objeto.get_visible(): objeto.hide() def mostrar(self, objeto): """ Esta funcion es llamada desde self.ocultar_controles() """ if not objeto.get_visible(): objeto.show() def show_filechooser(self, widget): selector = Selector_de_Archivos(self) selector.connect('archivos-seleccionados', self.cargar_archivo) def cargar_archivo(self, widget, archivo): """ Recibe un archivo desde el filechooser para abrir en el lector. """ self.abrir( archivo) def limpiar(self): self.toolbartry.label.set_text("") self.documento = None self.previewcontainer.limpiar() self.load_pagina(None) self.textview.get_buffer().set_text("") map(self.ocultar, self.controlestexto) map(self.ocultar, self.controlespdf) def abrir(self, archivo): """ Abre un Archivo. """ descripcion = JAMF.describe_uri(archivo) if descripcion: if descripcion[2]: # Es un Archivo tipo = JAMF.describe_archivo(archivo) if 'pdf' in tipo: self.toolbartry.label.set_text(archivo) archivo = "file://%s" % (archivo) map(self.ocultar, self.controlestexto) map(self.mostrar, self.controlespdf) self.documento = Poppler.Document.new_from_file(archivo, None) self.npaginas = self.documento.get_n_pages() #thread = threading.Thread( target=self.llenar_preview ) #thread.start() self.previewcontainer.llenar(self.documento) elif 'text' in tipo: self.toolbartry.label.set_text(archivo) map(self.ocultar, self.controlespdf) map(self.mostrar, self.controlestexto) arch = open(archivo, "r") lineas = arch.readlines() arch.close() texto = "" for linea in lineas: texto += linea self.textview.get_buffer().set_text(texto) else: self.toolbartry.label.set_text("") self.documento = None self.previewcontainer.limpiar() self.load_pagina(None) self.textview.get_buffer().set_text("") #def llenar_preview(self): # """ Thread para cargar las páginas en preview. """ # self.previewcontainer.llenar(self.documento) def nueva_pagina(self, widget, indice): """ Cuando se selecciona una nueva pagina """ self.load_pagina(indice) def load_pagina(self, indice): """ Carga una página del Archivo pdf abierto actualmente. """ if indice != None: self.indexpaginaactiva = indice self.pagina = self.documento.get_page(self.indexpaginaactiva) self.visor.set_pagina(self.pagina) self.toolbarpaginas.set_pagina(self.indexpaginaactiva+1, self.npaginas) else: self.indexpaginaactiva = None self.pagina = None self.visor.set_pagina(None) self.toolbarpaginas.set_pagina(None, None) def activar(self, widget, senial): """ Cuando se pasa de pagina. """ if senial == 'atras': if self.indexpaginaactiva > 0: self.previewcontainer.seleccionar(self.indexpaginaactiva-1) else: self.previewcontainer.seleccionar(self.npaginas-1) elif senial == 'siguiente': if self.indexpaginaactiva < self.npaginas-1: self.previewcontainer.seleccionar(self.indexpaginaactiva+1) else: self.previewcontainer.seleccionar(0) def embed_event(self, widget): """ No hace nada por ahora. """ print "JAMediaLector => OK" def confirmar_salir(self, widget = None, senial = None): """ Recibe salir y lo pasa a la toolbar de confirmación. """ map(self.ocultar, [self.toolbar_config]) self.toolbar_salir.run("JAMediaLector") def emit_salir(self, widget = None, senial = None): """ Emite salir para que cuando esta embebida, la aplicacion decida que hacer, si salir, o cerrar solo JAMediaLector. """ self.emit('salir')
class VisorImagenes(Gtk.EventBox): __gtype_name__ = 'JAMediaImagenesVisorImagenes' __gsignals__ = { 'salir': (GObject.SIGNAL_RUN_LAST, GObject.TYPE_NONE, []), 'switch_to': (GObject.SIGNAL_RUN_LAST, GObject.TYPE_NONE, (GObject.TYPE_STRING, )) } def __init__(self, path): Gtk.EventBox.__init__(self) self.path = path # Directorio base_box = Gtk.VBox() self.intervalo = False self.actualizador = False self.toolbar = ToolbarImagen(path) self.visor = Visor() self.toolbar_config = ToolbarConfig() self.toolbartry = ToolbarTry() ### En panel scroll = Gtk.ScrolledWindow() scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) scroll.add_with_viewport(self.visor) panel = Gtk.Paned(orientation=Gtk.Orientation.HORIZONTAL) panel.pack1(scroll, resize=True, shrink=False) self.listaiconview = ListaIconView(None) scroll = Gtk.ScrolledWindow() scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) scroll.add_with_viewport(self.listaiconview) panel.pack2(scroll, resize=False, shrink=False) ### base_box.pack_start(self.toolbar, False, False, 0) base_box.pack_start(self.toolbar_config, False, False, 0) base_box.pack_start(panel, True, True, 0) base_box.pack_end(self.toolbartry, False, False, 0) self.add(base_box) self.connect("realize", self.__rescale) self.show_all() self.toolbar.connect('switch_to', self.__emit_switch) self.toolbar.connect('activar', self.__set_accion) self.toolbar.connect('salir', self.__salir) self.toolbar_config.connect('run', self.__set_presentacion) self.visor.connect('changed', self.__set_change_image) self.visor.connect('info', self.__set_info) self.toolbar_config.hide() self.toolbar.set_modo("nochanged") self.toolbar.set_modo("edit") self.connect("motion-notify-event", self.__do_motion_notify_event) self.visor.add_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK) self.visor.connect("button_press_event", self.__clicks_en_pantalla) self.listaiconview.connect("selected", self.__show_imagen) self.listaiconview.connect("button-press-event", self.__click_derecho_en_lista) def __rescale(self, widget): #rect = self.get_toplevel().get_allocation() self.listaiconview.set_size_request(-1, -1) self.listaiconview.hide() def __clicks_en_pantalla(self, widget, event): pass # FIXME: El visor es fullscreen, pero esta funcionalidad puede ser # insteresante cuando la aplicación está embebida en otra. """ if event.type.value_name == "GDK_2BUTTON_PRESS": self.get_toplevel().set_sensitive(False) ventana = self.get_toplevel() screen = ventana.get_screen() w,h = ventana.get_size() ww, hh = (screen.get_width(), screen.get_height()) if ww == w and hh == h: GLib.idle_add(ventana.unfullscreen) else: GLib.idle_add(ventana.fullscreen) self.get_toplevel().set_sensitive(True) """ def __click_derecho_en_lista(self, widget, event): """ Esto es para abrir un menu de opciones cuando el usuario hace click derecho sobre un elemento en la lista de imágenes, permitiendo copiar, mover y borrar el archivo o simplemente quitarlo de la lista. """ boton = event.button pos = (event.x, event.y) tiempo = event.time if boton == 1: return elif boton == 3: path = widget.get_path_at_pos(int(pos[0]), int(pos[1])) #iter = widget.get_model().get_iter(path) from Widgets import MenuList menu = MenuList(widget, boton, pos, tiempo, path, widget.get_model(), self.path) menu.connect('accion', self.__set_menu_accion) menu.popup(None, None, None, None, boton, tiempo) elif boton == 2: return def __set_menu_accion(self, widget, widget_item, accion, iter, file_path): if accion == "Quitar": widget_item.get_model().remove(iter) elif accion == "Borrar": from JAMediaObjects.JAMFileSystem import borrar widget_item.get_model().remove(iter) borrar(file_path) elif accion == "Copiar": from Globales import get_imagenes_directory from JAMediaObjects.JAMFileSystem import copiar copiar(file_path, get_imagenes_directory()) elif accion == "Mover": from Globales import get_imagenes_directory from JAMediaObjects.JAMFileSystem import mover widget_item.get_model().remove(iter) mover(file_path, get_imagenes_directory()) def __do_motion_notify_event(self, widget, event): """ Cuando se mueve el mouse sobre la ventana se muestran u ocultan las toolbars. """ if self.toolbar_config.get_visible(): return rect = self.toolbar.get_allocation() arriba = range(0, rect.height) root_rect = self.get_toplevel().get_allocation() rect = self.toolbartry.get_allocation() abajo = range(root_rect.height - rect.height, root_rect.height) x, y = self.get_toplevel().get_pointer() rect = self.listaiconview.get_allocation() derecha = range(root_rect.width - rect.width, root_rect.width) if y in arriba or y in abajo or x in derecha: if not self.toolbar.get_visible(): self.toolbar.show() if not self.toolbartry.get_visible(): self.toolbartry.show() if not self.listaiconview.get_visible(): self.listaiconview.show() return else: if self.toolbar.get_visible(): self.toolbar.hide() if self.toolbartry.get_visible(): self.toolbartry.hide() if self.listaiconview.get_visible(): self.listaiconview.hide() return def __set_presentacion(self, widget=None, intervalo=False): """ Lanza el modo diapositivas. """ if self.actualizador: GLib.source_remove(self.actualizador) self.actualizador = False if intervalo: self.intervalo = intervalo self.toolbar.set_modo("player") self.toolbar.set_playing() self.actualizador = GLib.timeout_add(self.intervalo, self.__handle_presentacion) def __stop_presentacion(self): if self.actualizador: GLib.source_remove(self.actualizador) self.actualizador = False self.toolbar.set_paused() def __handle_presentacion(self): """ Cuando está en modo Diapositivas. """ self.listaiconview.seleccionar_siguiente() return True def __set_accion(self, widget, accion): self.get_toplevel().set_sensitive(False) if accion == "Configurar Presentación": self.__stop_presentacion() if self.toolbar_config.get_visible(): self.toolbar_config.hide() else: self.toolbar_config.show() elif accion == "Reproducir": if self.toolbar_config.get_visible(): self.toolbar_config.hide() if self.actualizador: self.__stop_presentacion() else: self.__set_presentacion() elif accion == "Anterior": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.__stop_presentacion() self.listaiconview.seleccionar_anterior() elif accion == "Siguiente": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.__stop_presentacion() self.listaiconview.seleccionar_siguiente() elif accion == "Detener": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.__stop_presentacion() elif accion == "Rotar Izquierda": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.visor.rotar(-1) elif accion == "Rotar Derecha": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.visor.rotar(1) elif accion == "Acercar": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.visor.zoom(1) elif accion == "Alejar": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.visor.zoom(-1) elif accion == "Centrar en Pantalla": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.visor.center_image() elif accion == "Navegar Imágenes": if self.toolbar_config.get_visible(): self.toolbar_config.hide() self.__stop_presentacion() if self.toolbar.modo != "edit": self.toolbar.set_modo("edit") elif self.toolbar.modo == "edit": self.toolbar.set_modo("player") elif accion == "Guardar": self.visor.guardar() self.get_toplevel().set_sensitive(True) def __set_change_image(self, widget, valor): """ Cuando el usuario rota la imagen, puede guardarla. """ if valor: self.toolbar.set_modo("changed") else: self.toolbar.set_modo("nochanged") def __emit_switch(self, widget, path): self.__stop_presentacion() self.emit("switch_to", path) def __salir(self, widget): self.__stop_presentacion() self.emit("salir") def run(self): self.listaiconview.load_previews(self.path) def __show_imagen(self, widget, imagen): self.visor.load(imagen) ''' while Gtk.events_pending(): Gtk.main_iteration() ''' self.queue_draw() def __set_info(self, widget, info): self.toolbartry.set_info(info)