Skip to content

Commit 894e189

Browse files
committed
overlay.py: Implement non-intrusive notifications
1 parent 73d93ee commit 894e189

File tree

6 files changed

+674
-69
lines changed

6 files changed

+674
-69
lines changed

Orange/canvas/__main__.py

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -180,34 +180,6 @@ def make_sql_logger(level=logging.INFO):
180180
sql_log.addHandler(handler)
181181

182182

183-
def show_survey():
184-
# If run for the first time, open a browser tab with a survey
185-
settings = QSettings()
186-
show_survey = settings.value("startup/show-survey", True, type=bool)
187-
if show_survey:
188-
question = QMessageBox(
189-
QMessageBox.Question,
190-
'Orange Survey',
191-
'We would like to know more about how our software is used.\n\n'
192-
'Would you care to fill our short 1-minute survey?',
193-
QMessageBox.Yes | QMessageBox.No)
194-
question.setDefaultButton(QMessageBox.Yes)
195-
later = question.addButton('Ask again later', QMessageBox.NoRole)
196-
question.setEscapeButton(later)
197-
198-
def handle_response(result):
199-
if result == QMessageBox.Yes:
200-
success = QDesktopServices.openUrl(
201-
QUrl("https://orange.biolab.si/survey/short.html"))
202-
settings.setValue("startup/show-survey", not success)
203-
else:
204-
settings.setValue("startup/show-survey", result != QMessageBox.No)
205-
206-
question.finished.connect(handle_response)
207-
question.show()
208-
return question
209-
210-
211183
def check_for_updates():
212184
settings = QSettings()
213185
check_updates = settings.value('startup/check-updates', True, type=bool)
@@ -433,6 +405,8 @@ def onrequest(url):
433405

434406
settings = QSettings()
435407

408+
settings.setValue('startup/launch-count', settings.value('startup/launch-count', 0, int) + 1)
409+
436410
stylesheet = options.stylesheet or defaultstylesheet
437411
stylesheet_string = None
438412

@@ -558,7 +532,6 @@ def show_message(message):
558532
canvas_window.load_scheme(open_requests[-1].toLocalFile())
559533

560534
# local references prevent destruction
561-
survey = show_survey()
562535
update_check = check_for_updates()
563536
send_stat = send_usage_statistics()
564537

@@ -591,7 +564,6 @@ def show_message(message):
591564
status = 42
592565

593566
del canvas_window
594-
del survey
595567
del update_check
596568
del send_stat
597569

Orange/canvas/application/canvasmain.py

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,14 @@ def user_documents_path():
5353
return QDesktopServices.storageLocation(
5454
QDesktopServices.DocumentsLocation)
5555

56-
from ...widgets.utils.overlay import MessageOverlayWidget
57-
5856
from ..gui.dropshadow import DropShadowFrame
5957
from ..gui.dock import CollapsibleDockWidget
6058
from ..gui.quickhelp import QuickHelpTipEvent
6159
from ..gui.utils import message_critical, message_question, \
6260
message_warning, message_information
6361

62+
from ..utils.overlay import NotificationWidget, NotificationOverlay
63+
6464
from ..document.usagestatistics import UsageStatistics
6565

6666
from ..help import HelpManager
@@ -384,15 +384,48 @@ def touch():
384384

385385
self.setMinimumSize(600, 500)
386386

387-
# ask for anonymous data collection permission
388-
def requestDataCollectionPermission():
389-
permDialogButtons = MessageOverlayWidget.AcceptRole | MessageOverlayWidget.RejectRole
390-
permDialog = MessageOverlayWidget(parent=w,
391-
text="Do you wish to share anonymous usage "
392-
"statistics to help improve Orange?",
387+
self.notification_overlay = NotificationOverlay(self.scheme_widget)
388+
389+
self.setup_notifications()
390+
391+
def setup_notifications(self):
392+
settings = config.settings()
393+
394+
# If run for the first time, prompt short survey
395+
show_survey = settings["startup/show-survey"]
396+
if show_survey:
397+
surveyDialogButtons = NotificationWidget.Ok | NotificationWidget.Close
398+
surveyDialog = NotificationWidget(parent=self.scheme_widget,
399+
icon=QIcon("Orange/Dlg_down3.png"),
400+
title="Survey",
401+
text="We want to get to know our users better.\n"
402+
"Would you care to fill out a "
403+
"1-minute survey?",
393404
wordWrap=True,
394-
standardButtons=permDialogButtons)
395-
btnOK = permDialog.button(MessageOverlayWidget.AcceptRole)
405+
standardButtons=surveyDialogButtons)
406+
407+
def handle_response(button):
408+
if surveyDialog.buttonRole(button) == NotificationWidget.AcceptRole:
409+
success = QDesktopServices.openUrl(
410+
QUrl("https://orange.biolab.si/survey/short.html"))
411+
settings["startup/show-survey"] = not success
412+
elif surveyDialog.buttonRole(button) == NotificationWidget.RejectRole:
413+
settings["startup/show-survey"] = False
414+
415+
surveyDialog.clicked.connect(handle_response)
416+
417+
surveyDialog.setWidget(self.scheme_widget)
418+
surveyDialog.show()
419+
420+
# data collection permission
421+
if not settings["error-reporting/permission-requested"]:
422+
permDialogButtons = NotificationWidget.AcceptRole | NotificationWidget.RejectRole
423+
permDialog = NotificationWidget(parent=self.scheme_widget,
424+
text="Do you wish to share anonymous usage "
425+
"statistics to help improve Orange?",
426+
wordWrap=True,
427+
standardButtons=permDialogButtons)
428+
btnOK = permDialog.button(NotificationWidget.AcceptRole)
396429
btnOK.setText("Allow")
397430

398431
def respondToRequest():
@@ -405,22 +438,18 @@ def shareData():
405438
permDialog.accepted.connect(shareData)
406439

407440
permDialog.setStyleSheet("""
408-
MessageOverlayWidget {
409-
background: qlineargradient(
410-
x1: 0, y1: 0, x2: 0, y2: 1,
411-
stop:0 #666, stop:0.3 #6D6D6D, stop:1 #666)
412-
}
413-
MessageOverlayWidget QLabel#text-label {
414-
color: white;
415-
}""")
416-
417-
permDialog.setWidget(w)
441+
MessageOverlayWidget {
442+
background: qlineargradient(
443+
x1: 0, y1: 0, x2: 0, y2: 1,
444+
stop:0 #666, stop:0.3 #6D6D6D, stop:1 #666)
445+
}
446+
MessageOverlayWidget QLabel#text-label {
447+
color: white;
448+
}""")
449+
450+
permDialog.setWidget(self.scheme_widget)
418451
permDialog.show()
419452

420-
settings = config.settings()
421-
if not settings["error-reporting/permission-requested"]:
422-
requestDataCollectionPermission()
423-
424453
def setup_actions(self):
425454
"""Initialize main window actions.
426455
"""
@@ -1912,6 +1941,7 @@ def closeEvent(self, event):
19121941
settings.endGroup()
19131942
self.help_dock.close()
19141943
self.log_dock.close()
1944+
self.notification_overlay.close()
19151945
super().closeEvent(event)
19161946

19171947
__did_restore = False

Orange/canvas/config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ def init():
5656
("startup/check-updates", bool, True,
5757
"Check for updates"),
5858

59+
("startup/launch-count", int, 0, ""),
60+
5961
("stylesheet", str, "orange",
6062
"QSS stylesheet to use"),
6163

Orange/canvas/gui/stackedwidget.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,25 @@ def maximumSize(self):
8686
else:
8787
return QStackedLayout.maximumSize(self)
8888

89+
def hasHeightForWidth(self) -> bool:
90+
current = self.currentWidget()
91+
if current is not None:
92+
return current.hasHeightForWidth()
93+
else:
94+
return False
95+
96+
def heightForWidth(self, width: int) -> int:
97+
current = self.currentWidget()
98+
if current is not None:
99+
return current.heightForWidth(width)
100+
else:
101+
return -1
102+
89103
def geometry(self):
90104
# Reimplemented due to QTBUG-47107.
91105
return QRect(self.__rect)
92106

93-
def setGeometry(self, rect):
94-
# type: (QRect) -> None
107+
def setGeometry(self, rect: QRect) -> None:
95108
if rect == self.__rect:
96109
return
97110
self.__rect = QRect(rect)

0 commit comments

Comments
 (0)