basic image pop-up on hover
This commit is contained in:
46
gotify_tray/gui/widgets/ImagePopup.py
Normal file
46
gotify_tray/gui/widgets/ImagePopup.py
Normal file
@@ -0,0 +1,46 @@
|
||||
from PyQt6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
from gotify_tray.database import Settings
|
||||
|
||||
|
||||
settings = Settings("gotify-tray")
|
||||
|
||||
|
||||
class ImagePopup(QtWidgets.QLabel):
|
||||
def __init__(self, filename: str, pos: QtCore.QPoint, link: str = None):
|
||||
"""Create and show a pop-up image under the cursor
|
||||
|
||||
Args:
|
||||
filename (str): The path to the image to display
|
||||
pos (QtCore.QPoint): The location at which the image should be displayed
|
||||
link (str, optional): The URL of the image. Defaults to None.
|
||||
"""
|
||||
super(ImagePopup, self).__init__()
|
||||
self.link = link
|
||||
|
||||
self.setWindowFlags(QtCore.Qt.WindowType.ToolTip)
|
||||
self.installEventFilter(self)
|
||||
|
||||
self.setPixmap(
|
||||
QtGui.QPixmap(filename).scaled(
|
||||
settings.value("ImagePopup/w", type=int),
|
||||
settings.value("ImagePopup/h", type=int),
|
||||
QtCore.Qt.AspectRatioMode.KeepAspectRatio,
|
||||
)
|
||||
)
|
||||
self.move(pos - QtCore.QPoint(30, 30))
|
||||
self.show()
|
||||
|
||||
def eventFilter(self, object: QtCore.QObject, event: QtCore.QEvent) -> bool:
|
||||
if event.type() == QtCore.QEvent.Type.Leave:
|
||||
# Close the pop-up on mouse leave
|
||||
self.close()
|
||||
elif (
|
||||
event.type() == QtCore.QEvent.Type.MouseButtonPress
|
||||
and event.button() == QtCore.Qt.MouseButton.LeftButton
|
||||
and self.link
|
||||
):
|
||||
# Open the image URL on left click
|
||||
QtGui.QDesktopServices.openUrl(QtCore.QUrl(self.link))
|
||||
|
||||
return super().eventFilter(object, event)
|
||||
@@ -21,6 +21,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
delete_all = QtCore.pyqtSignal(QtGui.QStandardItem)
|
||||
delete_message = QtCore.pyqtSignal(MessagesModelItem)
|
||||
application_selection_changed = QtCore.pyqtSignal(QtGui.QStandardItem)
|
||||
image_popup = QtCore.pyqtSignal(str, QtCore.QPoint)
|
||||
|
||||
def __init__(
|
||||
self, application_model: ApplicationModel, messages_model: MessagesModel
|
||||
@@ -103,6 +104,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
self.messages_model.indexFromItem(message_item), message_widget
|
||||
)
|
||||
message_widget.deletion_requested.connect(self.delete_message.emit)
|
||||
message_widget.image_popup.connect(self.image_popup.emit)
|
||||
|
||||
def currentApplicationIndex(self) -> QtCore.QModelIndex:
|
||||
return self.listView_applications.selectionModel().currentIndex()
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
import os
|
||||
|
||||
from PyQt6 import QtCore, QtGui, QtWidgets
|
||||
|
||||
from ..models.MessagesModel import MessageItemDataRole, MessagesModelItem
|
||||
from ..designs.widget_message import Ui_Form
|
||||
from gotify_tray.database import Settings
|
||||
from gotify_tray.database import Cache, Settings
|
||||
from gotify_tray.utils import convert_links, get_abs_path
|
||||
|
||||
|
||||
@@ -11,6 +13,7 @@ settings = Settings("gotify-tray")
|
||||
|
||||
class MessageWidget(QtWidgets.QWidget, Ui_Form):
|
||||
deletion_requested = QtCore.pyqtSignal(MessagesModelItem)
|
||||
image_popup = QtCore.pyqtSignal(str, QtCore.QPoint)
|
||||
|
||||
def __init__(self, message_item: MessagesModelItem, image_path: str = ""):
|
||||
super(MessageWidget, self).__init__()
|
||||
@@ -86,7 +89,16 @@ class MessageWidget(QtWidgets.QWidget, Ui_Form):
|
||||
self.label_date.setFont(font_date)
|
||||
self.label_message.setFont(font_content)
|
||||
|
||||
def link_hovered_callback(self, link: str):
|
||||
if not settings.value("ImagePopup/enabled", type=bool):
|
||||
return
|
||||
|
||||
_, ext = os.path.splitext(link)
|
||||
if ext in [".jpg", ".jpeg", ".png"]:
|
||||
self.image_popup.emit(link, QtGui.QCursor.pos())
|
||||
|
||||
def link_callbacks(self):
|
||||
self.pb_delete.clicked.connect(
|
||||
lambda: self.deletion_requested.emit(self.message_item)
|
||||
)
|
||||
self.label_message.linkHovered.connect(self.link_hovered_callback)
|
||||
|
||||
@@ -86,6 +86,10 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog):
|
||||
)
|
||||
self.layout_fonts_message.addWidget(self.message_widget)
|
||||
|
||||
# Advanced
|
||||
self.cb_image_popup.setChecked(settings.value("ImagePopup/enabled", type=bool))
|
||||
# TODO: w/h
|
||||
|
||||
def change_server_info_callback(self):
|
||||
self.server_changed = verify_server(force_new=True, enable_import=False)
|
||||
|
||||
@@ -179,6 +183,7 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog):
|
||||
self.pb_export.clicked.connect(self.export_callback)
|
||||
self.pb_import.clicked.connect(self.import_callback)
|
||||
self.pb_reset.clicked.connect(self.reset_callback)
|
||||
self.cb_image_popup.stateChanged.connect(self.settings_changed_callback)
|
||||
|
||||
def apply_settings(self):
|
||||
# Priority
|
||||
@@ -211,6 +216,9 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog):
|
||||
self.message_widget.label_message.font().toString(),
|
||||
)
|
||||
|
||||
# Advanced
|
||||
settings.setValue("ImagePopup/enabled", self.cb_image_popup.isChecked())
|
||||
|
||||
self.settings_changed = False
|
||||
self.buttonBox.button(
|
||||
QtWidgets.QDialogButtonBox.StandardButton.Apply
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from .ImagePopup import ImagePopup
|
||||
from .MessageWidget import MessageWidget
|
||||
from .MainWindow import MainWindow
|
||||
from .ServerInfoDialog import ServerInfoDialog
|
||||
|
||||
Reference in New Issue
Block a user