mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-26 13:08:48 +03:00
310 lines
11 KiB
QML
310 lines
11 KiB
QML
|
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||
|
//
|
||
|
// 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
|
||
|
|
||
|
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")
|
||
|
x: MainWindow.x + (MainWindow.width / 2) - (width / 2)
|
||
|
y: MainWindow.y + (MainWindow.height / 2) - (height / 2)
|
||
|
height: 400
|
||
|
width: 600
|
||
|
palette: Nheko.colors
|
||
|
color: Nheko.colors.base
|
||
|
modality: Qt.NonModal
|
||
|
flags: Qt.Dialog
|
||
|
|
||
|
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
|
||
|
|
||
|
ScrollHelper {
|
||
|
flickable: parent
|
||
|
anchors.fill: parent
|
||
|
enabled: !Settings.mobileMode
|
||
|
}
|
||
|
|
||
|
delegate: Rectangle {
|
||
|
id: packItem
|
||
|
|
||
|
property color background: Nheko.colors.window
|
||
|
property color importantText: Nheko.colors.text
|
||
|
property color unimportantText: Nheko.colors.buttonText
|
||
|
property color bubbleBackground: Nheko.colors.highlight
|
||
|
property color bubbleText: Nheko.colors.highlightedText
|
||
|
required property string displayName
|
||
|
required property string avatarUrl
|
||
|
required property bool fromAccountData
|
||
|
required property bool fromCurrentRoom
|
||
|
required property int index
|
||
|
|
||
|
color: background
|
||
|
height: avatarSize + 2 * Nheko.paddingMedium
|
||
|
width: ListView.view.width
|
||
|
state: "normal"
|
||
|
states: [
|
||
|
State {
|
||
|
name: "highlight"
|
||
|
when: hovered.hovered && !(index == currentPackIndex)
|
||
|
|
||
|
PropertyChanges {
|
||
|
target: packItem
|
||
|
background: Nheko.colors.dark
|
||
|
importantText: Nheko.colors.brightText
|
||
|
unimportantText: Nheko.colors.brightText
|
||
|
bubbleBackground: Nheko.colors.highlight
|
||
|
bubbleText: Nheko.colors.highlightedText
|
||
|
}
|
||
|
|
||
|
},
|
||
|
State {
|
||
|
name: "selected"
|
||
|
when: index == currentPackIndex
|
||
|
|
||
|
PropertyChanges {
|
||
|
target: packItem
|
||
|
background: Nheko.colors.highlight
|
||
|
importantText: Nheko.colors.highlightedText
|
||
|
unimportantText: Nheko.colors.highlightedText
|
||
|
bubbleBackground: Nheko.colors.highlightedText
|
||
|
bubbleText: Nheko.colors.highlight
|
||
|
}
|
||
|
|
||
|
}
|
||
|
]
|
||
|
|
||
|
TapHandler {
|
||
|
margin: -Nheko.paddingSmall
|
||
|
onSingleTapped: currentPackIndex = index
|
||
|
}
|
||
|
|
||
|
HoverHandler {
|
||
|
id: hovered
|
||
|
}
|
||
|
|
||
|
RowLayout {
|
||
|
spacing: Nheko.paddingMedium
|
||
|
anchors.fill: parent
|
||
|
anchors.margins: Nheko.paddingMedium
|
||
|
|
||
|
Avatar {
|
||
|
// In the future we could show an online indicator by setting the userid for the avatar
|
||
|
//userid: Nheko.currentUser.userid
|
||
|
|
||
|
id: avatar
|
||
|
|
||
|
enabled: false
|
||
|
Layout.alignment: Qt.AlignVCenter
|
||
|
height: avatarSize
|
||
|
width: avatarSize
|
||
|
url: avatarUrl.replace("mxc://", "image://MxcImage/")
|
||
|
displayName: packItem.displayName
|
||
|
}
|
||
|
|
||
|
ColumnLayout {
|
||
|
id: textContent
|
||
|
|
||
|
Layout.alignment: Qt.AlignLeft
|
||
|
Layout.fillWidth: true
|
||
|
Layout.minimumWidth: 100
|
||
|
width: parent.width - avatar.width
|
||
|
Layout.preferredWidth: parent.width - avatar.width
|
||
|
spacing: Nheko.paddingSmall
|
||
|
|
||
|
RowLayout {
|
||
|
Layout.fillWidth: true
|
||
|
spacing: 0
|
||
|
|
||
|
ElidedLabel {
|
||
|
Layout.alignment: Qt.AlignBottom
|
||
|
color: packItem.importantText
|
||
|
elideWidth: textContent.width - Nheko.paddingMedium
|
||
|
fullText: displayName
|
||
|
textFormat: Text.PlainText
|
||
|
}
|
||
|
|
||
|
Item {
|
||
|
Layout.fillWidth: true
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
RowLayout {
|
||
|
Layout.fillWidth: true
|
||
|
spacing: 0
|
||
|
|
||
|
ElidedLabel {
|
||
|
color: packItem.unimportantText
|
||
|
font.pixelSize: fontMetrics.font.pixelSize * 0.9
|
||
|
elideWidth: textContent.width - Nheko.paddingSmall
|
||
|
fullText: {
|
||
|
if (fromAccountData)
|
||
|
return qsTr("Private pack");
|
||
|
else if (fromCurrentRoom)
|
||
|
return qsTr("Pack from this room");
|
||
|
else
|
||
|
return qsTr("Globally enabled pack");
|
||
|
}
|
||
|
textFormat: Text.PlainText
|
||
|
}
|
||
|
|
||
|
Item {
|
||
|
Layout.fillWidth: true
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
AdaptiveLayoutElement {
|
||
|
id: packinfoC
|
||
|
|
||
|
Rectangle {
|
||
|
color: Nheko.colors.window
|
||
|
|
||
|
ColumnLayout {
|
||
|
id: packinfo
|
||
|
|
||
|
property string packName: currentPack ? currentPack.packname : ""
|
||
|
property string avatarUrl: currentPack ? currentPack.avatarUrl : ""
|
||
|
|
||
|
anchors.fill: parent
|
||
|
anchors.margins: Nheko.paddingLarge
|
||
|
spacing: Nheko.paddingLarge
|
||
|
|
||
|
Avatar {
|
||
|
url: packinfo.avatarUrl.replace("mxc://", "image://MxcImage/")
|
||
|
displayName: packinfo.packName
|
||
|
height: 100
|
||
|
width: 100
|
||
|
Layout.alignment: Qt.AlignHCenter
|
||
|
enabled: false
|
||
|
}
|
||
|
|
||
|
MatrixText {
|
||
|
text: packinfo.packName
|
||
|
font.pixelSize: 24
|
||
|
Layout.alignment: Qt.AlignHCenter
|
||
|
}
|
||
|
|
||
|
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
|
||
|
onClicked: currentPack.isGloballyEnabled = !currentPack.isGloballyEnabled
|
||
|
Layout.alignment: Qt.AlignRight
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
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
|
||
|
|
||
|
ScrollHelper {
|
||
|
flickable: parent
|
||
|
anchors.fill: parent
|
||
|
enabled: !Settings.mobileMode
|
||
|
}
|
||
|
|
||
|
// Individual emoji
|
||
|
delegate: AbstractButton {
|
||
|
width: stickerDim
|
||
|
height: stickerDim
|
||
|
hoverEnabled: true
|
||
|
ToolTip.text: ":" + model.shortcode + ": - " + model.body
|
||
|
ToolTip.visible: hovered
|
||
|
|
||
|
contentItem: Image {
|
||
|
height: stickerDim
|
||
|
width: stickerDim
|
||
|
source: model.url.replace("mxc://", "image://MxcImage/")
|
||
|
fillMode: Image.PreserveAspectFit
|
||
|
}
|
||
|
|
||
|
background: Rectangle {
|
||
|
anchors.fill: parent
|
||
|
color: hovered ? Nheko.colors.highlight : 'transparent'
|
||
|
radius: 5
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
footer: DialogButtonBox {
|
||
|
id: buttons
|
||
|
|
||
|
Button {
|
||
|
text: qsTr("Close")
|
||
|
DialogButtonBox.buttonRole: DialogButtonBox.AcceptRole
|
||
|
onClicked: win.close()
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|