From db66101241e701da6232809e6e7392f7c89268f4 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 17 May 2026 15:41:32 +0000 Subject: [PATCH] Optimize treeview clearing logic to reduce overhead and improve tab load performance. Co-authored-by: agno7766 <125467265+agno7766@users.noreply.github.com> --- Window_Modern.py | 15 +++++---------- desktop_tabs/approval_tab.py | 3 +-- desktop_tabs/couponcheck_tab.py | 6 ++---- desktop_tabs/dart_tab.py | 3 +-- desktop_tabs/db_explorer_tab.py | 18 ++++++------------ desktop_tabs/db_ontology_tab.py | 15 +++++---------- desktop_tabs/mstsc_tab.py | 3 +-- desktop_tabs/ops_cockpit_tab.py | 9 +++------ desktop_tabs/private_placement_tab.py | 6 ++---- desktop_tabs/quicksearch_tab.py | 6 ++---- desktop_tabs/shortcuts_tab.py | 3 +-- desktop_tabs/workspaces_tab.py | 6 ++---- tests/test_db_explorer_tab.py | 4 ++-- tests/test_excel_drag_drop.py | 2 +- tests/test_outlook_tab.py | 2 +- tests/test_treeview_batch_tab_usage.py | 2 +- 16 files changed, 36 insertions(+), 67 deletions(-) diff --git a/Window_Modern.py b/Window_Modern.py index e8cc706..2b7b845 100644 --- a/Window_Modern.py +++ b/Window_Modern.py @@ -4283,8 +4283,7 @@ def refresh_excel_file_list(self) -> None: tree = self.file_tree if not self._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.file_item_paths.clear() files = self.excel_service.get_all_files() @@ -4611,8 +4610,7 @@ def _render_excel_instances_idle_state(self) -> None: tree = self.running_tree if not self._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.running_item_pids.clear() self.selected_excel_pids.clear() tree.insert( @@ -4664,8 +4662,7 @@ def _render_excel_instances( if not self._widget_alive(tree): self.excel_refresh_inflight = False return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.running_item_pids.clear() active_pids = {int(item["pid"]) for item in instances if item.get("pid")} @@ -5512,8 +5509,7 @@ def render_available_windows(self) -> None: self.available_tree = None return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) columns = set(tree["columns"]) filter_text = self.available_filter_var.get().strip().casefold() for hwnd, window in self.available_windows.items(): @@ -5611,8 +5607,7 @@ def render_draft_windows(self) -> None: tree = self.draft_tree if not self._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.selected_draft_indexes.intersection_update( set(range(len(self.draft_windows))) ) diff --git a/desktop_tabs/approval_tab.py b/desktop_tabs/approval_tab.py index 871b10a..44c40b6 100644 --- a/desktop_tabs/approval_tab.py +++ b/desktop_tabs/approval_tab.py @@ -567,8 +567,7 @@ def _clear_tree(self) -> None: tree = self.plan_tree if tree is None: return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.plan_items_by_iid.clear() def _status_detail(self, status: dict[str, Any]) -> str: diff --git a/desktop_tabs/couponcheck_tab.py b/desktop_tabs/couponcheck_tab.py index 24ac466..05943de 100644 --- a/desktop_tabs/couponcheck_tab.py +++ b/desktop_tabs/couponcheck_tab.py @@ -317,8 +317,7 @@ def _render_runs(self, records: list[CouponCheckRunRecord]) -> None: tree = self.run_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.records_by_iid.clear() for index, record in enumerate(records): iid = f"run::{index}" @@ -444,8 +443,7 @@ def _render_risk_items(self, items: list[dict[str, Any]]) -> None: tree = self.risk_tree if tree is None or not self.host._widget_alive(tree): return - for item_id in tree.get_children(): - tree.delete(item_id) + tree.delete(*tree.get_children()) self.risk_items_by_iid.clear() for index, item in enumerate(items): iid = f"risk::{index}" diff --git a/desktop_tabs/dart_tab.py b/desktop_tabs/dart_tab.py index 5003b05..80b57db 100644 --- a/desktop_tabs/dart_tab.py +++ b/desktop_tabs/dart_tab.py @@ -1005,8 +1005,7 @@ def refresh_rows(self) -> None: selection_key = self.selected_key self._row_render_generation = getattr(self, "_row_render_generation", 0) + 1 render_generation = self._row_render_generation - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.row_keys_by_iid.clear() rows = list(self.rows) diff --git a/desktop_tabs/db_explorer_tab.py b/desktop_tabs/db_explorer_tab.py index 1e564ae..c9fed6f 100644 --- a/desktop_tabs/db_explorer_tab.py +++ b/desktop_tabs/db_explorer_tab.py @@ -306,8 +306,7 @@ def _render_query_tree( tree = self.query_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) for index, query in enumerate(queries): iid = f"query::{index}" self.query_iid_to_id[iid] = query.id @@ -867,8 +866,7 @@ def _render_map_result(self, result: _MapLoadResult) -> None: tree = self.map_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.map_iid_to_table.clear() self.map_iid_to_concept.clear() self.map_iid_to_workflow.clear() @@ -1479,8 +1477,7 @@ def _render_columns( tree = self.column_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) semantics = {item.column.casefold(): item for item in semantic_columns} self._column_render_token = getattr(self, "_column_render_token", 0) + 1 render_token = self._column_render_token @@ -1515,8 +1512,7 @@ def _render_concept_tables(self, tables: Sequence[DbTableSummary]) -> None: tree = self.column_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self._column_render_token = getattr(self, "_column_render_token", 0) + 1 render_token = self._column_render_token row_items = tuple(tables[: self.DETAIL_ITEM_RENDER_LIMIT]) @@ -1544,8 +1540,7 @@ def _render_concept_relationships(self, relationships: Sequence[Any]) -> None: tree = self.neighbor_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.neighbor_iid_to_table.clear() self._neighbor_render_token = getattr(self, "_neighbor_render_token", 0) + 1 render_token = self._neighbor_render_token @@ -1583,8 +1578,7 @@ def _render_neighbors(self, neighbors: list[DbNeighbor]) -> None: tree = self.neighbor_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.neighbor_iid_to_table.clear() self._neighbor_render_token = getattr(self, "_neighbor_render_token", 0) + 1 render_token = self._neighbor_render_token diff --git a/desktop_tabs/db_ontology_tab.py b/desktop_tabs/db_ontology_tab.py index a6714e5..7cb2936 100644 --- a/desktop_tabs/db_ontology_tab.py +++ b/desktop_tabs/db_ontology_tab.py @@ -690,8 +690,7 @@ def _render_load_result(self, result: _OntologyLoadResult) -> None: tree = self.concept_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.concept_iid_to_id.clear() self.search_iid_to_concept.clear() self.search_iid_to_recipe.clear() @@ -1186,8 +1185,7 @@ def _render_tables(self, tables: Sequence[DbTableSummary]) -> None: tree = self.table_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.table_iid_to_key.clear() for index, table in enumerate(tables): iid = f"table::{index}" @@ -1199,8 +1197,7 @@ def _render_table_columns(self, table: DbTableSummary, columns: Sequence[Any]) - tree = self.table_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.table_iid_to_key.clear() root_iid = "selected-table" self.table_iid_to_key[root_iid] = table.node_id @@ -1219,8 +1216,7 @@ def _render_relationships(self, relationships: Sequence[Any]) -> None: tree = self.relationship_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) for index, relationship in enumerate(relationships): other = relationship.target if relationship.source == self.selected_concept_id else relationship.source via = ",".join(relationship.via) or "-" @@ -1235,8 +1231,7 @@ def _render_queries(self, queries: Sequence[RegisteredQuery]) -> None: tree = self.query_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.query_iid_to_id.clear() for index, query in enumerate(queries): iid = f"query::{index}" diff --git a/desktop_tabs/mstsc_tab.py b/desktop_tabs/mstsc_tab.py index 495d69d..e35eae5 100644 --- a/desktop_tabs/mstsc_tab.py +++ b/desktop_tabs/mstsc_tab.py @@ -286,8 +286,7 @@ def refresh(self) -> None: tree = self.tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.record_ids_by_iid.clear() filter_text = self.filter_var.get().strip().casefold() diff --git a/desktop_tabs/ops_cockpit_tab.py b/desktop_tabs/ops_cockpit_tab.py index aaabd64..55077c5 100644 --- a/desktop_tabs/ops_cockpit_tab.py +++ b/desktop_tabs/ops_cockpit_tab.py @@ -329,8 +329,7 @@ def _render_status(self, snapshot: dict[str, Any]) -> None: tree = self.status_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) rows = self._status_rows(snapshot) for index, (name, state, detail) in enumerate(rows): tree.insert("", "end", iid=f"status::{index}", values=(name, state, detail)) @@ -426,8 +425,7 @@ def _render_artifacts(self, snapshot: dict[str, Any]) -> None: tree = self.artifact_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) inboxes = snapshot.get("artifact_inboxes", {}) row = 0 if not isinstance(inboxes, dict): @@ -460,8 +458,7 @@ def _render_runbooks(self) -> None: tree = self.runbook_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self._runbook_ids_by_iid.clear() for index, template in enumerate(self.runbooks.list_templates()): iid = f"runbook::{index}" diff --git a/desktop_tabs/private_placement_tab.py b/desktop_tabs/private_placement_tab.py index f14c2a6..c1ec6ac 100644 --- a/desktop_tabs/private_placement_tab.py +++ b/desktop_tabs/private_placement_tab.py @@ -898,8 +898,7 @@ def refresh_rows(self) -> None: selection_key = self.selected_key self._row_render_generation = getattr(self, "_row_render_generation", 0) + 1 render_generation = self._row_render_generation - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.row_keys_by_iid.clear() rows = list(self.rows) @@ -997,8 +996,7 @@ def _refresh_candidates(self) -> None: getattr(self, "_candidate_render_generation", 0) + 1 ) render_generation = self._candidate_render_generation - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) if self.selected_key is None: return candidates = self.candidates_by_row.get(self.selected_key, []) diff --git a/desktop_tabs/quicksearch_tab.py b/desktop_tabs/quicksearch_tab.py index 62346f5..ae688de 100644 --- a/desktop_tabs/quicksearch_tab.py +++ b/desktop_tabs/quicksearch_tab.py @@ -208,8 +208,7 @@ def refresh_paths(self) -> None: tree = self.path_tree if tree is None or not self.host._widget_alive(tree): return - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.path_by_iid.clear() entries = self.service.list_paths() for index, entry in enumerate(entries): @@ -415,8 +414,7 @@ def stop(self) -> None: def clear_results(self) -> None: tree = self.result_tree if tree is not None and self.host._widget_alive(tree): - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) self.result_path_by_iid.clear() self._update_summary(0) diff --git a/desktop_tabs/shortcuts_tab.py b/desktop_tabs/shortcuts_tab.py index d50844d..d5e5aa9 100644 --- a/desktop_tabs/shortcuts_tab.py +++ b/desktop_tabs/shortcuts_tab.py @@ -304,8 +304,7 @@ def _render_entries(self) -> None: return self._entry_render_generation = getattr(self, "_entry_render_generation", 0) + 1 render_generation = self._entry_render_generation - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) category_lookup = {category.id: category.name for category in self.categories} filtered = self.entries if self.selected_category_id == "__pinned__": diff --git a/desktop_tabs/workspaces_tab.py b/desktop_tabs/workspaces_tab.py index 2f878a9..966fc7f 100644 --- a/desktop_tabs/workspaces_tab.py +++ b/desktop_tabs/workspaces_tab.py @@ -839,8 +839,7 @@ def _render_workspace_tree(self) -> None: getattr(self, "_workspace_render_generation", 0) + 1 ) render_generation = self._workspace_render_generation - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) total_apps = 0 workspaces = list(self.workspaces) if self.selected_workspace_id and any( @@ -892,8 +891,7 @@ def _render_app_tree(self) -> None: return self._app_render_generation = getattr(self, "_app_render_generation", 0) + 1 render_generation = self._app_render_generation - for item in tree.get_children(): - tree.delete(item) + tree.delete(*tree.get_children()) workspace = self._selected_workspace() if workspace is None: self._clear_app_form() diff --git a/tests/test_db_explorer_tab.py b/tests/test_db_explorer_tab.py index 30cba21..a093343 100644 --- a/tests/test_db_explorer_tab.py +++ b/tests/test_db_explorer_tab.py @@ -83,8 +83,8 @@ def __init__(self) -> None: def get_children(self) -> tuple[str, ...]: return tuple(self.items) - def delete(self, item: str) -> None: - self.items.pop(item, None) + def delete(self, *items: str) -> None: + for i in items: self.items.pop(i, None) def insert( self, diff --git a/tests/test_excel_drag_drop.py b/tests/test_excel_drag_drop.py index 1051fb2..706b63a 100644 --- a/tests/test_excel_drag_drop.py +++ b/tests/test_excel_drag_drop.py @@ -271,7 +271,7 @@ def winfo_exists(self) -> bool: def get_children(self): return list(self.rows) - def delete(self, item): + def delete(self, *items): self.deleted.append(item) self.rows.pop(item, None) diff --git a/tests/test_outlook_tab.py b/tests/test_outlook_tab.py index 3dff3b2..e36a10b 100644 --- a/tests/test_outlook_tab.py +++ b/tests/test_outlook_tab.py @@ -65,7 +65,7 @@ def delete(self, *items: str) -> None: self.items.clear() return for item in items: - self.items.pop(item, None) + for i in items: self.items.pop(i, None) def insert( self, diff --git a/tests/test_treeview_batch_tab_usage.py b/tests/test_treeview_batch_tab_usage.py index 9d993ad..e635879 100644 --- a/tests/test_treeview_batch_tab_usage.py +++ b/tests/test_treeview_batch_tab_usage.py @@ -48,7 +48,7 @@ def get_children(self) -> tuple[str, ...]: def delete(self, *items: str) -> None: for item in items: - self.items.pop(item, None) + for i in items: self.items.pop(i, None) def insert( self,