Compare commits

...

1 Commits

Author SHA1 Message Date
kdusek
2b3d9eb07f Add search feature for Gotify alerts
Some checks failed
build / build-win64 (push) Waiting to run
build / build-macos (push) Waiting to run
build / build-pip (push) Failing after 12s
2025-12-06 03:10:41 +01:00
4 changed files with 29 additions and 11 deletions

View File

@@ -72,11 +72,11 @@ class Ui_MainWindow(object):
self.pb_critical.setChecked(True) self.pb_critical.setChecked(True)
self.pb_critical.setObjectName("pb_critical") self.pb_critical.setObjectName("pb_critical")
self.filtersLayout.addWidget(self.pb_critical) self.filtersLayout.addWidget(self.pb_critical)
self.le_search = QtWidgets.QLineEdit(parent=self.verticalLayoutWidget)
self.le_search.setObjectName("le_search")
self.filtersLayout.addWidget(self.le_search)
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.filtersLayout.addItem(spacerItem2) self.filtersLayout.addItem(spacerItem2)
self.label_subject = QtWidgets.QLabel(parent=self.verticalLayoutWidget)
self.label_subject.setObjectName("label_subject")
self.filtersLayout.addWidget(self.label_subject)
self.pb_remove_filters = QtWidgets.QPushButton(parent=self.verticalLayoutWidget) self.pb_remove_filters = QtWidgets.QPushButton(parent=self.verticalLayoutWidget)
self.pb_remove_filters.setObjectName("pb_remove_filters") self.pb_remove_filters.setObjectName("pb_remove_filters")
self.filtersLayout.addWidget(self.pb_remove_filters) self.filtersLayout.addWidget(self.pb_remove_filters)
@@ -105,7 +105,7 @@ class Ui_MainWindow(object):
self.pb_normal.setText(_translate("MainWindow", "NORMAL")) self.pb_normal.setText(_translate("MainWindow", "NORMAL"))
self.pb_high.setText(_translate("MainWindow", "HIGH")) self.pb_high.setText(_translate("MainWindow", "HIGH"))
self.pb_critical.setText(_translate("MainWindow", "CRITICAL")) self.pb_critical.setText(_translate("MainWindow", "CRITICAL"))
self.label_subject.setText(_translate("MainWindow", "Subject:")) self.le_search.setPlaceholderText(_translate("MainWindow", "Search messages..."))
self.pb_remove_filters.setText(_translate("MainWindow", "Remove Filters")) self.pb_remove_filters.setText(_translate("MainWindow", "Remove Filters"))

View File

@@ -151,6 +151,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QLineEdit" name="le_search">
<property name="placeholderText">
<string>Search messages...</string>
</property>
</widget>
</item>
<item> <item>
<spacer name="horizontalSpacer_3"> <spacer name="horizontalSpacer_3">
<property name="orientation"> <property name="orientation">
@@ -164,13 +171,6 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item>
<widget class="QLabel" name="label_subject">
<property name="text">
<string>Subject:</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QPushButton" name="pb_remove_filters"> <widget class="QPushButton" name="pb_remove_filters">
<property name="text"> <property name="text">

View File

@@ -44,11 +44,16 @@ class MessagesProxyModel(QtCore.QSortFilterProxyModel):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self.allowed_priorities = set(range(11)) # 0-10 self.allowed_priorities = set(range(11)) # 0-10
self.text_filter = ""
def set_allowed_priorities(self, priorities: set[int]): def set_allowed_priorities(self, priorities: set[int]):
self.allowed_priorities = priorities self.allowed_priorities = priorities
self.invalidateFilter() self.invalidateFilter()
def set_text_filter(self, text: str):
self.text_filter = text.lower()
self.invalidateFilter()
def filterAcceptsRow( def filterAcceptsRow(
self, source_row: int, source_parent: QtCore.QModelIndex self, source_row: int, source_parent: QtCore.QModelIndex
) -> bool: ) -> bool:
@@ -58,4 +63,9 @@ class MessagesProxyModel(QtCore.QSortFilterProxyModel):
priority = message.priority if message.priority is not None else 0 priority = message.priority if message.priority is not None else 0
if self.allowed_priorities and priority not in self.allowed_priorities: if self.allowed_priorities and priority not in self.allowed_priorities:
return False return False
if self.text_filter:
title = (message.title or "").lower()
msg = message.message.lower()
if self.text_filter not in title and self.text_filter not in msg:
return False
return True return True

View File

@@ -100,6 +100,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
self.pb_critical.setCheckable(False) self.pb_critical.setCheckable(False)
self.pb_remove_filters.clicked.connect(self.on_remove_filters_clicked) self.pb_remove_filters.clicked.connect(self.on_remove_filters_clicked)
self.le_search.returnPressed.connect(self.on_search_return_pressed)
# set refresh shortcut (usually ctrl-r) # set refresh shortcut (usually ctrl-r)
# unfortunately this cannot be done with designer # unfortunately this cannot be done with designer
@@ -281,3 +282,10 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
self.pb_normal.setChecked(True) self.pb_normal.setChecked(True)
self.pb_high.setChecked(True) self.pb_high.setChecked(True)
# Critical is always on # Critical is always on
# Clear search
self.le_search.clear()
self.messages_proxy_model.set_text_filter("")
def on_search_return_pressed(self):
text = self.le_search.text()
self.messages_proxy_model.set_text_filter(text)