// Copyright (c) 2022 Proton AG // // This file is part of Proton Mail Bridge. // // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Proton Mail Bridge is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Proton Mail Bridge. If not, see . import QtQuick 2.12 import QtQuick.Templates 2.12 as T import QtQuick.Controls 2.12 import QtQuick.Controls.impl 2.12 T.Switch { property ColorScheme colorScheme property bool loading: false // TODO: store previous enabled state and restore it? // For now assuming that only enabled buttons could have loading state onLoadingChanged: { if (loading) { enabled = false } else { enabled = true } } id: control implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, implicitContentWidth + leftPadding + rightPadding) implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, implicitContentHeight + topPadding + bottomPadding, implicitIndicatorHeight + topPadding + bottomPadding) padding: 0 spacing: 7 indicator: Rectangle { implicitWidth: 40 implicitHeight: 24 x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2 y: control.topPadding + (control.availableHeight - height) / 2 radius: height / 2. color: control.enabled || control.loading ? control.colorScheme.background_norm : control.colorScheme.background_strong border.width: control.enabled && !loading ? 1 : 0 border.color: control.hovered ? control.colorScheme.field_hover : control.colorScheme.field_norm Rectangle { x: Math.max(0, Math.min(parent.width - width, control.visualPosition * parent.width - (width / 2))) y: (parent.height - height) / 2 width: 24 height: 24 radius: parent.radius visible: !loading color: { if (!control.enabled) { return control.colorScheme.field_disabled } if (control.checked) { if (control.hovered || control.activeFocus) { return control.colorScheme.interaction_norm_hover } return control.colorScheme.interaction_norm } if (control.hovered || control.activeFocus) { return control.colorScheme.field_hover } return control.colorScheme.field_norm } ColorImage { x: (parent.width - width) / 2 y: (parent.height - height) / 2 width: 16 height: 16 sourceSize.width: 16 sourceSize.height: 16 color: "#FFFFFF" source: "../icons/ic-check.svg" visible: control.checked } Behavior on x { enabled: !control.down SmoothedAnimation { velocity: 200 } } } ColorImage { id: loadingImage x: parent.width - width y: (parent.height - height) / 2 width: 18 height: 18 sourceSize.width: 18 sourceSize.height: 18 color: control.colorScheme.interaction_norm_hover source: "../icons/Loader_16.svg" visible: control.loading RotationAnimation { target: loadingImage loops: Animation.Infinite duration: 1000 from: 0 to: 360 direction: RotationAnimation.Clockwise running: control.loading } } } contentItem: CheckLabel { id: label leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0 rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0 text: control.text color: control.enabled || control.loading ? control.colorScheme.text_norm : control.colorScheme.text_disabled font.family: Style.font_family font.weight: Style.fontWeight_400 font.pixelSize: Style.body_font_size lineHeight: Style.body_line_height lineHeightMode: Text.FixedHeight font.letterSpacing: Style.body_letter_spacing } }