diff options
122 files changed, 456 insertions, 99 deletions
diff --git a/src/imports/calendar/qquickcalendar.cpp b/src/imports/calendar/qquickcalendar.cpp index 5a14bb27..b64759f2 100644 --- a/src/imports/calendar/qquickcalendar.cpp +++ b/src/imports/calendar/qquickcalendar.cpp @@ -52,7 +52,7 @@ QT_BEGIN_NAMESPACE with the JavaScript Date type, that is used by the QML language. This means that \c Date::getMonth() can be assigned to MonthGrid::month and WeekNumberColumn::month as is. When dealing with dealing with month numbers - diretly, it is highly recommended to use the following enumeration values + directly, it is highly recommended to use the following enumeration values to avoid confusion. \value Calendar.January January (0) diff --git a/src/imports/calendar/qquickcalendarmodel.cpp b/src/imports/calendar/qquickcalendarmodel.cpp index 6b59d45a..9d214450 100644 --- a/src/imports/calendar/qquickcalendarmodel.cpp +++ b/src/imports/calendar/qquickcalendarmodel.cpp @@ -60,9 +60,28 @@ QT_BEGIN_NAMESPACE \row \li \b model.year : int \li The number of the year \endtable + The Qt Labs Calendar module uses 0-based month numbers to be consistent + with the JavaScript Date type, that is used by the QML language. This + means that \c Date::getMonth() can be passed to the methods as is. When + dealing with dealing with month numbers directly, it is highly recommended + to use the following enumeration values to avoid confusion. + + \value Calendar.January January (0) + \value Calendar.February February (1) + \value Calendar.March March (2) + \value Calendar.April April (3) + \value Calendar.May May (4) + \value Calendar.June June (5) + \value Calendar.July July (6) + \value Calendar.August August (7) + \value Calendar.September September (8) + \value Calendar.October October (9) + \value Calendar.November November (10) + \value Calendar.December December (11) + \labs - \sa MonthGrid + \sa MonthGrid, Calendar */ class QQuickCalendarModelPrivate : public QAbstractItemModelPrivate @@ -87,9 +106,16 @@ public: int QQuickCalendarModelPrivate::getCount(const QDate& from, const QDate &to) { + if (!from.isValid() || !to.isValid()) + return 0; + QDate f(from.year(), from.month(), 1); QDate t(to.year(), to.month(), to.daysInMonth()); - QDate r = QDate(1, 1, 1).addDays(f.daysTo(t)); + int days = f.daysTo(t); + if (days < 0) + return 0; + + QDate r = QDate(1, 1, 1).addDays(days); int years = r.year() - 1; int months = r.month() - 1; return 12 * years + months + (r.day() / t.day()); @@ -169,7 +195,7 @@ void QQuickCalendarModel::setTo(const QDate &to) int QQuickCalendarModel::monthAt(int index) const { Q_D(const QQuickCalendarModel); - return d->from.addMonths(index).month(); + return d->from.addMonths(index).month() - 1; } /*! @@ -190,7 +216,8 @@ int QQuickCalendarModel::yearAt(int index) const */ int QQuickCalendarModel::indexOf(const QDate &date) const { - return indexOf(date.year(), date.month()); + Q_D(const QQuickCalendarModel); + return d->getCount(d->from, date) - 1; } /*! @@ -200,8 +227,7 @@ int QQuickCalendarModel::indexOf(const QDate &date) const */ int QQuickCalendarModel::indexOf(int year, int month) const { - Q_D(const QQuickCalendarModel); - return d->getCount(d->from, QDate(year, month, 1)) - 1; + return indexOf(QDate(year, month + 1, 1)); } QVariant QQuickCalendarModel::data(const QModelIndex &index, int role) const diff --git a/src/imports/calendar/qquickmonthgrid.cpp b/src/imports/calendar/qquickmonthgrid.cpp index 8fe9ad63..c6ad3d53 100644 --- a/src/imports/calendar/qquickmonthgrid.cpp +++ b/src/imports/calendar/qquickmonthgrid.cpp @@ -188,7 +188,7 @@ QQuickMonthGrid::QQuickMonthGrid(QQuickItem *parent) : The Qt Labs Calendar module uses 0-based month numbers to be consistent with the JavaScript Date type, that is used by the QML language. This means that \c Date::getMonth() can be assigned to this property as is. - When dealing with dealing with month numbers diretly, it is highly + When dealing with dealing with month numbers directly, it is highly recommended to use the following enumeration values to avoid confusion. \value Calendar.January January (0) diff --git a/src/imports/calendar/qquickweeknumbercolumn.cpp b/src/imports/calendar/qquickweeknumbercolumn.cpp index 031b0555..a128b500 100644 --- a/src/imports/calendar/qquickweeknumbercolumn.cpp +++ b/src/imports/calendar/qquickweeknumbercolumn.cpp @@ -116,7 +116,7 @@ QQuickWeekNumberColumn::QQuickWeekNumberColumn(QQuickItem *parent) : The Qt Labs Calendar module uses 0-based month numbers to be consistent with the JavaScript Date type, that is used by the QML language. This means that \c Date::getMonth() can be assigned to this property as is. - When dealing with dealing with month numbers diretly, it is highly + When dealing with dealing with month numbers directly, it is highly recommended to use the following enumeration values to avoid confusion. \value Calendar.January January (0) diff --git a/src/imports/controls/ComboBox.qml b/src/imports/controls/ComboBox.qml index 30f45af3..6e3dc91b 100644 --- a/src/imports/controls/ComboBox.qml +++ b/src/imports/controls/ComboBox.qml @@ -101,7 +101,7 @@ T.ComboBox { popup: T.Popup { y: control.height - 1 implicitWidth: control.width - implicitHeight: Math.min(396, listview.contentHeight) + implicitHeight: listview.contentHeight topMargin: 6 bottomMargin: 6 diff --git a/src/imports/controls/controls.pro b/src/imports/controls/controls.pro index 0ccdf5a0..9a3f9628 100644 --- a/src/imports/controls/controls.pro +++ b/src/imports/controls/controls.pro @@ -25,7 +25,7 @@ RESOURCES += \ $$PWD/qtlabscontrolsplugin.qrc include(controls.pri) -include(designer/designer.pri) +!ios: include(designer/designer.pri) qtquickcompiler { qmlfiles.prefix = /qt-project.org/imports/Qt/labs/controls diff --git a/src/imports/controls/designer/designer.pri b/src/imports/controls/designer/designer.pri index 601fc4b4..1589723c 100644 --- a/src/imports/controls/designer/designer.pri +++ b/src/imports/controls/designer/designer.pri @@ -29,5 +29,4 @@ QML_FILES += \ $$PWD/TumblerSpecifics.qml QML_FILES += \ - $$PWD/images/todo.png \ - $$PWD/images/todo16.png + $$PWD/images/*.png diff --git a/src/imports/controls/designer/images/busyindicator-icon.png b/src/imports/controls/designer/images/busyindicator-icon.png Binary files differnew file mode 100644 index 00000000..307dccf9 --- /dev/null +++ b/src/imports/controls/designer/images/busyindicator-icon.png diff --git a/src/imports/controls/designer/images/busyindicator-icon16.png b/src/imports/controls/designer/images/busyindicator-icon16.png Binary files differnew file mode 100644 index 00000000..1258b92b --- /dev/null +++ b/src/imports/controls/designer/images/busyindicator-icon16.png diff --git a/src/imports/controls/designer/images/busyindicator-icon16@2x.png b/src/imports/controls/designer/images/busyindicator-icon16@2x.png Binary files differnew file mode 100644 index 00000000..5e5bd2ff --- /dev/null +++ b/src/imports/controls/designer/images/busyindicator-icon16@2x.png diff --git a/src/imports/controls/designer/images/busyindicator-icon@2x.png b/src/imports/controls/designer/images/busyindicator-icon@2x.png Binary files differnew file mode 100644 index 00000000..04c0e3c8 --- /dev/null +++ b/src/imports/controls/designer/images/busyindicator-icon@2x.png diff --git a/src/imports/controls/designer/images/button-icon.png b/src/imports/controls/designer/images/button-icon.png Binary files differnew file mode 100644 index 00000000..37ace9a6 --- /dev/null +++ b/src/imports/controls/designer/images/button-icon.png diff --git a/src/imports/controls/designer/images/button-icon16.png b/src/imports/controls/designer/images/button-icon16.png Binary files differnew file mode 100644 index 00000000..c8a1f80c --- /dev/null +++ b/src/imports/controls/designer/images/button-icon16.png diff --git a/src/imports/controls/designer/images/button-icon16@2x.png b/src/imports/controls/designer/images/button-icon16@2x.png Binary files differnew file mode 100644 index 00000000..8883ae0b --- /dev/null +++ b/src/imports/controls/designer/images/button-icon16@2x.png diff --git a/src/imports/controls/designer/images/button-icon@2x.png b/src/imports/controls/designer/images/button-icon@2x.png Binary files differnew file mode 100644 index 00000000..0070c51b --- /dev/null +++ b/src/imports/controls/designer/images/button-icon@2x.png diff --git a/src/imports/controls/designer/images/checkbox-icon.png b/src/imports/controls/designer/images/checkbox-icon.png Binary files differnew file mode 100644 index 00000000..466af6f3 --- /dev/null +++ b/src/imports/controls/designer/images/checkbox-icon.png diff --git a/src/imports/controls/designer/images/checkbox-icon16.png b/src/imports/controls/designer/images/checkbox-icon16.png Binary files differnew file mode 100644 index 00000000..45f92ee4 --- /dev/null +++ b/src/imports/controls/designer/images/checkbox-icon16.png diff --git a/src/imports/controls/designer/images/checkbox-icon16@2x.png b/src/imports/controls/designer/images/checkbox-icon16@2x.png Binary files differnew file mode 100644 index 00000000..4e78e7ba --- /dev/null +++ b/src/imports/controls/designer/images/checkbox-icon16@2x.png diff --git a/src/imports/controls/designer/images/checkbox-icon@2x.png b/src/imports/controls/designer/images/checkbox-icon@2x.png Binary files differnew file mode 100644 index 00000000..750161dd --- /dev/null +++ b/src/imports/controls/designer/images/checkbox-icon@2x.png diff --git a/src/imports/controls/designer/images/combobox-icon.png b/src/imports/controls/designer/images/combobox-icon.png Binary files differnew file mode 100644 index 00000000..9f485c77 --- /dev/null +++ b/src/imports/controls/designer/images/combobox-icon.png diff --git a/src/imports/controls/designer/images/combobox-icon16.png b/src/imports/controls/designer/images/combobox-icon16.png Binary files differnew file mode 100644 index 00000000..f2d1ec7e --- /dev/null +++ b/src/imports/controls/designer/images/combobox-icon16.png diff --git a/src/imports/controls/designer/images/combobox-icon16@2x.png b/src/imports/controls/designer/images/combobox-icon16@2x.png Binary files differnew file mode 100644 index 00000000..c24f275d --- /dev/null +++ b/src/imports/controls/designer/images/combobox-icon16@2x.png diff --git a/src/imports/controls/designer/images/combobox-icon@2x.png b/src/imports/controls/designer/images/combobox-icon@2x.png Binary files differnew file mode 100644 index 00000000..8df1fd41 --- /dev/null +++ b/src/imports/controls/designer/images/combobox-icon@2x.png diff --git a/src/imports/controls/designer/images/dial-icon.png b/src/imports/controls/designer/images/dial-icon.png Binary files differnew file mode 100644 index 00000000..8989c27e --- /dev/null +++ b/src/imports/controls/designer/images/dial-icon.png diff --git a/src/imports/controls/designer/images/dial-icon16.png b/src/imports/controls/designer/images/dial-icon16.png Binary files differnew file mode 100644 index 00000000..bfbe9d3b --- /dev/null +++ b/src/imports/controls/designer/images/dial-icon16.png diff --git a/src/imports/controls/designer/images/dial-icon16@2x.png b/src/imports/controls/designer/images/dial-icon16@2x.png Binary files differnew file mode 100644 index 00000000..d26fddcf --- /dev/null +++ b/src/imports/controls/designer/images/dial-icon16@2x.png diff --git a/src/imports/controls/designer/images/dial-icon@2x.png b/src/imports/controls/designer/images/dial-icon@2x.png Binary files differnew file mode 100644 index 00000000..8030a0cf --- /dev/null +++ b/src/imports/controls/designer/images/dial-icon@2x.png diff --git a/src/imports/controls/designer/images/frame-icon.png b/src/imports/controls/designer/images/frame-icon.png Binary files differnew file mode 100644 index 00000000..b584d3ed --- /dev/null +++ b/src/imports/controls/designer/images/frame-icon.png diff --git a/src/imports/controls/designer/images/frame-icon16.png b/src/imports/controls/designer/images/frame-icon16.png Binary files differnew file mode 100644 index 00000000..65b033d8 --- /dev/null +++ b/src/imports/controls/designer/images/frame-icon16.png diff --git a/src/imports/controls/designer/images/frame-icon16@2x.png b/src/imports/controls/designer/images/frame-icon16@2x.png Binary files differnew file mode 100644 index 00000000..7076acd0 --- /dev/null +++ b/src/imports/controls/designer/images/frame-icon16@2x.png diff --git a/src/imports/controls/designer/images/frame-icon@2x.png b/src/imports/controls/designer/images/frame-icon@2x.png Binary files differnew file mode 100644 index 00000000..70e72599 --- /dev/null +++ b/src/imports/controls/designer/images/frame-icon@2x.png diff --git a/src/imports/controls/designer/images/groupbox-icon.png b/src/imports/controls/designer/images/groupbox-icon.png Binary files differnew file mode 100644 index 00000000..5525d96c --- /dev/null +++ b/src/imports/controls/designer/images/groupbox-icon.png diff --git a/src/imports/controls/designer/images/groupbox-icon16.png b/src/imports/controls/designer/images/groupbox-icon16.png Binary files differnew file mode 100644 index 00000000..3d228fc1 --- /dev/null +++ b/src/imports/controls/designer/images/groupbox-icon16.png diff --git a/src/imports/controls/designer/images/groupbox-icon16@2x.png b/src/imports/controls/designer/images/groupbox-icon16@2x.png Binary files differnew file mode 100644 index 00000000..c870a24f --- /dev/null +++ b/src/imports/controls/designer/images/groupbox-icon16@2x.png diff --git a/src/imports/controls/designer/images/groupbox-icon@2x.png b/src/imports/controls/designer/images/groupbox-icon@2x.png Binary files differnew file mode 100644 index 00000000..cb46a585 --- /dev/null +++ b/src/imports/controls/designer/images/groupbox-icon@2x.png diff --git a/src/imports/controls/designer/images/itemdelegate-icon.png b/src/imports/controls/designer/images/itemdelegate-icon.png Binary files differnew file mode 100644 index 00000000..d296eed1 --- /dev/null +++ b/src/imports/controls/designer/images/itemdelegate-icon.png diff --git a/src/imports/controls/designer/images/itemdelegate-icon16.png b/src/imports/controls/designer/images/itemdelegate-icon16.png Binary files differnew file mode 100644 index 00000000..bf5727fb --- /dev/null +++ b/src/imports/controls/designer/images/itemdelegate-icon16.png diff --git a/src/imports/controls/designer/images/itemdelegate-icon16@2x.png b/src/imports/controls/designer/images/itemdelegate-icon16@2x.png Binary files differnew file mode 100644 index 00000000..e7e65326 --- /dev/null +++ b/src/imports/controls/designer/images/itemdelegate-icon16@2x.png diff --git a/src/imports/controls/designer/images/itemdelegate-icon@2x.png b/src/imports/controls/designer/images/itemdelegate-icon@2x.png Binary files differnew file mode 100644 index 00000000..1cbe9f79 --- /dev/null +++ b/src/imports/controls/designer/images/itemdelegate-icon@2x.png diff --git a/src/imports/controls/designer/images/label-icon.png b/src/imports/controls/designer/images/label-icon.png Binary files differnew file mode 100644 index 00000000..e551d62b --- /dev/null +++ b/src/imports/controls/designer/images/label-icon.png diff --git a/src/imports/controls/designer/images/label-icon16.png b/src/imports/controls/designer/images/label-icon16.png Binary files differnew file mode 100644 index 00000000..02221a83 --- /dev/null +++ b/src/imports/controls/designer/images/label-icon16.png diff --git a/src/imports/controls/designer/images/label-icon16@2x.png b/src/imports/controls/designer/images/label-icon16@2x.png Binary files differnew file mode 100644 index 00000000..08b71953 --- /dev/null +++ b/src/imports/controls/designer/images/label-icon16@2x.png diff --git a/src/imports/controls/designer/images/label-icon@2x.png b/src/imports/controls/designer/images/label-icon@2x.png Binary files differnew file mode 100644 index 00000000..5b185656 --- /dev/null +++ b/src/imports/controls/designer/images/label-icon@2x.png diff --git a/src/imports/controls/designer/images/pageindicator-icon.png b/src/imports/controls/designer/images/pageindicator-icon.png Binary files differnew file mode 100644 index 00000000..8b190422 --- /dev/null +++ b/src/imports/controls/designer/images/pageindicator-icon.png diff --git a/src/imports/controls/designer/images/pageindicator-icon16.png b/src/imports/controls/designer/images/pageindicator-icon16.png Binary files differnew file mode 100644 index 00000000..ea6cfaad --- /dev/null +++ b/src/imports/controls/designer/images/pageindicator-icon16.png diff --git a/src/imports/controls/designer/images/pageindicator-icon16@2x.png b/src/imports/controls/designer/images/pageindicator-icon16@2x.png Binary files differnew file mode 100644 index 00000000..bb52d401 --- /dev/null +++ b/src/imports/controls/designer/images/pageindicator-icon16@2x.png diff --git a/src/imports/controls/designer/images/pageindicator-icon@2x.png b/src/imports/controls/designer/images/pageindicator-icon@2x.png Binary files differnew file mode 100644 index 00000000..98cc8ea2 --- /dev/null +++ b/src/imports/controls/designer/images/pageindicator-icon@2x.png diff --git a/src/imports/controls/designer/images/pane-icon.png b/src/imports/controls/designer/images/pane-icon.png Binary files differnew file mode 100644 index 00000000..78ba7dc8 --- /dev/null +++ b/src/imports/controls/designer/images/pane-icon.png diff --git a/src/imports/controls/designer/images/pane-icon16.png b/src/imports/controls/designer/images/pane-icon16.png Binary files differnew file mode 100644 index 00000000..aa8eaa35 --- /dev/null +++ b/src/imports/controls/designer/images/pane-icon16.png diff --git a/src/imports/controls/designer/images/pane-icon16@2x.png b/src/imports/controls/designer/images/pane-icon16@2x.png Binary files differnew file mode 100644 index 00000000..dfacdcf7 --- /dev/null +++ b/src/imports/controls/designer/images/pane-icon16@2x.png diff --git a/src/imports/controls/designer/images/pane-icon@2x.png b/src/imports/controls/designer/images/pane-icon@2x.png Binary files differnew file mode 100644 index 00000000..649314fd --- /dev/null +++ b/src/imports/controls/designer/images/pane-icon@2x.png diff --git a/src/imports/controls/designer/images/placeholder-icon.png b/src/imports/controls/designer/images/placeholder-icon.png Binary files differnew file mode 100644 index 00000000..65beb4ac --- /dev/null +++ b/src/imports/controls/designer/images/placeholder-icon.png diff --git a/src/imports/controls/designer/images/placeholder-icon16.png b/src/imports/controls/designer/images/placeholder-icon16.png Binary files differnew file mode 100644 index 00000000..a3e2f2f7 --- /dev/null +++ b/src/imports/controls/designer/images/placeholder-icon16.png diff --git a/src/imports/controls/designer/images/placeholder-icon16@2x.png b/src/imports/controls/designer/images/placeholder-icon16@2x.png Binary files differnew file mode 100644 index 00000000..a8164015 --- /dev/null +++ b/src/imports/controls/designer/images/placeholder-icon16@2x.png diff --git a/src/imports/controls/designer/images/placeholder-icon@2x.png b/src/imports/controls/designer/images/placeholder-icon@2x.png Binary files differnew file mode 100644 index 00000000..f17fff24 --- /dev/null +++ b/src/imports/controls/designer/images/placeholder-icon@2x.png diff --git a/src/imports/controls/designer/images/progressbar-icon.png b/src/imports/controls/designer/images/progressbar-icon.png Binary files differnew file mode 100644 index 00000000..8a283960 --- /dev/null +++ b/src/imports/controls/designer/images/progressbar-icon.png diff --git a/src/imports/controls/designer/images/progressbar-icon16.png b/src/imports/controls/designer/images/progressbar-icon16.png Binary files differnew file mode 100644 index 00000000..91010d85 --- /dev/null +++ b/src/imports/controls/designer/images/progressbar-icon16.png diff --git a/src/imports/controls/designer/images/progressbar-icon16@2x.png b/src/imports/controls/designer/images/progressbar-icon16@2x.png Binary files differnew file mode 100644 index 00000000..93d98b72 --- /dev/null +++ b/src/imports/controls/designer/images/progressbar-icon16@2x.png diff --git a/src/imports/controls/designer/images/progressbar-icon@2x.png b/src/imports/controls/designer/images/progressbar-icon@2x.png Binary files differnew file mode 100644 index 00000000..5dc4130c --- /dev/null +++ b/src/imports/controls/designer/images/progressbar-icon@2x.png diff --git a/src/imports/controls/designer/images/radiobutton-icon.png b/src/imports/controls/designer/images/radiobutton-icon.png Binary files differnew file mode 100644 index 00000000..c19d6984 --- /dev/null +++ b/src/imports/controls/designer/images/radiobutton-icon.png diff --git a/src/imports/controls/designer/images/radiobutton-icon16.png b/src/imports/controls/designer/images/radiobutton-icon16.png Binary files differnew file mode 100644 index 00000000..cbd49ee7 --- /dev/null +++ b/src/imports/controls/designer/images/radiobutton-icon16.png diff --git a/src/imports/controls/designer/images/radiobutton-icon16@2x.png b/src/imports/controls/designer/images/radiobutton-icon16@2x.png Binary files differnew file mode 100644 index 00000000..07396b0d --- /dev/null +++ b/src/imports/controls/designer/images/radiobutton-icon16@2x.png diff --git a/src/imports/controls/designer/images/radiobutton-icon@2x.png b/src/imports/controls/designer/images/radiobutton-icon@2x.png Binary files differnew file mode 100644 index 00000000..8e576eb7 --- /dev/null +++ b/src/imports/controls/designer/images/radiobutton-icon@2x.png diff --git a/src/imports/controls/designer/images/slider-icon.png b/src/imports/controls/designer/images/slider-icon.png Binary files differnew file mode 100644 index 00000000..c4638b43 --- /dev/null +++ b/src/imports/controls/designer/images/slider-icon.png diff --git a/src/imports/controls/designer/images/slider-icon16.png b/src/imports/controls/designer/images/slider-icon16.png Binary files differnew file mode 100644 index 00000000..caab3992 --- /dev/null +++ b/src/imports/controls/designer/images/slider-icon16.png diff --git a/src/imports/controls/designer/images/slider-icon16@2x.png b/src/imports/controls/designer/images/slider-icon16@2x.png Binary files differnew file mode 100644 index 00000000..20faceb2 --- /dev/null +++ b/src/imports/controls/designer/images/slider-icon16@2x.png diff --git a/src/imports/controls/designer/images/slider-icon@2x.png b/src/imports/controls/designer/images/slider-icon@2x.png Binary files differnew file mode 100644 index 00000000..d4fdcd88 --- /dev/null +++ b/src/imports/controls/designer/images/slider-icon@2x.png diff --git a/src/imports/controls/designer/images/spinbox-icon.png b/src/imports/controls/designer/images/spinbox-icon.png Binary files differnew file mode 100644 index 00000000..8135a173 --- /dev/null +++ b/src/imports/controls/designer/images/spinbox-icon.png diff --git a/src/imports/controls/designer/images/spinbox-icon16.png b/src/imports/controls/designer/images/spinbox-icon16.png Binary files differnew file mode 100644 index 00000000..774cdbf5 --- /dev/null +++ b/src/imports/controls/designer/images/spinbox-icon16.png diff --git a/src/imports/controls/designer/images/spinbox-icon16@2x.png b/src/imports/controls/designer/images/spinbox-icon16@2x.png Binary files differnew file mode 100644 index 00000000..00bc8adc --- /dev/null +++ b/src/imports/controls/designer/images/spinbox-icon16@2x.png diff --git a/src/imports/controls/designer/images/spinbox-icon@2x.png b/src/imports/controls/designer/images/spinbox-icon@2x.png Binary files differnew file mode 100644 index 00000000..83fcc689 --- /dev/null +++ b/src/imports/controls/designer/images/spinbox-icon@2x.png diff --git a/src/imports/controls/designer/images/switch-icon.png b/src/imports/controls/designer/images/switch-icon.png Binary files differnew file mode 100644 index 00000000..64c9f80f --- /dev/null +++ b/src/imports/controls/designer/images/switch-icon.png diff --git a/src/imports/controls/designer/images/switch-icon16.png b/src/imports/controls/designer/images/switch-icon16.png Binary files differnew file mode 100644 index 00000000..893a0d9c --- /dev/null +++ b/src/imports/controls/designer/images/switch-icon16.png diff --git a/src/imports/controls/designer/images/switch-icon16@2x.png b/src/imports/controls/designer/images/switch-icon16@2x.png Binary files differnew file mode 100644 index 00000000..09333db6 --- /dev/null +++ b/src/imports/controls/designer/images/switch-icon16@2x.png diff --git a/src/imports/controls/designer/images/switch-icon@2x.png b/src/imports/controls/designer/images/switch-icon@2x.png Binary files differnew file mode 100644 index 00000000..2b5fa0da --- /dev/null +++ b/src/imports/controls/designer/images/switch-icon@2x.png diff --git a/src/imports/controls/designer/images/textarea-icon.png b/src/imports/controls/designer/images/textarea-icon.png Binary files differnew file mode 100644 index 00000000..61b7387c --- /dev/null +++ b/src/imports/controls/designer/images/textarea-icon.png diff --git a/src/imports/controls/designer/images/textarea-icon16.png b/src/imports/controls/designer/images/textarea-icon16.png Binary files differnew file mode 100644 index 00000000..8f23812e --- /dev/null +++ b/src/imports/controls/designer/images/textarea-icon16.png diff --git a/src/imports/controls/designer/images/textarea-icon16@2x.png b/src/imports/controls/designer/images/textarea-icon16@2x.png Binary files differnew file mode 100644 index 00000000..4b81c633 --- /dev/null +++ b/src/imports/controls/designer/images/textarea-icon16@2x.png diff --git a/src/imports/controls/designer/images/textarea-icon@2x.png b/src/imports/controls/designer/images/textarea-icon@2x.png Binary files differnew file mode 100644 index 00000000..3b64908a --- /dev/null +++ b/src/imports/controls/designer/images/textarea-icon@2x.png diff --git a/src/imports/controls/designer/images/textfield-icon.png b/src/imports/controls/designer/images/textfield-icon.png Binary files differnew file mode 100644 index 00000000..c08424bf --- /dev/null +++ b/src/imports/controls/designer/images/textfield-icon.png diff --git a/src/imports/controls/designer/images/textfield-icon16.png b/src/imports/controls/designer/images/textfield-icon16.png Binary files differnew file mode 100644 index 00000000..514ae04e --- /dev/null +++ b/src/imports/controls/designer/images/textfield-icon16.png diff --git a/src/imports/controls/designer/images/textfield-icon16@2x.png b/src/imports/controls/designer/images/textfield-icon16@2x.png Binary files differnew file mode 100644 index 00000000..d93cf59b --- /dev/null +++ b/src/imports/controls/designer/images/textfield-icon16@2x.png diff --git a/src/imports/controls/designer/images/textfield-icon@2x.png b/src/imports/controls/designer/images/textfield-icon@2x.png Binary files differnew file mode 100644 index 00000000..bbb5ca9c --- /dev/null +++ b/src/imports/controls/designer/images/textfield-icon@2x.png diff --git a/src/imports/controls/designer/images/todo.png b/src/imports/controls/designer/images/todo.png Binary files differdeleted file mode 100644 index 9a8a586f..00000000 --- a/src/imports/controls/designer/images/todo.png +++ /dev/null diff --git a/src/imports/controls/designer/images/todo16.png b/src/imports/controls/designer/images/todo16.png Binary files differdeleted file mode 100644 index 0717d1eb..00000000 --- a/src/imports/controls/designer/images/todo16.png +++ /dev/null diff --git a/src/imports/controls/designer/images/toolbar-icon.png b/src/imports/controls/designer/images/toolbar-icon.png Binary files differnew file mode 100644 index 00000000..c65e7038 --- /dev/null +++ b/src/imports/controls/designer/images/toolbar-icon.png diff --git a/src/imports/controls/designer/images/toolbar-icon16.png b/src/imports/controls/designer/images/toolbar-icon16.png Binary files differnew file mode 100644 index 00000000..ee2d3c9c --- /dev/null +++ b/src/imports/controls/designer/images/toolbar-icon16.png diff --git a/src/imports/controls/designer/images/toolbar-icon16@2x.png b/src/imports/controls/designer/images/toolbar-icon16@2x.png Binary files differnew file mode 100644 index 00000000..4ae0f41a --- /dev/null +++ b/src/imports/controls/designer/images/toolbar-icon16@2x.png diff --git a/src/imports/controls/designer/images/toolbar-icon@2x.png b/src/imports/controls/designer/images/toolbar-icon@2x.png Binary files differnew file mode 100644 index 00000000..a41cb0bd --- /dev/null +++ b/src/imports/controls/designer/images/toolbar-icon@2x.png diff --git a/src/imports/controls/designer/images/toolbutton-icon.png b/src/imports/controls/designer/images/toolbutton-icon.png Binary files differnew file mode 100644 index 00000000..8a3cea5e --- /dev/null +++ b/src/imports/controls/designer/images/toolbutton-icon.png diff --git a/src/imports/controls/designer/images/toolbutton-icon16.png b/src/imports/controls/designer/images/toolbutton-icon16.png Binary files differnew file mode 100644 index 00000000..49c9d956 --- /dev/null +++ b/src/imports/controls/designer/images/toolbutton-icon16.png diff --git a/src/imports/controls/designer/images/toolbutton-icon16@2x.png b/src/imports/controls/designer/images/toolbutton-icon16@2x.png Binary files differnew file mode 100644 index 00000000..4d9b2684 --- /dev/null +++ b/src/imports/controls/designer/images/toolbutton-icon16@2x.png diff --git a/src/imports/controls/designer/images/toolbutton-icon@2x.png b/src/imports/controls/designer/images/toolbutton-icon@2x.png Binary files differnew file mode 100644 index 00000000..aff35c52 --- /dev/null +++ b/src/imports/controls/designer/images/toolbutton-icon@2x.png diff --git a/src/imports/controls/designer/images/tumbler-icon.png b/src/imports/controls/designer/images/tumbler-icon.png Binary files differnew file mode 100644 index 00000000..59e827b8 --- /dev/null +++ b/src/imports/controls/designer/images/tumbler-icon.png diff --git a/src/imports/controls/designer/images/tumbler-icon16.png b/src/imports/controls/designer/images/tumbler-icon16.png Binary files differnew file mode 100644 index 00000000..7c2b3a1f --- /dev/null +++ b/src/imports/controls/designer/images/tumbler-icon16.png diff --git a/src/imports/controls/designer/images/tumbler-icon16@2x.png b/src/imports/controls/designer/images/tumbler-icon16@2x.png Binary files differnew file mode 100644 index 00000000..21b70156 --- /dev/null +++ b/src/imports/controls/designer/images/tumbler-icon16@2x.png diff --git a/src/imports/controls/designer/images/tumbler-icon@2x.png b/src/imports/controls/designer/images/tumbler-icon@2x.png Binary files differnew file mode 100644 index 00000000..7a36e8c3 --- /dev/null +++ b/src/imports/controls/designer/images/tumbler-icon@2x.png diff --git a/src/imports/controls/designer/qtlabscontrols.metainfo b/src/imports/controls/designer/qtlabscontrols.metainfo index 1c005c6f..0564077a 100644 --- a/src/imports/controls/designer/qtlabscontrols.metainfo +++ b/src/imports/controls/designer/qtlabscontrols.metainfo @@ -1,12 +1,12 @@ MetaInfo { Type { name: "Qt.labs.controls.BusyIndicator" - icon: "images/todo16.png" + icon: "images/busyindicator-icon16.png" ItemLibraryEntry { name: "Busy Indicator" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/busyindicator-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" } @@ -14,12 +14,12 @@ MetaInfo { Type { name: "Qt.labs.controls.Button" - icon: "images/todo16.png" + icon: "images/button-icon16.png" ItemLibraryEntry { name: "Button" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/button-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -29,12 +29,12 @@ MetaInfo { Type { name: "Qt.labs.controls.CheckBox" - icon: "images/todo16.png" + icon: "images/checkbox-icon16.png" ItemLibraryEntry { name: "Check Box" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/checkbox-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -44,12 +44,12 @@ MetaInfo { Type { name: "Qt.labs.controls.ComboBox" - icon: "images/todo16.png" + icon: "images/combobox-icon16.png" ItemLibraryEntry { name: "Combo Box" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/combobox-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" } @@ -57,12 +57,12 @@ MetaInfo { Type { name: "Qt.labs.controls.Dial" - icon: "images/todo16.png" + icon: "images/dial-icon16.png" ItemLibraryEntry { name: "Dial" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/dial-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" } @@ -70,12 +70,12 @@ MetaInfo { Type { name: "Qt.labs.controls.Frame" - icon: "images/todo16.png" + icon: "images/frame-icon16.png" ItemLibraryEntry { name: "Frame" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/frame-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -86,12 +86,12 @@ MetaInfo { Type { name: "Qt.labs.controls.GroupBox" - icon: "images/todo16.png" + icon: "images/groupbox-icon16.png" ItemLibraryEntry { name: "Group Box" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/groupbox-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -103,12 +103,12 @@ MetaInfo { Type { name: "Qt.labs.controls.ItemDelegate" - icon: "images/todo16.png" + icon: "images/itemdelegate-icon16.png" ItemLibraryEntry { name: "Item Delegate" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/itemdelegate-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -118,12 +118,12 @@ MetaInfo { Type { name: "Qt.labs.controls.Label" - icon: "images/todo16.png" + icon: "images/label-icon16.png" ItemLibraryEntry { name: "Label" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/label-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -133,12 +133,12 @@ MetaInfo { Type { name: "Qt.labs.controls.PageIndicator" - icon: "images/todo16.png" + icon: "images/pageindicator-icon16.png" ItemLibraryEntry { name: "Page Indicator" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/pageindicator-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -148,12 +148,12 @@ MetaInfo { Type { name: "Qt.labs.controls.Pane" - icon: "images/todo16.png" + icon: "images/pane-icon16.png" ItemLibraryEntry { name: "Pane" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/pane-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -164,12 +164,12 @@ MetaInfo { Type { name: "Qt.labs.controls.ProgressBar" - icon: "images/todo16.png" + icon: "images/progressbar-icon16.png" ItemLibraryEntry { name: "Progress Bar" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/progressbar-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -179,12 +179,12 @@ MetaInfo { Type { name: "Qt.labs.controls.RadioButton" - icon: "images/todo16.png" + icon: "images/radiobutton-icon16.png" ItemLibraryEntry { name: "Radio Button" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/radiobutton-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -194,12 +194,12 @@ MetaInfo { Type { name: "Qt.labs.controls.Slider" - icon: "images/todo16.png" + icon: "images/slider-icon16.png" ItemLibraryEntry { name: "Slider" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/slider-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -209,12 +209,12 @@ MetaInfo { Type { name: "Qt.labs.controls.SpinBox" - icon: "images/todo16.png" + icon: "images/spinbox-icon16.png" ItemLibraryEntry { name: "Spin Box" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/spinbox-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" } @@ -222,12 +222,12 @@ MetaInfo { Type { name: "Qt.labs.controls.Switch" - icon: "images/todo16.png" + icon: "images/switch-icon16.png" ItemLibraryEntry { name: "Switch" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/switch-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -237,12 +237,12 @@ MetaInfo { Type { name: "Qt.labs.controls.TextArea" - icon: "images/todo16.png" + icon: "images/textarea-icon16.png" ItemLibraryEntry { name: "Text Area" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/textarea-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -252,12 +252,12 @@ MetaInfo { Type { name: "Qt.labs.controls.TextField" - icon: "images/todo16.png" + icon: "images/textfield-icon16.png" ItemLibraryEntry { name: "Text Field" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/textfield-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -267,12 +267,12 @@ MetaInfo { Type { name: "Qt.labs.controls.ToolButton" - icon: "images/todo16.png" + icon: "images/toolbutton-icon16.png" ItemLibraryEntry { name: "Tool Button" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/toolbutton-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -282,12 +282,12 @@ MetaInfo { Type { name: "Qt.labs.controls.ToolBar" - icon: "images/todo16.png" + icon: "images/toolbar-icon16.png" ItemLibraryEntry { name: "Tool Bar" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/toolbar-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" @@ -297,12 +297,12 @@ MetaInfo { Type { name: "Qt.labs.controls.Tumbler" - icon: "images/todo16.png" + icon: "images/tumbler-icon16.png" ItemLibraryEntry { name: "Tumbler" category: "Qt Labs - Controls" - libraryIcon: "images/todo.png" + libraryIcon: "images/tumbler-icon.png" version: "1.0" requiredImport: "Qt.labs.controls" } diff --git a/src/imports/controls/material/Button.qml b/src/imports/controls/material/Button.qml index d0b05b2c..4dc9bfc5 100644 --- a/src/imports/controls/material/Button.qml +++ b/src/imports/controls/material/Button.qml @@ -86,6 +86,14 @@ T.Button { } } + Rectangle { + width: parent.width + height: parent.height + radius: parent.radius + visible: control.activeFocus + color: control.Material.checkBoxUncheckedRippleColor + } + layer.enabled: control.enabled layer.effect: DropShadow { verticalOffset: 1 diff --git a/src/imports/controls/material/CheckBox.qml b/src/imports/controls/material/CheckBox.qml index abaf571d..fd6ef256 100644 --- a/src/imports/controls/material/CheckBox.qml +++ b/src/imports/controls/material/CheckBox.qml @@ -86,7 +86,7 @@ T.CheckBox { height: width control: control colored: control.checked - opacity: control.pressed ? 1 : 0 + opacity: control.pressed || control.activeFocus ? 1 : 0 } // TODO: This needs to be transparent diff --git a/src/imports/controls/material/ComboBox.qml b/src/imports/controls/material/ComboBox.qml index 5529c546..ef073370 100644 --- a/src/imports/controls/material/ComboBox.qml +++ b/src/imports/controls/material/ComboBox.qml @@ -102,6 +102,14 @@ T.ComboBox { opacity: !control.enabled ? 0.5 : 1.0 source: "qrc:/qt-project.org/imports/Qt/labs/controls/material/images/drop-indicator.png" } + + Rectangle { + width: parent.width + height: parent.height + radius: parent.radius + visible: control.activeFocus + color: control.Material.checkBoxUncheckedRippleColor + } } //! [background] @@ -109,7 +117,7 @@ T.ComboBox { popup: T.Popup { y: control.height implicitWidth: control.width - implicitHeight: Math.min(396, listview.contentHeight) + implicitHeight: listview.contentHeight transformOrigin: Item.Top topMargin: 12 bottomMargin: 12 diff --git a/src/imports/controls/material/RadioButton.qml b/src/imports/controls/material/RadioButton.qml index 429e4f80..4c8831a5 100644 --- a/src/imports/controls/material/RadioButton.qml +++ b/src/imports/controls/material/RadioButton.qml @@ -71,7 +71,7 @@ T.RadioButton { height: width control: control colored: control.checked - opacity: control.pressed ? 1 : 0 + opacity: control.pressed || control.activeFocus ? 1 : 0 } Rectangle { diff --git a/src/imports/controls/material/SliderHandle.qml b/src/imports/controls/material/SliderHandle.qml index dc1a836d..6f54eaf5 100644 --- a/src/imports/controls/material/SliderHandle.qml +++ b/src/imports/controls/material/SliderHandle.qml @@ -55,7 +55,7 @@ Item { height: parent.height radius: width / 2 color: root.control.Material.accentColor - scale: root.handlePressed || root.handleHasFocus ? 1.5 : 1 + scale: root.handlePressed ? 1.5 : 1 Behavior on scale { NumberAnimation { @@ -63,4 +63,12 @@ Item { } } } + + Ripple { + width: parent.width + height: width + control: root.control + colored: true + opacity: root.handleHasFocus && !root.handlePressed ? 1 : 0 + } } diff --git a/src/imports/controls/material/Switch.qml b/src/imports/controls/material/Switch.qml index a38a643c..ca4b1ff6 100644 --- a/src/imports/controls/material/Switch.qml +++ b/src/imports/controls/material/Switch.qml @@ -67,7 +67,7 @@ T.Switch { height: width control: control colored: control.checked - opacity: control.pressed ? 1 : 0 + opacity: control.pressed || control.activeFocus ? 1 : 0 } Rectangle { diff --git a/src/imports/controls/material/qquickmaterialprogressstrip.cpp b/src/imports/controls/material/qquickmaterialprogressstrip.cpp index a3ff6c9b..34590340 100644 --- a/src/imports/controls/material/qquickmaterialprogressstrip.cpp +++ b/src/imports/controls/material/qquickmaterialprogressstrip.cpp @@ -225,6 +225,7 @@ QSGNode *QQuickMaterialProgressStrip::updatePaintNode(QSGNode *oldNode, UpdatePa transformNode->appendChildNode(rectNode); } Q_ASSERT(transformNode->type() == QSGNode::TransformNodeType); + static_cast<QSGTransformNode *>(transformNode)->setMatrix(QMatrix4x4()); QSGRectangleNode *rectNode = static_cast<QSGRectangleNode *>(transformNode->firstChild()); Q_ASSERT(rectNode->type() == QSGNode::GeometryNodeType); diff --git a/src/imports/controls/material/qquickmaterialstyle.cpp b/src/imports/controls/material/qquickmaterialstyle.cpp index 5100d01e..280acb77 100644 --- a/src/imports/controls/material/qquickmaterialstyle.cpp +++ b/src/imports/controls/material/qquickmaterialstyle.cpp @@ -634,7 +634,7 @@ QColor QQuickMaterialStyle::accentColor() const return QColor::fromRgba(m_accent); if (m_accent > BlueGrey) return QColor(); - return colors[m_accent][Shade500]; + return colors[m_accent][m_theme == Light ? Shade500 : Shade200]; } QColor QQuickMaterialStyle::backgroundColor() const @@ -744,7 +744,7 @@ QColor QQuickMaterialStyle::checkBoxCheckedRippleColor() const { QColor pressColor = accentColor(); // TODO: find out actual value - pressColor.setAlpha(30); + pressColor.setAlpha(m_theme == Light ? 30 : 50); return pressColor; } diff --git a/src/templates/qquickcontrol.cpp b/src/templates/qquickcontrol.cpp index 9dbe4181..ae6180ad 100644 --- a/src/templates/qquickcontrol.cpp +++ b/src/templates/qquickcontrol.cpp @@ -201,10 +201,15 @@ void QQuickControl::accessibilityActiveChanged(bool active) return; d->accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(qmlAttachedPropertiesObject<QQuickAccessibleAttached>(this, true)); - if (d->accessibleAttached) - d->accessibleAttached->setRole(accessibleRole()); - else - qWarning() << "QQuickControl: " << this << " QQuickAccessibleAttached object creation failed!"; + + // QQuickControl relies on the existence of a QQuickAccessibleAttached object. + // However, qmlAttachedPropertiesObject(create=true) creates an instance only + // for items that have been created by a QML engine. Therefore we create the + // object by hand for items created in C++ (QQuickPopupItem, for instance). + if (!d->accessibleAttached) + d->accessibleAttached = new QQuickAccessibleAttached(this); + + d->accessibleAttached->setRole(accessibleRole()); } #endif diff --git a/src/templates/qquickmenu.cpp b/src/templates/qquickmenu.cpp index 2a45b6df..13f90546 100644 --- a/src/templates/qquickmenu.cpp +++ b/src/templates/qquickmenu.cpp @@ -518,6 +518,13 @@ bool QQuickMenu::eventFilter(QObject *object, QEvent *event) return QQuickPopup::eventFilter(object, event); } +#ifndef QT_NO_ACCESSIBILITY +QAccessible::Role QQuickMenu::accessibleRole() const +{ + return QAccessible::PopupMenu; +} +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE #include "moc_qquickmenu_p.cpp" diff --git a/src/templates/qquickmenu_p.h b/src/templates/qquickmenu_p.h index ec417d16..9ed3f45c 100644 --- a/src/templates/qquickmenu_p.h +++ b/src/templates/qquickmenu_p.h @@ -89,6 +89,11 @@ protected: Q_SIGNALS: void titleChanged(); +protected: +#ifndef QT_NO_ACCESSIBILITY + QAccessible::Role accessibleRole() const override; +#endif // QT_NO_ACCESSIBILITY + private: Q_DISABLE_COPY(QQuickMenu) Q_DECLARE_PRIVATE(QQuickMenu) diff --git a/src/templates/qquickpopup.cpp b/src/templates/qquickpopup.cpp index 4b953fc6..8e751a39 100644 --- a/src/templates/qquickpopup.cpp +++ b/src/templates/qquickpopup.cpp @@ -105,6 +105,7 @@ QQuickPopupPrivate::QQuickPopupPrivate() : QObjectPrivate() , focus(false) , modal(false) + , complete(false) , hasTopMargin(false) , hasLeftMargin(false) , hasRightMargin(false) @@ -367,6 +368,14 @@ void QQuickPopupItem::paddingChange(const QMarginsF &newPadding, const QMarginsF d->popup->paddingChange(newPadding, oldPadding); } +#ifndef QT_NO_ACCESSIBILITY +QAccessible::Role QQuickPopupItem::accessibleRole() const +{ + Q_D(const QQuickPopupItem); + return d->popup->accessibleRole(); +} +#endif // QT_NO_ACCESSIBILITY + QQuickPopupPositioner::QQuickPopupPositioner(QQuickPopupPrivate *popup) : m_x(0), m_y(0), @@ -473,6 +482,7 @@ void QQuickPopupPositioner::repositionPopup() const qreal iw = m_popup->popupItem->implicitWidth(); const qreal ih = m_popup->popupItem->implicitHeight(); + bool adjusted = false; QRectF rect(m_x, m_y, iw > 0 ? iw : w, ih > 0 ? ih : h); if (m_parentItem) { rect = m_parentItem->mapRectToScene(rect); @@ -484,6 +494,7 @@ void QQuickPopupPositioner::repositionPopup() // if the popup doesn't fit inside the window, try flipping it around (below <-> above) const QRectF flipped = m_parentItem->mapRectToScene(QRectF(m_x, m_parentItem->height() - m_y - rect.height(), rect.width(), rect.height())); if (flipped.top() >= bounds.top() && flipped.bottom() < bounds.bottom()) { + adjusted = true; rect = flipped; } else if (ih > 0) { // neither the flipped around geometry fits inside the window, choose @@ -498,13 +509,14 @@ void QQuickPopupPositioner::repositionPopup() rect.setY(secondary.y()); rect.setHeight(secondary.height()); } + adjusted = true; } } } } m_popup->popupItem->setPosition(rect.topLeft()); - if (ih > 0) + if (adjusted && ih > 0) m_popup->popupItem->setHeight(rect.height()); } @@ -1636,6 +1648,13 @@ void QQuickPopup::paddingChange(const QMarginsF &newPadding, const QMarginsF &ol emit availableHeightChanged(); } +#ifndef QT_NO_ACCESSIBILITY +QAccessible::Role QQuickPopup::accessibleRole() const +{ + return QAccessible::LayeredPane; +} +#endif // QT_NO_ACCESSIBILITY + QT_END_NAMESPACE #include "moc_qquickpopup_p.cpp" diff --git a/src/templates/qquickpopup_p.h b/src/templates/qquickpopup_p.h index 4b5d3e72..51b155f2 100644 --- a/src/templates/qquickpopup_p.h +++ b/src/templates/qquickpopup_p.h @@ -56,6 +56,10 @@ #include <QtQml/qqmllist.h> #include <QtQml/qqmlparserstatus.h> +#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qaccessible.h> +#endif + QT_BEGIN_NAMESPACE class QQuickItem; @@ -315,6 +319,10 @@ protected: virtual void marginsChange(const QMarginsF &newMargins, const QMarginsF &oldMargins); virtual void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding); +#ifndef QT_NO_ACCESSIBILITY + virtual QAccessible::Role accessibleRole() const; +#endif + private: Q_DISABLE_COPY(QQuickPopup) Q_DECLARE_PRIVATE(QQuickPopup) diff --git a/src/templates/qquickpopup_p_p.h b/src/templates/qquickpopup_p_p.h index ba1e90a8..a6fdcd00 100644 --- a/src/templates/qquickpopup_p_p.h +++ b/src/templates/qquickpopup_p_p.h @@ -108,6 +108,10 @@ protected: void itemChange(ItemChange change, const ItemChangeData &data) override; void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) override; +#ifndef QT_NO_ACCESSIBILITY + QAccessible::Role accessibleRole() const override; +#endif + private: Q_DECLARE_PRIVATE(QQuickPopupItem) }; diff --git a/src/templates/qquickrangeslider.cpp b/src/templates/qquickrangeslider.cpp index 1ca4fbed..6dcd7fcb 100644 --- a/src/templates/qquickrangeslider.cpp +++ b/src/templates/qquickrangeslider.cpp @@ -697,6 +697,24 @@ void QQuickRangeSlider::setValues(qreal firstValue, qreal secondValue) secondPrivate->updatePosition(); } +void QQuickRangeSlider::focusInEvent(QFocusEvent *event) +{ + Q_D(QQuickRangeSlider); + QQuickControl::focusInEvent(event); + + // The active focus ends up to RangeSlider when using forceActiveFocus() + // or QML KeyNavigation. We must forward the focus to one of the handles, + // because RangeSlider handles key events for the focused handle. If + // neither handle has active focus, RangeSlider doesn't do anything. + QQuickItem *handle = nextItemInFocusChain(); + // QQuickItem::nextItemInFocusChain() only works as desired with + // Qt::TabFocusAllControls. otherwise pick the first handle + if (!handle || handle == this) + handle = d->first->handle(); + if (handle) + handle->forceActiveFocus(event->reason()); +} + void QQuickRangeSlider::keyPressEvent(QKeyEvent *event) { Q_D(QQuickRangeSlider); diff --git a/src/templates/qquickrangeslider_p.h b/src/templates/qquickrangeslider_p.h index 24653b0e..d81ab98a 100644 --- a/src/templates/qquickrangeslider_p.h +++ b/src/templates/qquickrangeslider_p.h @@ -109,6 +109,7 @@ Q_SIGNALS: void trackChanged(); protected: + void focusInEvent(QFocusEvent *event) override; void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; void mousePressEvent(QMouseEvent *event) override; diff --git a/tests/auto/accessibility/accessibility.pro b/tests/auto/accessibility/accessibility.pro index c57eba11..ca751265 100644 --- a/tests/auto/accessibility/accessibility.pro +++ b/tests/auto/accessibility/accessibility.pro @@ -4,7 +4,7 @@ SOURCES += tst_accessibility.cpp osx:CONFIG -= app_bundle -QT += core-private gui-private qml-private quick-private testlib +QT += core-private gui-private qml-private quick-private labstemplates-private testlib include (../shared/util.pri) diff --git a/tests/auto/accessibility/data/menu.qml b/tests/auto/accessibility/data/menu.qml new file mode 100644 index 00000000..8903bd0b --- /dev/null +++ b/tests/auto/accessibility/data/menu.qml @@ -0,0 +1,12 @@ +import QtQuick 2.5 +import QtQuick.Window 2.2 +import Qt.labs.controls 1.0 + +Window { + visible: true + + Menu { + id: menu + objectName: "menu" + } +} diff --git a/tests/auto/accessibility/data/popup.qml b/tests/auto/accessibility/data/popup.qml new file mode 100644 index 00000000..e95ef2b7 --- /dev/null +++ b/tests/auto/accessibility/data/popup.qml @@ -0,0 +1,12 @@ +import QtQuick 2.5 +import QtQuick.Window 2.2 +import Qt.labs.controls 1.0 + +Window { + visible: true + + Popup { + id: popup + objectName: "popup" + } +} diff --git a/tests/auto/accessibility/tst_accessibility.cpp b/tests/auto/accessibility/tst_accessibility.cpp index 16a138b5..8c05e2f2 100644 --- a/tests/auto/accessibility/tst_accessibility.cpp +++ b/tests/auto/accessibility/tst_accessibility.cpp @@ -41,6 +41,7 @@ #include <QtQml/qqmlcontext.h> #include <QtQuick/qquickview.h> #include <QtQuick/private/qquickitem_p.h> +#include <QtLabsTemplates/private/qquickpopup_p.h> #include "../shared/util.h" #include "../shared/visualtestutil.h" @@ -75,7 +76,9 @@ void tst_accessibility::a11y_data() // Frame // GroupBox QTest::newRow("Label") << "label" << 0x00000029 << "Label"; //QAccessible::StaticText + QTest::newRow("Menu") << "menu" << 0x0000000B << ""; //QAccessible::PopupMenu QTest::newRow("PageIndicator") << "pageindicator" << 0x00000027 << ""; //QAccessible::Indicator + QTest::newRow("Popup") << "popup" << 0x00000080 << ""; //QAccessible::LayeredPane QTest::newRow("ProgressBar") << "progressbar" << 0x00000030 << ""; //QAccessible::ProgressBar QTest::newRow("RadioButton") << "radiobutton" << 0x0000002D << "RadioButton"; //QAccessible::RadioButton QTest::newRow("RangeSlider") << "rangeslider" << 0x00000033 << ""; //QAccessible::Slider @@ -102,6 +105,14 @@ void tst_accessibility::a11y_data() QTest::newRow("WeekNumberColumn") << "weeknumbercolumn" << 0x0 << "WeekNumberColumn"; //QAccessible::NoRole } +static QQuickAccessibleAttached *accessibleAttached(QQuickItem *item) +{ + QQuickAccessibleAttached *acc = qobject_cast<QQuickAccessibleAttached *>(qmlAttachedPropertiesObject<QQuickAccessibleAttached>(item, false)); + if (!acc) + acc = item->findChild<QQuickAccessibleAttached *>(); + return acc; +} + void tst_accessibility::a11y() { QFETCH(QString, name); @@ -128,10 +139,15 @@ void tst_accessibility::a11y() QVERIFY(QTest::qWaitForWindowActive(window)); QQuickItem *item = findItem<QQuickItem>(window->contentItem(), name); + if (!item) { + QQuickPopup *popup = window->contentItem()->findChild<QQuickPopup *>(name); + if (popup) + item = popup->popupItem(); + } QVERIFY(item); #ifndef QT_NO_ACCESSIBILITY - QQuickAccessibleAttached *acc = qobject_cast<QQuickAccessibleAttached *>(qmlAttachedPropertiesObject<QQuickAccessibleAttached>(item, false)); + QQuickAccessibleAttached *acc = accessibleAttached(item); if (name != QLatin1Literal("dayofweekrow") && name != QLatin1Literal("monthgrid") && name != QLatin1Literal("weeknumbercolumn")) { @@ -140,7 +156,7 @@ void tst_accessibility::a11y() } else { QVERIFY(!acc); QAccessible::setActive(true); - acc = qobject_cast<QQuickAccessibleAttached *>(qmlAttachedPropertiesObject<QQuickAccessibleAttached>(item, false)); + acc = accessibleAttached(item); } } QVERIFY(acc); diff --git a/tests/auto/calendar/data/tst_calendarmodel.qml b/tests/auto/calendar/data/tst_calendarmodel.qml new file mode 100644 index 00000000..da2f3d8b --- /dev/null +++ b/tests/auto/calendar/data/tst_calendarmodel.qml @@ -0,0 +1,115 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.2 +import QtTest 1.0 +import QtQml 2.2 +import Qt.labs.calendar 1.0 + +TestCase { + id: testCase + name: "CalendarModel" + + Component { + id: calendarModel + CalendarModel { } + } + + Component { + id: instantiator + Instantiator { + model: CalendarModel { + from: new Date(2016, 0, 1) + to: new Date(2016, 11, 31) + } + QtObject { + readonly property int month: model.month + readonly property int year: model.year + } + } + } + + function test_indices_data() { + return [ + { tag: "2013", from: "2013-01-01", to: "2013-12-31", count: 12 }, + { tag: "2016", from: "2016-01-01", to: "2016-03-31", count: 3 } + ] + } + + function test_indices(data) { + var model = calendarModel.createObject(testCase, {from: data.from, to: data.to}) + verify(model) + + compare(model.count, data.count) + + var y = parseInt(data.tag) + for (var m = 0; m < 12; ++m) { + compare(model.yearAt(m), y) + compare(model.indexOf(y, m), m) + compare(model.indexOf(new Date(y, m, 1)), m) + compare(model.monthAt(m), m) + } + + model.destroy() + } + + function test_invalid() { + var model = calendarModel.createObject(testCase) + verify(model) + + compare(model.indexOf(-1, -1), -1) + compare(model.indexOf(new Date(-1, -1, -1)), -1) + + model.destroy() + } + + function test_instantiator() { + var inst = instantiator.createObject(testCase) + verify(inst) + + compare(inst.count, 12) + for (var m = 0; m < inst.count; ++m) { + compare(inst.objectAt(m).month, m) + compare(inst.objectAt(m).year, 2016) + } + + inst.destroy() + } +} diff --git a/tests/auto/calendar/data/tst_monthgrid.qml b/tests/auto/calendar/data/tst_monthgrid.qml index d07b77db..6c60f92f 100644 --- a/tests/auto/calendar/data/tst_monthgrid.qml +++ b/tests/auto/calendar/data/tst_monthgrid.qml @@ -51,12 +51,26 @@ TestCase { name: "MonthGrid" Component { - id: component + id: defaultGrid MonthGrid { } } + Component { + id: delegateGrid + MonthGrid { + delegate: Item { + readonly property date date: model.date + readonly property int day: model.day + readonly property bool today: model.today + readonly property int weekNumber: model.weekNumber + readonly property int month: model.month + readonly property int year: model.year + } + } + } + function test_locale() { - var control = component.createObject(testCase, {month: 0, year: 2013}) + var control = delegateGrid.createObject(testCase, {month: 0, year: 2013}) compare(control.contentItem.children.length, 6 * 7 + 1) @@ -68,37 +82,53 @@ TestCase { control.locale = Qt.locale("en_GB") compare(control.locale.name, "en_GB") - // M T W T F S S - var en_GB = [31, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 1, 2, 3, - 4, 5, 6, 7, 8, 9, 10] - - for (var i = 0; i < 42; ++i) - compare(control.contentItem.children[i].text, en_GB[i].toString()) + // M T W T F S S + var en_GB = ["2012-12-31", "2013-01-01", "2013-01-02", "2013-01-03", "2013-01-04", "2013-01-05", "2013-01-06", + "2013-01-07", "2013-01-08", "2013-01-09", "2013-01-10", "2013-01-11", "2013-01-12", "2013-01-13", + "2013-01-14", "2013-01-15", "2013-01-16", "2013-01-17", "2013-01-18", "2013-01-19", "2013-01-20", + "2013-01-21", "2013-01-22", "2013-01-23", "2013-01-24", "2013-01-25", "2013-01-26", "2013-01-27", + "2013-01-28", "2013-01-29", "2013-01-30", "2013-01-31", "2013-02-01", "2013-02-02", "2013-02-03", + "2013-02-04", "2013-02-05", "2013-02-06", "2013-02-07", "2013-02-08", "2013-02-09", "2013-02-10"] + + for (var i = 0; i < 42; ++i) { + var cellDate = new Date(en_GB[i]) + compare(control.contentItem.children[i].date.getFullYear(), cellDate.getFullYear()) + compare(control.contentItem.children[i].date.getMonth(), cellDate.getMonth()) + compare(control.contentItem.children[i].date.getDate(), cellDate.getDate()) + compare(control.contentItem.children[i].day, cellDate.getDate()) + compare(control.contentItem.children[i].today, cellDate === new Date()) + compare(control.contentItem.children[i].month, cellDate.getMonth()) + compare(control.contentItem.children[i].year, cellDate.getFullYear()) + } // en_US control.locale = Qt.locale("en_US") compare(control.locale.name, "en_US") - // S M T W T F S - var en_US = [30, 31, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 1, 2, - 3, 4, 5, 6, 7, 8, 9] - - for (var j = 0; j < 42; ++j) - compare(control.contentItem.children[j].text, en_US[j].toString()) + // S M T W T F S + var en_US = ["2012-12-30", "2012-12-31", "2013-01-01", "2013-01-02", "2013-01-03", "2013-01-04", "2013-01-05", + "2013-01-06", "2013-01-07", "2013-01-08", "2013-01-09", "2013-01-10", "2013-01-11", "2013-01-12", + "2013-01-13", "2013-01-14", "2013-01-15", "2013-01-16", "2013-01-17", "2013-01-18", "2013-01-19", + "2013-01-20", "2013-01-21", "2013-01-22", "2013-01-23", "2013-01-24", "2013-01-25", "2013-01-26", + "2013-01-27", "2013-01-28", "2013-01-29", "2013-01-30", "2013-01-31", "2013-02-01", "2013-02-02", + "2013-02-03", "2013-02-04", "2013-02-05", "2013-02-06", "2013-02-07", "2013-02-08", "2013-02-09"] + + for (var j = 0; j < 42; ++j) { + cellDate = new Date(en_US[j]) + compare(control.contentItem.children[j].date.getFullYear(), cellDate.getFullYear()) + compare(control.contentItem.children[j].date.getMonth(), cellDate.getMonth()) + compare(control.contentItem.children[j].date.getDate(), cellDate.getDate()) + compare(control.contentItem.children[j].day, cellDate.getDate()) + compare(control.contentItem.children[j].today, cellDate === new Date()) + compare(control.contentItem.children[j].month, cellDate.getMonth()) + compare(control.contentItem.children[j].year, cellDate.getFullYear()) + } control.destroy() } function test_range() { - var control = component.createObject(testCase) + var control = defaultGrid.createObject(testCase) control.month = 0 compare(control.month, 0) @@ -132,7 +162,7 @@ TestCase { } function test_bce() { - var control = component.createObject(testCase) + var control = defaultGrid.createObject(testCase) compare(control.contentItem.children.length, 6 * 7 + 1) @@ -178,7 +208,7 @@ TestCase { } function test_font() { - var control = component.createObject(testCase) + var control = defaultGrid.createObject(testCase) verify(control.contentItem.children[0]) diff --git a/tests/auto/controls/data/tst_popup.qml b/tests/auto/controls/data/tst_popup.qml index 20859dac..7a34834e 100644 --- a/tests/auto/controls/data/tst_popup.qml +++ b/tests/auto/controls/data/tst_popup.qml @@ -52,11 +52,16 @@ TestCase { name: "Popup" Component { - id: popup + id: popupTemplate T.Popup { } } Component { + id: popupControl + Popup { } + } + + Component { id: rect Rectangle { } } @@ -97,7 +102,7 @@ TestCase { } function test_padding() { - var control = popup.createObject(testCase) + var control = popupTemplate.createObject(testCase) verify(control) paddingSpy.target = control @@ -205,7 +210,7 @@ TestCase { } function test_availableSize() { - var control = popup.createObject(testCase) + var control = popupTemplate.createObject(testCase) verify(control) availableWidthSpy.target = control @@ -277,7 +282,7 @@ TestCase { } function test_background() { - var control = popup.createObject(testCase) + var control = popupTemplate.createObject(testCase) verify(control) control.background = rect.createObject(testCase) @@ -591,4 +596,20 @@ TestCase { control.destroy() } + + function test_size() { + var control = popupControl.createObject(testCase) + verify(control) + + control.width = 200 + control.height = 200 + + control.open() + waitForRendering(control.contentItem) + + compare(control.width, 200) + compare(control.height, 200) + + control.destroy() + } } diff --git a/tests/auto/controls/data/tst_rangeslider.qml b/tests/auto/controls/data/tst_rangeslider.qml index 97104856..cc12b851 100644 --- a/tests/auto/controls/data/tst_rangeslider.qml +++ b/tests/auto/controls/data/tst_rangeslider.qml @@ -655,4 +655,38 @@ TestCase { control.destroy() } + + function test_focus() { + var control = sliderComponent.createObject(testCase) + verify(control) + + waitForRendering(control) + compare(control.activeFocus, false) + + // focus is forwarded to the first handle + control.forceActiveFocus() + compare(control.activeFocus, true) + compare(control.first.handle.activeFocus, true) + compare(control.second.handle.activeFocus, false) + + // move focus to the second handle + control.second.handle.forceActiveFocus() + compare(control.activeFocus, true) + compare(control.first.handle.activeFocus, false) + compare(control.second.handle.activeFocus, true) + + // clear focus + control.focus = false + compare(control.activeFocus, false) + compare(control.first.handle.activeFocus, false) + compare(control.second.handle.activeFocus, false) + + // focus is forwarded to the second handle (where it previously was in the focus scope) + control.forceActiveFocus() + compare(control.activeFocus, true) + compare(control.first.handle.activeFocus, false) + compare(control.second.handle.activeFocus, true) + + control.destroy() + } } |