mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-01-18 11:58:11 +00:00
158 lines
3.7 KiB
QML
158 lines
3.7 KiB
QML
import QtQuick 2.7
|
|
import QtQuick.Controls 2.1
|
|
import QtQuick.Dialogs 1.2
|
|
|
|
import Common 1.0
|
|
import Common.Styles 1.0
|
|
import Utils 1.0
|
|
|
|
// =============================================================================
|
|
|
|
Item {
|
|
id: droppableTextArea
|
|
|
|
property alias placeholderText: textArea.placeholderText
|
|
property alias text: textArea.text
|
|
|
|
property bool dropEnabled: true
|
|
property string dropDisabledReason
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
signal dropped (var files)
|
|
signal validText (string text)
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
function _emitFiles (files) {
|
|
// Filtering files, other urls are forbidden.
|
|
files = files.reduce(function (files, file) {
|
|
if (file.startsWith('file:')) {
|
|
files.push(Utils.getSystemPathFromUri(file))
|
|
}
|
|
|
|
return files
|
|
}, [])
|
|
|
|
if (files.length > 0) {
|
|
dropped(files)
|
|
}
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
// Text area.
|
|
Flickable {
|
|
anchors.fill: parent
|
|
boundsBehavior: Flickable.StopAtBounds
|
|
|
|
ScrollBar.vertical: ForceScrollBar {
|
|
id: scrollBar
|
|
}
|
|
|
|
TextArea.flickable: TextArea {
|
|
id: textArea
|
|
|
|
function handleValidation () {
|
|
if (text.length !== 0) {
|
|
validText(text)
|
|
}
|
|
}
|
|
|
|
background: Rectangle {
|
|
color: DroppableTextAreaStyle.backgroundColor
|
|
}
|
|
|
|
color: DroppableTextAreaStyle.text.color
|
|
font.pointSize: DroppableTextAreaStyle.text.pointSize
|
|
rightPadding: fileChooserButton.width +
|
|
fileChooserButton.anchors.rightMargin +
|
|
DroppableTextAreaStyle.fileChooserButton.margins
|
|
selectByMouse: true
|
|
wrapMode: TextArea.Wrap
|
|
|
|
// Workaround. Without this line, the scrollbar is not linked correctly
|
|
// to the text area.
|
|
width: parent.width
|
|
|
|
Component.onCompleted: forceActiveFocus()
|
|
|
|
Keys.onPressed: {
|
|
if (event.matches(StandardKey.InsertLineSeparator)) {
|
|
insert(cursorPosition, '')
|
|
} else if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
|
|
handleValidation()
|
|
event.accepted = true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Handle click to select files.
|
|
ActionButton {
|
|
id: fileChooserButton
|
|
|
|
anchors {
|
|
right: parent.right
|
|
rightMargin: scrollBar.width +
|
|
DroppableTextAreaStyle.fileChooserButton.margins
|
|
verticalCenter: parent.verticalCenter
|
|
}
|
|
enabled: droppableTextArea.dropEnabled
|
|
icon: 'attachment'
|
|
iconSize: DroppableTextAreaStyle.fileChooserButton.size
|
|
|
|
onClicked: fileDialog.open()
|
|
|
|
FileDialog {
|
|
id: fileDialog
|
|
|
|
folder: shortcuts.home
|
|
title: qsTr('fileChooserTitle')
|
|
|
|
onAccepted: _emitFiles(fileDialog.fileUrls)
|
|
}
|
|
|
|
TooltipArea {
|
|
text: droppableTextArea.dropEnabled
|
|
? qsTr('attachmentTooltip')
|
|
: droppableTextArea.dropDisabledReason
|
|
}
|
|
}
|
|
|
|
// Hovered style.
|
|
Rectangle {
|
|
id: hoverContent
|
|
|
|
anchors.fill: parent
|
|
color: DroppableTextAreaStyle.hoverContent.backgroundColor
|
|
visible: false
|
|
|
|
Text {
|
|
anchors.centerIn: parent
|
|
color: DroppableTextAreaStyle.hoverContent.text.color
|
|
font.pointSize: DroppableTextAreaStyle.hoverContent.text.pointSize
|
|
text: qsTr('dropYourAttachment')
|
|
}
|
|
}
|
|
|
|
DropArea {
|
|
anchors.fill: parent
|
|
keys: [ 'text/uri-list' ]
|
|
visible: droppableTextArea.dropEnabled
|
|
|
|
onDropped: {
|
|
state = ''
|
|
if (drop.hasUrls) {
|
|
_emitFiles(drop.urls)
|
|
}
|
|
}
|
|
onEntered: state = 'hover'
|
|
onExited: state = ''
|
|
|
|
states: State {
|
|
name: 'hover'
|
|
PropertyChanges { target: hoverContent; visible: true }
|
|
}
|
|
}
|
|
}
|