linphone-desktop/linphone-app/ui/modules/Common/Picker/DatePicker.qml
Julien Wadel 66d5bbc100 Add a confirm popup for meeting deletion.
Change date and time pickers into datetime popup.
Upgrade date picker design.
Fix time picker design to follow popup layout.
Fix audio video conference URI migration in linphonerc and avoid to replace it if it already exists (same for conference URI).
Remove binding loop warning on combobox.
In meeting creation, format dates to system and fix combobox display.
2022-07-15 17:04:40 +02:00

159 lines
No EOL
4.9 KiB
QML

import QtQuick 2.7
import QtQuick.Layouts 1.3
import Common 1.0
import Common.Styles 1.0
import Units 1.0
Item{
id: mainItem
property bool allYears : false // if false : years from today
property alias selectedDate: monthList.selectedDate
signal clicked(date date);
RowLayout {
id: headerRow
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
height: 30
Layout.alignment: Qt.AlignCenter
ActionButton{
isCustom: true
colorSet: DatePickerStyle.nextMonthButton
rotation: 180
onClicked: --monthList.currentIndex
visible: monthList.currentIndex > 0
}
Text { // month year
Layout.fillWidth: true
Layout.alignment: Qt.AlignCenter
horizontalAlignment: Qt.AlignCenter
text: new Date(monthList.currentYear, monthList.currentMonth, 1).toLocaleString(Qt.locale(), 'MMMM yyyy')
color: DatePickerStyle.title.color
font.pointSize: DatePickerStyle.title.pointSize
}
ActionButton{
isCustom: true
colorSet: DatePickerStyle.nextMonthButton
onClicked: ++monthList.currentIndex
visible: monthList.currentIndex < monthList.count
}
}
ListView {
id: monthList
anchors.top: headerRow.bottom
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
cacheBuffer:0
property int maxYears: 5 // Max years to be requested.
function set(date) {
selectedDate = new Date(date)
var moveTo = (selectedDate.getFullYear()-minYear) * 12 + selectedDate.getMonth()
currentIndex = moveTo
}
property date selectedDate: new Date()
property int minYear: mainItem.allYears ? new Date(0,0,0).getFullYear() : new Date().getFullYear()
snapMode: ListView.SnapOneItem
orientation: Qt.Horizontal
clip: true
// One model per month
model: (new Date().getFullYear()- minYear + maxYears) * 12
property int currentYear: Math.floor(currentIndex / 12) + minYear
property int currentMonth: currentIndex % 12
highlightFollowsCurrentItem: true
highlightRangeMode: ListView.StrictlyEnforceRange
highlightMoveDuration: 100
Component.onCompleted: monthList.set(mainItem.selectedDate)
delegate: Item {
width: monthList.width == 0 ? 100 : monthList.width
height: monthList.height == 0 ? 100 : monthList.height
property int year: Math.floor(index / 12) + monthList.minYear
property int month: index % 12
property int firstDay: new Date(year, month, 1).getDay()
GridLayout { // 1 month calender
id: grid
//width: monthList.width; height: monthList.height
anchors.fill: parent
property real cellWidth: width / columns;
property real cellHeight: height / rows // width and height of each cell in the grid.
property real cellMinSize: Math.min(cellHeight, cellWidth)
columns: 7 // days
rows: 7
Repeater {
model: grid.columns * grid.rows // 49 cells per month
delegate: Item{
id: cellItem
property int day: index - 7 // 0 = top left below Sunday (-7 to 41)
property int date: day - firstDay + 1 // 1-31
property bool selected : new Date(year, month, date).toDateString() == monthList.selectedDate.toDateString() && text.text && day >= 0
width: grid.cellMinSize
height: width
Rectangle { // index is 0 to 48
anchors.centerIn: parent
width: Math.max(text.implicitWidth, text.implicitHeight) + 20
height: width
//border.width: 0.3 * radius
border.width: 2
border.color: cellItem.selected ? DatePickerStyle.cell.selectedBorderColor : 'transparent' // selected
//radius: 0.02 * monthList.height
radius: width/2
opacity: !mouseArea.pressed? 1: 0.3 // pressed state
Text {
id: text
anchors.centerIn: parent
color: DatePickerStyle.cell.color
font.pixelSize: cellItem.selected
? DatePickerStyle.cell.selectedPointSize
: cellItem.day < 0
? DatePickerStyle.cell.dayHeaderPointSize
: DatePickerStyle.cell.dayPointSize
font.bold: cellItem.day < 0 || cellItem.selected || new Date(year, month, cellItem.date).toDateString() == new Date().toDateString() // today
text: {
if(cellItem.day < 0)
// Magic date to set day names in this order : 'S', 'M', 'T', 'W', 'T', 'F', 'S' in Locale
return new Date(1,3,index).toLocaleString(Qt.locale(), 'ddd')[0]
else if(new Date(year, month, cellItem.date).getMonth() == month)
return cellItem.date
else
return ''
}
}
}
MouseArea {
id: mouseArea
anchors.fill: parent
enabled: text.text && cellItem.day >= 0
onClicked: {
monthList.selectedDate = new Date(year, month, cellItem.date)
mainItem.clicked(monthList.selectedDate)
}
}
}
}
}
}
}
}