Skip to content

Commit f30ad01

Browse files
committed
Fix scaling issues for notifications with long texts
- If a notification contained a large body of text, and wordWrap is on, it took up too much vertical space. This has been fixed and the notification now takes up the minimum vertical space required.
1 parent 687faa6 commit f30ad01

File tree

3 files changed

+25
-10
lines changed

3 files changed

+25
-10
lines changed

QNotifications/QNotification.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,19 @@
3030
__author__ = u"Daniel Schreij"
3131
__license__ = u"GPLv3"
3232

33+
class MessageLabel(QtWidgets.QLabel):
34+
""" Subclass of QLabel, which reimplements the resizeEvent() function. This
35+
is necessary because otherwise the notifications take up too much vertical
36+
space when texts they display become longer. This is because normally the height
37+
of a notification is calculated as the minimum height necessary for the text
38+
when the widget is horizontally resized to its minimum. """
39+
40+
def resizeEvent(self, event):
41+
super(MessageLabel, self).resizeEvent(event)
42+
if ( self.wordWrap() and \
43+
self.sizePolicy().verticalPolicy() == QtWidgets.QSizePolicy.Minimum ):
44+
self.setMaximumHeight( self.heightForWidth( self.width() ) )
45+
3346
class QNotification(QtWidgets.QWidget):
3447
""" Class representing a single notification """
3548

@@ -55,15 +68,20 @@ def __init__(self, message, category, *args, **kwargs):
5568
# Set Object name for reference
5669
self.setObjectName(category)
5770
self.setLayout(QtWidgets.QHBoxLayout())
71+
self.setContentsMargins(0,0,0,0)
72+
# self.setSizePolicy(QtWidgets.QSizePolicy.Minimum,
73+
# QtWidgets.QSizePolicy.Fixed)
5874

5975
# Create a message area
6076
#contents = QtWidgets.QWidget(self)
6177
messageArea = QtWidgets.QHBoxLayout()
6278
messageArea.setContentsMargins(0,0,0,0)
6379

6480
# Create the layout
65-
self.message_display = QtWidgets.QLabel()
81+
self.message_display = MessageLabel()
6682
self.message_display.setObjectName("message")
83+
self.message_display.setSizePolicy(QtWidgets.QSizePolicy.Minimum,
84+
QtWidgets.QSizePolicy.Minimum)
6785
self.message_display.setWordWrap(True)
6886

6987
# Create a button that can close notifications
@@ -75,7 +93,7 @@ def __init__(self, message, category, *args, **kwargs):
7593

7694
# Add everything together
7795
messageArea.addWidget(self.message_display)
78-
messageArea.addStretch(1)
96+
# messageArea.addStretch(1)
7997
messageArea.addWidget(close_button)
8098
self.layout().addLayout(messageArea)
8199

QNotifications/QNotificationArea.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class QNotificationArea(QtWidgets.QWidget):
4646
color: #FFFFFF;
4747
padding: 0px;
4848
margin: 0px;
49+
width: 100%;
4950
}
5051
5152
QNotification #closeButton{
@@ -115,7 +116,7 @@ def __init__(self, targetWidget, *args, **kwargs):
115116

116117
# Store original target classes resizeEvent to be called in our own
117118
# function
118-
self.old_target_resize_event = targetWidget.resizeEvent
119+
self.target_resize_event = targetWidget.resizeEvent
119120
# Overwrite resizeEvent function of targetWidget to capture it ourself
120121
# (parent's resizeEvent will be called in our function too)
121122
self.targetWidget.resizeEvent = self.resizeEvent
@@ -244,9 +245,10 @@ def remove(self, notification = None):
244245
# Internal Qt functions
245246
def resizeEvent(self, event):
246247
""" Internal QT functions (do not call directly) """
247-
self.old_target_resize_event(event)
248+
self.target_resize_event(event)
248249
newsize = event.size()
249250
self.setFixedWidth(newsize.width())
251+
self.adjustSize()
250252

251253
def paintEvent(self, pe):
252254
""" redefinition of paintEvent, to make class QNotificationArea available

example.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def __setup_widget(self):
6161
duration_label = QtWidgets.QLabel("Display duration: (ms)", display_widget)
6262
self.message_duration = QtWidgets.QSpinBox(display_widget)
6363
self.message_duration.setRange(500, 5000)
64-
self.message_duration.setValue(2000)
64+
self.message_duration.setValue(5000)
6565
self.message_duration.setSingleStep(50)
6666
# Entry effect
6767
entryeffect_label = QtWidgets.QLabel("Entry effect: ", display_widget)
@@ -114,7 +114,6 @@ def __setup_notification_area(self, targetWidget):
114114
return notification_area
115115

116116
def __process_combo_change(self, val):
117-
new_selection = val
118117
if self.sender() == self.entry_dropdown:
119118
if val == "None":
120119
self.entryduration_label.setDisabled(True)
@@ -164,7 +163,3 @@ def __submit_message(self):
164163
print("App exiting with code {}".format(exitcode))
165164
del(example)
166165
sys.exit(exitcode)
167-
168-
169-
170-

0 commit comments

Comments
 (0)