From 5db0fc7785ed731ca724efff5a3c35933935b93f Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 28 Oct 2017 15:43:01 +0200 Subject: [PATCH 1/7] Add useragreement screen on first run of Cura CURA-4501 --- cura/CuraApplication.py | 1 + plugins/UserAgreementPlugin/UserAgreement.py | 50 +++++++++++++++ plugins/UserAgreementPlugin/UserAgreement.qml | 61 +++++++++++++++++++ plugins/UserAgreementPlugin/__init__.py | 10 +++ plugins/UserAgreementPlugin/plugin.json | 8 +++ 5 files changed, 130 insertions(+) create mode 100644 plugins/UserAgreementPlugin/UserAgreement.py create mode 100644 plugins/UserAgreementPlugin/UserAgreement.qml create mode 100644 plugins/UserAgreementPlugin/__init__.py create mode 100644 plugins/UserAgreementPlugin/plugin.json diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 2d1c35aca7..09dfe430d9 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -215,6 +215,7 @@ class CuraApplication(QtApplication): self.setRequiredPlugins([ "CuraEngineBackend", + "UserAgreement", "SolidView", "LayerView", "STLReader", diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py new file mode 100644 index 0000000000..148b1adecc --- /dev/null +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -0,0 +1,50 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Extension import Extension +from UM.Preferences import Preferences +from UM.Application import Application +from UM.PluginRegistry import PluginRegistry +from UM.Logger import Logger + +from PyQt5.QtQml import QQmlComponent, QQmlContext +from PyQt5.QtCore import QUrl, QObject, pyqtSlot + +import os.path + +class UserAgreement(Extension, QObject): + def __init__(self, parent = None): + QObject.__init__(self, parent) + Extension.__init__(self) + self._user_agreement_window = None + self._user_agreement_context = None + Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) + Preferences.getInstance().addPreference("general/accepted_user_agreement", False) + + def _onEngineCreated(self): + if not Preferences.getInstance().getValue("general/accepted_user_agreement"): + self.showUserAgreement() + + def showUserAgreement(self): + if not self._user_agreement_window: + self.createUserAgreementWindow() + + self._user_agreement_window.show() + + @pyqtSlot() + def disagreed(self): + Logger.log("i", "User did NOT Accept the license") + + @pyqtSlot() + def agreed(self): + Logger.log("i", "User Accepted the license") + Preferences.getInstance().setValue("general/accepted_user_agreement", True) + self._user_agreement_window.hide() + + def createUserAgreementWindow(self): + path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "UserAgreement.qml")) + + component = QQmlComponent(Application.getInstance()._engine, path) + self._user_agreement_context = QQmlContext(Application.getInstance()._engine.rootContext()) + self._user_agreement_context.setContextProperty("manager", self) + self._user_agreement_window = component.create(self._user_agreement_context) diff --git a/plugins/UserAgreementPlugin/UserAgreement.qml b/plugins/UserAgreementPlugin/UserAgreement.qml new file mode 100644 index 0000000000..20b4350acf --- /dev/null +++ b/plugins/UserAgreementPlugin/UserAgreement.qml @@ -0,0 +1,61 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.3 +import QtQuick.Layouts 1.1 +import QtQuick.Window 2.1 + +import UM 1.1 as UM + +UM.Dialog +{ + id: baseDialog + minimumWidth: Math.floor(UM.Theme.getSize("modal_window_minimum").width * 0.75) + minimumHeight: Math.floor(UM.Theme.getSize("modal_window_minimum").height * 0.5) + width: minimumWidth + height: minimumHeight + title: "User Agreement" + + TextArea + { + anchors.top: parent.top + width: parent.width + anchors.bottom: buttonRow.top + text: '

DISCLAIMER BY ULTIMAKER

+

PLEASE READ THIS DISCLAIMER CAREFULLY.

+

EXCEPT WHEN OTHERWISE STATED IN WRITING, ULTIMAKER PROVIDES ANY ULTIMAKER SOFTWARE OR THIRD PARTY SOFTWARE “AS IS” WITHOUT WARRANTY OF ANY KIND. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF ULTIMAKER SOFTWARE IS WITH YOU.

+

UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, IN NO EVENT WILL ULTIMAKER BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE ANY ULTIMAKER SOFTWARE OR THIRD PARTY SOFTWARE.

+ ' + readOnly: true; + textFormat: TextEdit.RichText + } + + Item + { + id: buttonRow + anchors.bottom: parent.bottom + width: parent.width + anchors.bottomMargin: UM.Theme.getSize("default_margin").height + + Button + { + anchors.right: parent.right + text: "I understand and agree" + onClicked: { + manager.agreed + } + } + + Button + { + anchors.left: parent.left + text: "I don't agree" + onClicked: { + manager.disagreed + } + } + + } + +} diff --git a/plugins/UserAgreementPlugin/__init__.py b/plugins/UserAgreementPlugin/__init__.py new file mode 100644 index 0000000000..635f8a6bc9 --- /dev/null +++ b/plugins/UserAgreementPlugin/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from . import UserAgreement + +def getMetaData(): + return {} + +def register(app): + return {"extension": UserAgreement.UserAgreement()} diff --git a/plugins/UserAgreementPlugin/plugin.json b/plugins/UserAgreementPlugin/plugin.json new file mode 100644 index 0000000000..aa5dbb1258 --- /dev/null +++ b/plugins/UserAgreementPlugin/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "UserAgreement", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Ask the user once if he/she agrees with our license", + "api": 4, + "i18n-catalog": "cura" +} From 910386eaf77b6936c3c2fce9f5682e9243db69cc Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 28 Oct 2017 15:43:26 +0200 Subject: [PATCH 2/7] remove unused import --- plugins/ChangeLogPlugin/ChangeLog.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/ChangeLogPlugin/ChangeLog.py b/plugins/ChangeLogPlugin/ChangeLog.py index 8d1e54f40c..a80779da50 100644 --- a/plugins/ChangeLogPlugin/ChangeLog.py +++ b/plugins/ChangeLogPlugin/ChangeLog.py @@ -8,7 +8,6 @@ from UM.Application import Application from UM.PluginRegistry import PluginRegistry from UM.Version import Version -from PyQt5.QtQuick import QQuickView from PyQt5.QtQml import QQmlComponent, QQmlContext from PyQt5.QtCore import QUrl, pyqtSlot, QObject From 8bfd10f9aad877d157b6e98654a1b64379c5d12d Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 28 Oct 2017 20:29:26 +0200 Subject: [PATCH 3/7] Refactor and cleanup CURA-4501 --- plugins/UserAgreementPlugin/UserAgreement.py | 22 +++++++++++-------- plugins/UserAgreementPlugin/UserAgreement.qml | 15 ++++++++----- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index 148b1adecc..c565399735 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -7,6 +7,8 @@ from UM.Application import Application from UM.PluginRegistry import PluginRegistry from UM.Logger import Logger +from cura.CuraApplication import CuraApplication + from PyQt5.QtQml import QQmlComponent, QQmlContext from PyQt5.QtCore import QUrl, QObject, pyqtSlot @@ -31,15 +33,17 @@ class UserAgreement(Extension, QObject): self._user_agreement_window.show() - @pyqtSlot() - def disagreed(self): - Logger.log("i", "User did NOT Accept the license") + @pyqtSlot(bool) + def didAgree(self, userChoice): + if userChoice: + Logger.log("i", 'User agreed to the user agreement') + Preferences.getInstance().setValue("general/accepted_user_agreement", True) + self._user_agreement_window.hide() + else: + Logger.log("i", 'User did NOT agree to the user agreement') + Preferences.getInstance().setValue("general/accepted_user_agreement", False) + CuraApplication.getInstance().quit() - @pyqtSlot() - def agreed(self): - Logger.log("i", "User Accepted the license") - Preferences.getInstance().setValue("general/accepted_user_agreement", True) - self._user_agreement_window.hide() def createUserAgreementWindow(self): path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "UserAgreement.qml")) @@ -47,4 +51,4 @@ class UserAgreement(Extension, QObject): component = QQmlComponent(Application.getInstance()._engine, path) self._user_agreement_context = QQmlContext(Application.getInstance()._engine.rootContext()) self._user_agreement_context.setContextProperty("manager", self) - self._user_agreement_window = component.create(self._user_agreement_context) + self._user_agreement_window = component.create(self._user_agreement_context) \ No newline at end of file diff --git a/plugins/UserAgreementPlugin/UserAgreement.qml b/plugins/UserAgreementPlugin/UserAgreement.qml index 20b4350acf..a2dd34e23f 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.qml +++ b/plugins/UserAgreementPlugin/UserAgreement.qml @@ -1,12 +1,10 @@ // Copyright (c) 2015 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.1 +import QtQuick 2.2 import QtQuick.Controls 1.3 -import QtQuick.Layouts 1.1 -import QtQuick.Window 2.1 -import UM 1.1 as UM +import UM 1.3 as UM UM.Dialog { @@ -43,7 +41,7 @@ UM.Dialog anchors.right: parent.right text: "I understand and agree" onClicked: { - manager.agreed + manager.didAgree(true) } } @@ -52,10 +50,15 @@ UM.Dialog anchors.left: parent.left text: "I don't agree" onClicked: { - manager.disagreed + manager.didAgree(false) } } } + onClosing: { + manager.didAgree(false) + } + + } From 0bdc1aad006a10cc764a9bd10e160e422b5f6c83 Mon Sep 17 00:00:00 2001 From: Mark Date: Sun, 29 Oct 2017 09:04:23 +0100 Subject: [PATCH 4/7] Fixed code comments CURA-4501 --- plugins/UserAgreementPlugin/UserAgreement.py | 11 +++++------ plugins/UserAgreementPlugin/UserAgreement.qml | 14 +++++++------- plugins/UserAgreementPlugin/__init__.py | 2 +- resources/i18n/cura.pot | 15 +++++++++++++++ 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index c565399735..5b6b266444 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from UM.Extension import Extension @@ -14,10 +14,9 @@ from PyQt5.QtCore import QUrl, QObject, pyqtSlot import os.path -class UserAgreement(Extension, QObject): +class UserAgreement(QObject, Extension): def __init__(self, parent = None): - QObject.__init__(self, parent) - Extension.__init__(self) + super(UserAgreement, self).__init__() self._user_agreement_window = None self._user_agreement_context = None Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) @@ -36,11 +35,11 @@ class UserAgreement(Extension, QObject): @pyqtSlot(bool) def didAgree(self, userChoice): if userChoice: - Logger.log("i", 'User agreed to the user agreement') + Logger.log('i', 'User agreed to the user agreement') Preferences.getInstance().setValue("general/accepted_user_agreement", True) self._user_agreement_window.hide() else: - Logger.log("i", 'User did NOT agree to the user agreement') + Logger.log('i', 'User did NOT agree to the user agreement') Preferences.getInstance().setValue("general/accepted_user_agreement", False) CuraApplication.getInstance().quit() diff --git a/plugins/UserAgreementPlugin/UserAgreement.qml b/plugins/UserAgreementPlugin/UserAgreement.qml index a2dd34e23f..52d35a4f44 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.qml +++ b/plugins/UserAgreementPlugin/UserAgreement.qml @@ -1,8 +1,8 @@ -// Copyright (c) 2015 Ultimaker B.V. +// Copyright (c) 2017 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 -import QtQuick.Controls 1.3 +import QtQuick.Controls 1.4 import UM 1.3 as UM @@ -13,7 +13,7 @@ UM.Dialog minimumHeight: Math.floor(UM.Theme.getSize("modal_window_minimum").height * 0.5) width: minimumWidth height: minimumHeight - title: "User Agreement" + title: catalog.i18nc("@title:window", "User Agreement") TextArea { @@ -36,10 +36,12 @@ UM.Dialog width: parent.width anchors.bottomMargin: UM.Theme.getSize("default_margin").height + UM.I18nCatalog { id: catalog; name:"cura" } + Button { anchors.right: parent.right - text: "I understand and agree" + text: catalog.i18nc("@action:button", "I understand and agree") onClicked: { manager.didAgree(true) } @@ -48,7 +50,7 @@ UM.Dialog Button { anchors.left: parent.left - text: "I don't agree" + text: catalog.i18nc("@action:button", "I don't agree") onClicked: { manager.didAgree(false) } @@ -59,6 +61,4 @@ UM.Dialog onClosing: { manager.didAgree(false) } - - } diff --git a/plugins/UserAgreementPlugin/__init__.py b/plugins/UserAgreementPlugin/__init__.py index 635f8a6bc9..88cb151f9e 100644 --- a/plugins/UserAgreementPlugin/__init__.py +++ b/plugins/UserAgreementPlugin/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from . import UserAgreement diff --git a/resources/i18n/cura.pot b/resources/i18n/cura.pot index fb4b9ed0d6..99ccd7a459 100644 --- a/resources/i18n/cura.pot +++ b/resources/i18n/cura.pot @@ -18,6 +18,21 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +#Manually added for plugins/UserAgreementPlugin/UserAgreement.qml +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + +#Manually added for plugins/UserAgreementPlugin/UserAgreement.qml +msgctxt "@action:button" +msgid "I understand and agree" +msgstr "" + +#Manually added for plugins/UserAgreementPlugin/UserAgreement.qml +msgctxt "@action:button" +msgid "I don't agree" +msgstr "" + #: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml msgctxt "@label:status" msgid "Print aborted" From 85f7b1ac03786cd86838ac7020f15ce4ccdb00c5 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 30 Oct 2017 10:32:45 +0100 Subject: [PATCH 5/7] Fix code style CURA-4501 --- plugins/UserAgreementPlugin/UserAgreement.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index 5b6b266444..cfad13dfae 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -35,11 +35,11 @@ class UserAgreement(QObject, Extension): @pyqtSlot(bool) def didAgree(self, userChoice): if userChoice: - Logger.log('i', 'User agreed to the user agreement') + Logger.log("i", "User agreed to the user agreement") Preferences.getInstance().setValue("general/accepted_user_agreement", True) self._user_agreement_window.hide() else: - Logger.log('i', 'User did NOT agree to the user agreement') + Logger.log("i", "User did NOT agree to the user agreement") Preferences.getInstance().setValue("general/accepted_user_agreement", False) CuraApplication.getInstance().quit() From c0f1af94ab6486def6030e7169f2948a0dda8312 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 30 Oct 2017 10:33:49 +0100 Subject: [PATCH 6/7] Show Add Machine dialog after User Agreement dialog is closed CURA-4501 --- cura/CuraApplication.py | 19 +++++++++++++++++++ plugins/UserAgreementPlugin/UserAgreement.py | 4 ++-- resources/qml/Cura.qml | 5 +++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 09dfe430d9..9da820c8a2 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -305,6 +305,9 @@ class CuraApplication(QtApplication): preferences.addPreference("view/invert_zoom", False) + self._need_to_show_user_agreement = not Preferences.getInstance().getValue("general/accepted_user_agreement") + self._has_user_agreement_shown = False + for key in [ "dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin "dialog_profile_path", @@ -377,6 +380,22 @@ class CuraApplication(QtApplication): def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) + onHasUserAgreementShownChanged = pyqtSignal() + + @pyqtProperty(bool) + def needToShowUserAgreement(self): + return self._need_to_show_user_agreement + + @pyqtProperty(bool, notify = onHasUserAgreementShownChanged) + def hasUserAgreementShown(self): + return self._has_user_agreement_shown + + def setHasShownUserAgreement(self, shown = True): + emit_signal = self._has_user_agreement_shown != shown + self._has_user_agreement_shown = shown + if emit_signal: + self.onHasUserAgreementShownChanged.emit() + ## The "Quit" button click event handler. @pyqtSlot() def closeApplication(self): diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index cfad13dfae..01788f7b57 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -42,7 +42,7 @@ class UserAgreement(QObject, Extension): Logger.log("i", "User did NOT agree to the user agreement") Preferences.getInstance().setValue("general/accepted_user_agreement", False) CuraApplication.getInstance().quit() - + CuraApplication.getInstance().setHasShownUserAgreement(True) def createUserAgreementWindow(self): path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "UserAgreement.qml")) @@ -50,4 +50,4 @@ class UserAgreement(QObject, Extension): component = QQmlComponent(Application.getInstance()._engine, path) self._user_agreement_context = QQmlContext(Application.getInstance()._engine.rootContext()) self._user_agreement_context.setContextProperty("manager", self) - self._user_agreement_window = component.create(self._user_agreement_context) \ No newline at end of file + self._user_agreement_window = component.create(self._user_agreement_context) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index cb0211f29f..8439d79d21 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -894,6 +894,11 @@ UM.MainWindow if(!base.visible) { base.visible = true; + } + + // check later if the user agreement dialog has been closed + if (CuraApplication.needToShowUserAgreement && !CuraApplication.hasUserAgreementShown) + { restart(); } else if(Cura.MachineManager.activeMachineId == null || Cura.MachineManager.activeMachineId == "") From 22aaf64b637d44f108f66c01837b35880cd02c68 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 30 Oct 2017 14:42:46 +0100 Subject: [PATCH 7/7] Simplified version for validation need to show user agreement CURA-4501 --- cura/CuraApplication.py | 13 ++----------- plugins/UserAgreementPlugin/UserAgreement.py | 2 +- resources/qml/Cura.qml | 2 +- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 9da820c8a2..161660c0a4 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -306,7 +306,6 @@ class CuraApplication(QtApplication): preferences.addPreference("view/invert_zoom", False) self._need_to_show_user_agreement = not Preferences.getInstance().getValue("general/accepted_user_agreement") - self._has_user_agreement_shown = False for key in [ "dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin @@ -380,21 +379,13 @@ class CuraApplication(QtApplication): def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) - onHasUserAgreementShownChanged = pyqtSignal() - @pyqtProperty(bool) def needToShowUserAgreement(self): return self._need_to_show_user_agreement - @pyqtProperty(bool, notify = onHasUserAgreementShownChanged) - def hasUserAgreementShown(self): - return self._has_user_agreement_shown - def setHasShownUserAgreement(self, shown = True): - emit_signal = self._has_user_agreement_shown != shown - self._has_user_agreement_shown = shown - if emit_signal: - self.onHasUserAgreementShownChanged.emit() + def setNeedToShowUserAgreement(self, set_value = True): + self._need_to_show_user_agreement = set_value ## The "Quit" button click event handler. @pyqtSlot() diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index 01788f7b57..f472b6fb13 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -42,7 +42,7 @@ class UserAgreement(QObject, Extension): Logger.log("i", "User did NOT agree to the user agreement") Preferences.getInstance().setValue("general/accepted_user_agreement", False) CuraApplication.getInstance().quit() - CuraApplication.getInstance().setHasShownUserAgreement(True) + CuraApplication.getInstance().setNeedToShowUserAgreement(False) def createUserAgreementWindow(self): path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "UserAgreement.qml")) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 8439d79d21..2fd19a8a03 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -897,7 +897,7 @@ UM.MainWindow } // check later if the user agreement dialog has been closed - if (CuraApplication.needToShowUserAgreement && !CuraApplication.hasUserAgreementShown) + if (CuraApplication.needToShowUserAgreement) { restart(); }