Compare commits
No commits in common. "8c222c6f6b4c650ac38cb8fcfb5073d85c87dcee" and "ab1ebd61b667eecfa8c3537353113527c9609095" have entirely different histories.
8c222c6f6b
...
ab1ebd61b6
|
@ -7,12 +7,11 @@ Label {
|
||||||
|
|
||||||
required property Item dragParent
|
required property Item dragParent
|
||||||
required property string holder
|
required property string holder
|
||||||
required property int nights
|
|
||||||
required property int reservationId
|
|
||||||
required property string reservationStatus
|
required property string reservationStatus
|
||||||
|
|
||||||
Drag.active: dragHandler.active
|
Drag.active: dragHandler.active
|
||||||
Drag.hotSpot.y: height / 2
|
Drag.hotSpot.x: 0
|
||||||
|
Drag.hotSpot.y: 0
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
padding: 2
|
padding: 2
|
||||||
text: holder
|
text: holder
|
||||||
|
|
|
@ -99,26 +99,40 @@ Control {
|
||||||
id: verticalScroll
|
id: verticalScroll
|
||||||
|
|
||||||
}
|
}
|
||||||
delegate: TimelineView {
|
delegate: DropArea {
|
||||||
|
property real contentWidth: ListView.view.contentWidth
|
||||||
|
required property string name
|
||||||
required property TimelineModel timeline
|
required property TimelineModel timeline
|
||||||
|
property real viewportWidth: ListView.view.width
|
||||||
|
property real viewportX: ListView.view.contentX
|
||||||
|
|
||||||
dayWidth: control.dayWidth
|
|
||||||
fromDate: control.fromDate
|
|
||||||
height: control.rowHeight
|
height: control.rowHeight
|
||||||
model: timeline
|
width: contentWidth
|
||||||
toDate: control.toDate
|
|
||||||
viewportWidth: ListView.view.width
|
|
||||||
viewportX: ListView.view.contentX
|
|
||||||
|
|
||||||
delegate: Reservation {
|
onPositionChanged: function (drag) {
|
||||||
dragParent: timelineList.contentItem
|
drag.source.y = y;
|
||||||
|
drag.source.x = (Math.floor(drag.x / control.dayWidth) + .5) * control.dayWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
Separator {
|
TimelineView {
|
||||||
anchors.bottom: parent.bottom
|
dayWidth: control.dayWidth
|
||||||
anchors.left: parent.left
|
fromDate: control.fromDate
|
||||||
anchors.right: parent.right
|
height: parent.height
|
||||||
palette: control.palette
|
model: parent.timeline
|
||||||
|
toDate: control.toDate
|
||||||
|
viewportWidth: parent.viewportWidth
|
||||||
|
viewportX: parent.viewportX
|
||||||
|
|
||||||
|
delegate: Reservation {
|
||||||
|
dragParent: timelineList.contentItem
|
||||||
|
}
|
||||||
|
|
||||||
|
Separator {
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
palette: control.palette
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
header: Rectangle {
|
header: Rectangle {
|
||||||
|
@ -187,51 +201,5 @@ Control {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DropArea {
|
|
||||||
property int prevDay
|
|
||||||
property int prevLodging
|
|
||||||
|
|
||||||
function addDays(date, days) {
|
|
||||||
var newDate = new Date(date);
|
|
||||||
newDate.setDate(date.getDate() + days);
|
|
||||||
return newDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
function findDayAndLodging(drag: DragEvent): list<int> {
|
|
||||||
const pos = timelineList.contentItem.mapFromItem(this, drag.x, drag.y);
|
|
||||||
const day = Math.floor(pos.x / control.dayWidth);
|
|
||||||
const lodging = Math.floor(pos.y / control.rowHeight);
|
|
||||||
return [day, lodging];
|
|
||||||
}
|
|
||||||
|
|
||||||
function isSpotAvailable(day: int, lodging: int, reservation: Reservation): bool {
|
|
||||||
const view = timelineList.itemAtIndex(lodging);
|
|
||||||
if (!view) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return view.timeline.areDatesAvailable(addDays(control.fromDate, day), addDays(control.fromDate, day + reservation.nights), reservation.reservationId);
|
|
||||||
}
|
|
||||||
|
|
||||||
anchors.fill: timelineList
|
|
||||||
anchors.leftMargin: -30 * control.dayWidth
|
|
||||||
|
|
||||||
onEntered: function (drag) {
|
|
||||||
[prevDay, prevLodging] = findDayAndLodging(drag);
|
|
||||||
}
|
|
||||||
onPositionChanged: function (drag) {
|
|
||||||
let [day, lodging] = findDayAndLodging(drag);
|
|
||||||
if ((day != prevDay || lodging != prevLodging) && isSpotAvailable(day, lodging, drag.source)) {
|
|
||||||
prevDay = day;
|
|
||||||
prevLodging = lodging;
|
|
||||||
} else {
|
|
||||||
day = prevDay;
|
|
||||||
lodging = prevLodging;
|
|
||||||
}
|
|
||||||
drag.source.y = lodging * control.rowHeight;
|
|
||||||
drag.source.x = (day + .5) * control.dayWidth;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,31 +16,6 @@ void TimelineModel::update(const QList<Item *> &items)
|
||||||
m_items.assign(items.begin(), items.end());
|
m_items.assign(items.begin(), items.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TimelineModel::areDatesAvailable(QDate arrival, QDate departure, int excludedId) const
|
|
||||||
{
|
|
||||||
auto [begin, end] = indexesOf(arrival, departure);
|
|
||||||
if (begin == end) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
const Item *first = m_items.at(begin);
|
|
||||||
if (first->id == excludedId) {
|
|
||||||
begin++;
|
|
||||||
if (begin == end) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
first = m_items.at(begin);
|
|
||||||
}
|
|
||||||
const Item *last = m_items.at(end - 1);
|
|
||||||
if (last->id == excludedId) {
|
|
||||||
--end;
|
|
||||||
if (begin == end) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
last = m_items.at(end - 1);
|
|
||||||
}
|
|
||||||
return arrival >= last->departure() || departure <= first->arrival;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::pair<qsizetype, qsizetype> TimelineModel::indexesOf(QDate from, QDate to) const
|
std::pair<qsizetype, qsizetype> TimelineModel::indexesOf(QDate from, QDate to) const
|
||||||
{
|
{
|
||||||
qsizetype begin = searchIndex(from);
|
qsizetype begin = searchIndex(from);
|
||||||
|
@ -50,16 +25,13 @@ std::pair<qsizetype, qsizetype> TimelineModel::indexesOf(QDate from, QDate to) c
|
||||||
|
|
||||||
while (begin > 0) {
|
while (begin > 0) {
|
||||||
--begin;
|
--begin;
|
||||||
|
const Item *item = m_items.at(begin);
|
||||||
if (m_items.at(begin)->departure() < from) {
|
if (m_items.at(begin)->departure() < from) {
|
||||||
++begin;
|
++begin;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (begin == 0 && m_items.at(begin)->arrival >= to) {
|
|
||||||
return std::make_pair(begin, begin);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (qsizetype end = begin + 1; end < m_items.count(); end++) {
|
for (qsizetype end = begin + 1; end < m_items.count(); end++) {
|
||||||
if (m_items.at(end)->arrival >= to) {
|
if (m_items.at(end)->arrival >= to) {
|
||||||
return std::make_pair(begin, end);
|
return std::make_pair(begin, end);
|
||||||
|
|
|
@ -31,7 +31,6 @@ public:
|
||||||
|
|
||||||
void update(const QList<Item *> &items);
|
void update(const QList<Item *> &items);
|
||||||
|
|
||||||
Q_INVOKABLE bool areDatesAvailable(QDate arrival, QDate departure, int excludeId) const;
|
|
||||||
std::pair<qsizetype, qsizetype> indexesOf(QDate from, QDate to) const;
|
std::pair<qsizetype, qsizetype> indexesOf(QDate from, QDate to) const;
|
||||||
const Item *at(qsizetype index) const;
|
const Item *at(qsizetype index) const;
|
||||||
|
|
||||||
|
|
|
@ -174,8 +174,6 @@ TimelineView::Item *TimelineView::createItem(qint64 day, const TimelineModel::It
|
||||||
if (m_reusableItems.isEmpty()) {
|
if (m_reusableItems.isEmpty()) {
|
||||||
QVariantMap initialProperties{
|
QVariantMap initialProperties{
|
||||||
{"holder", modelItem.holder},
|
{"holder", modelItem.holder},
|
||||||
{"nights", modelItem.nights},
|
|
||||||
{"reservationId", modelItem.id},
|
|
||||||
{"reservationStatus", modelItem.status},
|
{"reservationStatus", modelItem.status},
|
||||||
};
|
};
|
||||||
item = qobject_cast<QQuickItem *>(
|
item = qobject_cast<QQuickItem *>(
|
||||||
|
@ -188,8 +186,6 @@ TimelineView::Item *TimelineView::createItem(qint64 day, const TimelineModel::It
|
||||||
} else {
|
} else {
|
||||||
item = m_reusableItems.takeLast();
|
item = m_reusableItems.takeLast();
|
||||||
item->setProperty("holder", modelItem.holder);
|
item->setProperty("holder", modelItem.holder);
|
||||||
item->setProperty("nights", modelItem.nights);
|
|
||||||
item->setProperty("reservationId", modelItem.id);
|
|
||||||
item->setProperty("reservationStatus", modelItem.status);
|
item->setProperty("reservationStatus", modelItem.status);
|
||||||
}
|
}
|
||||||
auto *viewItem = new TimelineView::Item(day, modelItem.nights, *item, *this);
|
auto *viewItem = new TimelineView::Item(day, modelItem.nights, *item, *this);
|
||||||
|
|
Loading…
Reference in New Issue