#!/usr/bin/env python # -*- coding: utf-8 -*- # ListView.py # Cristian García # Ignacio Rodríguez from gi.repository import Gtk import Globales as G import os class ListView(Gtk.TreeView): def __init__(self): super(ListView, self).__init__() self.modelo = Gtk.TreeStore(str, str) self.set_model(self.modelo) self.__construir_columnas() self.set_path("/") self.connect("row-expanded", self.__expandir) self.connect("row-collapsed", self.__colapsar) self.connect("key-press-event", self.__tecla_presionada) self.show_all() def __construir_columnas(self): render1 = Gtk.CellRendererText() render2 = Gtk.CellRendererText() columna1 = Gtk.TreeViewColumn('Archivo', render1, text=0) columna2 = Gtk.TreeViewColumn('Direccion', render2, text=1) columna2.set_property('visible', False) self.append_column(columna1) self.append_column(columna2) def set_path(self, path): self.modelo.clear() dir = os.path.basename(path) iter = self.modelo.append(self.modelo.get_iter_first(), [dir, path]) self.modelo.append(iter, ["Vacio", "Directorio"]) def __expandir(self, widget, iter, path): direccion = self.modelo.get_value(iter, 1) principal = self.modelo.iter_children(iter) try: archivos = os.listdir(direccion) except OSError: valor = self.modelo.get_value(principal, 0) self.modelo.append(iter, ["Acceso Denegado", "Acceso Denegado"]) if valor == "Vacio" or valor == "Acceso Denegado": self.modelo.remove(principal) return archivos.sort() if len(archivos) == 0: return ultimos = [] directorios_ultimos = [] for archivo in archivos: nuevo_path = os.path.join(direccion, archivo) if os.path.isdir(nuevo_path): if archivo.startswith("."): directorios_ultimos.append([archivo, nuevo_path]) else: iter_nuevo = self.modelo.append(iter, [archivo, nuevo_path]) self.modelo.append(iter_nuevo, ["Vacio", "Directorio"]) else: ultimos.append(archivo) for directorio in directorios_ultimos: iter_nuevo = self.modelo.append(iter, [directorio[0], directorio[1]]) self.modelo.append(iter_nuevo, ["Vacio", "Directorio"]) for archivo in ultimos: nuevo_path = os.path.join(direccion, archivo) self.modelo.append(iter, [archivo, nuevo_path]) valor = self.modelo.get_value(principal, 0) if valor == "Vacio" or valor == "Acceso Denegado": self.modelo.remove(principal) def __colapsar(self, treeview, iter, path): while self.modelo.iter_n_children(iter): self.modelo.remove(self.modelo.iter_children(iter)) self.modelo.append(iter, ["Vacio", "Directorio"]) def __tecla_presionada(self, widget, event): tecla = event.keyval model, iter = self.get_selection().get_selected() if iter is None: return path = self.get_model().get_path(iter) if tecla == 65361: if self.row_expanded(path): self.collapse_row(path) elif tecla == 65363: if not self.row_expanded(path): self.expand_to_path(path) else: pass return False if __name__ == "__main__": Scroll = Gtk.ScrolledWindow() Scroll.add_with_viewport(ListView()) Scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) Ventana = Gtk.Window() Ventana.connect("delete-event", lambda x, i: exit()) Ventana.add(Scroll) Ventana.show_all() Gtk.main()