status-desktop/ui/app/AppLayouts/Profile/panels/ProfileSocialLinksPanel.qml
Lukáš Tinkl 1998a6556a feat(Profile): New Social Links workflow
TLDR;
- all links visible in settings/popup
- persistent order of items
- drag'n'drop to reorder
- editing/deleting in a new popup
- several links of the same type

Needs changes in nimqml (to expose QAIM::begin/endMoveRows), in
DOtherSide (to expose those to NIM), in status-go (to preserve the links
order and fully save them to DB)

Fixes #9777
2023-03-16 16:08:23 +01:00

161 lines
5.4 KiB
QML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtQuick.Shapes 1.15
import StatusQ.Core 0.1
import StatusQ.Controls 0.1
import StatusQ.Components 0.1
import StatusQ.Core.Theme 0.1
import utils 1.0
import AppLayouts.Profile.popups 1.0
import SortFilterProxyModel 0.2
Control {
id: root
property var profileStore
property var socialLinksModel
background: null
implicitHeight: layout.implicitHeight + linksView.contentHeight
Component {
id: addSocialLinkModalComponent
AddSocialLinkModal {
onAddLinkRequested: root.profileStore.createLink(linkText, linkUrl, linkType, linkIcon)
}
}
Component {
id: modifySocialLinkModal
ModifySocialLinkModal {
onUpdateLinkRequested: root.profileStore.updateLink(uuid, linkText, linkUrl)
onRemoveLinkRequested: root.profileStore.removeLink(uuid)
}
}
contentItem: ColumnLayout {
id: layout
spacing: 12
RowLayout {
Layout.fillWidth: true
Layout.bottomMargin: Style.current.halfPadding
StatusBaseText {
text: qsTr("Links")
color: Theme.palette.baseColor1
}
Item { Layout.fillWidth: true }
StatusLinkText {
text: qsTr(" Add more links")
color: Theme.palette.primaryColor1
font.pixelSize: Theme.tertiaryTextFontSize
font.weight: Font.Normal
onClicked: Global.openPopup(addSocialLinkModalComponent)
}
}
SortFilterProxyModel {
id: filteredSocialLinksModel
sourceModel: root.socialLinksModel
filters: ExpressionFilter {
expression: model.text !== "" && model.url !== ""
}
}
// empty placeholder when no links; dashed rounded rectangle
ShapeRectangle {
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: parent.width - 4 // the rectangular path is rendered outside
Layout.preferredHeight: 44
visible: !filteredSocialLinksModel.count
text: qsTr("Your links will appear here")
}
StatusListView {
id: linksView
Layout.fillWidth: true
Layout.fillHeight: true
model: root.socialLinksModel
displaced: Transition {
NumberAnimation { properties: "x,y"; easing.type: Easing.OutQuad }
}
delegate: DropArea {
id: delegateRoot
property int visualIndex: index
width: ListView.view.width
height: draggableDelegate.height
keys: ["x-status-draggable-list-item-internal"]
onEntered: function(drag) {
const from = drag.source.visualIndex
const to = draggableDelegate.visualIndex
if (to === from)
return
root.profileStore.moveLink(from, to, 1)
drag.accept()
}
onDropped: function(drop) {
root.profileStore.saveSocialLinks(true /*silent*/)
}
StatusDraggableListItem {
id: draggableDelegate
readonly property string asideText: ProfileUtils.stripSocialLinkPrefix(model.url, model.linkType)
visible: !!asideText
width: parent.width
height: visible ? implicitHeight : 0
anchors {
horizontalCenter: parent.horizontalCenter
verticalCenter: parent.verticalCenter
}
dragParent: linksView
visualIndex: delegateRoot.visualIndex
draggable: linksView.count > 1
title: ProfileUtils.linkTypeToText(model.linkType) || model.text
icon.name: model.icon
icon.color: ProfileUtils.linkTypeColor(model.linkType)
actions: [
StatusLinkText {
Layout.fillWidth: true
Layout.alignment: Qt.AlignRight
horizontalAlignment: Text.AlignRight
font.pixelSize: Theme.primaryTextFontSize
font.weight: Font.Normal
text: draggableDelegate.asideText
onClicked: Global.openLink(model.url)
},
StatusFlatRoundButton {
icon.name: "edit_pencil"
Layout.preferredWidth: 24
Layout.preferredHeight: 24
icon.width: 16
icon.height: 16
type: StatusFlatRoundButton.Type.Tertiary
tooltip.text: qsTr("Edit link")
onClicked: Global.openPopup(modifySocialLinkModal,
{linkType: model.linkType, icon: model.icon, uuid: model.uuid,
linkText: model.text, linkUrl: draggableDelegate.asideText})
}
]
}
}
}
}
}