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