Warning, /plasma/qqc2-breeze-style/style/qtquickcontrols/TabButton.qml is written in an unsupported language. File is not indexed.

0001 /* SPDX-FileCopyrightText: 2020 Noah Davis <noahadvs@gmail.com>
0002  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0003  */
0004 
0005 import QtQuick
0006 import QtQuick.Templates as T
0007 import org.kde.kirigami as Kirigami
0008 import org.kde.breeze
0009 import org.kde.breeze.impl as Impl
0010 
0011 T.TabButton {
0012     id: control
0013 
0014     readonly property bool __inTabBar: T.TabBar.tabBar != null
0015     readonly property bool __hasLeftSeparator: background && background.hasOwnProperty("leftSeparatorLine")
0016     readonly property bool __hasRightSeparator: background && background.hasOwnProperty("rightSeparatorLine")
0017     readonly property bool __inHeader: T.TabBar.position === T.TabBar.Header
0018     readonly property bool __inFooter: T.TabBar.position === T.TabBar.Footer
0019 
0020     implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
0021                             implicitContentWidth + leftPadding + rightPadding,
0022                             implicitIndicatorWidth + leftPadding + rightPadding)
0023     implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
0024                              implicitContentHeight + topPadding + bottomPadding,
0025                              implicitIndicatorHeight + topPadding + bottomPadding)
0026 
0027     padding: Kirigami.Units.mediumSpacing
0028     leftPadding: {
0029         if ((!contentItem.hasIcon && contentItem.textBesideIcon) // False if contentItem has been replaced
0030             || display == T.AbstractButton.TextOnly
0031             || display == T.AbstractButton.TextUnderIcon) {
0032             return Impl.Units.mediumHorizontalPadding
0033         } else {
0034             return control.horizontalPadding
0035         }
0036     }
0037     rightPadding: {
0038         if (contentItem.hasLabel && display != T.AbstractButton.IconOnly) { // False if contentItem has been replaced
0039             return Impl.Units.mediumHorizontalPadding
0040         } else {
0041             return control.horizontalPadding
0042         }
0043     }
0044 
0045     leftInset: {
0046         if (!mirrored && __hasLeftSeparator && background.leftSeparatorLine.visible) {
0047             return background.leftSeparatorLine.width
0048         } else if (mirrored && __hasRightSeparator && background.rightSeparatorLine.visible) {
0049             return background.rightSeparatorLine.width
0050         } else {
0051             return 0
0052         }
0053     }
0054     rightInset: {
0055         if (!mirrored && __hasRightSeparator && background.leftSeparatorLine.visible) {
0056             return background.rightSeparatorLine.width
0057         } else if (mirrored && __hasLeftSeparator && background.rightSeparatorLine.visible) {
0058             return background.leftSeparatorLine.width
0059         } else {
0060             return 0
0061         }
0062     }
0063 
0064     spacing: Kirigami.Units.mediumSpacing
0065 
0066     icon.width: Kirigami.Units.iconSizes.sizeForLabels
0067     icon.height: Kirigami.Units.iconSizes.sizeForLabels
0068 
0069     Kirigami.Theme.colorSet: {
0070         if (control.__inTabBar && !(control.checked)) {
0071             return T.TabBar.tabBar.Kirigami.Theme.colorSet
0072         } else {
0073             return Kirigami.Theme.Button
0074         }
0075     }
0076     Kirigami.Theme.inherit: !(background && background.visible)
0077 
0078     contentItem:Impl.IconLabelContent {
0079         control: control
0080     }
0081 
0082     //TODO: tweak the appearance. This is just to have something usable and reasonably close to what we want.
0083     background: Rectangle {
0084         implicitHeight: Impl.Units.mediumControlHeight + (Kirigami.Units.smallSpacing * 2) // fill TabBar
0085         implicitWidth: implicitHeight
0086         color: control.checked ? Kirigami.Theme.backgroundColor : "transparent"
0087 
0088         property Rectangle leftSeparatorLine: Rectangle {
0089             parent: control.background
0090             visible: control.T.TabBar.index != 0 && control.checked
0091             Kirigami.Theme.colorSet: Kirigami.Theme.Button
0092             Kirigami.Theme.inherit: false
0093             anchors.left: parent.left
0094             anchors.leftMargin: -control.leftInset
0095             anchors.verticalCenter: parent.verticalCenter
0096             width: 1
0097             height: control.checked ? parent.height : Math.min(parent.height, Kirigami.Units.gridUnit)
0098             color: Impl.Theme.separatorColor()
0099             Behavior on height {
0100                 NumberAnimation {
0101                     easing.type: Easing.InOutQuad
0102                     duration: Kirigami.Units.longDuration
0103                 }
0104             }
0105         }
0106 
0107         property Rectangle rightSeparatorLine: Rectangle {
0108             parent: control.background
0109             visible: control.__inTabBar && control.T.TabBar.index != control.T.TabBar.tabBar.count - 1 && control.checked
0110             Kirigami.Theme.colorSet: Kirigami.Theme.Button
0111             Kirigami.Theme.inherit: false
0112             anchors.right: parent.right
0113             anchors.rightMargin: -control.rightInset
0114             anchors.verticalCenter: parent.verticalCenter
0115             width: 1
0116             height: parent.leftSeparatorLine.height
0117             color: Impl.Theme.separatorColor()
0118         }
0119 
0120         Rectangle {
0121             id: thickHighlightLine
0122             anchors.left: parent.left
0123             anchors.right: parent.right
0124             anchors.leftMargin: -control.leftInset
0125             anchors.rightMargin: -control.rightInset
0126             y: control.__inHeader ? 0 : parent.height - height
0127             height: Impl.Units.highlightLineThickness
0128             opacity: control.visualFocus || control.checked || control.hovered || control.down ? 1 : 0
0129             Kirigami.Theme.colorSet: Kirigami.Theme.Button
0130             Kirigami.Theme.inherit: false
0131             color: {
0132                 if (control.visualFocus) {
0133                     Kirigami.Theme.alternateBackgroundColor
0134                 } else if (control.checked || control.down) {
0135                     Kirigami.Theme.focusColor
0136                 } else {
0137                     Impl.Theme.separatorColor()
0138                 }
0139             }
0140             Behavior on opacity {
0141                 OpacityAnimator {
0142                     easing.type: Easing.OutCubic
0143                     duration: Kirigami.Units.shortDuration
0144                 }
0145             }
0146             Behavior on color {
0147                 ColorAnimation {
0148                     easing.type: Easing.InOutQuad
0149                     duration: Kirigami.Units.longDuration
0150                 }
0151             }
0152         }
0153 
0154         Rectangle {
0155             id: thinHighlightLine
0156             anchors.left: parent.left
0157             anchors.right: parent.right
0158             anchors.leftMargin: -control.leftInset
0159             anchors.rightMargin: -control.rightInset
0160             y: control.__inHeader ? 0 : parent.height - height
0161             height: 1
0162             opacity: control.visualFocus ? 1 : 0
0163             Kirigami.Theme.colorSet: Kirigami.Theme.Button
0164             Kirigami.Theme.inherit: false
0165             color: Kirigami.Theme.focusColor
0166             Behavior on opacity {
0167                 OpacityAnimator {
0168                     easing.type: Easing.OutCubic
0169                     duration: Kirigami.Units.shortDuration
0170                 }
0171             }
0172         }
0173     }
0174 }