Eliminate wrapper SpinBox for expire date field

Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
This commit is contained in:
Claudio Cambra 2023-08-07 16:47:58 +08:00 коммит произвёл Matthieu Gallien
Родитель 2dc3af2335
Коммит 265396eba0
1 изменённых файлов: 28 добавлений и 48 удалений

Просмотреть файл

@ -734,11 +734,11 @@ Page {
// QML dates are essentially JavaScript dates, which makes them very finicky and unreliable.
// Instead, we exclusively deal with msecs from epoch time to make things less painful when editing.
// We only use the QML Date when showing the nice string to the user.
SpinBox {
id: expireDateSpinBox
NCInputTextField {
id: expireDateField
function updateText() {
expireDateSpinBoxTextField.text = textFromValue(value, locale);
text = textFromValue(value, locale);
}
// Work arounds the limitations of QML's 32 bit integer when handling msecs from epoch
@ -765,6 +765,10 @@ Page {
return Math.floor(minDateUTC / dayInMSecs) // Start of day at 00:00:0000 UTC
}
readonly property var from: minimumExpireDateReduced
readonly property var to: maximumExpireDateReduced
property var value: expireDateReduced
// Taken from Kalendar 22.08
// https://invent.kde.org/pim/kalendar/-/blob/release/22.08/src/contents/ui/KalendarUtils/dateutils.js
function parseDateString(dateString) {
@ -820,63 +824,39 @@ Page {
return new Date(Date.UTC(fixedYearNum, monthIndexNum, dayNum));
}
Layout.fillWidth: true
height: visible ? implicitHeight : 0
// We want all the internal benefits of the spinbox but don't actually want the
// buttons, so set an empty item as a dummy
up.indicator: Item {}
down.indicator: Item {}
padding: 0
background: null
contentItem: NCInputTextField {
id: expireDateSpinBoxTextField
validInput: {
const value = expireDateSpinBox.valueFromText(text);
return value >= expireDateSpinBox.from && value <= expireDateSpinBox.to;
}
text: expireDateSpinBox.textFromValue(expireDateSpinBox.value, expireDateSpinBox.locale)
readOnly: !expireDateSpinBox.editable
validator: expireDateSpinBox.validator
inputMethodHints: Qt.ImhFormattedNumbersOnly
onAccepted: {
expireDateSpinBox.value = expireDateSpinBox.valueFromText(text, expireDateSpinBox.locale);
expireDateSpinBox.valueModified();
}
}
value: expireDateReduced
from: minimumExpireDateReduced
to: maximumExpireDateReduced
textFromValue: (value, locale) => {
function textFromValue(value, locale) {
const dateFromValue = new Date(value * dayInMSecs);
return dateFromValue.toLocaleDateString(Qt.locale(), Locale.NarrowFormat);
}
valueFromText: (text, locale) => {
function valueFromText(text, locale) {
const dateFromText = parseDateString(text);
return Math.floor(dateFromText.getTime() / dayInMSecs);
}
editable: true
inputMethodHints: Qt.ImhDate | Qt.ImhFormattedNumbersOnly
Layout.fillWidth: true
height: visible ? implicitHeight : 0
validInput: {
const value = valueFromText(text);
return value >= from && value <= to;
}
text: textFromValue(expireDateSpinBox.value, expireDateSpinBox.locale)
inputMethodHints: expireDateSpinBox.inputMethodHints
onAccepted: {
const value = valueFromText(text, expireDateSpinBox.locale);
root.setExpireDate(value * dayInMSecs);
root.waitingForExpireDateChange = true;
}
inputMethodHints: Qt.ImhDate
enabled: root.expireDateEnabled &&
!root.waitingForExpireDateChange &&
!root.waitingForExpireDateEnabledChange
onValueModified: {
if (!enabled || !activeFocus) {
return;
}
root.setExpireDate(value * dayInMSecs);
root.waitingForExpireDateChange = true;
}
NCBusyIndicator {
anchors.fill: parent
visible: root.waitingForExpireDateEnabledChange ||