예제 #1
0
    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