forked from qt-creator/qt-creator
Change-Id: Ia81c3a3c224dcea531d3d90d1e0ef787e1d62179 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
178 lines
5.3 KiB
QML
178 lines
5.3 KiB
QML
// Copyright (C) 2023 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
|
|
|
import QtQuick
|
|
import QtQuick.Controls
|
|
import QtQuick.Shapes
|
|
import StudioTheme 1.0 as StudioTheme
|
|
|
|
Item {
|
|
id: root
|
|
antialiasing: true
|
|
|
|
property int modelSize
|
|
|
|
/* Colors might come from Theme */
|
|
property color idleBackgroundColor: StudioTheme.Values.themeControlBackground_toolbarIdle
|
|
property color idleStrokeColor: StudioTheme.Values.controlOutline_toolbarIdle
|
|
property color idleTextColor: StudioTheme.Values.themeTextColor
|
|
property color hoverBackgroundColor: StudioTheme.Values.themeControlBackground_topToolbarHover
|
|
property color hoverStrokeColor: StudioTheme.Values.controlOutline_toolbarHover
|
|
property color activeColor: StudioTheme.Values.themeInteraction
|
|
property color activeTextColor: StudioTheme.Values.themeTextSelectedTextColor
|
|
|
|
property string tooltip
|
|
|
|
property alias text: label.text
|
|
property alias font: label.font
|
|
property alias inset: backgroundPath.inset
|
|
property alias strokeWidth: backgroundPath.strokeWidth
|
|
|
|
property real textLeftMargin: 18
|
|
property real textTopMargin: 6
|
|
property real textRightMargin: 6
|
|
property real textBottomMargin: 6
|
|
|
|
readonly property int itemIndex: index
|
|
readonly property bool isFirst: itemIndex === 0
|
|
readonly property bool isLast: (itemIndex + 1) === modelSize
|
|
|
|
signal clicked(int callIdx)
|
|
|
|
width: 166
|
|
height: 36
|
|
|
|
Shape {
|
|
id: backgroundShape
|
|
anchors.fill: root
|
|
|
|
antialiasing: root.antialiasing
|
|
layer.enabled: antialiasing
|
|
layer.smooth: antialiasing
|
|
layer.samples: antialiasing ? 4 : 0
|
|
|
|
ShapePath {
|
|
id: backgroundPath
|
|
|
|
joinStyle: ShapePath.MiterJoin
|
|
fillColor: root.idleBackgroundColor
|
|
strokeColor: root.idleStrokeColor
|
|
strokeWidth: 1
|
|
|
|
property real inset: 5
|
|
property real rightOut: root.isLast ? 0 : root.inset
|
|
property real leftIn: root.isFirst ? 0 : root.inset
|
|
property real strokeOffset: backgroundPath.strokeWidth / 2
|
|
|
|
property real topY: backgroundPath.strokeOffset
|
|
property real bottomY: backgroundShape.height - backgroundPath.strokeOffset
|
|
property real halfY: (backgroundPath.topY + backgroundPath.bottomY) / 2
|
|
|
|
startX: backgroundPath.strokeOffset
|
|
startY: backgroundPath.topY
|
|
|
|
PathLine {
|
|
x: backgroundShape.width - backgroundPath.strokeOffset - backgroundPath.rightOut
|
|
y: backgroundPath.topY
|
|
}
|
|
PathLine {
|
|
x: backgroundShape.width - backgroundPath.strokeOffset
|
|
y: backgroundPath.halfY
|
|
}
|
|
PathLine {
|
|
x: backgroundShape.width - backgroundPath.strokeOffset - backgroundPath.rightOut
|
|
y: backgroundPath.bottomY
|
|
}
|
|
PathLine {
|
|
x: backgroundPath.strokeOffset
|
|
y: backgroundPath.bottomY
|
|
}
|
|
PathLine {
|
|
x: backgroundPath.leftIn + backgroundPath.strokeOffset
|
|
y: backgroundPath.halfY
|
|
}
|
|
PathLine {
|
|
x: backgroundPath.strokeOffset
|
|
y: backgroundPath.topY
|
|
}
|
|
}
|
|
}
|
|
|
|
Text {
|
|
id: label
|
|
|
|
anchors.fill: parent
|
|
anchors.leftMargin: root.textLeftMargin
|
|
anchors.topMargin: root.textTopMargin
|
|
anchors.rightMargin: root.textRightMargin
|
|
anchors.bottomMargin: root.textBottomMargin
|
|
|
|
horizontalAlignment: Text.AlignLeft
|
|
verticalAlignment: Text.AlignVCenter
|
|
|
|
color: root.idleTextColor
|
|
|
|
wrapMode: Text.Wrap
|
|
elide: Text.ElideRight
|
|
maximumLineCount: 1
|
|
|
|
text: "Crumble File"
|
|
font.pixelSize: 12
|
|
font.family: "SF Pro"
|
|
|
|
ToolTip.text: root.tooltip
|
|
ToolTip.visible: mouseArea.containsMouse
|
|
ToolTip.delay: 1000
|
|
}
|
|
|
|
MouseArea {
|
|
id: mouseArea
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
onClicked: root.clicked(root.itemIndex)
|
|
}
|
|
|
|
states: [
|
|
State {
|
|
name: "idle"
|
|
when: !mouseArea.containsMouse && !mouseArea.pressed && !root.isLast
|
|
|
|
PropertyChanges {
|
|
target: backgroundPath
|
|
fillColor: root.idleBackgroundColor
|
|
strokeColor: root.idleStrokeColor
|
|
}
|
|
},
|
|
State {
|
|
name: "active"
|
|
when: root.isLast
|
|
extend: "pressed"
|
|
},
|
|
State {
|
|
name: "hover"
|
|
when: mouseArea.containsMouse && !mouseArea.pressed
|
|
|
|
PropertyChanges {
|
|
target: backgroundPath
|
|
fillColor: root.hoverBackgroundColor
|
|
strokeColor: root.hoverStrokeColor
|
|
}
|
|
},
|
|
State {
|
|
name: "pressed"
|
|
when: mouseArea.pressed
|
|
|
|
PropertyChanges {
|
|
target: backgroundPath
|
|
strokeColor: root.activeColor
|
|
fillColor: root.activeColor
|
|
}
|
|
|
|
PropertyChanges {
|
|
target: label
|
|
color: root.activeTextColor
|
|
}
|
|
}
|
|
]
|
|
}
|