1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qquickweeknumbercolumn_p.h"
5#include "qquickweeknumbermodel_p.h"
6
7#include <QtQuickTemplates2/private/qquickcontrol_p_p.h>
8#include <QtQml/qqmlinfo.h>
9
10QT_BEGIN_NAMESPACE
11
12/*!
13 \qmltype WeekNumberColumn
14 \inherits Control
15//! \instantiates QQuickWeekNumberColumn
16 \inqmlmodule QtQuick.Controls
17 \brief A column of week numbers.
18
19 WeekNumberColumn presents week numbers in a column. The week numbers
20 are calculated for a given \l month and \l year, using the specified
21 \l {Control::locale}{locale}.
22
23 \image qtquickcontrols-weeknumbercolumn.png
24 \snippet qtquickcontrols-weeknumbercolumn.qml 1
25
26 WeekNumberColumn can be used as a standalone control, but it is most
27 often used in conjunction with MonthGrid. Regardless of the use case,
28 positioning of the column is left to the user.
29
30 \image qtquickcontrols-weeknumbercolumn-layout.png
31 \snippet qtquickcontrols-weeknumbercolumn-layout.qml 1
32
33 The visual appearance of WeekNumberColumn can be changed by
34 implementing a \l {delegate}{custom delegate}.
35
36 \sa MonthGrid, DayOfWeekRow
37*/
38
39class QQuickWeekNumberColumnPrivate : public QQuickControlPrivate
40{
41public:
42 QQuickWeekNumberColumnPrivate() : delegate(nullptr), model(nullptr) { }
43
44 void resizeItems();
45
46 QVariant source;
47 QQmlComponent *delegate;
48 QQuickWeekNumberModel *model;
49};
50
51void QQuickWeekNumberColumnPrivate::resizeItems()
52{
53 if (!contentItem)
54 return;
55
56 QSizeF itemSize;
57 itemSize.setWidth(contentItem->width());
58 itemSize.setHeight((contentItem->height() - 5 * spacing) / 6);
59
60 const auto childItems = contentItem->childItems();
61 for (QQuickItem *item : childItems)
62 item->setSize(itemSize);
63}
64
65QQuickWeekNumberColumn::QQuickWeekNumberColumn(QQuickItem *parent) :
66 QQuickControl(*(new QQuickWeekNumberColumnPrivate), parent)
67{
68 Q_D(QQuickWeekNumberColumn);
69 d->model = new QQuickWeekNumberModel(this);
70 d->source = QVariant::fromValue(value: d->model);
71 connect(sender: d->model, signal: &QQuickWeekNumberModel::monthChanged, context: this, slot: &QQuickWeekNumberColumn::monthChanged);
72 connect(sender: d->model, signal: &QQuickWeekNumberModel::yearChanged, context: this, slot: &QQuickWeekNumberColumn::yearChanged);
73}
74
75/*!
76 \qmlproperty int QtQuick.Controls::WeekNumberColumn::month
77
78 This property holds the number of the month that the week numbers are
79 calculated for. The default value is the current month.
80
81 \include zero-based-months.qdocinc
82
83 \sa Calendar
84*/
85int QQuickWeekNumberColumn::month() const
86{
87 Q_D(const QQuickWeekNumberColumn);
88 return d->model->month() - 1;
89}
90
91void QQuickWeekNumberColumn::setMonth(int month)
92{
93 Q_D(QQuickWeekNumberColumn);
94 if (month < 0 || month > 11) {
95 qmlWarning(me: this) << "month " << month << " is out of range [0...11]";
96 return;
97 }
98 d->model->setMonth(month + 1);
99}
100
101/*!
102 \qmlproperty int QtQuick.Controls::WeekNumberColumn::year
103
104 This property holds the number of the year that the week numbers are calculated for.
105
106 The value must be in the range from \c -271820 to \c 275759. The default
107 value is the current year.
108*/
109int QQuickWeekNumberColumn::year() const
110{
111 Q_D(const QQuickWeekNumberColumn);
112 return d->model->year();
113}
114
115void QQuickWeekNumberColumn::setYear(int year)
116{
117 Q_D(QQuickWeekNumberColumn);
118 if (year < -271820 || year > 275759) {
119 qmlWarning(me: this) << "year " << year << " is out of range [-271820...275759]";
120 return;
121 }
122 d->model->setYear(year);
123}
124
125/*!
126 \internal
127 \qmlproperty model QtQuick.Controls::WeekNumberColumn::source
128
129 This property holds the source model that is used as a data model
130 for the internal content column.
131*/
132QVariant QQuickWeekNumberColumn::source() const
133{
134 Q_D(const QQuickWeekNumberColumn);
135 return d->source;
136}
137
138void QQuickWeekNumberColumn::setSource(const QVariant &source)
139{
140 Q_D(QQuickWeekNumberColumn);
141 if (d->source != source) {
142 d->source = source;
143 emit sourceChanged();
144 }
145}
146
147/*!
148 \qmlproperty Component QtQuick.Controls::WeekNumberColumn::delegate
149
150 This property holds the item delegate that visualizes each week number.
151
152 In addition to the \c index property, a list of model data roles
153 are available in the context of each delegate:
154 \table
155 \row \li \b model.weekNumber : int \li The week number
156 \endtable
157
158 The following snippet presents the default implementation of the item
159 delegate. It can be used as a starting point for implementing custom
160 delegates.
161
162 \snippet basic/WeekNumberColumn.qml delegate
163*/
164QQmlComponent *QQuickWeekNumberColumn::delegate() const
165{
166 Q_D(const QQuickWeekNumberColumn);
167 return d->delegate;
168}
169
170void QQuickWeekNumberColumn::setDelegate(QQmlComponent *delegate)
171{
172 Q_D(QQuickWeekNumberColumn);
173 if (d->delegate != delegate) {
174 d->delegate = delegate;
175 emit delegateChanged();
176 }
177}
178
179void QQuickWeekNumberColumn::componentComplete()
180{
181 Q_D(QQuickWeekNumberColumn);
182 QQuickControl::componentComplete();
183 d->resizeItems();
184}
185
186void QQuickWeekNumberColumn::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
187{
188 Q_D(QQuickWeekNumberColumn);
189 QQuickControl::geometryChange(newGeometry, oldGeometry);
190 if (isComponentComplete())
191 d->resizeItems();
192}
193
194void QQuickWeekNumberColumn::localeChange(const QLocale &newLocale, const QLocale &oldLocale)
195{
196 Q_D(QQuickWeekNumberColumn);
197 QQuickControl::localeChange(newLocale, oldLocale);
198 d->model->setLocale(newLocale);
199}
200
201void QQuickWeekNumberColumn::paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding)
202{
203 Q_D(QQuickWeekNumberColumn);
204 QQuickControl::paddingChange(newPadding, oldPadding);
205 if (isComponentComplete())
206 d->resizeItems();
207}
208
209QT_END_NAMESPACE
210
211#include "moc_qquickweeknumbercolumn_p.cpp"
212

source code of qtdeclarative/src/quicktemplates/qquickweeknumbercolumn.cpp