2023-02-22 01:48:49 +03:00
|
|
|
// SPDX-FileCopyrightText: Nheko Contributors
|
2021-07-21 14:37:57 +03:00
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
|
|
|
import ".."
|
|
|
|
import "../components"
|
|
|
|
import QtQuick 2.12
|
|
|
|
import QtQuick.Controls 2.12
|
|
|
|
import QtQuick.Layouts 1.12
|
|
|
|
import im.nheko 1.0
|
|
|
|
|
|
|
|
ApplicationWindow {
|
|
|
|
id: win
|
|
|
|
|
2021-12-14 01:25:42 +03:00
|
|
|
property Room room
|
2021-07-21 14:37:57 +03:00
|
|
|
property ImagePackListModel packlist
|
|
|
|
property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 2.3)
|
|
|
|
property SingleImagePackModel currentPack: packlist.packAt(currentPackIndex)
|
|
|
|
property int currentPackIndex: 0
|
|
|
|
readonly property int stickerDim: 128
|
|
|
|
readonly property int stickerDimPad: 128 + Nheko.paddingSmall
|
|
|
|
|
|
|
|
title: qsTr("Image pack settings")
|
2021-08-06 02:45:47 +03:00
|
|
|
height: 600
|
|
|
|
width: 800
|
2023-06-02 02:29:05 +03:00
|
|
|
color: palette.base
|
2021-07-21 14:37:57 +03:00
|
|
|
modality: Qt.NonModal
|
2021-08-19 17:55:54 +03:00
|
|
|
flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
|
2021-07-21 14:37:57 +03:00
|
|
|
|
2021-08-06 02:45:47 +03:00
|
|
|
Component {
|
|
|
|
id: packEditor
|
|
|
|
|
|
|
|
ImagePackEditorDialog {
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-07-21 14:37:57 +03:00
|
|
|
AdaptiveLayout {
|
|
|
|
id: adaptiveView
|
|
|
|
|
|
|
|
anchors.fill: parent
|
|
|
|
singlePageMode: false
|
|
|
|
pageIndex: 0
|
|
|
|
|
|
|
|
AdaptiveLayoutElement {
|
|
|
|
id: packlistC
|
|
|
|
|
|
|
|
visible: Settings.groupView
|
|
|
|
minimumWidth: 200
|
|
|
|
collapsedWidth: 200
|
|
|
|
preferredWidth: 300
|
|
|
|
maximumWidth: 300
|
|
|
|
|
|
|
|
ListView {
|
|
|
|
model: packlist
|
|
|
|
clip: true
|
|
|
|
|
2023-06-02 02:36:01 +03:00
|
|
|
|
2021-07-21 14:37:57 +03:00
|
|
|
|
2021-08-06 05:31:30 +03:00
|
|
|
footer: ColumnLayout {
|
|
|
|
Button {
|
|
|
|
onClicked: {
|
|
|
|
var dialog = packEditor.createObject(timelineRoot, {
|
|
|
|
"imagePack": packlist.newPack(false)
|
|
|
|
});
|
|
|
|
dialog.show();
|
2022-02-21 07:01:01 +03:00
|
|
|
timelineRoot.destroyOnClose(dialog);
|
2021-08-06 05:31:30 +03:00
|
|
|
}
|
2023-10-26 17:43:09 +03:00
|
|
|
Layout.preferredWidth: packlistC.width
|
2021-08-06 05:31:30 +03:00
|
|
|
visible: !packlist.containsAccountPack
|
|
|
|
text: qsTr("Create account pack")
|
|
|
|
}
|
|
|
|
|
|
|
|
Button {
|
|
|
|
onClicked: {
|
|
|
|
var dialog = packEditor.createObject(timelineRoot, {
|
|
|
|
"imagePack": packlist.newPack(true)
|
|
|
|
});
|
|
|
|
dialog.show();
|
2022-02-21 07:01:01 +03:00
|
|
|
timelineRoot.destroyOnClose(dialog);
|
2021-08-06 05:31:30 +03:00
|
|
|
}
|
2023-10-26 17:43:09 +03:00
|
|
|
Layout.preferredWidth: packlistC.width
|
2021-12-14 01:25:42 +03:00
|
|
|
visible: room.permissions.canChange(MtxEvent.ImagePackInRoom)
|
2021-08-06 05:31:30 +03:00
|
|
|
text: qsTr("New room pack")
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-08-06 02:45:47 +03:00
|
|
|
delegate: AvatarListTile {
|
2021-07-21 14:37:57 +03:00
|
|
|
id: packItem
|
|
|
|
|
2023-06-02 02:29:05 +03:00
|
|
|
property color background: palette.window
|
|
|
|
property color importantText: palette.text
|
|
|
|
property color unimportantText: palette.buttonText
|
|
|
|
property color bubbleBackground: palette.highlight
|
|
|
|
property color bubbleText: palette.highlightedText
|
2021-07-21 14:37:57 +03:00
|
|
|
required property string displayName
|
|
|
|
required property bool fromAccountData
|
|
|
|
required property bool fromCurrentRoom
|
2022-09-01 14:25:11 +03:00
|
|
|
required property bool fromSpace
|
2021-09-15 01:39:57 +03:00
|
|
|
required property string statekey
|
2021-07-21 14:37:57 +03:00
|
|
|
|
2021-08-06 02:45:47 +03:00
|
|
|
title: displayName
|
|
|
|
subtitle: {
|
|
|
|
if (fromAccountData)
|
|
|
|
return qsTr("Private pack");
|
|
|
|
else if (fromCurrentRoom)
|
|
|
|
return qsTr("Pack from this room");
|
2022-09-01 14:25:11 +03:00
|
|
|
else if (fromSpace)
|
|
|
|
return qsTr("Pack from parent community");
|
2021-08-06 02:45:47 +03:00
|
|
|
else
|
|
|
|
return qsTr("Globally enabled pack");
|
|
|
|
}
|
|
|
|
selectedIndex: currentPackIndex
|
2021-09-15 01:39:57 +03:00
|
|
|
roomid: statekey
|
2021-07-21 14:37:57 +03:00
|
|
|
|
|
|
|
TapHandler {
|
|
|
|
onSingleTapped: currentPackIndex = index
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
AdaptiveLayoutElement {
|
|
|
|
id: packinfoC
|
|
|
|
|
|
|
|
Rectangle {
|
2023-06-02 02:29:05 +03:00
|
|
|
color: palette.window
|
2021-07-21 14:37:57 +03:00
|
|
|
|
|
|
|
ColumnLayout {
|
|
|
|
id: packinfo
|
|
|
|
|
|
|
|
property string packName: currentPack ? currentPack.packname : ""
|
2021-08-06 02:45:47 +03:00
|
|
|
property string attribution: currentPack ? currentPack.attribution : ""
|
2021-07-21 14:37:57 +03:00
|
|
|
property string avatarUrl: currentPack ? currentPack.avatarUrl : ""
|
2021-09-07 04:14:45 +03:00
|
|
|
property string statekey: currentPack ? currentPack.statekey : ""
|
2021-07-21 14:37:57 +03:00
|
|
|
|
|
|
|
anchors.fill: parent
|
|
|
|
anchors.margins: Nheko.paddingLarge
|
|
|
|
spacing: Nheko.paddingLarge
|
|
|
|
|
|
|
|
Avatar {
|
|
|
|
url: packinfo.avatarUrl.replace("mxc://", "image://MxcImage/")
|
|
|
|
displayName: packinfo.packName
|
2021-09-07 04:14:45 +03:00
|
|
|
roomid: packinfo.statekey
|
2023-10-26 17:43:09 +03:00
|
|
|
Layout.preferredHeight: 100
|
|
|
|
Layout.preferredWidth: 100
|
2021-07-21 14:37:57 +03:00
|
|
|
Layout.alignment: Qt.AlignHCenter
|
|
|
|
enabled: false
|
|
|
|
}
|
|
|
|
|
|
|
|
MatrixText {
|
|
|
|
text: packinfo.packName
|
2021-08-06 02:45:47 +03:00
|
|
|
font.pixelSize: Math.ceil(fontMetrics.pixelSize * 1.1)
|
|
|
|
horizontalAlignment: TextEdit.AlignHCenter
|
|
|
|
Layout.alignment: Qt.AlignHCenter
|
|
|
|
Layout.preferredWidth: packinfoC.width - Nheko.paddingLarge * 2
|
2023-03-24 20:19:43 +03:00
|
|
|
textFormat: TextEdit.PlainText
|
2021-08-06 02:45:47 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
MatrixText {
|
|
|
|
text: packinfo.attribution
|
|
|
|
wrapMode: TextEdit.Wrap
|
|
|
|
horizontalAlignment: TextEdit.AlignHCenter
|
2021-07-21 14:37:57 +03:00
|
|
|
Layout.alignment: Qt.AlignHCenter
|
2021-08-06 02:45:47 +03:00
|
|
|
Layout.preferredWidth: packinfoC.width - Nheko.paddingLarge * 2
|
2023-03-24 20:19:43 +03:00
|
|
|
textFormat: TextEdit.PlainText
|
2021-07-21 14:37:57 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
GridLayout {
|
|
|
|
Layout.alignment: Qt.AlignHCenter
|
|
|
|
visible: currentPack && currentPack.roomid != ""
|
|
|
|
columns: 2
|
|
|
|
rowSpacing: Nheko.paddingMedium
|
|
|
|
|
|
|
|
MatrixText {
|
|
|
|
text: qsTr("Enable globally")
|
|
|
|
}
|
|
|
|
|
|
|
|
ToggleButton {
|
|
|
|
ToolTip.text: qsTr("Enables this pack to be used in all rooms")
|
|
|
|
checked: currentPack ? currentPack.isGloballyEnabled : false
|
2022-01-09 02:28:03 +03:00
|
|
|
onCheckedChanged: currentPack.isGloballyEnabled = checked
|
2021-07-21 14:37:57 +03:00
|
|
|
Layout.alignment: Qt.AlignRight
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-08-06 02:45:47 +03:00
|
|
|
Button {
|
|
|
|
Layout.alignment: Qt.AlignHCenter
|
|
|
|
text: qsTr("Edit")
|
|
|
|
enabled: currentPack.canEdit
|
|
|
|
onClicked: {
|
|
|
|
var dialog = packEditor.createObject(timelineRoot, {
|
|
|
|
"imagePack": currentPack
|
|
|
|
});
|
|
|
|
dialog.show();
|
2022-02-21 07:01:01 +03:00
|
|
|
timelineRoot.destroyOnClose(dialog);
|
2021-08-06 02:45:47 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-07-21 14:37:57 +03:00
|
|
|
GridView {
|
|
|
|
Layout.fillHeight: true
|
|
|
|
Layout.fillWidth: true
|
|
|
|
model: currentPack
|
|
|
|
cellWidth: stickerDimPad
|
|
|
|
cellHeight: stickerDimPad
|
|
|
|
boundsBehavior: Flickable.StopAtBounds
|
|
|
|
clip: true
|
|
|
|
currentIndex: -1 // prevent sorting from stealing focus
|
|
|
|
cacheBuffer: 500
|
|
|
|
|
|
|
|
|
|
|
|
// Individual emoji
|
|
|
|
delegate: AbstractButton {
|
|
|
|
width: stickerDim
|
|
|
|
height: stickerDim
|
|
|
|
hoverEnabled: true
|
2021-08-06 02:45:47 +03:00
|
|
|
ToolTip.text: ":" + model.shortCode + ": - " + model.body
|
2021-07-21 14:37:57 +03:00
|
|
|
ToolTip.visible: hovered
|
|
|
|
|
|
|
|
contentItem: Image {
|
|
|
|
height: stickerDim
|
|
|
|
width: stickerDim
|
2022-03-09 22:15:37 +03:00
|
|
|
source: model.url.replace("mxc://", "image://MxcImage/") + "?scale"
|
2021-07-21 14:37:57 +03:00
|
|
|
fillMode: Image.PreserveAspectFit
|
|
|
|
}
|
|
|
|
|
|
|
|
background: Rectangle {
|
|
|
|
anchors.fill: parent
|
2023-06-02 02:29:05 +03:00
|
|
|
color: hovered ? palette.highlight : 'transparent'
|
2021-07-21 14:37:57 +03:00
|
|
|
radius: 5
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
footer: DialogButtonBox {
|
|
|
|
id: buttons
|
|
|
|
|
|
|
|
Button {
|
|
|
|
text: qsTr("Close")
|
|
|
|
DialogButtonBox.buttonRole: DialogButtonBox.AcceptRole
|
|
|
|
onClicked: win.close()
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|