This is standard for KDE dialogs, but we weren't super consistent about it. Most of this is porting to DialogButtonBox, and using buttonRole. I also made sure the close button is hidden in cases where we have a cancel button already. I also took the time to clean out some cruft like manually calling close() and such. I probably missed a lot more spots, but this is a good improvement.
154 lines
5.3 KiB
QML
154 lines
5.3 KiB
QML
// SPDX-FileCopyrightText: 2025 James Graham <james.h.graham@protonmail.com>
|
|
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
|
|
|
pragma ComponentBehavior: Bound
|
|
|
|
import QtQuick
|
|
import QtQuick.Controls as QQC2
|
|
import QtQuick.Layouts
|
|
|
|
import org.kde.kirigami as Kirigami
|
|
|
|
import org.kde.kirigamiaddons.formcard as FormCard
|
|
import org.kde.kirigamiaddons.delegates as Delegates
|
|
|
|
import org.kde.neochat
|
|
|
|
Kirigami.Dialog {
|
|
id: root
|
|
|
|
required property NeoChatRoom room
|
|
|
|
width: Math.min(QQC2.ApplicationWindow.window.width, Kirigami.Units.gridUnit * 24)
|
|
title: i18nc("@title: create new poll in the room", "Create Poll")
|
|
showCloseButton: false
|
|
standardButtons: QQC2.Dialog.Cancel
|
|
|
|
onAccepted: root.room.postPoll(pollTypeCombo.currentValue, questionTextField.text, optionModel.values())
|
|
|
|
contentItem: ColumnLayout {
|
|
spacing: 0
|
|
|
|
FormCard.FormComboBoxDelegate {
|
|
id: pollTypeCombo
|
|
|
|
text: i18nc("@label", "Poll type:")
|
|
currentIndex: 0
|
|
textRole: "text"
|
|
valueRole: "value"
|
|
model: [
|
|
{ value: PollKind.Disclosed, text: i18nc("@item:inlistbox", "Open poll") },
|
|
{ value: PollKind.Undisclosed, text: i18nc("@item:inlistbox", "Closed poll") }
|
|
]
|
|
}
|
|
FormCard.FormTextDelegate {
|
|
verticalPadding: 0
|
|
text: pollTypeCombo.currentValue == 0 ? i18nc("@info", "Voters can see the result as soon as they have voted") : i18nc("@info", "Results are revealed only after the poll has closed")
|
|
}
|
|
FormCard.FormTextFieldDelegate {
|
|
id: questionTextField
|
|
label: i18nc("@label", "Question:")
|
|
}
|
|
Repeater {
|
|
id: optionRepeater
|
|
|
|
model: ListModel {
|
|
id: optionModel
|
|
|
|
readonly property bool allValuesSet: {
|
|
for (let i = 0; i < optionModel.rowCount(); i++) {
|
|
if (optionModel.get(i).optionText.length <= 0) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
ListElement {
|
|
optionText: ""
|
|
}
|
|
ListElement {
|
|
optionText: ""
|
|
}
|
|
|
|
function values() {
|
|
let textValues = []
|
|
for(let i = 0; i < optionModel.rowCount(); i++) {
|
|
textValues.push(optionModel.get(i).optionText);
|
|
}
|
|
return textValues;
|
|
}
|
|
}
|
|
delegate: FormCard.AbstractFormDelegate {
|
|
id: optionDelegate
|
|
|
|
required property int index
|
|
required property string optionText
|
|
|
|
contentItem: ColumnLayout {
|
|
QQC2.Label {
|
|
id: optionLabel
|
|
|
|
Layout.fillWidth: true
|
|
text: i18nc("As in first answer option to the poll", "Option %1:", optionDelegate.index + 1)
|
|
elide: Text.ElideRight
|
|
wrapMode: Text.Wrap
|
|
Accessible.ignored: true
|
|
}
|
|
RowLayout {
|
|
Layout.fillWidth: true
|
|
|
|
QQC2.TextField {
|
|
id: textField
|
|
Layout.fillWidth: true
|
|
Accessible.name: optionLabel.text
|
|
onTextChanged: {
|
|
optionModel.set(optionDelegate.index, {optionText: text})
|
|
optionModel.allValuesSetChanged()
|
|
}
|
|
placeholderText: i18nc("@placeholder", "Enter option")
|
|
}
|
|
QQC2.ToolButton {
|
|
display: QQC2.AbstractButton.IconOnly
|
|
text: i18nc("@action:button", "Remove option")
|
|
icon.name: "edit-delete-remove"
|
|
onClicked: optionModel.remove(optionDelegate.index)
|
|
QQC2.ToolTip.text: text
|
|
QQC2.ToolTip.delay: Kirigami.Units.toolTipDelay
|
|
QQC2.ToolTip.visible: hovered
|
|
}
|
|
}
|
|
}
|
|
|
|
background: null
|
|
}
|
|
}
|
|
Delegates.RoundedItemDelegate {
|
|
Layout.fillWidth: true
|
|
|
|
horizontalPadding: Kirigami.Units.largeSpacing * 2
|
|
leftInset: Kirigami.Units.largeSpacing + Kirigami.Units.smallSpacing
|
|
rightInset: Kirigami.Units.largeSpacing + Kirigami.Units.smallSpacing
|
|
|
|
highlighted: true
|
|
|
|
icon.name: "list-add"
|
|
text: i18nc("@action:button", "Add option")
|
|
|
|
onClicked: optionModel.append({optionText: ""})
|
|
}
|
|
}
|
|
|
|
footer: QQC2.DialogButtonBox {
|
|
QQC2.Button {
|
|
enabled: optionModel.allValuesSet && questionTextField.text.length > 0
|
|
text: i18nc("@action:button", "Send")
|
|
icon.name: "document-send"
|
|
|
|
onClicked: root.accept()
|
|
|
|
QQC2.DialogButtonBox.buttonRole: QQC2.DialogButtonBox.AcceptRole
|
|
}
|
|
}
|
|
}
|