Ejemplo n.º 1
0
    def __init__(self, nombre_biblioteca):
        Gtk.Window.__init__(self, title="Modificar biblioteca "+nombre_biblioteca)
        self.nombre_biblioteca = nombre_biblioteca
        self.musica = []
        self.lbl_reproductor_info = Gtk.Label()
        self.mi_reproductor = Reproductor(self.lbl_reproductor_info)
        self.load_biblioteca()
        self.set_border_width(20)
        self.grid = Gtk.Grid()
        self.grid.set_column_homogeneous(True)
        self.grid.set_row_homogeneous(True)
        self.add(self.grid)

        self.canciones_lista = Gtk.ListStore(str)
        self.rellenar_listado()

        self.treeview = Gtk.TreeView(model=self.canciones_lista)
        renderer = Gtk.CellRendererText()
        column = Gtk.TreeViewColumn("Cancion", renderer, text=0)
        column.set_sort_column_id(0)
        self.treeview.append_column(column)

        self.buttons = list()
        for prog_language in ["Reproducir", "Detener", "Eliminar", "Agregar", "Guardar", "Cancelar"]:
            button = Gtk.Button(prog_language)
            self.buttons.append(button)
            button.connect("clicked", self.on_selection_button_clicked)

        self.scrollable_treelist = Gtk.ScrolledWindow()
        self.scrollable_treelist.set_vexpand(True)
        self.grid.attach(self.scrollable_treelist, 0, 0, 6, 8)
        self.grid.attach_next_to(self.buttons[0], self.scrollable_treelist, Gtk.PositionType.BOTTOM, 1, 1)
        for i, button in enumerate(self.buttons[1:]):
            self.grid.attach_next_to(button, self.buttons[i], Gtk.PositionType.RIGHT, 1, 1)

        self.scrollable_treelist.add(self.treeview)
        self.show_all()
Ejemplo n.º 2
0
    def __init__(self):
	
        Gtk.Table.__init__(self, 10, 30, False)

	# para los archivos mp3 - wav - ogg
	self.treeview = Gtk.TreeView()
	self.liststore = Gtk.ListStore(str)
	self.treeselection = self.treeview.get_selection()
	self.treeselection.set_mode(Gtk.SelectionMode.SINGLE)

	self.directorio_de_reproduccion = None # el directorio desde donde se cargaron los archivos
	self.indice_archivo_en_reproduccion = 0 # para mantener una lista de reproduccion con los archivos

	# La base de datos con las radios
	self.BasedeDatos = ManejodeBasedeDatos(mi_base)
	self.listaderadios = []

	# Reproductor helix
        self.reproductor = Reproductor(self)
	self.is_radio = False
        self.fuentededatosparareproducir = None

	self.directoriodeiconos = os.getcwd() + "/Iconos/"
	self.rosado = Gdk.Color(65000,13000,25000)
	self.celeste1 = Gdk.Color(0,33000,33000)

	# ******************** Interface Grafica *****************************
	# Zona Central.
	# Definicion de radios online
	viewportderadios = Gtk.ScrolledWindow()
	viewportderadios.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
	self.caja_radios = Gtk.VBox()

	self.cargar_radios()

	viewportderadios.add_with_viewport(self.caja_radios)
	self.attach(viewportderadios, 0, 8, 0, 29)

	# Barra vertical derecha para la lista de reproduccion
        self.viewportderecho = Gtk.ScrolledWindow()
        self.viewportderecho.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
        self.attach(self.viewportderecho, 8, 10, 0, 29)
	# Informacion adicional de la actividad
	self.viewportderecho.add_with_viewport(self.crear_barra_info())

	# Barra con controles de reproduccion
	# Zona inferior
        self.barradereproduccion = BarradeReproduccion()
	self.reproductor.asignacion_de_barra_de_reproduccion(self.barradereproduccion)
        self.attach(self.barradereproduccion, 0, 10, 29, 30)
        self.show_all()

	# Conexion de eventos de los controles de la barra de reproduccion con las
	# funciones de reproduccion del reproductor

        # Abre un selector de archivos
        self.barradereproduccion.botonabrir.connect("clicked", self.abrirdirectoriomp3)
	self.barradereproduccion.botonstop.connect("clicked", self.reproductor.stop)
	self.barradereproduccion.botonplay.connect("clicked", self.reproductor.pause)# moficar para un click en la lista
	self.barradereproduccion.botonatras.connect("clicked", self.tema_anterior)
	self.barradereproduccion.botonsiguiente.connect("clicked", self.siguiente_tema)
Ejemplo n.º 3
0
class VistaReproductor(Gtk.Table):

    def __init__(self):
	
        Gtk.Table.__init__(self, 10, 30, False)

	# para los archivos mp3 - wav - ogg
	self.treeview = Gtk.TreeView()
	self.liststore = Gtk.ListStore(str)
	self.treeselection = self.treeview.get_selection()
	self.treeselection.set_mode(Gtk.SelectionMode.SINGLE)

	self.directorio_de_reproduccion = None # el directorio desde donde se cargaron los archivos
	self.indice_archivo_en_reproduccion = 0 # para mantener una lista de reproduccion con los archivos

	# La base de datos con las radios
	self.BasedeDatos = ManejodeBasedeDatos(mi_base)
	self.listaderadios = []

	# Reproductor helix
        self.reproductor = Reproductor(self)
	self.is_radio = False
        self.fuentededatosparareproducir = None

	self.directoriodeiconos = os.getcwd() + "/Iconos/"
	self.rosado = Gdk.Color(65000,13000,25000)
	self.celeste1 = Gdk.Color(0,33000,33000)

	# ******************** Interface Grafica *****************************
	# Zona Central.
	# Definicion de radios online
	viewportderadios = Gtk.ScrolledWindow()
	viewportderadios.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
	self.caja_radios = Gtk.VBox()

	self.cargar_radios()

	viewportderadios.add_with_viewport(self.caja_radios)
	self.attach(viewportderadios, 0, 8, 0, 29)

	# Barra vertical derecha para la lista de reproduccion
        self.viewportderecho = Gtk.ScrolledWindow()
        self.viewportderecho.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
        self.attach(self.viewportderecho, 8, 10, 0, 29)
	# Informacion adicional de la actividad
	self.viewportderecho.add_with_viewport(self.crear_barra_info())

	# Barra con controles de reproduccion
	# Zona inferior
        self.barradereproduccion = BarradeReproduccion()
	self.reproductor.asignacion_de_barra_de_reproduccion(self.barradereproduccion)
        self.attach(self.barradereproduccion, 0, 10, 29, 30)
        self.show_all()

	# Conexion de eventos de los controles de la barra de reproduccion con las
	# funciones de reproduccion del reproductor

        # Abre un selector de archivos
        self.barradereproduccion.botonabrir.connect("clicked", self.abrirdirectoriomp3)
	self.barradereproduccion.botonstop.connect("clicked", self.reproductor.stop)
	self.barradereproduccion.botonplay.connect("clicked", self.reproductor.pause)# moficar para un click en la lista
	self.barradereproduccion.botonatras.connect("clicked", self.tema_anterior)
	self.barradereproduccion.botonsiguiente.connect("clicked", self.siguiente_tema)






# ***************************************************************************
# ************************** FUNCIONES **************************************

    def cargar_radios(self):
	# se llama al iniciar la actividad y al agregar o eliminar una radio

        for child in self.caja_radios:
            self.caja_radios.remove(child)

	radios = self.BasedeDatos.CargarRadios() # Devuelve una lista de tuplas
	self.listaderadios = []

	for radio in radios:
		self.listaderadios.append(Radio(radio, self.directoriodeiconos))

	for radio in self.listaderadios:
		radio.connect("button_press_event", self.handler_click_Radio)
		self.caja_radios.pack_start(radio, True, True, 5)

    def handler_click_Radio(self, widget, event):
	# reacciona a los clicks sobre las radios
	boton = event.button
	pos = (event.x, event.y)
	tiempo = event.time

	if boton == 1:
		self.cargar_fuente_de_datos (widget, widget.direccionderadio, True)
		self.pintar_radios_no_seleccionadas(widget)
		print "Reproducir radio"
		return
	elif boton == 3:
		print "Abrir menu - popup"
		self.crear_menu_emergente_para_radios(widget, boton, pos, tiempo)
		return

    def crear_menu_emergente_para_radios(self, widget, boton, pos, tiempo):
	# un menu para agregar o eliminar radios de la base de datos
	menu = Gtk.Menu()

	# Items del menu
	agregar = Gtk.MenuItem("Agregar nueva Radio . . .")
	eliminar = Gtk.MenuItem("Eliminar de la lista")
	eliminar2 = Gtk.MenuItem("Eliminar definitivamente")

	# Agregar los items al menu
	menu.append(agregar)
	menu.append(eliminar)
	menu.append(eliminar2)

        # Se conectan las funciones de retrollamada a la senal "activate"
        agregar.connect_object("activate", self.construir_dialogo_agregar_radio, None)
        eliminar.connect_object("activate", self.destruirwidget, widget, widget)
        eliminar2.connect_object("activate", self.eliminar_radio, widget)

	menu.show_all()
	menu.popup(None, None, self.posicionar_menu, boton, tiempo, None)

    def posicionar_menu(self, widget, pos):
	# Establece la posicion del menu desplegable
	print "Posicionando menu desplegable"

    def construir_dialogo_agregar_radio(self, widget):
	# Crea un cuadro de dialogo para ingresar los datos de una nueva radio

	dialog = Gtk.Dialog("Agregar Radio", None, Gtk.DialogFlags.MODAL, None)

	etiqueta0 = Gtk.Label("No utilices tildes ni ñ en los datos.")
	dialog.vbox.pack_start(etiqueta0, True, True, 5)

	renglo1 = Gtk.HBox()
	etiqueta1 = Gtk.Label("Nombre de la Radio: ")
	texto1 = Gtk.Entry()
	renglo1.pack_start(etiqueta1, True, True, 5)
	renglo1.pack_start(texto1, True, True, 5)
	dialog.vbox.pack_start(renglo1, True, True, 5)

	renglo2 = Gtk.HBox()
	etiqueta2 = Gtk.Label("Direccion de Reproduccion: ")
	texto2 = Gtk.Entry()
	renglo2.pack_start(etiqueta2, True, True, 5)
	renglo2.pack_start(texto2, True, True, 5)
	dialog.vbox.pack_start(renglo2, True, True, 5)

	renglo3 = Gtk.HBox()
	etiqueta3 = Gtk.Label("Descripcion: ")
	texto3 = Gtk.Entry()
	renglo3.pack_start(etiqueta3, True, True, 5)
	renglo3.pack_start(texto3, True, True, 5)
	dialog.vbox.pack_start(renglo3, True, True, 5)

	renglo4 = Gtk.HBox()
	etiqueta4 = Gtk.Label("Pais de procedencia: ")
	texto4 = Gtk.Entry()
	renglo4.pack_start(etiqueta4, True, True, 5)
	renglo4.pack_start(texto4, True, True, 5)
	dialog.vbox.pack_start(renglo4, True, True, 5)

	dialog.add_button("Guardar", 1)
	dialog.add_button("Cancelar", 2)

	dialog.show_all()

        if dialog.run() == 1:
		# verificar y guardar

		if texto2.get_text() != "":
			radio = self.listaderadios[-1]
			id_de_radio = radio.id_en_base
			indice = int (id_de_radio + 1)

			nombre = texto1.get_text()

			dir_rep = texto2.get_text()

			detalles = texto3.get_text()

			pais = texto4.get_text()

			self.BasedeDatos.agregar_radio(indice, nombre, dir_rep, detalles, pais)
			self.cargar_radios()
		
	elif dialog.run() == 2:
		# sale automaticamente
		pass
        dialog.destroy()

    def eliminar_radio (self, widget):
	indice = widget.id_en_base
	self.BasedeDatos.eliminar_radio(indice)
	self.cargar_radios()

    def crear_barra_info(self):
	# Informacion
	self.barra_ceibal_radio_info = Gtk.VBox()
	imagen1 = Gtk.Image()
	imagen1.set_from_file(self.directoriodeiconos + "Flavio.png")

	etiquetadeinformacion1 = Gtk.Label("Ceibal Radio" + "\n" + "*****@*****.**" + "\n" + "http://sites.google.com/" + "\n" + "site/sugaractivities/home")
	etiquetadeinformacion1.modify_font(Pango.FontDescription("purisa 4"))
	etiquetadeinformacion1.set_justify(Gtk.Justification.CENTER)

	etiquetadeinformacion2 = Gtk.Label("http://drupal.ceibaljam.org/"  + "\n" + "*****@*****.**")
	etiquetadeinformacion2.modify_font(Pango.FontDescription("purisa 4"))
	etiquetadeinformacion2.set_justify(Gtk.Justification.CENTER)

	imagen2 = Gtk.Image()
	imagen2.set_from_file(self.directoriodeiconos + "ceibaljam.png")

	self.barra_ceibal_radio_info.pack_start(imagen2, True, True, 5)
	self.barra_ceibal_radio_info.pack_start(etiquetadeinformacion2, True, True, 5)
	self.barra_ceibal_radio_info.pack_start(imagen1, True, True, 5)
	self.barra_ceibal_radio_info.pack_start(etiquetadeinformacion1, True, True, 5)

	self.barra_ceibal_radio_info.show_all()
	return self.barra_ceibal_radio_info

    def pintar_radios_no_seleccionadas (self, widget):
	# Cambia los colores de los controles al hacerles click
	for radio in self.listaderadios:
		radio.pintame(self.celeste1)
	widget.pintame(self.rosado)


    def abrirdirectoriomp3(self,widget):
	# Abre un Filechooser para cargar un directorio con archivos mp3 - wav - ogg
	selectordedirectorio = Gtk.FileChooserDialog("Abrir directorio MP3", None, Gtk.FileChooserAction.OPEN, None)
	selectordedirectorio.set_current_folder_uri("file:///media")
	selectordedirectorio.set_select_multiple(True)

	# extras
	frame = Gtk.Frame()
	hbox = Gtk.HBox()
	frame.add(hbox)
	botonabrirdirectorio = Gtk.Button("Abrir")
	botonseleccionartodo = Gtk.Button("Seleccionar Todos")
	botonsalir = Gtk.Button("Salir")
	hbox.pack_end(botonsalir, False, False, 5)
	hbox.pack_end(botonseleccionartodo, False, False, 5)
	hbox.pack_end(botonabrirdirectorio, False, False, 5)
	selectordedirectorio.set_extra_widget(frame)

	botonsalir.connect("clicked",self.destruirwidget,selectordedirectorio)
	botonabrirdirectorio.connect("clicked",self.abrirdirectorio,selectordedirectorio)
	botonseleccionartodo.connect("clicked",self.seleccionartodo,selectordedirectorio)

	# filtro Musica
	filter = Gtk.FileFilter()
	filter.set_name("Musica")
	filter.add_mime_type("sound/mp3")
	filter.add_mime_type("sound/ogg")
	filter.add_mime_type("sound/wav")
	filter.add_pattern("*.mp3")
	filter.add_pattern("*.ogg")
	filter.add_pattern("*.wav")
	selectordedirectorio.add_filter(filter)
	selectordedirectorio.add_shortcut_folder_uri("file:///media/")

	selectordedirectorio.show_all()

    def seleccionartodo(self,widget,selectordedirectorio):
	selectordedirectorio.select_all()

    def abrirdirectorio(self,widget,selectordedirectorio):
	# Carga los mp3 del directorio seleccionado
        listadereproduccion = selectordedirectorio.get_filenames()
        self.cargardirectorio(listadereproduccion)
        self.destruirwidget(None, selectordedirectorio)

#****************
#****************

    def cargardirectorio(self, listadereproduccion):

	self.liststore = Gtk.ListStore(str)
        for archivo in listadereproduccion:
	    if os.path.isfile(archivo):
		nombre_de_archivo = os.path.basename(archivo)
		self.liststore.append([nombre_de_archivo])

	if len(self.liststore) > 0:
		for child in self.viewportderecho:
			self.viewportderecho.remove(child)

		# el directorio de reproduccion
		self.directorio_de_reproduccion = os.path.dirname(listadereproduccion[0])

		self.treeview = Gtk.TreeView()
		self.treeview.connect("row-activated", self.open_file)
		self.treeview.set_model(self.liststore)
		self.treeview.append_column(Gtk.TreeViewColumn('Mi música', Gtk.CellRendererText(), text=0))
		self.viewportderecho.add_with_viewport(self.treeview)

		self.viewportderecho.show_all()
		self.treeview.show_all()

		self.indice_archivo_en_reproduccion = 0
		self.open_file(self.treeview, self.indice_archivo_en_reproduccion, 0)
		self.treeselection = self.treeview.get_selection()
		self.treeselection.set_mode(Gtk.SelectionMode.SINGLE)
		self.treeselection.select_path(self.indice_archivo_en_reproduccion)

    def siguiente_tema(self, widget):
	if int(self.indice_archivo_en_reproduccion) + 1 < len(self.liststore) and self.is_radio == False:
		self.indice_archivo_en_reproduccion += 1
		self.open_file(self.treeview, self.indice_archivo_en_reproduccion, 0)
		self.treeselection = self.treeview.get_selection()
		self.treeselection.set_mode(Gtk.SelectionMode.SINGLE)
		self.treeselection.select_path(self.indice_archivo_en_reproduccion)

    def tema_anterior(self, widget):
	if int(self.indice_archivo_en_reproduccion) - 1 > -1 and self.is_radio == False:
		self.indice_archivo_en_reproduccion -= 1
		self.open_file(self.treeview, self.indice_archivo_en_reproduccion, 0)
		self.treeselection = self.treeview.get_selection()
		self.treeselection.set_mode(Gtk.SelectionMode.SINGLE)
		self.treeselection.select_path(self.indice_archivo_en_reproduccion)
	
    def open_file(self, treeview, path, column):
	# def callback(treeview, iter, path, user_data)
	# metodo de la interfase treeview

        model = treeview.get_model()
        iterador = model.get_iter(path)
        archivo = self.directorio_de_reproduccion + "/" + model.get_value(iterador, 0)
	self.cargar_fuente_de_datos(None, archivo, False)
	
	# El path es de tipo (1,) hay que sacar la coma y los parentesis para usarlo como indice entero
	indice1 = str(path)
	indice = ""
	for x in indice1:
		if x != "," and x != "(" and x != ")":
			indice += x
	#self.indice_archivo_en_reproduccion = path
	self.indice_archivo_en_reproduccion = int(indice)
	print "self.indice_archivo_en_reproduccion: ", self.indice_archivo_en_reproduccion

    def cargar_fuente_de_datos(self, widget, archivo, is_radio):
	# Se carga la fuente de datos que se va a reproducir
	self.is_radio = is_radio
	if is_radio == False:
		self.fuentededatosparareproducir = "file://" + archivo
	else:
		self.fuentededatosparareproducir = archivo
        
	self.reproductor.abrirfuentededatos(None, self.fuentededatosparareproducir, is_radio)

    def destruirwidget(self,widgetquedalasenal,widgetquesedestruira):
	# Elimina un widget (filechooser y radio eliminada por el menu contextual)
        widgetquesedestruira.destroy()
        return False
    def __init__(self):

        gtk.Table.__init__(self, 10, 30, False)

        # para los archivos mp3 - wav - ogg
        self.treeview = gtk.TreeView()
        self.liststore = gtk.ListStore(str)
        self.treeselection = self.treeview.get_selection()
        self.treeselection.set_mode(gtk.SELECTION_SINGLE)

        self.directorio_de_reproduccion = None  # el directorio desde donde se cargaron los archivos
        self.indice_archivo_en_reproduccion = 0  # para mantener una lista de reproduccion con los archivos

        # La base de datos con las radios
        self.BasedeDatos = ManejodeBasedeDatos(mi_base)
        self.listaderadios = []

        # Reproductor helix
        self.reproductor = Reproductor(self)
        self.is_radio = False
        self.fuentededatosparareproducir = None

        self.directoriodeiconos = os.getcwd() + "/Iconos/"
        self.rosado = gtk.gdk.Color(65000, 13000, 25000, 1)
        self.celeste1 = gtk.gdk.Color(0, 33000, 33000, 1)

        # ******************** Interface Grafica *****************************
        # Zona Central.
        # Definicion de radios online
        viewportderadios = gtk.ScrolledWindow()
        viewportderadios.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        self.caja_radios = gtk.VBox()

        self.cargar_radios()

        viewportderadios.add_with_viewport(self.caja_radios)
        self.attach(viewportderadios, 0, 8, 0, 29)

        # Barra vertical derecha para la lista de reproduccion
        self.viewportderecho = gtk.ScrolledWindow()
        self.viewportderecho.set_policy(gtk.POLICY_AUTOMATIC,
                                        gtk.POLICY_AUTOMATIC)
        self.attach(self.viewportderecho, 8, 10, 0, 29)
        # Informacion adicional de la actividad
        self.viewportderecho.add_with_viewport(self.crear_barra_info())

        # Barra con controles de reproduccion
        # Zona inferior
        self.barradereproduccion = BarradeReproduccion()
        self.reproductor.asignacion_de_barra_de_reproduccion(
            self.barradereproduccion)
        self.attach(self.barradereproduccion, 0, 10, 29, 30)
        self.show_all()

        # Conexion de eventos de los controles de la barra de reproduccion con las
        # funciones de reproduccion del reproductor

        # Abre un selector de archivos
        self.barradereproduccion.botonabrir.connect("clicked",
                                                    self.abrirdirectoriomp3)
        self.barradereproduccion.botonstop.connect("clicked",
                                                   self.reproductor.stop)
        self.barradereproduccion.botonplay.connect(
            "clicked",
            self.reproductor.pause)  # moficar para un click en la lista
        self.barradereproduccion.botonatras.connect("clicked",
                                                    self.tema_anterior)
        self.barradereproduccion.botonsiguiente.connect(
            "clicked", self.siguiente_tema)
class VistaReproductor(gtk.Table):
    def __init__(self):

        gtk.Table.__init__(self, 10, 30, False)

        # para los archivos mp3 - wav - ogg
        self.treeview = gtk.TreeView()
        self.liststore = gtk.ListStore(str)
        self.treeselection = self.treeview.get_selection()
        self.treeselection.set_mode(gtk.SELECTION_SINGLE)

        self.directorio_de_reproduccion = None  # el directorio desde donde se cargaron los archivos
        self.indice_archivo_en_reproduccion = 0  # para mantener una lista de reproduccion con los archivos

        # La base de datos con las radios
        self.BasedeDatos = ManejodeBasedeDatos(mi_base)
        self.listaderadios = []

        # Reproductor helix
        self.reproductor = Reproductor(self)
        self.is_radio = False
        self.fuentededatosparareproducir = None

        self.directoriodeiconos = os.getcwd() + "/Iconos/"
        self.rosado = gtk.gdk.Color(65000, 13000, 25000, 1)
        self.celeste1 = gtk.gdk.Color(0, 33000, 33000, 1)

        # ******************** Interface Grafica *****************************
        # Zona Central.
        # Definicion de radios online
        viewportderadios = gtk.ScrolledWindow()
        viewportderadios.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        self.caja_radios = gtk.VBox()

        self.cargar_radios()

        viewportderadios.add_with_viewport(self.caja_radios)
        self.attach(viewportderadios, 0, 8, 0, 29)

        # Barra vertical derecha para la lista de reproduccion
        self.viewportderecho = gtk.ScrolledWindow()
        self.viewportderecho.set_policy(gtk.POLICY_AUTOMATIC,
                                        gtk.POLICY_AUTOMATIC)
        self.attach(self.viewportderecho, 8, 10, 0, 29)
        # Informacion adicional de la actividad
        self.viewportderecho.add_with_viewport(self.crear_barra_info())

        # Barra con controles de reproduccion
        # Zona inferior
        self.barradereproduccion = BarradeReproduccion()
        self.reproductor.asignacion_de_barra_de_reproduccion(
            self.barradereproduccion)
        self.attach(self.barradereproduccion, 0, 10, 29, 30)
        self.show_all()

        # Conexion de eventos de los controles de la barra de reproduccion con las
        # funciones de reproduccion del reproductor

        # Abre un selector de archivos
        self.barradereproduccion.botonabrir.connect("clicked",
                                                    self.abrirdirectoriomp3)
        self.barradereproduccion.botonstop.connect("clicked",
                                                   self.reproductor.stop)
        self.barradereproduccion.botonplay.connect(
            "clicked",
            self.reproductor.pause)  # moficar para un click en la lista
        self.barradereproduccion.botonatras.connect("clicked",
                                                    self.tema_anterior)
        self.barradereproduccion.botonsiguiente.connect(
            "clicked", self.siguiente_tema)

# ***************************************************************************
# ************************** FUNCIONES **************************************

    def cargar_radios(self):
        # se llama al iniciar la actividad y al agregar o eliminar una radio

        for child in self.caja_radios:
            self.caja_radios.remove(child)

        radios = self.BasedeDatos.CargarRadios(
        )  # Devuelve una lista de tuplas
        self.listaderadios = []

        for radio in radios:
            self.listaderadios.append(Radio(radio, self.directoriodeiconos))

        for radio in self.listaderadios:
            radio.connect("button_press_event", self.handler_click_Radio)
            self.caja_radios.pack_start(radio, True, True, 5)

    def handler_click_Radio(self, widget, event):
        # reacciona a los clicks sobre las radios
        boton = event.button
        pos = (event.x, event.y)
        tiempo = event.time

        if boton == 1:
            self.cargar_fuente_de_datos(widget, widget.direccionderadio, True)
            self.pintar_radios_no_seleccionadas(widget)
            print "Reproducir radio"
            return
        elif boton == 3:
            print "Abrir menu - popup"
            self.crear_menu_emergente_para_radios(widget, boton, pos, tiempo)
            return

    def crear_menu_emergente_para_radios(self, widget, boton, pos, tiempo):
        # un menu para agregar o eliminar radios de la base de datos
        menu = gtk.Menu()

        # Items del menu
        agregar = gtk.MenuItem("Agregar nueva Radio . . .")
        eliminar = gtk.MenuItem("Eliminar de la lista")
        eliminar2 = gtk.MenuItem("Eliminar definitivamente")

        # Agregar los items al menu
        menu.append(agregar)
        menu.append(eliminar)
        menu.append(eliminar2)

        # Se conectan las funciones de retrollamada a la senal "activate"
        agregar.connect_object("activate",
                               self.construir_dialogo_agregar_radio, None)
        eliminar.connect_object("activate", self.destruirwidget, widget,
                                widget)
        eliminar2.connect_object("activate", self.eliminar_radio, widget)

        menu.show_all()
        menu.popup(None, None, self.posicionar_menu, boton, tiempo, None)

    def posicionar_menu(self, widget, pos):
        # Establece la posicion del menu desplegable
        print "Posicionando menu desplegable"

    def construir_dialogo_agregar_radio(self, widget):
        # Crea un cuadro de dialogo para ingresar los datos de una nueva radio

        dialog = gtk.Dialog("Agregar Radio", None, gtk.DIALOG_MODAL, None)

        etiqueta0 = gtk.Label("No utilices tildes ni ñ en los datos.")
        dialog.vbox.pack_start(etiqueta0, True, True, 5)

        renglo1 = gtk.HBox()
        etiqueta1 = gtk.Label("Nombre de la Radio: ")
        texto1 = gtk.Entry()
        renglo1.pack_start(etiqueta1, True, True, 5)
        renglo1.pack_start(texto1, True, True, 5)
        dialog.vbox.pack_start(renglo1, True, True, 5)

        renglo2 = gtk.HBox()
        etiqueta2 = gtk.Label("Direccion de Reproduccion: ")
        texto2 = gtk.Entry()
        renglo2.pack_start(etiqueta2, True, True, 5)
        renglo2.pack_start(texto2, True, True, 5)
        dialog.vbox.pack_start(renglo2, True, True, 5)

        renglo3 = gtk.HBox()
        etiqueta3 = gtk.Label("Descripcion: ")
        texto3 = gtk.Entry()
        renglo3.pack_start(etiqueta3, True, True, 5)
        renglo3.pack_start(texto3, True, True, 5)
        dialog.vbox.pack_start(renglo3, True, True, 5)

        renglo4 = gtk.HBox()
        etiqueta4 = gtk.Label("Pais de procedencia: ")
        texto4 = gtk.Entry()
        renglo4.pack_start(etiqueta4, True, True, 5)
        renglo4.pack_start(texto4, True, True, 5)
        dialog.vbox.pack_start(renglo4, True, True, 5)

        dialog.add_button("Guardar", 1)
        dialog.add_button("Cancelar", 2)

        dialog.show_all()

        if dialog.run() == 1:
            # verificar y guardar

            if texto2.get_text() != "":
                radio = self.listaderadios[-1]
                id_de_radio = radio.id_en_base
                indice = int(id_de_radio + 1)

                nombre = texto1.get_text()

                dir_rep = texto2.get_text()

                detalles = texto3.get_text()

                pais = texto4.get_text()

                self.BasedeDatos.agregar_radio(indice, nombre, dir_rep,
                                               detalles, pais)
                self.cargar_radios()

        elif dialog.run() == 2:
            # sale automaticamente
            pass
        dialog.destroy()

    def eliminar_radio(self, widget):
        indice = widget.id_en_base
        self.BasedeDatos.eliminar_radio(indice)
        self.cargar_radios()

    def crear_barra_info(self):
        # Informacion
        self.barra_ceibal_radio_info = gtk.VBox()
        imagen1 = gtk.Image()
        imagen1.set_from_file(self.directoriodeiconos + "Flavio.png")

        etiquetadeinformacion1 = gtk.Label("Ceibal Radio" + "\n" +
                                           "*****@*****.**" + "\n" +
                                           "http://sites.google.com/" + "\n" +
                                           "site/sugaractivities/home")
        etiquetadeinformacion1.modify_font(pango.FontDescription("purisa 4"))
        etiquetadeinformacion1.set_justify(gtk.JUSTIFY_CENTER)

        etiquetadeinformacion2 = gtk.Label("http://drupal.ceibaljam.org/" +
                                           "\n" + "*****@*****.**")
        etiquetadeinformacion2.modify_font(pango.FontDescription("purisa 4"))
        etiquetadeinformacion2.set_justify(gtk.JUSTIFY_CENTER)

        imagen2 = gtk.Image()
        imagen2.set_from_file(self.directoriodeiconos + "ceibaljam.png")

        self.barra_ceibal_radio_info.pack_start(imagen2, True, True, 5)
        self.barra_ceibal_radio_info.pack_start(etiquetadeinformacion2, True,
                                                True, 5)
        self.barra_ceibal_radio_info.pack_start(imagen1, True, True, 5)
        self.barra_ceibal_radio_info.pack_start(etiquetadeinformacion1, True,
                                                True, 5)

        self.barra_ceibal_radio_info.show_all()
        return self.barra_ceibal_radio_info

    def pintar_radios_no_seleccionadas(self, widget):
        # Cambia los colores de los controles al hacerles click
        for radio in self.listaderadios:
            radio.pintame(self.celeste1)
        widget.pintame(self.rosado)

    def abrirdirectoriomp3(self, widget):
        # Abre un Filechooser para cargar un directorio con archivos mp3 - wav - ogg
        selectordedirectorio = gtk.FileChooserDialog(
            "Abrir directorio MP3", None, gtk.FILE_CHOOSER_ACTION_OPEN, None)
        selectordedirectorio.set_current_folder_uri("file:///media")
        selectordedirectorio.set_select_multiple(True)

        # extras
        frame = gtk.Frame()
        hbox = gtk.HBox()
        frame.add(hbox)
        botonabrirdirectorio = gtk.Button("Abrir")
        botonseleccionartodo = gtk.Button("Seleccionar Todos")
        botonsalir = gtk.Button("Salir")
        hbox.pack_end(botonsalir, False, False, 5)
        hbox.pack_end(botonseleccionartodo, False, False, 5)
        hbox.pack_end(botonabrirdirectorio, False, False, 5)
        selectordedirectorio.set_extra_widget(frame)

        botonsalir.connect("clicked", self.destruirwidget,
                           selectordedirectorio)
        botonabrirdirectorio.connect("clicked", self.abrirdirectorio,
                                     selectordedirectorio)
        botonseleccionartodo.connect("clicked", self.seleccionartodo,
                                     selectordedirectorio)

        # filtro Musica
        filter = gtk.FileFilter()
        filter.set_name("Musica")
        filter.add_mime_type("sound/mp3")
        filter.add_mime_type("sound/ogg")
        filter.add_mime_type("sound/wav")
        filter.add_pattern("*.mp3")
        filter.add_pattern("*.ogg")
        filter.add_pattern("*.wav")
        selectordedirectorio.add_filter(filter)
        selectordedirectorio.add_shortcut_folder_uri("file:///media/")

        selectordedirectorio.show_all()

    def seleccionartodo(self, widget, selectordedirectorio):
        selectordedirectorio.select_all()

    def abrirdirectorio(self, widget, selectordedirectorio):
        # Carga los mp3 del directorio seleccionado
        listadereproduccion = selectordedirectorio.get_filenames()
        self.cargardirectorio(listadereproduccion)
        self.destruirwidget(None, selectordedirectorio)

#****************
#****************

    def cargardirectorio(self, listadereproduccion):

        self.liststore = gtk.ListStore(str)
        for archivo in listadereproduccion:
            if os.path.isfile(archivo):
                nombre_de_archivo = os.path.basename(archivo)
                self.liststore.append([nombre_de_archivo])

        if len(self.liststore) > 0:
            for child in self.viewportderecho:
                self.viewportderecho.remove(child)

            # el directorio de reproduccion
            self.directorio_de_reproduccion = os.path.dirname(
                listadereproduccion[0])

            self.treeview = gtk.TreeView()
            self.treeview.connect("row-activated", self.open_file)
            self.treeview.set_model(self.liststore)
            self.treeview.append_column(
                gtk.TreeViewColumn('Mi música', gtk.CellRendererText(),
                                   text=0))
            self.viewportderecho.add_with_viewport(self.treeview)

            self.viewportderecho.show_all()
            self.treeview.show_all()

            self.indice_archivo_en_reproduccion = 0
            self.open_file(self.treeview, self.indice_archivo_en_reproduccion,
                           0)
            self.treeselection = self.treeview.get_selection()
            self.treeselection.set_mode(gtk.SELECTION_SINGLE)
            self.treeselection.select_path(self.indice_archivo_en_reproduccion)

    def siguiente_tema(self, widget):
        if int(self.indice_archivo_en_reproduccion) + 1 < len(
                self.liststore) and self.is_radio == False:
            self.indice_archivo_en_reproduccion += 1
            self.open_file(self.treeview, self.indice_archivo_en_reproduccion,
                           0)
            self.treeselection = self.treeview.get_selection()
            self.treeselection.set_mode(gtk.SELECTION_SINGLE)
            self.treeselection.select_path(self.indice_archivo_en_reproduccion)

    def tema_anterior(self, widget):
        if int(self.indice_archivo_en_reproduccion
               ) - 1 > -1 and self.is_radio == False:
            self.indice_archivo_en_reproduccion -= 1
            self.open_file(self.treeview, self.indice_archivo_en_reproduccion,
                           0)
            self.treeselection = self.treeview.get_selection()
            self.treeselection.set_mode(gtk.SELECTION_SINGLE)
            self.treeselection.select_path(self.indice_archivo_en_reproduccion)

    def open_file(self, treeview, path, column):
        # def callback(treeview, iter, path, user_data)
        # metodo de la interfase treeview

        model = treeview.get_model()
        iterador = model.get_iter(path)
        archivo = self.directorio_de_reproduccion + "/" + model.get_value(
            iterador, 0)
        self.cargar_fuente_de_datos(None, archivo, False)

        # El path es de tipo (1,) hay que sacar la coma y los parentesis para usarlo como indice entero
        indice1 = str(path)
        indice = ""
        for x in indice1:
            if x != "," and x != "(" and x != ")":
                indice += x
#self.indice_archivo_en_reproduccion = path
        self.indice_archivo_en_reproduccion = int(indice)
        print "self.indice_archivo_en_reproduccion: ", self.indice_archivo_en_reproduccion

    def cargar_fuente_de_datos(self, widget, archivo, is_radio):
        # Se carga la fuente de datos que se va a reproducir
        self.is_radio = is_radio
        if is_radio == False:
            self.fuentededatosparareproducir = "file://" + archivo
        else:
            self.fuentededatosparareproducir = archivo

        self.reproductor.abrirfuentededatos(None,
                                            self.fuentededatosparareproducir,
                                            is_radio)

    def destruirwidget(self, widgetquedalasenal, widgetquesedestruira):
        # Elimina un widget (filechooser y radio eliminada por el menu contextual)
        widgetquesedestruira.destroy()
        return False
Ejemplo n.º 6
0
class MenuModify(Gtk.Window):
    def __init__(self, nombre_biblioteca):
        Gtk.Window.__init__(self, title="Modificar biblioteca "+nombre_biblioteca)
        self.nombre_biblioteca = nombre_biblioteca
        self.musica = []
        self.lbl_reproductor_info = Gtk.Label()
        self.mi_reproductor = Reproductor(self.lbl_reproductor_info)
        self.load_biblioteca()
        self.set_border_width(20)
        self.grid = Gtk.Grid()
        self.grid.set_column_homogeneous(True)
        self.grid.set_row_homogeneous(True)
        self.add(self.grid)

        self.canciones_lista = Gtk.ListStore(str)
        self.rellenar_listado()

        self.treeview = Gtk.TreeView(model=self.canciones_lista)
        renderer = Gtk.CellRendererText()
        column = Gtk.TreeViewColumn("Cancion", renderer, text=0)
        column.set_sort_column_id(0)
        self.treeview.append_column(column)

        self.buttons = list()
        for prog_language in ["Reproducir", "Detener", "Eliminar", "Agregar", "Guardar", "Cancelar"]:
            button = Gtk.Button(prog_language)
            self.buttons.append(button)
            button.connect("clicked", self.on_selection_button_clicked)

        self.scrollable_treelist = Gtk.ScrolledWindow()
        self.scrollable_treelist.set_vexpand(True)
        self.grid.attach(self.scrollable_treelist, 0, 0, 6, 8)
        self.grid.attach_next_to(self.buttons[0], self.scrollable_treelist, Gtk.PositionType.BOTTOM, 1, 1)
        for i, button in enumerate(self.buttons[1:]):
            self.grid.attach_next_to(button, self.buttons[i], Gtk.PositionType.RIGHT, 1, 1)

        self.scrollable_treelist.add(self.treeview)
        self.show_all()

    def rellenar_listado(self):
        for cancion in sorted(self.musica):
            self.canciones_lista.append([cancion])

    def on_selection_button_clicked(self, widget):
        self.mi_biblioteca = []
        self.mi_reproductor.stop()
        self.tipo_boton = widget.get_label()
        if (self.tipo_boton == "Reproducir"):
            model, rows = self.treeview.get_selection().get_selected()
            if (rows != None):   ## Prevent a empty treelist
                self.mi_biblioteca.append(model[rows][0])
                self.mi_reproductor.set_biblioteca(self.mi_biblioteca)
                self.mi_reproductor.manager_biblioteca()
                self.mi_reproductor.play()
        if (self.tipo_boton == "Detener"):
            self.mi_reproductor.stop()

        if (self.tipo_boton == "Eliminar"):
            self.mi_reproductor.stop()
            selection = self.treeview.get_selection()
            model, rows = selection.get_selected_rows()
            if (len(rows) > 0): ## Prevent a empty treelist
                for row in rows:
                   iter = model.get_iter(row)
                   # Remove the ListStore row referenced by iter
                print(model[row][0])
                self.musica.remove(model[row][0])
                model.remove(iter)

        if (self.tipo_boton == "Agregar"):
            biblioteca= FileChooserWindow()
            biblioteca_aux = self.musica+biblioteca.seleccionar_carpeta()
            for i in biblioteca_aux:
                if i not in sorted(self.musica):
                    self.musica.append(i)
                    self.canciones_lista.append([i])

        if (self.tipo_boton == "Guardar"):
            lib_directory = "./bibliotecas/"
            if not os.path.exists(lib_directory):
                os.makedirs(lib_directory)
            if (len(self.musica) > 0):
                if os.path.exists(lib_directory+self.nombre_biblioteca+".lib"):
                    os.remove(lib_directory+self.nombre_biblioteca+".lib")
                fichero = open(lib_directory+self.nombre_biblioteca+".lib", "w")
                fichero.write("nombre:"+self.nombre_biblioteca+"\n")
                fichero.write("items:"+str(len(self.musica))+"\n")
                for i in self.musica:
                    fichero.write("cancion:"+i+"\n")
                fichero.close()
                self.close()
            else:
                self.error_params(self)
        if (self.tipo_boton == "Cancelar"):
            self.close()

    def error_params(self, widget):
        dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO,
            Gtk.ButtonsType.OK, "Error en la modificacion de la biblioteca")
        dialog.format_secondary_text(
            "Asegurate de que la biblioteca tenga al menos un fichero de audio")
        dialog.run()
        print("Aceptar")
        dialog.destroy()


    def language_filter_func(self, model, iter, data):
        return True

    def load_biblioteca(self):
        numero = 1
        lib_directory = "./bibliotecas/"
        fichero = open(lib_directory+self.nombre_biblioteca+".lib")
        for line in fichero:
            if (line.split(":")[0] == 'nombre'):
                self.nombre = (line.split(":")[1])

            elif (line.split(":")[0] == "items"):
                items =(line.split(":")[1])

            elif (line.split(":")[0] == 'cancion'):
                self.musica.append (line.split(":")[1][:-1])
                numero = numero +1