Browse Source

added date edit (unpolished)

pull/2/head
Skycoder42 7 years ago
parent
commit
2e03b31720
No known key found for this signature in database GPG Key ID: 8E01AD9EF0578D2B
  1. 2
      src/imports/mvvmquick/ContrastToolBar.qml
  2. 169
      src/imports/mvvmquick/DateEdit.qml
  3. 4
      src/imports/mvvmquick/icons/ic_navigate_before_white_24px.svg
  4. 4
      src/imports/mvvmquick/icons/ic_navigate_next_white_24px.svg
  5. 3
      src/imports/mvvmquick/mvvmquick.pro
  6. 1
      src/imports/mvvmquick/qmldir
  7. 42
      src/imports/mvvmquick/qtmvvmquick_plugin.qrc
  8. 20
      src/mvvmquick/DateEdit.qml
  9. 3
      src/mvvmquick/TimeEdit.qml
  10. 2
      src/mvvmquick/inputviewfactory.cpp
  11. 1
      src/mvvmquick/qtmvvmquick_module.qrc

2
src/imports/mvvmquick/ContrastToolBar.qml

@ -28,7 +28,7 @@ ToolBar {
* the color value is checked, too. If baseColor is easily readable, it is simply returned * the color value is checked, too. If baseColor is easily readable, it is simply returned
* as result. Otherwise the method proceeds as usual. * as result. Otherwise the method proceeds as usual.
*/ */
function accentTextColor(accentColor, baseColor) { function accentTextColor(accentColor, baseColor) { //TODO move to global
var a = (0.299 * accentColor.r + 0.587 * accentColor.g + 0.144 * accentColor.b); var a = (0.299 * accentColor.r + 0.587 * accentColor.g + 0.144 * accentColor.b);
if(typeof baseColor !== "undefined") { if(typeof baseColor !== "undefined") {
var b = (0.299 * baseColor.r + 0.587 * baseColor.g + 0.144 * baseColor.b); var b = (0.299 * baseColor.r + 0.587 * baseColor.g + 0.144 * baseColor.b);

169
src/imports/mvvmquick/DateEdit.qml

@ -0,0 +1,169 @@
import QtQuick 2.10
import QtQuick.Controls 2.3
import QtQuick.Controls.Material 2.3
import QtQuick.Layouts 1.3
import Qt.labs.calendar 1.0
ListView {
id: _calenderList
property date firstDate: new Date(1970, 0, 1)
property date lastDate: new Date(9999, 11, 31)
property date currentDate: today();
function today() {
var cDate = new Date();
cDate.setHours(0, 0, 0, 0, 0);
return cDate;
}
QtObject {
id: _p
property bool _skipNextFocus: false
function focusDate() {
if(_skipNextFocus)
_skipNextFocus = false;
else {
_calenderList.currentIndex = calendarModel.indexOf(_calenderList.currentDate);
_calenderList.positionViewAtIndex(_calenderList.currentIndex, ListView.SnapPosition);
}
}
}
Component.onCompleted: _p.focusDate()
onCurrentDateChanged: _p.focusDate()
implicitWidth: 300
implicitHeight: 200
interactive: true
keyNavigationWraps: true
snapMode: ListView.SnapOneItem
orientation: ListView.Horizontal
highlightRangeMode: ListView.StrictlyEnforceRange
clip: true
model: CalendarModel {
id: calendarModel
from: _calenderList.firstDate
to: _calenderList.lastDate
}
delegate: GridLayout {
width: _calenderList.width
height: _calenderList.height
columns: 4
Button {
Layout.rowSpan: 3
Layout.fillHeight: true
Layout.preferredWidth: 36
flat: true
icon.name: "go-previous"
icon.source: "qrc:/de/skycoder42/qtmvvm/quick/icons/ic_navigate_before.svg"
icon.width: 24
icon.height: 24
onClicked: _calenderList.decrementCurrentIndex()
}
Label {
Layout.columnSpan: 2
Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
font.bold: true
text: grid.title
}
Button {
Layout.rowSpan: 3
Layout.fillHeight: true
Layout.preferredWidth: 36
flat: true
icon.name: "go-next"
icon.source: "qrc:/de/skycoder42/qtmvvm/quick/icons/ic_navigate_next.svg"
icon.width: 24
icon.height: 24
onClicked: _calenderList.incrementCurrentIndex()
}
Item {
Layout.fillWidth: true
} // spacer
DayOfWeekRow {
Layout.fillWidth: true
}
WeekNumberColumn {
month: model.month
year: model.year
Layout.fillHeight: true
}
MonthGrid {
id: grid
month: model.month
year: model.year
Layout.fillWidth: true
Layout.fillHeight: true
delegate: Label {
id: dayDelegate
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
opacity: model.month === grid.month ? 1 : 0.5
text: model.day
font: grid.font
//TODO accent text color
background: Rectangle {
readonly property double size: Math.max(dayDelegate.width, dayDelegate.height) * 1.2
anchors.centerIn: parent
height: size
width: size
color: Material.accentColor //TODO highlight color from globally
opacity: model.day === _calenderList.currentDate.getDate() && model.month === _calenderList.currentDate.getMonth() ? 1 : 0
radius: size / 2
Behavior on opacity {
NumberAnimation {
duration: 750
easing.type: Easing.OutBack
}
}
}
MouseArea {
anchors.fill: parent
onClicked: {
if(model.month < grid.month) {
_calenderList.decrementCurrentIndex();
_p._skipNextFocus = true;
} else if(model.month > grid.month) {
_calenderList.incrementCurrentIndex();
_p._skipNextFocus = true;
}
_calenderList.currentDate = model.date;
}
}
}
}
Item {
Layout.fillWidth: true
Layout.columnSpan: 4
Layout.minimumHeight: 0
Layout.maximumHeight: 0
} // spacer, only needed for the additional padding below the month grid
}
}

4
src/imports/mvvmquick/icons/ic_navigate_before_white_24px.svg

@ -0,0 +1,4 @@
<svg fill="#FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
<path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
<path d="M0 0h24v24H0z" fill="none"/>
</svg>

After

Width:  |  Height:  |  Size: 209 B

4
src/imports/mvvmquick/icons/ic_navigate_next_white_24px.svg

@ -0,0 +1,4 @@
<svg fill="#FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
<path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
<path d="M0 0h24v24H0z" fill="none"/>
</svg>

After

Width:  |  Height:  |  Size: 210 B

3
src/imports/mvvmquick/mvvmquick.pro

@ -54,8 +54,9 @@ QML_FILES += \
RoundMenuButton.qml \ RoundMenuButton.qml \
DecorLabel.qml \ DecorLabel.qml \
MsgDelegate.qml \ MsgDelegate.qml \
TimeTumbler.qml \
TimeEdit.qml \ TimeEdit.qml \
TimeTumbler.qml DateEdit.qml
RESOURCES += \ RESOURCES += \
qtmvvmquick_plugin.qrc qtmvvmquick_plugin.qrc

1
src/imports/mvvmquick/qmldir

@ -30,6 +30,7 @@ RoundMenuButton 1.1 RoundMenuButton.qml
DecorLabel 1.1 DecorLabel.qml DecorLabel 1.1 DecorLabel.qml
MsgDelegate 1.1 MsgDelegate.qml MsgDelegate 1.1 MsgDelegate.qml
TimeEdit 1.1 TimeEdit.qml TimeEdit 1.1 TimeEdit.qml
DateEdit 1.1 DateEdit.qml
PresenterProgress 1.0 PresenterProgress.qml PresenterProgress 1.0 PresenterProgress.qml
PresentingStackView 1.0 PresentingStackView.qml PresentingStackView 1.0 PresentingStackView.qml

42
src/imports/mvvmquick/qtmvvmquick_plugin.qrc

@ -1,22 +1,24 @@
<RCC> <RCC>
<qresource prefix="/de/skycoder42/qtmvvm/quick/icons"> <qresource prefix="/de/skycoder42/qtmvvm/quick/icons">
<file alias="ic_error.svg">icons/ic_error_white_24px.svg</file> <file alias="ic_error.svg">icons/ic_error_white_24px.svg</file>
<file alias="ic_help.svg">icons/ic_help_white_24px.svg</file> <file alias="ic_help.svg">icons/ic_help_white_24px.svg</file>
<file alias="ic_info.svg">icons/ic_info_white_24px.svg</file> <file alias="ic_info.svg">icons/ic_info_white_24px.svg</file>
<file alias="ic_warning.svg">icons/ic_warning_white_24px.svg</file> <file alias="ic_warning.svg">icons/ic_warning_white_24px.svg</file>
<file alias="ic_close.svg">icons/ic_close_white_24px.svg</file> <file alias="ic_close.svg">icons/ic_close_white_24px.svg</file>
<file alias="ic_search.svg">icons/ic_search_white_24px.svg</file> <file alias="ic_search.svg">icons/ic_search_white_24px.svg</file>
<file alias="ic_settings_backup_restore.svg">icons/ic_settings_backup_restore_white_24px.svg</file> <file alias="ic_settings_backup_restore.svg">icons/ic_settings_backup_restore_white_24px.svg</file>
<file alias="ic_chevron_right.svg">icons/ic_chevron_right_white_24px.svg</file> <file alias="ic_chevron_right.svg">icons/ic_chevron_right_white_24px.svg</file>
<file alias="ic_more_vert.svg">icons/ic_more_vert_white_24px.svg</file> <file alias="ic_more_vert.svg">icons/ic_more_vert_white_24px.svg</file>
</qresource> <file alias="ic_navigate_before.svg">icons/ic_navigate_before_white_24px.svg</file>
<qresource prefix="/de/skycoder42/qtmvvm/quick/qml"> <file alias="ic_navigate_next.svg">icons/ic_navigate_next_white_24px.svg</file>
<file>FileDialog.qml</file> </qresource>
<file>FolderDialog.qml</file> <qresource prefix="/de/skycoder42/qtmvvm/quick/qml">
<file>AndroidFileDialog.qml</file> <file>FileDialog.qml</file>
<file>AndroidFolderDialog.qml</file> <file>FolderDialog.qml</file>
</qresource> <file>AndroidFileDialog.qml</file>
<qresource prefix="/de/skycoder42/qtmvvm/icons"> <file>AndroidFolderDialog.qml</file>
<file alias="settings.svg">icons/ic_settings_white_24px.svg</file> </qresource>
</qresource> <qresource prefix="/de/skycoder42/qtmvvm/icons">
<file alias="settings.svg">icons/ic_settings_white_24px.svg</file>
</qresource>
</RCC> </RCC>

20
src/mvvmquick/DateEdit.qml

@ -0,0 +1,20 @@
import QtQuick 2.10
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
import de.skycoder42.QtMvvm.Quick 1.1 as QtMvvm
QtMvvm.DateEdit {
id: _edit
property var inputValue: new Date()
onInputValueChanged: {
var realDate = typeof inputValue == "string" ? new Date(inputValue + "T00:00:00") : inputValue
if(realDate.getDate() !== currentDate.getDate() ||
realDate.getMonth() !== currentDate.getMonth() ||
realDate.getYear() !== currentDate.getYear()) {
currentDate = realDate
}
}
onCurrentDateChanged: inputValue = currentDate
}

3
src/mvvmquick/TimeEdit.qml

@ -11,7 +11,8 @@ QtMvvm.TimeEdit {
onInputValueChanged: { onInputValueChanged: {
var realTime = typeof inputValue == "string" ? new Date("2000-01-01T" + inputValue) : inputValue var realTime = typeof inputValue == "string" ? new Date("2000-01-01T" + inputValue) : inputValue
if(realTime.getHours() !== time.getHours() || if(realTime.getHours() !== time.getHours() ||
realTime.getMinutes() !== time.getMinutes()) { realTime.getMinutes() !== time.getMinutes() ||
realTime.getSeconds() !== time.getSeconds()) {
time = realTime time = realTime
} }
} }

2
src/mvvmquick/inputviewfactory.cpp

@ -115,8 +115,8 @@ InputViewFactoryPrivate::InputViewFactoryPrivate() :
{QMetaType::typeName(QMetaType::Double), QStringLiteral("qrc:/qtmvvm/inputs/DoubleSpinBox.qml")}, {QMetaType::typeName(QMetaType::Double), QStringLiteral("qrc:/qtmvvm/inputs/DoubleSpinBox.qml")},
{"number", QStringLiteral("qrc:/qtmvvm/inputs/DoubleSpinBox.qml")}, {"number", QStringLiteral("qrc:/qtmvvm/inputs/DoubleSpinBox.qml")},
{"range", QStringLiteral("qrc:/qtmvvm/inputs/Slider.qml")}, {"range", QStringLiteral("qrc:/qtmvvm/inputs/Slider.qml")},
// {QMetaType::typeName(QMetaType::QDate), QStringLiteral("qrc:/qtmvvm/inputs/")},
{QMetaType::typeName(QMetaType::QTime), QStringLiteral("qrc:/qtmvvm/inputs/TimeEdit.qml")}, {QMetaType::typeName(QMetaType::QTime), QStringLiteral("qrc:/qtmvvm/inputs/TimeEdit.qml")},
{QMetaType::typeName(QMetaType::QDate), QStringLiteral("qrc:/qtmvvm/inputs/DateEdit.qml")},
// {QMetaType::typeName(QMetaType::QDateTime), QStringLiteral("qrc:/qtmvvm/inputs/")}, // {QMetaType::typeName(QMetaType::QDateTime), QStringLiteral("qrc:/qtmvvm/inputs/")},
// {"date", QStringLiteral("qrc:/qtmvvm/inputs/.qml")}, // {"date", QStringLiteral("qrc:/qtmvvm/inputs/.qml")},
{QMetaType::typeName(QMetaType::QFont), QStringLiteral("qrc:/qtmvvm/inputs/FontEdit.qml")}, {QMetaType::typeName(QMetaType::QFont), QStringLiteral("qrc:/qtmvvm/inputs/FontEdit.qml")},

1
src/mvvmquick/qtmvvmquick_module.qrc

@ -11,6 +11,7 @@
<file>RadioListEdit.qml</file> <file>RadioListEdit.qml</file>
<file>Slider.qml</file> <file>Slider.qml</file>
<file>TimeEdit.qml</file> <file>TimeEdit.qml</file>
<file>DateEdit.qml</file>
</qresource> </qresource>
<qresource prefix="/qtmvvm/delegates"> <qresource prefix="/qtmvvm/delegates">
<file>BoolDelegate.qml</file> <file>BoolDelegate.qml</file>

Loading…
Cancel
Save