#!/usr/share/env python # -*- coding:UTF-8 -*- # window.py por: # Cristian García import os import thread import time import Archivos from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GObject from gi.repository import GdkPixbuf from Widgets import AreadeMontajes from Widgets import Area from Widgets import Toolbar from Widgets import Entrada from Widgets import BarradeEstado from Widgets import DialogoError screen = Gdk.Screen.get_default() css_provider = Gtk.CssProvider() style_path = 'CExplorer.css' css_provider.load_from_path(style_path) context = Gtk.StyleContext() context.add_provider_for_screen( screen, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER) class CExplorer(Gtk.Window): __gsignals__ = { 'change-directory': (GObject.SIGNAL_RUN_FIRST, None, []) } def __init__(self): Gtk.Window.__init__(self) self.set_size_request(600, 400) self.set_title('CExplorer') self.ocultos = False self.direccion = os.path.expanduser('~') self.archivos = [] self.carpetas = [] self.vbox = Gtk.VBox() self.toolbar = Toolbar() self.entrada = Entrada() self.area = Area() self.area_montajes = AreadeMontajes(self) self.b_estado = BarradeEstado() item = Gtk.ToolItem() switch = Gtk.Switch() switch.connect('notify::active', self.change_ocultos) item.add(switch) self.toolbar.add(item) scrolled_montajes = Gtk.ScrolledWindow() scrolled = Gtk.ScrolledWindow() paned = Gtk.Paned() scrolled_montajes.add(self.area_montajes) scrolled.add(self.area) paned.pack1(scrolled_montajes, False, True) paned.pack2(scrolled, True, True) self.vbox.pack_start(self.toolbar, False, False, 0) self.vbox.pack_start(self.entrada, False, False, 5) self.vbox.pack_start(paned, True, True, 0) self.vbox.pack_start(self.b_estado, False, False, 0) self.connect('destroy', Gtk.main_quit) self.connect('key-press-event', self.tecla_presionada) self.connect('change-directory', self.borrar_todo) self.toolbar.connect('accion', self.set_accion) self.entrada.connect('activate', self.nueva_direccion) self.area.connect('cambio-de-direccion', self.abrir_desde_widget) self.area.connect('cambio-de-mensaje', self.cambio_de_mensaje) self.area.connect('solicitar-direccion', self.setear_direccion) self.abrir(self.direccion) self.add(self.vbox) self.show_all() def set_accion(self, widget=None, accion=None): if accion == 'raiz': self.direccion = '/' self.update() elif accion == 'personal': self.direccion = os.path.expanduser('~/') self.update() elif accion == 'arriba': self.abrir_arriba() elif accion == 'recargar': self.update() def abrir(self, directorio): """Abre el directorio especificado""" texto = False if os.path.isdir(directorio) or os.path.ismount(directorio): # Sí es que no exíste, devolverá False self.direccion = directorio self.entrada.set_text(directorio) self.emit('change-directory') for objeto in os.listdir(directorio): direccion = os.path.join(directorio, objeto) if os.path.isdir(direccion) or os.path.ismount(direccion): if not self.ocultos and not list(objeto)[0] == '.': self.carpetas.append(objeto) elif self.ocultos: self.carpetas.append(objeto) if os.path.isfile(direccion): if not self.ocultos and not \ (list(objeto)[0] == '.' or list(objeto)[-1] == '~'): self.archivos.append(objeto) elif self.ocultos: self.archivos.append(objeto) self.carpetas.sort() self.archivos.sort() for carpeta in self.carpetas: self.area.agregar(carpeta, self.direccion) for archivo in self.archivos: self.area.agregar(archivo, self.direccion) elif os.path.isfile(directorio): comando = Archivos.intentar_abrir(directorio) if 'error' in comando: texto = 'abrir archivo' else: texto = 'inexistente' if texto: dialogo = DialogoError(texto, directorio, self) dialogo.show_all() try: self.abrir(self.direccion) except: try: direccion = Archivos.get_direccion_arriba(self.direccion) self.abrir(direccion) except: self.abrir(os.path.expanduser('~')) self.setear_direccion(self.area) def tecla_presionada(self, widget, event): tecla = event.keyval direccion = self.direccion if direccion[-1] != '/': direccion += '/' lectura, escritura, ejecucion = Archivos.get_permisos(self.direccion) if self.area.get_selected_items() and self.area.has_focus(): path = self.area.get_selected_items()[0] iter = self.area.modelo.get_iter(path) direccion += self.area.modelo.get_value(iter, 0) lectura, escritura, ejecucion = Archivos.get_permisos(direccion) if tecla == 32: if lectura: self.preferencias() elif tecla == 65535: if lectura and escritura: self.borrar_archivo() elif tecla == 65293: self.abrir(direccion) elif tecla == 65288: self.abrir_arriba() if tecla == 43: if lectura and escritura: self.crear_directorio() def setear_direccion(self, widget): widget.set_direccion(self.direccion) def abrir_desde_widget(self, widget, direccion): """Llama a la función 'abrir'.""" self.abrir(direccion) def crear_directorio(self, *args): """Abre el un diálogo para crear un directorio, sí es que en el directorio actual hay permisos suficientes""" lectura, escritura, ejecucion = Archivos.get_permisos(self.direccion) if lectura and escritura: crear = Archivos.CrearDirectorio(self.direccion) crear.connect('creado', self.update) crear.show_all() def borrar_archivo(self, *args): """Abre un diálogo para borrar el archivo o la carpeta seleccionada, sí es que hay permisos suficientes""" direccion = self.get_nueva_direccion() lectura, escritura, ejecucion = Archivos.get_permisos(direccion) if lectura and escritura: borrar = Archivos.Borrar(direccion) borrar.connect('borrado', self.update) borrar.show_all() def state_changed(self, widget, state): pass def preferencias(self, *args): """Abre un diálogo con las propiedades del archivo, con opciones de configurar todo lo que se pueda, teniendo en cuenta los permisos""" direccion = self.get_nueva_direccion() lectura, escritura, ejecucion = Archivos.get_permisos(direccion) if lectura: propiedades = Archivos.Propiedades(direccion) propiedades.connect('cambio-de-propiedades', self.update) propiedades.show_all() def nueva_direccion(self, widget, direccion=None, *args): """Abre la dirección introducida""" if not direccion: direccion = widget.get_text() else: if direccion == '~': direccion = os.path.expanduser('~') self.abrir(direccion) def borrar_todo(self, *args): """Borra todos los archivos y carpetas de las listas""" while len(self.carpetas) > 0: for carpeta in self.carpetas: self.carpetas.remove(carpeta) while len(self.archivos) > 0: for archivo in self.archivos: self.archivos.remove(archivo) self.area.borrar_area() self.b_estado.borrar() def cambio_de_mensaje(self, widget, mensaje): """Llama a la función 'set_text', de la clase 'BarradeEstado'""" self.b_estado.set_text(mensaje) def update(self, *args): """Recarga el directorio acual""" self.borrar_todo() self.abrir(self.direccion) def abrir_arriba(self, *args): """Abre la carpeta que contiene la actual""" self.direccion = Archivos.get_carpeta_contenedora(self.direccion) self.entrada.set_text(self.direccion) self.entrada.activate() self.update() def change_ocultos(self, widget, active): """Muestra o no muestra archivos ocultos""" self.ocultos = widget.get_active() self.update() def get_nueva_direccion(self): """Sí hay un item seleccionado en el area de navegación, devuelve la dirección que conduce a él, de lo contrario, devuelve la dirección actual""" try: direccion = self.direccion if direccion[-1] != '/': direccion += '/' path = self.area.get_selected_items()[0] iter = self.area.modelo.get_iter(path) direccion += self.area.modelo.get_value(iter, 0) return direccion except: return self.direccion if __name__ == '__main__': CExplorer() Gtk.main()