-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix (GT-96): parameters tab search past first #15
Changes from 7 commits
d9c87b8
8949407
f542afb
e505610
821d72c
be4146c
64e4243
a993444
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,6 +7,7 @@ | |
import textwrap | ||
import time | ||
import traceback | ||
import typing | ||
import uuid | ||
import weakref | ||
|
||
|
@@ -153,6 +154,10 @@ def message_handler(mode, context, message): | |
) | ||
) | ||
print(" {}: {}\n".format(mode, message)) | ||
# Output stack track, minus the last entry which unnecesarily points to the next line. | ||
tb_stack = traceback.extract_stack() | ||
tb_format = traceback.format_list(tb_stack[:-1]) | ||
print("".join(tb_format)) | ||
|
||
|
||
class Progress(QtCore.QObject): | ||
|
@@ -631,14 +636,21 @@ def dialog_from_file(parent, title, file_name): | |
) | ||
|
||
|
||
class PySortFilterProxyModel(QtCore.QSortFilterProxyModel): | ||
def __init__(self, *args, filter_column, **kwargs): | ||
super().__init__(*args, **kwargs) | ||
@attr.s(auto_attribs=True) | ||
class BaseSortFilterProxyModel(QtCore.QSortFilterProxyModel): | ||
_parent: QtCore.QObject = None | ||
|
||
def __attrs_post_init__(self): | ||
super().__init__(self._parent) | ||
|
||
# TODO: replace with filterKeyColumn | ||
self.filter_column = filter_column | ||
|
||
self.wildcard = QtCore.QRegExp() | ||
@attr.s(auto_attribs=True) | ||
class SortFilterProxyModel(BaseSortFilterProxyModel): | ||
filter_column: int = 0 | ||
wildcard: QtCore.QRegExp = attr.Factory(QtCore.QRegExp) | ||
|
||
def __attrs_post_init__(self): | ||
super().__attrs_post_init__() | ||
self.wildcard.setPatternSyntax(QtCore.QRegExp.Wildcard) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (tl;dr probably do nothing, but I felt like thinking about this so I wrote this up anyways) So, I just learned that you can pass properties to the constructors with PyQt (python-qt-tools/PyQt5-stubs#147 (comment)). I don't know that I want to use that, or if it works with PySide (maybe relevant someday here, definitely relevant elsewhere for us), but figured I'd share anyways. Point is that this could get moved up to the attribute definition then. wildcard: QtCore.QRegexp = attr.Factory(lambda: QtCore.QRegexp(patternSyntax=QtCore.QRegexp.Wildcard) But that still doesn't get rid of the @attr.s(auto_attrib=True)
class AttrsQObject:
_parent: QtWidgets.QWidget = None
def __attrs_post_init__(self):
super().__init__(parent=self._parent) Note the 'private' There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I held off changing the What I found is that no matter what, there is no way to avoid adding the Really, it doesn't make much sense to have the base class. It's not saving any lines of code, that's for sure. Let me know what you think. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Having a general But yeah, big picture, various opinions, not really to be dealt with in this PR. |
||
|
||
def lessThan(self, left, right): | ||
|
@@ -750,17 +762,17 @@ def set_row_column(index, row=None, column=None): | |
return None | ||
|
||
|
||
@attr.s | ||
class DiffProxyModel(QtCore.QIdentityProxyModel): | ||
parent = attr.ib(default=None) | ||
columns = attr.ib(factory=set, converter=set) | ||
_reference_column = attr.ib(default=None) | ||
diff_highlights = attr.ib(factory=dict) | ||
reference_highlights = attr.ib(factory=dict) | ||
diff_role = attr.ib(default=QtCore.Qt.ItemDataRole.DisplayRole) | ||
|
||
def __attrs_post_init__(self): | ||
super().__init__(self.parent) | ||
@attr.s(auto_attribs=True) | ||
class HighlightDiffSortFilterProxyModel(SortFilterProxyModel): | ||
columns: typing.Set[int] = attr.ib(factory=set, converter=set) | ||
_reference_column: int = None | ||
diff_highlights: typing.Dict[ | ||
QtCore.Qt.ItemDataRole, PyQt5.QtGui.QColor | ||
] = attr.Factory(dict) | ||
reference_highlights: typing.Dict[ | ||
QtCore.Qt.ItemDataRole, PyQt5.QtGui.QColor | ||
] = attr.Factory(dict) | ||
diff_role: QtCore.Qt.ItemDataRole = QtCore.Qt.ItemDataRole.DisplayRole | ||
|
||
def data(self, index, role): | ||
column = index.column() | ||
|
@@ -857,23 +869,27 @@ def search_view(view, text, column): | |
return | ||
|
||
model = view.model() | ||
|
||
index = view.currentIndex() | ||
models = [] | ||
|
||
while model is not None: | ||
while True: | ||
models.append(model) | ||
search = getattr(model, "search", None) | ||
if search is not None: | ||
break | ||
|
||
model = model.sourceModel() | ||
else: | ||
raise Exception("ack") | ||
next_model = model.sourceModel() | ||
|
||
if next_model is None: | ||
raise Exception("ack") | ||
|
||
index = model.mapToSource(index) | ||
model = next_model | ||
|
||
index = search( | ||
text=text, | ||
column=column, | ||
search_from=view.currentIndex(), | ||
search_from=index, | ||
) | ||
|
||
if index is not None: | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I had imagined this being a generic
QObject
inheriting thing but I kind of forgot about how we want to inherit from something else... I guess maybe it would still work and then the other class would just get mixed in?This is really a big picture question though and I can't say I'm hot on the multiple inheritance I just typed here... maybe it isn't worth it and a pattern is the right approach.