Skip to content

Commit 4cd75d2

Browse files
committed
Column search fixes
1 parent fd0e0ef commit 4cd75d2

2 files changed

Lines changed: 32 additions & 21 deletions

File tree

activity_browser/ui/core/tree_model.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
from typing import Optional
2-
from collections import defaultdict
32

4-
from loguru import logger
53
import pandas as pd
6-
from PySide6.QtCore import QModelIndex, Qt
4+
5+
from PySide6 import QtGui
6+
from PySide6.QtCore import QModelIndex, Qt, QAbstractItemModel
77
from PySide6.QtWidgets import QWidget
8-
from PySide6.QtCore import QAbstractItemModel
8+
9+
from activity_browser.ui.icons import qicons
910

1011

1112
class TreeNode:
@@ -54,6 +55,8 @@ def __init__(self, df: pd.DataFrame = None, parent: Optional[QWidget] = None, ch
5455
super().__init__(parent)
5556
self.df = df if df is not None else pd.DataFrame()
5657
self.df_query: dict[str, str] = {"model": "index == index"} # dictionary where queries can be registered
58+
self.filtered_columns: set[int] = set() # set of column indices that have active filters, only used for the header icon
59+
5760
self.lazy = chunk_size > 0
5861
self.chunk_size = chunk_size
5962

@@ -269,13 +272,22 @@ def isBranchNode(self, index: QModelIndex) -> bool:
269272
return not node.is_leaf
270273

271274
def headerData(self, section: int, orientation: Qt.Orientation = Qt.Horizontal, role: int = Qt.DisplayRole):
272-
if orientation == Qt.Vertical or not role == Qt.DisplayRole:
275+
if orientation == Qt.Vertical:
273276
return None
274-
275-
if section == 0:
276-
return ""
277-
278-
return self.df.columns[section - 1]
277+
278+
if role == Qt.DisplayRole:
279+
if section == 0:
280+
return ""
281+
282+
return self.df.columns[section - 1]
283+
284+
if role == Qt.ItemDataRole.FontRole and section in self.filtered_columns:
285+
font = QtGui.QFont()
286+
font.setUnderline(True)
287+
return font
288+
289+
if role == Qt.ItemDataRole.DecorationRole and section in self.filtered_columns:
290+
return qicons.filter
279291

280292
def canFetchMore(self, parent: QModelIndex) -> bool:
281293
"""Check if this parent has more children that can be loaded."""
@@ -333,7 +345,8 @@ def build_node_hierarchy(self, pandas_index: pd.Index) -> None:
333345

334346
# Create a mapping from full path to DataFrame position
335347
path_to_position = {}
336-
for df_pos, row_tuple in enumerate(idx_df.itertuples(index=False, name=None)):
348+
for row_tuple in idx_df.itertuples(index=False, name=None):
349+
df_pos = self.df.index.get_loc(row_tuple)
337350
path_to_position[row_tuple] = df_pos
338351

339352
# Process each level to build the hierarchy

activity_browser/ui/widgets/tree_view.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
from loguru import logger
22

3-
import pandas as pd
4-
53
from qtpy import QtWidgets, QtCore, QtGui
6-
from qtpy.QtCore import Qt
74

85
from activity_browser.ui import delegates, core
9-
from .item_model import ABItemModel
6+
7+
from .line_edit import ABLineEdit
108

119

1210

@@ -26,11 +24,11 @@ def __init__(self, pos: QtCore.QPoint, view: "ABNewTreeView"):
2624
col_index = view.columnAt(pos.x())
2725
col_name = model.columns()[col_index]
2826

29-
search_box = QtWidgets.QLineEdit(self)
27+
search_box = ABLineEdit(self)
3028
search_box.setText(view.columnFilters.get(col_name, ""))
3129
search_box.setPlaceholderText("Search")
3230
search_box.selectAll()
33-
search_box.textChanged.connect(lambda query: view.setColumnFilter(col_name, query))
31+
search_box.textChangedDebounce.connect(lambda query: view.setColumnFilter(col_name, query))
3432
widget_action = QtWidgets.QWidgetAction(self)
3533
widget_action.setDefaultWidget(search_box)
3634
self.addAction(widget_action)
@@ -103,7 +101,7 @@ def setModel(self, model):
103101
self.updateIndexColumnVisibility()
104102
self.updateBranchSpanning()
105103

106-
def model(self) -> ABItemModel:
104+
def model(self) -> core.ABTreeModel:
107105
return super().model()
108106

109107
# === Functionality related to contextmenus
@@ -122,10 +120,10 @@ def setColumnFilter(self, column_name: str, query: str):
122120

123121
if query:
124122
self.columnFilters[column_name] = query
125-
# self.model().filtered_columns.add(col_index)
123+
self.model().filtered_columns.add(col_index)
126124
elif column_name in self.columnFilters:
127125
del self.columnFilters[column_name]
128-
# self.model().filtered_columns.discard(col_index)
126+
self.model().filtered_columns.discard(col_index)
129127

130128
self.applyFilter()
131129

@@ -144,7 +142,7 @@ def buildQuery(self) -> str:
144142
del self.columnFilters[col]
145143

146144
for col, query in self.columnFilters.items():
147-
q = f"({col}.astype('str').str.contains('{self.format_query(query)}'))"
145+
q = f"({col}.astype('str').str.contains('{self.format_query(query)}', False))"
148146
queries.append(q)
149147

150148
# query for the all filter

0 commit comments

Comments
 (0)