#!/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 class AreadeMontajes(Gtk.TreeView): __gsinglas__ = {'change-directory': (GObject.SIGNAL_RUN_FIRST, None, [str])} def __init__(self): Gtk.TreeView.__init__(self) 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): pass def propiedades(self, widget, direccion): dialogo = Archivos.Propiedades(direccion) dialogo.show_all() class Area(Gtk.IconView): __gsignals__ = { 'cambio-de-direccion': (GObject.SIGNAL_RUN_FIRST, None, [str]), 'cambio-de-mensaje': (GObject.SIGNAL_RUN_FIRST, None, [str]), 'copiar': (GObject.SIGNAL_RUN_FIRST, None, [str]), 'propiedades': (GObject.SIGNAL_RUN_FIRST, None, [str]), 'solicitar-direccion': (GObject.SIGNAL_RUN_FIRST, None, []) } def __init__(self): Gtk.IconView.__init__(self) self.lista_carpetas = [] self.lista_archivos = [] self.direccion = '' 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.connect('button-press-event', self.click) self.connect('selection-changed', self.changed) def changed(self, widget): """Emite la señal 'cambio-de-mensaje' con una cadena que muestra información del archivo o carpeta seleccionada""" if self.get_selected_items(): direccion = self.get_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.emit('cambio-de-mensaje', '') def agregar(self, nombre, direccion): """Agrega el icono de una carpeta o un archivo""" direccion = os.path.join(direccion, nombre) if ' ' in direccion: direccion.replace(' ', '\ ') self.modelo.append([nombre, Archivos.get_pixbuf(direccion)]) 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 self.solicitar_direccion() try: path = widget.get_path_at_pos(int(posx), int(posy)) iter = self.modelo.get_iter(path) direccion = os.path.join(self.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 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 = os.path.join(self.get_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) for item in [abrir, cortar, copiar, pegar, propiedades]: item.set_use_underline(True) menu.show_all() menu.popup(None, None, None, None, boton, tiempo) def get_direccion(self): return self.direccion def set_direccion(self, direccion): self.direccion = direccion def abrir(self, widget, direccion): """Abre la dirección del montaje seleccionado""" self.emit('cambio-de-direccion', direccion) def copiar(self, widget, direccion): """Emite la señal 'copiar' con la dirección recibida como parámetro""" self.emit('copiar', direccion) def propiedades(self, widget, direccion): """Emite la señal 'propiedades'.""" self.emit('propiedades', direccion) def solicitar_direccion(self): self.emit('solicitar-direccion') class Toolbar(Gtk.Toolbar): __gsignals__ = { 'accion': (GObject.SIGNAL_RUN_FIRST, None, (str,)) } def __init__(self): Gtk.Toolbar.__init__(self) self.toolbutton( Gtk.STOCK_HARDDISK, 'Dirigirse al directorio raíz', 'raiz') self.toolbutton(Gtk.STOCK_HOME, 'Dirigirse al directorio personal', 'personal') self.toolbutton(Gtk.STOCK_GO_UP, 'Dirigirse al directorio padre del actual', 'arriba') self.toolbutton(Gtk.STOCK_REFRESH, 'Recargar', 'recargar') img_mas = Gtk.Image() img_menos = Gtk.Image() img_preferencias = Gtk.Image() b_create = Gtk.ToolButton() b_remove = Gtk.ToolButton() b_preferences = Gtk.ToolButton() """ b_ocults.connect('clicked', self.change_ocultos) b_create.connect('clicked', self.crear_directorio) b_remove.connect('clicked', self.borrar_archivo) b_preferences.connect('clicked', self.preferencias) """ def toolbutton(self, imagen, tooltip, string): boton = Gtk.ToolButton(imagen) boton.set_tooltip_text(tooltip) boton.connect('clicked', self.emit_accion, string) self.add(boton) def emit_accion(self, widget, string): self.emit('accion', string) class Entrada(Gtk.Entry): def __init__(self): """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_placeholder_text(os.path.expanduser('Dirección')) self.set_completion(completion) self.connect('changed', self.changed) def changed(self, widget): """Sí el usuario escribe '/' como último caracter, agrega un item al modelo del completion por cada carpeta que se encuentra en la dirección introducida""" 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 BarradeEstado(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): def __init__(self, error, direccion, padre): Gtk.Dialog.__init__(self, parent=padre, flags=Gtk.DialogFlags.MODAL) self.set_text('Error') if error == 'inexistente': texto = 'Al parecer la dirección:\n"%s"\nno existe, compruebe lo introducido, eh intente de nuevo' % direccion elif error == 'abrir archivo': texto = 'No tiene un programa instalado para abrir:\n"%s"' % direccion 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()