8 changed files with 160 additions and 17 deletions
@ -0,0 +1,99 @@ |
|||||
|
import QtQuick 2.10 |
||||
|
import QtQuick.Controls 2.3 |
||||
|
import QtQuick.Layouts 1.3 |
||||
|
|
||||
|
RowLayout { |
||||
|
id: _edit |
||||
|
spacing: 0 |
||||
|
|
||||
|
property date time: new Date() |
||||
|
onTimeChanged: { |
||||
|
if(!_skipChange) |
||||
|
_forceTime = time |
||||
|
} |
||||
|
|
||||
|
property var _forceTime: new Date() |
||||
|
|
||||
|
readonly property bool is24Hours: { |
||||
|
var fmStr = Qt.locale().timeFormat(Locale.LongFormat); |
||||
|
var isApPm = false; |
||||
|
["A", "AP", "a", "ap"].forEach(function(text){ |
||||
|
if(fmStr.indexOf(text) !== -1) |
||||
|
isApPm = true; |
||||
|
}); |
||||
|
return !isApPm; |
||||
|
} |
||||
|
|
||||
|
readonly property int hours: _hourTumbler.currentIndex + (!is24Hours && _amPmTumbler.currentIndex === 1 ? 12 : 0); |
||||
|
readonly property int minutes: _minuteTumbler.currentIndex; |
||||
|
property bool _skipChange: false |
||||
|
|
||||
|
function recalcTime() { |
||||
|
var hours = _hourTumbler.currentIndex + (!is24Hours && _amPmTumbler.currentIndex === 1 ? 12 : 0); |
||||
|
var minutes = _minuteTumbler.currentIndex; |
||||
|
if(_forceTime.getHours() !== hours || |
||||
|
_forceTime.getMinutes() !== minutes) { |
||||
|
_skipChange = true; |
||||
|
time = new Date(0, 0, 0, hours, minutes); |
||||
|
_skipChange = false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Item { |
||||
|
id: _spacer1 |
||||
|
Layout.fillHeight: true |
||||
|
Layout.fillWidth: true |
||||
|
Layout.preferredWidth: 0 |
||||
|
} |
||||
|
|
||||
|
Tumbler { |
||||
|
id: _hourTumbler |
||||
|
model: { |
||||
|
var model = new Array(is24Hours ? 24 : 12); |
||||
|
for(var i = 0; i < model.length; i++) |
||||
|
model[i] = i.toString(); |
||||
|
if(!is24Hours) |
||||
|
model[0] = 12; |
||||
|
return model; |
||||
|
} |
||||
|
currentIndex: is24Hours ? _forceTime.getHours() : (_forceTime.getHours() % 12) |
||||
|
onCurrentIndexChanged: Qt.callLater(recalcTime) |
||||
|
} |
||||
|
|
||||
|
Label { |
||||
|
text: qsTr(":") |
||||
|
Layout.minimumWidth: implicitWidth |
||||
|
} |
||||
|
|
||||
|
Tumbler { |
||||
|
id: _minuteTumbler |
||||
|
model: { |
||||
|
var mod = new Array(60) |
||||
|
for(var i = 0; i < mod.length; i++) { |
||||
|
var data = i.toString(); |
||||
|
mod[i] = data.length < 2 ? Qt.locale().zeroDigit + data : data; |
||||
|
} |
||||
|
return mod; |
||||
|
} |
||||
|
currentIndex: _forceTime.getMinutes() |
||||
|
onCurrentIndexChanged: Qt.callLater(recalcTime) |
||||
|
} |
||||
|
|
||||
|
Tumbler { |
||||
|
id: _amPmTumbler |
||||
|
visible: !is24Hours |
||||
|
model: [ |
||||
|
Qt.locale().amText, |
||||
|
Qt.locale().pmText, |
||||
|
] |
||||
|
currentIndex: _forceTime.getHours() >= 12 ? 1 : 0 |
||||
|
onCurrentIndexChanged: Qt.callLater(recalcTime) |
||||
|
} |
||||
|
|
||||
|
Item { |
||||
|
id: _spacer2 |
||||
|
Layout.fillHeight: true |
||||
|
Layout.fillWidth: true |
||||
|
Layout.preferredWidth: 0 |
||||
|
} |
||||
|
} |
@ -0,0 +1,19 @@ |
|||||
|
import QtQuick 2.10 |
||||
|
import QtQuick.Controls 2.3 |
||||
|
import QtQuick.Layouts 1.3 |
||||
|
import de.skycoder42.QtMvvm.Quick 1.1 as QtMvvm |
||||
|
|
||||
|
QtMvvm.TimeEdit { |
||||
|
id: _edit |
||||
|
|
||||
|
property var inputValue: new Date() |
||||
|
|
||||
|
onInputValueChanged: { |
||||
|
var realTime = typeof inputValue == "string" ? new Date("2000-01-01T" + inputValue) : inputValue |
||||
|
if(realTime.getHours() !== time.getHours() || |
||||
|
realTime.getMinutes() !== time.getMinutes()) { |
||||
|
time = realTime |
||||
|
} |
||||
|
} |
||||
|
onTimeChanged: inputValue = time |
||||
|
} |
Loading…
Reference in new issue