diff --git a/cura/API/Account.py b/cura/API/Account.py index 8a8b708cfa..30401454b3 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -76,6 +76,9 @@ class Account(QObject): self._error_message.hide() self._error_message = Message(error_message, title = i18n_catalog.i18nc("@info:title", "Login failed")) self._error_message.show() + self._logged_in = False + self.loginStateChanged.emit(False) + return if self._logged_in != logged_in: self._logged_in = logged_in diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index 377ec080aa..dd20ea1d96 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -10,12 +10,16 @@ import requests.exceptions from UM.Logger import Logger +from UM.Message import Message from UM.Signal import Signal from cura.OAuth2.LocalAuthorizationServer import LocalAuthorizationServer from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers, TOKEN_TIMESTAMP_FORMAT from cura.OAuth2.Models import AuthenticationResponse +from UM.i18n import i18nCatalog +i18n_catalog = i18nCatalog("cura") + if TYPE_CHECKING: from cura.OAuth2.Models import UserProfile, OAuth2Settings from UM.Preferences import Preferences @@ -39,6 +43,14 @@ class AuthorizationService: self._preferences = preferences self._server = LocalAuthorizationServer(self._auth_helpers, self._onAuthStateChanged, daemon=True) + self._unable_to_get_data_message = None # type: Optional[Message] + + self.onAuthStateChanged.connect(self._authChanged) + + def _authChanged(self, logged_in): + if logged_in and self._unable_to_get_data_message is not None: + self._unable_to_get_data_message.hide() + def initialize(self, preferences: Optional["Preferences"] = None) -> None: if preferences is not None: self._preferences = preferences @@ -161,7 +173,18 @@ class AuthorizationService: preferences_data = json.loads(self._preferences.getValue(self._settings.AUTH_DATA_PREFERENCE_KEY)) if preferences_data: self._auth_data = AuthenticationResponse(**preferences_data) - self.onAuthStateChanged.emit(logged_in = True) + # Also check if we can actually get the user profile information. + user_profile = self.getUserProfile() + if user_profile is not None: + self.onAuthStateChanged.emit(logged_in = True) + else: + if self._unable_to_get_data_message is not None: + self._unable_to_get_data_message.hide() + + self._unable_to_get_data_message = Message(i18n_catalog.i18nc("@info", "Unable to reach the Ultimaker account server."), title = i18n_catalog.i18nc("@info:title", "Warning")) + self._unable_to_get_data_message.addAction("retry", i18n_catalog.i18nc("@action:button", "Retry"), "[no_icon]", "[no_description]") + self._unable_to_get_data_message.actionTriggered.connect(self._onMessageActionTriggered) + self._unable_to_get_data_message.show() except ValueError: Logger.logException("w", "Could not load auth data from preferences") @@ -178,3 +201,7 @@ class AuthorizationService: else: self._user_profile = None self._preferences.resetPreference(self._settings.AUTH_DATA_PREFERENCE_KEY) + + def _onMessageActionTriggered(self, _, action): + if action == "retry": + self.loadAuthDataFromPreferences() diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 797d6dabec..ec00329f86 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -69,8 +69,7 @@ class SolidView(View): if support_angle_stack is not None and Application.getInstance().getPreferences().getValue("view/show_overhang"): angle = support_angle_stack.getProperty("support_angle", "value") # Make sure the overhang angle is valid before passing it to the shader - # Note: if the overhang angle is set to its default value, it does not need to get validated (validationState = None) - if angle is not None and global_container_stack.getProperty("support_angle", "validationState") in [None, ValidatorState.Valid]: + if angle is not None and angle >= 0 and angle <= 90: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(90 - angle))) else: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) #Overhang angle of 0 causes no area at all to be marked as overhang.