def __addTargetFiles__(self, files, defaultIcon, iterOp, iter=None, position=gtk.TREE_VIEW_DROP_AFTER, recursiveLevel=0, gtkLock=True): """ @summary: Add files to target listview. @param files: List of files to add. @param defaultIcon: Default icon to associate with each file. @param iterOp: GtkIter of operation progress bar. @param recursiveLevel: Current recursive level. @param iter: Iter that it will use as reference to insert new files. @param position: Position over iter. @param gtkLock: True to do a lock on gtk loop. """ if (files != None): operations = RegOperations() # Add each file into target TreeView for file in files: __log__.debug("Adding %s" % file) if (iterOp != None): operations.stepOperation(iterOp) if (file == ""): __log__.warn("Empty file path. Skip file") continue if (self.__core__.getItem(file) != None): __log__.info("File %s already exists in target file list" % file) continue # Checks if is a folder and system is configured to add files recursively if (os.path.isdir(file) and Configuration().getConfiguration().getboolean("UI_CORE", "add_recursive")): __log__.debug("%s is folder. Adding images into folder." % file) # Do recursivity if (recursiveLevel < Configuration().getConfiguration().getint("UI_CORE", "recursive_level")): ioUtils = IOUtils() listNewFiles = [] if ((recursiveLevel + 1) != Configuration().getConfiguration().getint("UI_CORE", "recursive_level")): listNewFiles += ioUtils.getDirectories(file, Configuration().getConfiguration().getboolean("NAVIGATOR", "show_hiddens"), getFullpath=True) listNewFiles += ioUtils.getFiles(file, Configuration().getConfiguration().getboolean("NAVIGATOR", "show_hiddens"), getFullpath=True) __log__.debug("Adding images from folder %s" % file) operations.addElements(iterOp, len(listNewFiles), gtkLock=gtkLock) self.__addTargetFiles__(listNewFiles, defaultIcon, iterOp, iter=iter, position=position, recursiveLevel=(recursiveLevel + 1), gtkLock=gtkLock) del ioUtils else: __log__.debug("Max. recursive level got.") continue head, filename = os.path.split(file) item = CamItem(file, target=filename) __log__.debug("New CamItem created for filename %s. %s" % (filename, item)) # Create a new row newRowData = [defaultIcon, file, _("Loading..."), filename , item.getDescription(), defaultIcon, False, True] iterAdd = UIUtils.insertIterAtPathPosition(self.__model__, newRowData, iter, position=position, doGObject=gtkLock) __log__.info("New file inserted into target treeview. %s" % file) if (iterAdd != None): self.__core__.addItem(file, item) self.updateItem(iterAdd, item, gtkLock=gtkLock) else: __log__.error("It could not insert new item into project. %s" % file) del newRowData del item else: __log__.warning("Files parameter is None")
class TreeExplorer: """ @summary: This class is a handler for a TreeView, for simulating a tree explorer, like nautilus has. """ __selectCallback__ = None __showHiddens__ = True __TEMP_NODE__ = " !TempCamimg" # Index of each column __IMG_COLUMN__ = 0 __NAME_COLUMN__ = 1 __PATH_COLUMN__ = 2 def __init__(self, selectCallback=None, showHiddens=True): """ @summary: Create new TreeExplorer. @param selectCallback: Callback that will call when an item will be selected. @param showHiddens: True to show hidden folders. @note: selectCallback must be a funtion reference, like function(path : str) """ self.__selectedPath__ = "" self.__ioUtils__ = IOUtils() # Define Treeview explorer self.__explorer__ = gtk.TreeView() self.__explorer__.connect("cursor-changed", self.__selectRowTvOneClickSignal__) self.__explorer__.connect("row-collapsed", self.__collapsedRowTVSignal__) self.__explorer__.connect("row-expanded", self.__expandRowTVSignal__) self.__exportControl__ = gtk.ScrolledWindow() self.__exportControl__.add(self.__explorer__) self.__HOME_NODE__ = _("home") # Initialize TreeView explorer self.__initializeExplorer__() self.__selectCallback__ = selectCallback self.__showHiddens__ = showHiddens def __initializeExplorer__(self): """ @summary: Initialize TreeView explorer. Add drives of OS. """ # Make a model for TreeView explorer self.__model__ = gtk.TreeStore(gtk.gdk.Pixbuf, gobject.TYPE_STRING, gobject.TYPE_STRING) __log__.debug("Created model for TreeExplorer.") # Gets home icon iconHome = FactoryControls.getPixbufFromStock(gtk.STOCK_HOME) # Gets drive icon icon = FactoryControls.getPixbufFromStock(gtk.STOCK_HARDDISK) self.__explorer__.set_model(None) # Apply look to TreeView self.__explorer__.set_headers_visible(False) self.__explorer__.set_show_expanders(True) self.__explorer__.get_selection().set_mode(gtk.SELECTION_SINGLE) column = FactoryControls.getTreeColumnTextAndPixbuf(_("Explorer"), self.__NAME_COLUMN__, self.__IMG_COLUMN__) self.__explorer__.append_column(column) __log__.debug("Added columns to TreeExplorer") # Add home node self.addDirectory(self.__HOME_NODE__, os.path.expanduser("~"), iconHome, glock=False) # Gets drives from the OS for sDrive in self.__ioUtils__.getDrives(): if (sDrive != None) and (sDrive != ""): self.addDirectory (sDrive, sDrive, icon, glock=False) __log__.debug("Drives added.") # Set model to explorer TreeView self.__explorer__.set_model(self.__model__) def __fillDirectory__(self, path): """ @summary: Fills a node with sub-directories. @param path: Folder path to fill. """ newExpand = False # Gets current path iter = self.__model__.get_iter(path) sPath = self.__model__.get_value(iter, self.__PATH_COLUMN__) monitor = FactoryDirectoryMonitor.getMonitor(sPath) # Checks if first child y a temporal node. If it is, it must be removed itFirstChild = self.__model__.iter_children(iter) if (itFirstChild != None): if (self.__model__.get_value(itFirstChild, self.__PATH_COLUMN__) == self.__TEMP_NODE__): # Gets number of nodes. If nNodes > 1, # there is another thread that is loading the directory nNodes = self.__model__.iter_n_children(iter) if (nNodes > 1): return newExpand = True else: __log__.warning("It can not get first child of %s" % sPath) # Gets directories of the path lDirectories = self.__ioUtils__.getDirectories(sPath, showhidden=self.__showHiddens__) if (lDirectories != None): icon = FactoryControls.getPixbufFromStock(gtk.STOCK_DIRECTORY) if (not newExpand): __log__.debug("It is not a new expand. Checking directories...") iterStep = self.__model__.iter_children(iter) # Find deleted iters while (iterStep != None): doStep = True sDirFind = self.__model__.get_value(iterStep, self.__NAME_COLUMN__) if (sDirFind != None): try: index = lDirectories.index(sDirFind) except ValueError, ve: __log__.debug("It can not get index of %s. %s" % (sDirFind, ve)) index = -1 if (index == -1): # In case of directory does not exist, it will remove from treeview iterDelete = iterStep iterStep = self.__model__.iter_next(iterStep) self.deleteNode(iterDelete) __log__.debug("Delete node %s" % sDirFind) doStep = False else: # In case of directory just exists, it will remove from list lDirectories.remove(sDirFind) __log__.debug("%s skipped" % sDirFind) if (doStep): iterStep = self.__model__.iter_next(iterStep) # Check directories in the list for sDir in lDirectories: sFullPath = os.path.join(sPath, sDir) checkIter = self.__findDirectoryOnParent__(iter, sDir) if (checkIter == None): self.addDirectory(sDir, sFullPath, icon, iter) __log__.debug("Add %s" % sFullPath) # Insert directories for sDir in lDirectories: sFullPath = os.path.join(sPath, sDir) self.addDirectory(sDir, sFullPath, icon, iter) __log__.debug("Add %s" % sFullPath) if ((itFirstChild != None) and newExpand): __log__.debug("Remove temporal node.") self.deleteNode(itFirstChild) monitor.addDirectories(lDirectories) monitor.addListener(self.__handlerDirectoryMonitorEvents__) else: # When there isn't any directory