mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-12-05 00:28:49 +03:00
186 lines
4.7 KiB
QML
186 lines
4.7 KiB
QML
// SPDX-FileCopyrightText: Nheko Contributors
|
|
//
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
import QtQuick 2.12
|
|
import QtQuick.Controls 2.12
|
|
import QtQuick.Layouts 1.12
|
|
import im.nheko 1.0
|
|
|
|
ColumnLayout {
|
|
id: c
|
|
|
|
property color backgroundColor: palette.base
|
|
property alias color: labelC.color
|
|
property alias echoMode: input.echoMode
|
|
property alias font: input.font
|
|
property var hasClear: false
|
|
property alias label: labelC.text
|
|
property alias placeholderText: input.placeholderText
|
|
property alias selectByMouse: input.selectByMouse
|
|
property alias text: input.text
|
|
property alias textPadding: input.padding
|
|
|
|
signal accepted
|
|
signal editingFinished
|
|
signal textEdited
|
|
|
|
function clear() {
|
|
input.clear();
|
|
}
|
|
function forceActiveFocus() {
|
|
input.forceActiveFocus();
|
|
}
|
|
|
|
ToolTip.delay: Nheko.tooltipDelay
|
|
ToolTip.visible: hover.hovered
|
|
spacing: 0
|
|
|
|
onTextChanged: timer.restart()
|
|
|
|
Timer {
|
|
id: timer
|
|
|
|
interval: 350
|
|
|
|
onTriggered: editingFinished()
|
|
}
|
|
Item {
|
|
Layout.bottomMargin: Nheko.paddingSmall
|
|
Layout.fillWidth: true
|
|
Layout.margins: input.padding
|
|
Layout.preferredHeight: labelC.contentHeight
|
|
visible: labelC.text
|
|
z: 1
|
|
|
|
Label {
|
|
id: labelC
|
|
|
|
color: palette.text
|
|
enabled: false
|
|
font.letterSpacing: input.font.pixelSize * 0.02
|
|
font.pixelSize: input.font.pixelSize
|
|
font.weight: Font.DemiBold
|
|
state: labelC.text && (input.activeFocus == true || input.text) ? "focused" : ""
|
|
width: parent.width
|
|
y: contentHeight + input.padding + Nheko.paddingSmall
|
|
|
|
states: State {
|
|
name: "focused"
|
|
|
|
PropertyChanges {
|
|
target: labelC
|
|
y: 0
|
|
}
|
|
PropertyChanges {
|
|
opacity: 1
|
|
target: input
|
|
}
|
|
}
|
|
transitions: Transition {
|
|
from: ""
|
|
reversible: true
|
|
to: "focused"
|
|
|
|
NumberAnimation {
|
|
alwaysRunToEnd: true
|
|
duration: 210
|
|
easing.type: Easing.InCubic
|
|
properties: "y"
|
|
target: labelC
|
|
}
|
|
NumberAnimation {
|
|
alwaysRunToEnd: true
|
|
duration: 210
|
|
easing.type: Easing.InCubic
|
|
properties: "opacity"
|
|
target: input
|
|
}
|
|
}
|
|
}
|
|
}
|
|
TextField {
|
|
id: input
|
|
|
|
Layout.fillWidth: true
|
|
color: labelC.color
|
|
focus: true
|
|
opacity: labelC.text ? 0 : 1
|
|
|
|
background: Rectangle {
|
|
id: backgroundRect
|
|
|
|
color: labelC.text ? "transparent" : backgroundColor
|
|
}
|
|
|
|
onAccepted: c.accepted()
|
|
onEditingFinished: c.editingFinished()
|
|
onTextEdited: c.textEdited()
|
|
|
|
ImageButton {
|
|
id: clearText
|
|
|
|
focusPolicy: Qt.NoFocus
|
|
hoverEnabled: true
|
|
image: ":/icons/icons/ui/round-remove-button.svg"
|
|
visible: c.hasClear && searchField.text !== ''
|
|
|
|
onClicked: {
|
|
searchField.clear();
|
|
topBar.searchString = "";
|
|
}
|
|
|
|
anchors {
|
|
bottom: parent.bottom
|
|
right: parent.right
|
|
rightMargin: Nheko.paddingSmall
|
|
top: parent.top
|
|
}
|
|
}
|
|
}
|
|
Rectangle {
|
|
id: blueBar
|
|
|
|
Layout.fillWidth: true
|
|
color: palette.highlight
|
|
height: 1
|
|
|
|
Rectangle {
|
|
id: blackBar
|
|
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
anchors.top: parent.top
|
|
color: palette.text
|
|
height: parent.height * 2
|
|
width: 0
|
|
|
|
states: State {
|
|
name: "focused"
|
|
when: input.activeFocus == true
|
|
|
|
PropertyChanges {
|
|
target: blackBar
|
|
width: blueBar.width
|
|
}
|
|
}
|
|
transitions: Transition {
|
|
from: ""
|
|
reversible: true
|
|
to: "focused"
|
|
|
|
NumberAnimation {
|
|
alwaysRunToEnd: true
|
|
duration: 310
|
|
easing.type: Easing.InCubic
|
|
properties: "width"
|
|
target: blackBar
|
|
}
|
|
}
|
|
}
|
|
}
|
|
HoverHandler {
|
|
id: hover
|
|
|
|
enabled: c.ToolTip.text
|
|
}
|
|
}
|