#!/usr/bin/env python # -*- coding:UTF-8 -*- import os import Archivos import gi from gi.repository import Gtk from gi.repository import GObject from gi.repository import GdkPixbuf from gi.repository import Gio from gi.repository import Pango COPIAR = None class Area_de_Montajes(Gtk.TreeView): """Parte de la entana en la que se muestran los montajes actualmente introducidos""" __gsinglas__ = {'change-directory': (GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, (GObject.TYPE_STRING,))} def __init__(self, padre): """Inicia la clase""" Gtk.TreeView.__init__(self) self.padre = padre self.montajes = [] self.volume_monitor = Gio.VolumeMonitor.get() self.numero = 0 nombre = Gtk.TreeViewColumn('Montajes') direccion = Gtk.TreeViewColumn('Dirección') self.modelo = Gtk.ListStore(str, str) self.set_model(self.modelo) celda1 = Gtk.CellRendererText() nombre.pack_start(celda1, True) nombre.set_attributes(celda1, text=0) celda2 = Gtk.CellRendererText() direccion.pack_start(celda2, True) direccion.set_attributes(celda2, text=1) self.append_column(nombre) self.append_column(direccion) self.connect('button-press-event', self.click) self.volume_monitor.connect('mount-added', self.agregar_montaje) self.volume_monitor.connect('mount-removed', self.montaje_desconectado) def montaje_desconectado(self, demonio, unidad): iter = self.modelo.get_iter_first() self.borrar_montaje(iter, unidad) def borrar_montaje(self, iter, unidad): """Cuando se desconecta una unidad, se quita de la lista.""" directorio = self.modelo.get_value(iter, 1) if directorio == self.montajes[self.numero]: self.modelo.remove(iter) self.numero = 0 else: iter = self.modelo.iter_next(iter) self.numero += 1 self.borrar_montaje(iter, unidad) def agregar_montaje(self, demonio, unidad, *args): """Agrega una columna por montaje que se encuentre actualmene""" direccion = unidad.get_default_location().get_path() texto = direccion.split('/')[-1] self.modelo.append([texto, direccion]) self.montajes.append(direccion) def click(self, widget, event): """Cuando se hace clic en el Widget clase, reacciona según el botón del mouse que se presionó""" boton = event.button tiempo = event.time try: path, columna, xdefondo, ydefondo = widget.get_path_at_pos(event.x, event.y) if boton == 1: direccion = self.montajes[path.get_indices()[0]] self.abrir(None, direccion) if boton == 3: self.crear_menu_emergente(boton, tiempo, path) return True except TypeError: pass def crear_menu_emergente(self, boton, tiempo, path): """Crea un menú emergente desde la columna actual""" iter = self.modelo.get_iter(path) nombre = self.modelo.get_value(iter, 0) direccion = self.modelo.get_value(iter, 1) item = Gtk.MenuItem('Montaje %s' % nombre) menu = Gtk.Menu() item.set_submenu(menu) abrir = Gtk.MenuItem('Abrir') copiar = Gtk.MenuItem('Copiar') propiedades = Gtk.MenuItem('Proiedades') abrir.connect('activate', self.abrir, direccion) copiar.connect('activate', self.copiar, direccion) propiedades.connect('activate', self.propiedades, direccion) menu.append(abrir) menu.append(copiar) menu.append(propiedades) menu.show_all() menu.popup(None, None, None, None, boton, tiempo) def abrir(self, widget, direccion): """Abre la dirección del montaje seleccionado""" self.emit('change-directory', direccion) def copiar(self, widget, direccion): COPIAR = direccion def propiedades(self, widget, direccion): dialogo = Archivos.Propiedades(direccion) dialogo.show_all() class Area(Gtk.IconView): """Area de navegación""" __gsignals__ = { 'cambio-de-direccion': (GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, (GObject.TYPE_STRING,)), 'cambio-de-mensaje': (GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, (GObject.TYPE_STRING,))} def __init__(self, padre): """Inicia la clase""" Gtk.IconView.__init__(self) self.padre = padre self.modelo = Gtk.ListStore(str, GdkPixbuf.Pixbuf) self.set_selection_mode(Gtk.SelectionMode(1)) self.set_model(self.modelo) self.set_text_column(0) self.set_pixbuf_column(1) self.lista_carpetas = [] self.lista_archivos = [] self.connect('button-press-event', self.click) self.connect('selection-changed', self.changed) def changed(self, widget): if self.get_selected_items(): direccion = self.padre.direccion path = self.get_selected_items()[0] iter = self.modelo.get_iter(path) direccion = os.path.join(direccion, self.modelo.get_value(iter, 0)) lectura, escritura, ejecucion = Archivos.get_permisos(direccion) if os.path.isfile(direccion): tamanio = Archivos.get_tamanio(direccion) string = ' - ' + tamanio elif os.path.isdir(direccion) or os.path.ismount(direccion): archivos = Archivos.get_tamanio(direccion) string = ' - ' + archivos mensaje = 'se ha seleccionada: ' + direccion + string self.emit('cambio-de-mensaje', mensaje) else: self.padre.b_estado.set_text('') def agregar(self, nombre, direccion): """Agrega el icono de una carpeta o un archivo""" if not list(direccion)[-1] == '/': direccion += '/' dir = direccion + nombre if ' ' in dir: dir.replace(' ', '\ ') pixbuf = Archivos.get_pixbuf(dir) self.modelo.append([nombre, pixbuf]) def borrar_area(self): """Borra todos los objetos en el modelo""" self.modelo.clear() def click(self, widget, event): """Reacciona cuando se le hace clic, obteniendo con que botón se le hizo clic y que debe hacer después""" boton = event.button posx = event.x posy = event.y tiempo = event.time try: path = widget.get_path_at_pos(int(posx), int(posy)) direccion = self.padre.direccion if list(direccion)[-1] != '/': direccion += '/' iter = self.modelo.get_iter(path) direccion += self.modelo.get_value(iter, 0) if boton == 3: self.crear_menu_emergente(boton, tiempo, path) return True if event.type.value_name == "GDK_2BUTTON_PRESS" and boton == 1: self.emit('cambio-de-direccion', direccion) except TypeError: # Solo sucede cuando se le hace clic fuera de un iter, # por eso lo dejo pasar pass def crear_menu_emergente(self, boton, tiempo, path): """Crea un menú emergente desde la iter actual""" iter = self.modelo.get_iter(path) nombre = self.modelo.get_value(iter, 0) direccion = self.padre.direccion if direccion[-1] != '/': direccion += '/' direccion += nombre item = Gtk.MenuItem('') menu = Gtk.Menu() item.set_submenu(menu) abrir = Gtk.MenuItem('Abrir') cortar = Gtk.MenuItem('Cor_tar') copiar = Gtk.MenuItem('_Copiar') pegar = Gtk.MenuItem('Pegar') propiedades = Gtk.MenuItem('Proiedades') abrir.connect('activate', self.abrir, direccion) copiar.connect('activate', self.copiar, direccion) propiedades.connect('activate', self.propiedades, direccion) menu.append(abrir) menu.append(Gtk.SeparatorMenuItem()) menu.append(cortar) menu.append(copiar) menu.append(pegar) menu.append(Gtk.SeparatorMenuItem()) menu.append(propiedades) menu.show_all() menu.popup(None, None, None, None, boton, tiempo) def abrir(self, widget, direccion): """Abre la dirección del montaje seleccionado""" self.emit('change-directory', direccion) def copiar(self, widget, direccion): COPIAR = direccion def propiedades(self, widget, direccion): dialogo = Archivos.Propiedades(direccion) dialogo.show_all() class Entrada(Gtk.Entry): """Entrada de navegación""" def __init__(self, direccion): """Inicia la clase""" Gtk.Entry.__init__(self) self.modelo = Gtk.ListStore(str) completion = Gtk.EntryCompletion() completion.set_model(self.modelo) completion.set_text_column(0) self.set_size_request(400, 40) self.set_text(direccion) self.set_placeholder_text(os.path.expanduser('Dirección')) self.set_completion(completion) self.connect('changed', self.changed) def changed(self, widget): texto = widget.get_text() if os.path.exists(texto) and not os.path.isfile(texto) and texto[-1] == '/': lista = os.listdir(texto) self.modelo.clear() for x in lista: self.modelo.append([texto + x]) self.show_all() class Barra_de_Estado(Gtk.Statusbar): def __init__(self): Gtk.Statusbar.__init__(self) def set_text(self, *args): """Le pasa 'pop' y 'push' al Widget clase""" texto = '' for x in args: texto += x self.pop(0) self.push(0, texto) def borrar(self, *args): """Llama a la función "set_text()" con '' como parámetro""" self.set_text('') class DialogoError(Gtk.Dialog): """Un diálogo que muestra el error que sucedió""" def __init__(self, error, direccion, padre): Gtk.Dialog.__init__(self, parent=padre) if error == 'inexistente': texto = 'Al parecer la dirección:\n"%s"\nno existe, compruebe lo introducido, eh intente de nuevo' % direccion elif error == 'abrir': texto = 'TENGO QUE ARREGLAR ESTO!!!!' self.set_modal(True) label1 = Gtk.Label('Error al abrir la dirección...') label2 = Gtk.Label(texto) label1.modify_font(Pango.FontDescription('bold 15')) label2.modify_font(Pango.FontDescription('12')) self.vbox.pack_start(label1, False, False, 10) self.vbox.pack_start(label2, False, False, 0) boton = Gtk.Button(None, Gtk.STOCK_OK) boton.connect('clicked', self.cerrar) self.action_area.add(boton) def cerrar(self, widget): self.destroy()