def add_paths(self, paths): """Add the given URLs to the control paths - a sequence of URLs """ uid = uuid.uuid4() npaths = len(paths) for i, path in enumerate(paths): if i % 100 == 0: report_progress(uid, float(i) / npaths, "Loading %s into UI" % path) folder, filename = self.splitpath(path) display_name = url2pathname(filename) width, _, _, _ = self.GetFullTextExtent(display_name) idx = bisect.bisect_left(self.folder_names, folder) if idx >= len( self.folder_names) or self.folder_names[idx] != folder: folder_item = self.FolderItem(self, folder) self.folder_names.insert(idx, folder) self.folder_items.insert(idx, folder_item) else: folder_item = self.folder_items[idx] fp = folder_item.filenames pidx = bisect.bisect_left(fp, filename) if pidx >= len(fp) or fp[pidx] != filename: fp.insert(pidx, filename) folder_item.widths.insert(pidx, width) folder_item.file_display_names.insert(pidx, display_name) folder_item.enabled.insert(pidx, True) if len(paths) > 0: report_progress(uid, 1, "Done") self.schmutzy = True self.Refresh(eraseBackground=False)
def update(self): operation_id = uuid.uuid4() total = self.v.node_count() if total == 0: return self.update_subtree(self.v.file_tree, self.root_item, False, [], operation_id, 0, total) self.manage_expansion() report_progress(operation_id, 1, None)
def update_subtree(self, file_tree, parent_item, is_filtered, modpath, operation_id, count, total): existing_items = {} show_filtered = self.v.show_filtered needs_sort = False child_count = self.tree_ctrl.GetChildrenCount(parent_item, False) if child_count > 0: child_item_id, cookie = self.tree_ctrl.GetFirstChild(parent_item) for i in range(child_count): existing_items[self.tree_ctrl.GetItemPyData(child_item_id)] = [ child_item_id, False, ] if i < child_count - 1: child_item_id = self.tree_ctrl.GetNextSibling( child_item_id) for x in sorted(file_tree.keys()): sub_modpath = modpath + [x] if x is None: continue text, node_type, tooltip = self.v.get_node_info(sub_modpath) report_progress(operation_id, float(count) / float(total), "Processing %s" % text) count += 1 image_id = self.get_image_id_from_nodetype(node_type) if isinstance(file_tree[x], bool) or isinstance(x, tuple): node_is_filtered = (not file_tree[x]) or is_filtered if node_is_filtered and not show_filtered: continue if x in existing_items: existing_items[x][1] = True item_id = existing_items[x][0] self.tree_ctrl.SetItemText(item_id, text) else: item_id = self.add_item(sub_modpath, text, sort=False) existing_items[x] = (item_id, True) needs_sort = True self.tree_ctrl.SetItemImage(item_id, image_id) elif isinstance(file_tree[x], dict): subtree = file_tree[x] node_is_filtered = (not subtree[None]) or is_filtered ( unfiltered_subfolders, filtered_subfolders, unfiltered_files, filtered_files, ) = self.get_file_and_folder_counts(subtree) n_subfolders = unfiltered_subfolders + filtered_subfolders n_files = unfiltered_files + filtered_files if node_is_filtered and not show_filtered: continue if node_type in ( FileCollectionDisplay.NODE_COMPOSITE_IMAGE, FileCollectionDisplay.NODE_MOVIE, ): expanded_image_id = image_id else: image_id = self.FOLDER_IMAGE_INDEX expanded_image_id = self.FOLDER_OPEN_IMAGE_INDEX text = "" + x if n_subfolders > 0 or n_files > 0: text += " (" if n_subfolders > 0: if node_is_filtered: text += "\t%d folders" % n_subfolders else: text += "\t%d of %d folders" % ( unfiltered_subfolders, n_subfolders, ) if n_files > 0: text += ", " if n_files > 0: if node_is_filtered: text += "\t%d files" % n_files else: text += "\t%d of %d files" % (unfiltered_files, n_files) text += ")" if x in existing_items: existing_items[x][1] = True item_id = existing_items[x][0] self.tree_ctrl.SetItemText(item_id, text) else: item_id = self.add_item(sub_modpath, text, sort=False) existing_items[x] = (item_id, True) needs_sort = True self.tree_ctrl.SetItemImage(item_id, image_id) self.tree_ctrl.SetItemImage(item_id, expanded_image_id, wx.TreeItemIcon_Expanded) has_children = n_subfolders + n_files > 0 self.tree_ctrl.SetItemHasChildren(item_id, has_children) count = self.update_subtree( subtree, item_id, node_is_filtered, sub_modpath, operation_id, count, total, ) color = self.FILTERED_COLOR if node_is_filtered else self.ACTIVE_COLOR self.tree_ctrl.SetItemTextColour(item_id, color) for last_part, (item_id, keep) in list(existing_items.items()): if not keep: self.remove_item(modpath + [last_part]) if needs_sort: self.tree_ctrl.SortChildren(parent_item) return count