252 lines
8.4 KiB
QML
252 lines
8.4 KiB
QML
|
import QtQuick 2.14
|
||
|
import QtQuick.Layouts 1.14
|
||
|
import QtQuick.Controls 2.14
|
||
|
import QtQuick.Dialogs 1.3
|
||
|
import QtGraphicalEffects 1.13
|
||
|
|
||
|
import utils 1.0
|
||
|
import shared.panels 1.0
|
||
|
import shared.popups 1.0
|
||
|
|
||
|
import StatusQ.Core 0.1
|
||
|
import StatusQ.Core.Theme 0.1
|
||
|
import StatusQ.Layout 0.1
|
||
|
import StatusQ.Components 0.1
|
||
|
import StatusQ.Controls 0.1
|
||
|
import StatusQ.Controls.Validators 0.1
|
||
|
|
||
|
Flickable {
|
||
|
id: root
|
||
|
|
||
|
property alias name: nameInput.text
|
||
|
property alias description: descriptionTextInput.text
|
||
|
property alias color: colorDialog.color
|
||
|
property alias image: addImageButton.selectedImage
|
||
|
readonly property alias imageAx: imageCropperModal.aX
|
||
|
readonly property alias imageAy: imageCropperModal.aY
|
||
|
readonly property alias imageBx: imageCropperModal.bX
|
||
|
readonly property alias imageBy: imageCropperModal.bY
|
||
|
|
||
|
contentWidth: layout.width
|
||
|
contentHeight: layout.height
|
||
|
clip: true
|
||
|
interactive: contentHeight > height
|
||
|
flickableDirection: Flickable.VerticalFlick
|
||
|
|
||
|
ColumnLayout {
|
||
|
id: layout
|
||
|
|
||
|
width: root.width
|
||
|
spacing: 12
|
||
|
|
||
|
StatusInput {
|
||
|
id: nameInput
|
||
|
|
||
|
Layout.fillWidth: true
|
||
|
|
||
|
leftPadding: 0
|
||
|
rightPadding: 0
|
||
|
label: qsTr("Community name")
|
||
|
charLimit: 30
|
||
|
input.placeholderText: qsTr("A catchy name")
|
||
|
validators: [
|
||
|
StatusMinLengthValidator {
|
||
|
minLength: 1
|
||
|
errorMessage: Utils.getErrorMessage(nameInput.errors,
|
||
|
qsTr("community name"))
|
||
|
}
|
||
|
]
|
||
|
validationMode: StatusInput.ValidationMode.Always
|
||
|
|
||
|
Component.onCompleted: nameInput.input.forceActiveFocus(Qt.MouseFocusReason)
|
||
|
}
|
||
|
|
||
|
StatusInput {
|
||
|
id: descriptionTextInput
|
||
|
|
||
|
Layout.fillWidth: true
|
||
|
|
||
|
leftPadding: 0
|
||
|
rightPadding: 0
|
||
|
label: qsTr("Description")
|
||
|
charLimit: 140
|
||
|
|
||
|
input.placeholderText: qsTr("What your community is about")
|
||
|
input.multiline: true
|
||
|
input.implicitHeight: 88
|
||
|
|
||
|
validators: [
|
||
|
StatusMinLengthValidator {
|
||
|
minLength: 1
|
||
|
errorMessage: Utils.getErrorMessage(
|
||
|
descriptionTextInput.errors,
|
||
|
qsTr("community description"))
|
||
|
}
|
||
|
]
|
||
|
validationMode: StatusInput.ValidationMode.Always
|
||
|
}
|
||
|
|
||
|
ColumnLayout {
|
||
|
Layout.fillWidth: true
|
||
|
spacing: 8
|
||
|
|
||
|
StatusBaseText {
|
||
|
//% "Thumbnail image"
|
||
|
text: qsTrId("thumbnail-image")
|
||
|
font.pixelSize: 15
|
||
|
color: Theme.palette.directColor1
|
||
|
}
|
||
|
|
||
|
Item {
|
||
|
Layout.fillWidth: true
|
||
|
|
||
|
implicitHeight: addImageButton.height + 32
|
||
|
|
||
|
Rectangle {
|
||
|
id: addImageButton
|
||
|
|
||
|
property string selectedImage: ""
|
||
|
|
||
|
anchors.centerIn: parent
|
||
|
color: imagePreview.visible ? "transparent" : Style.current.inputBackground
|
||
|
width: 128
|
||
|
height: width
|
||
|
radius: width / 2
|
||
|
|
||
|
FileDialog {
|
||
|
id: imageDialog
|
||
|
//% "Please choose an image"
|
||
|
title: qsTrId("please-choose-an-image")
|
||
|
folder: shortcuts.pictures
|
||
|
nameFilters: [//% "Image files (*.jpg *.jpeg *.png)"
|
||
|
qsTrId("image-files----jpg---jpeg---png-")]
|
||
|
onAccepted: {
|
||
|
addImageButton.selectedImage = imageDialog.fileUrls[0]
|
||
|
imageCropperModal.open()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Rectangle {
|
||
|
id: imagePreviewCropper
|
||
|
clip: true
|
||
|
width: parent.width
|
||
|
height: parent.height
|
||
|
radius: parent.width / 2
|
||
|
visible: !!addImageButton.selectedImage
|
||
|
|
||
|
Image {
|
||
|
id: imagePreview
|
||
|
visible: !!addImageButton.selectedImage
|
||
|
source: addImageButton.selectedImage
|
||
|
fillMode: Image.PreserveAspectFit
|
||
|
width: parent.width
|
||
|
height: parent.height
|
||
|
}
|
||
|
layer.enabled: true
|
||
|
layer.effect: OpacityMask {
|
||
|
maskSource: Rectangle {
|
||
|
anchors.centerIn: parent
|
||
|
width: imageCropperModal.width
|
||
|
height: imageCropperModal.height
|
||
|
radius: width / 2
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Item {
|
||
|
id: addImageCenter
|
||
|
visible: !imagePreview.visible
|
||
|
width: uploadText.width
|
||
|
height: childrenRect.height
|
||
|
anchors.centerIn: parent
|
||
|
|
||
|
SVGImage {
|
||
|
id: imageImg
|
||
|
source: Style.svg("images_icon")
|
||
|
width: 20
|
||
|
height: 18
|
||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||
|
}
|
||
|
|
||
|
StatusBaseText {
|
||
|
id: uploadText
|
||
|
//% "Upload"
|
||
|
text: qsTrId("upload")
|
||
|
anchors.top: imageImg.bottom
|
||
|
anchors.topMargin: 5
|
||
|
font.pixelSize: 15
|
||
|
color: Theme.palette.baseColor1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
StatusRoundButton {
|
||
|
type: StatusRoundButton.Type.Secondary
|
||
|
icon.name: "add"
|
||
|
anchors.top: parent.top
|
||
|
anchors.right: parent.right
|
||
|
anchors.rightMargin: Style.current.halfPadding
|
||
|
highlighted: sensor.containsMouse
|
||
|
}
|
||
|
|
||
|
MouseArea {
|
||
|
id: sensor
|
||
|
hoverEnabled: true
|
||
|
anchors.fill: parent
|
||
|
cursorShape: Qt.PointingHandCursor
|
||
|
onClicked: imageDialog.open()
|
||
|
}
|
||
|
|
||
|
ImageCropperModal {
|
||
|
id: imageCropperModal
|
||
|
selectedImage: addImageButton.selectedImage
|
||
|
ratio: "1:1"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ColumnLayout {
|
||
|
Layout.fillWidth: true
|
||
|
spacing: 8
|
||
|
|
||
|
StatusBaseText {
|
||
|
text: qsTrId("Community colour")
|
||
|
font.pixelSize: 15
|
||
|
color: Theme.palette.directColor1
|
||
|
}
|
||
|
|
||
|
StatusPickerButton {
|
||
|
Layout.fillWidth: true
|
||
|
|
||
|
property string validationError: ""
|
||
|
|
||
|
bgColor: colorDialog.colorSelected ? colorDialog.color : Theme.palette.baseColor2
|
||
|
contentColor: colorDialog.colorSelected ? Theme.palette.indirectColor1 : Theme.palette.baseColor1
|
||
|
text: colorDialog.colorSelected ? colorDialog.color.toString(
|
||
|
).toUpperCase() : qsTr("Pick a color")
|
||
|
|
||
|
onClicked: colorDialog.open()
|
||
|
onTextChanged: {
|
||
|
if (colorDialog.colorSelected) {
|
||
|
validationError = Utils.validateAndReturnError(
|
||
|
text,
|
||
|
Utils.Validate.NoEmpty | Utils.Validate.TextHexColor)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ColorDialog {
|
||
|
id: colorDialog
|
||
|
property bool colorSelected: true
|
||
|
color: Theme.palette.primaryColor1
|
||
|
onAccepted: colorSelected = true
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Item {
|
||
|
Layout.fillHeight: true
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|