Automatic theme (#29)

* add "automatic" theme

set the theme and icons based on the system theme

* update the default icons based on system theme

* update pyqt to 6.5.0 to get the colorSchemeChanged callback

* rename style to theme

* remove unused svg files for default theme

* ServerInfoDialog: update feedback colors in dark mode
This commit is contained in:
seird
2023-05-21 11:41:01 +02:00
committed by GitHub
parent 34d81ef6d0
commit bc221d6c8f
17 changed files with 105 additions and 272 deletions

View File

@@ -26,7 +26,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
activated = QtCore.pyqtSignal()
def __init__(
self, application_model: ApplicationModel, messages_model: MessagesModel
self, app: QtWidgets.QApplication,
application_model: ApplicationModel, messages_model: MessagesModel
):
super(MainWindow, self).__init__()
self.setupUi(self)
@@ -35,6 +36,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
self.setWindowTitle(__title__)
self.app = app
self.application_model = application_model
self.messages_model = messages_model
@@ -47,7 +50,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
# Do not collapse the message list
self.splitter.setCollapsible(1, False)
self.status_widget = StatusWidget()
self.status_widget = StatusWidget(app)
self.horizontalLayout.insertWidget(0, self.status_widget)
self.set_icons()
@@ -70,8 +73,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def set_icons(self):
# Set button icons
self.pb_refresh.setIcon(QtGui.QIcon(get_theme_file("refresh.svg")))
self.pb_delete_all.setIcon(QtGui.QIcon(get_theme_file("trashcan.svg")))
self.pb_refresh.setIcon(QtGui.QIcon(get_theme_file(self.app, "refresh.svg")))
self.pb_delete_all.setIcon(QtGui.QIcon(get_theme_file(self.app, "trashcan.svg")))
# Resize the labels and icons
size = settings.value("MainWindow/label/size", type=int)
@@ -105,7 +108,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
self, message_item: MessagesModelItem, image_path: str = ""
):
message_widget = MessageWidget(
self.listView_messages, message_item, image_path=image_path
self.app, self.listView_messages, message_item, image_path=image_path
)
self.listView_messages.setIndexWidget(
self.messages_model.indexFromItem(message_item), message_widget

View File

@@ -20,11 +20,13 @@ class MessageWidget(QtWidgets.QWidget, Ui_Form):
def __init__(
self,
app: QtWidgets.QApplication,
parent: QtWidgets.QWidget,
message_item: MessagesModelItem,
image_path: str = "",
):
super(MessageWidget, self).__init__()
self.app = app
self.parent = parent
self.setupUi(self)
self.setAutoFillBackground(True)
@@ -104,7 +106,7 @@ class MessageWidget(QtWidgets.QWidget, Ui_Form):
self.label_message.setFont(font_content)
def set_icons(self):
self.pb_delete.setIcon(QtGui.QIcon(get_theme_file("trashcan.svg")))
self.pb_delete.setIcon(QtGui.QIcon(get_theme_file(self.app, "trashcan.svg")))
self.pb_delete.setIconSize(QtCore.QSize(24, 24))
def set_message_image(self, filename: str):

View File

@@ -47,10 +47,18 @@ class ServerInfoDialog(QtWidgets.QDialog, Ui_Dialog):
self.task.incorrect_url.connect(self.incorrect_url_callback)
self.task.start()
def update_widget_state(self, widget: QtWidgets.QWidget, state: str):
widget.setProperty("state", state)
widget.style().unpolish(widget)
widget.style().polish(widget)
widget.update()
def server_info_success(self, version: GotifyVersionModel):
self.pb_test.setEnabled(True)
self.label_server_info.setText(f"Version: {version.version}")
self.pb_test.setStyleSheet("background-color: rgba(0, 255, 0, 100);")
self.update_widget_state(self.pb_test, "success")
self.update_widget_state(self.line_token, "success")
self.update_widget_state(self.line_url, "success")
self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setEnabled(
True
)
@@ -59,15 +67,17 @@ class ServerInfoDialog(QtWidgets.QDialog, Ui_Dialog):
def incorrect_token_callback(self, version: GotifyVersionModel):
self.pb_test.setEnabled(True)
self.label_server_info.setText(f"Version: {version.version}")
self.pb_test.setStyleSheet("background-color: rgba(255, 0, 0, 100);")
self.line_token.setStyleSheet("border: 1px solid red;")
self.update_widget_state(self.pb_test, "failed")
self.update_widget_state(self.line_token, "failed")
self.update_widget_state(self.line_url, "success")
self.line_token.setFocus()
def incorrect_url_callback(self):
self.pb_test.setEnabled(True)
self.label_server_info.clear()
self.pb_test.setStyleSheet("background-color: rgba(255, 0, 0, 100);")
self.line_url.setStyleSheet("border: 1px solid red;")
self.update_widget_state(self.pb_test, "failed")
self.update_widget_state(self.line_token, "success")
self.update_widget_state(self.line_url, "failed")
self.line_url.setFocus()
def import_success_callback(self):

View File

@@ -27,10 +27,12 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog):
quit_requested = QtCore.pyqtSignal()
theme_change_requested = QtCore.pyqtSignal(str)
def __init__(self):
def __init__(self, app: QtWidgets.QApplication):
super(SettingsDialog, self).__init__()
self.setupUi(self)
self.setWindowTitle("Settings")
self.app = app
self.settings_changed = False
self.changes_applied = False
@@ -104,6 +106,7 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog):
def add_message_widget(self):
self.message_widget = MessageWidget(
self.app,
self,
MessagesModelItem(
GotifyMessageModel(

View File

@@ -8,8 +8,9 @@ settings = Settings("gotify-tray")
class StatusWidget(QtWidgets.QLabel):
def __init__(self):
def __init__(self, app: QtWidgets.QApplication):
super(StatusWidget, self).__init__()
self.app = app
self.setFixedSize(QtCore.QSize(20, 20))
self.setScaledContents(True)
self.set_connecting()
@@ -17,7 +18,7 @@ class StatusWidget(QtWidgets.QLabel):
def set_status(self, image: str):
self.image = image
self.setPixmap(QtGui.QPixmap(get_theme_file(image)))
self.setPixmap(QtGui.QPixmap(get_theme_file(self.app, image)))
def set_active(self):
self.setToolTip("Listening for new messages")