This patch will implement delegate item recycling in
ListView. The API will be the same as used in TableView, except
that it will be off by default since the behavior of a delegate
that is reused is not compatible with legacy applications
which were not written with this in mind.
Most importantly:
- Component.onCompleted will only be called on a delegate the
first time it's created, and never when it's reused.
- Any user-declared properties in the delegate (that is, not
model roles, index, etc) will not be cleared or updated when an
item is reused. The application must do this manually upon
receiving the pooled or reused signal in the item.
[ChangeLog][ListView] ListView now has support for reusing delegate
items. This can be switched on by setting the reuseItems property of
ListView to true.
Task-number: QTBUG-80507
Change-Id: I68cc8300b050e4a1f89feebb1d31a2fd9189c793
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Synthesize a "GraphicsStack" client attribute from the various
environment variables that determine the rendering backend. This
allows the baseline server to differentiate the baselines from the
different rendering stacks.
Manual comparison between them can then be done using the -compareto
command line option.
Change-Id: Iea13e130baa97462461ccf8b769d57ea74567c51
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
The stderr output of the qmlscenegrabber subprocess was not forwarded.
Change-Id: I38d304ad2570187de0552ad325149f66aacf3ac3
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
An old, unused, model was just lying around in the code. And the
buttons in the test was modifying it. But after introducing the
syncView concept in 5.14, all the TableViews in the test got their own
separate model. So fix up the test to work as it should with the new setup.
Change-Id: Ic3e6e3013186ef1c2998566b84b3b94e809296e8
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Commit 6e883c53 introduced snapping to pixel grid for non-integer
device pixel ratios. But the snapping also modified the w element of
the coord vector, which resulted in mangled and offset rendering.
As a driveby, add the dpr snapping also to the outlinetext shader, as
it improves rendering quality.
Fixes: QTBUG-70481
Fixes: QTBUG-78160
Change-Id: I4c4b1788005514adc0255878ba24cdf1acc6755f
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Font handling has been observed to differ depending on the presence of
the Info.plist file in the app bundle. We want to test the typical use
case, so make the qmlscenegrabber executable be a bundled app.
Change-Id: I2e8b96328b16d5bedfeb5f6dd23f20c06d4c60c1
Reviewed-by: Daniel Smith <Daniel.Smith@qt.io>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
We need drag threshold to be adjustable on each handler instance instead
of relying only on the system default drag threshold. For example in
some use cases DragHandler needs to work with a threshold of 0 or 1 to
start dragging as soon as the point is pressed or as soon as the point
is moved, with no "jump", to enable fine adjustment of a value on some
control such as a Slider.
This involves moving the dragOverThreshold() functions that handlers are
using from QQuickWindowPrivate to QQuickPointerHandlerPrivate, so that
they can use the adjustable threshold value.
Task-number: QTBUG-68075
Change-Id: Ie720cbbf9f30abb40d1731d92f8e7f1e6534eeb5
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Having neither a list of all possible modifiers nor a link to
Qt::KeyboardModifier was inconvenient. Clarify that bitwise OR
results in logical-AND behavior, while having multiple handlers
results in logical-OR behavior, and that a switch statement in JS
allows you do anything you like with modifiers. Fix the manual test
to test the switch statement and deal with the fact that
point.event.modifiers is undefined: TapHandler can use
eventPoint.modifiers, but any DeviceHandler can use point.modifiers.
Fixes: QTBUG-78234
Change-Id: Iba2a03950aa1279ef454cc76fc8de1b2dab14dfb
Reviewed-by: Venugopal Shivashankar <Venugopal.Shivashankar@qt.io>
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
The grabbing process transports the image data to the main process
over the stdout stream. Windows by default applies LF->CRLF conversion
on that stream. Avoid by setting the binary mode flag on it.
Change-Id: Ieec0911e24e21c111caeb35e35259833e1fdd639
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Use the QFINDTESTDATA mechanism to locate the test suite directory,
and add the data directory and qmlscenegrabber to the installs.
As a driveby, improve runtime by cutting down on needlessly long
waiting time between test scenes.
Change-Id: Id8452c843eef198d8548b196b0a2b5f0bc6be8ba
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
The old hacky way of the test running a "hostinfo.sh" script is about
to be removed, see
https://codereview.qt-project.org/c/qt/qtbase/+/272694
Insted add the value of QT_QUICK_BACKEND (the only
not-automatically-gathered important piece of host information)
programmatically. As a driveby, update it from the obsolete name
"QMLSCENE_DEVICE".
Change-Id: If95a4ccc89ec1c32bf03743071261dfa1b8f5b4d
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
An image inside at the end of a text block which did not start at text
position 0 would resolve to an invalid QTextLine, since we passed
the document position to lineForTextPosition(), which expects the
relative block position. If the image was aligned to top or
bottom, so that the extracted QTextLine was actually accessed,
this would cause a crash.
[ChangeLog][QtQuick][Text] Fixed a bug where aligning an image
to "top" or "bottom" could cause a crash under certain circumstances.
Task-number: QTBUG-77217
Change-Id: Iaa239ba482f2a765703656e4116cbebb8435a66e
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
And show our users even more love.
This path element allows to specify a list of
polylines as a single list of lists of points.
[ChangeLog][QtQuick][Path] Added QQuickPathMultiLine.
Change-Id: Idf1d1dcd928bb19b9ad995322f86822448811537
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Opt in via environment variables:
QSG_RHI=1 -> enable using QRhi instead of GL
QSG_RHI_BACKEND -> set to vulkan, metal, d3d11, gl to override the default
(the default is d3d11 on Windows, metal on Mac, gl elsewhere)
Or force a given rhi backend via the existing
QQuickWindow::setSceneGraphBackend().
Otherwise the default behavior is the same as before, the rhi code path
is never active by default.
-no-opengl builds are supported in the sense that they work and default
to the software backend. However, the rhi code path cannot currently be
used in such builds, even though QRhi from qtbase is fully functional
with Vulkan, D3D, or Metal even when qtbase was configured with
-no-opengl. This cannot be utilized by Quick atm due to OpenGL usage
being all over the place in the sources corresponding to the default
backend, and those host the rhi code path as well. This will be cleaned up
hopefully in Qt 6, with the removal all direct OpenGL usage.
Other env.vars.:
QSG_RHI_DEBUG_LAYER=1 -> enable D3D debug or Vulkan validation layer
(assuming the system is set up for this)
QSG_RHI_SHADEREFFECT_DEBUG=1 -> print stuff from ShaderEffect
QSG_SAMPLES=1,2,4,... -> MSAA sample count (but QSurfaceFormat works too)
QT_D3D_ADAPTER_INDEX=0,1,... -> D3D adapter index
QT_VK_PHYSICAL_DEVICE_INDEX=0,1,... -> Vulkan physical device index
QSG_RHI_UINT32_INDEX=1 -> always use uint index data (both
merged/unmerged, convert when needed - with some rhi backends this is
implicit)
QSG_RENDER_LOOP -> to override the render loop as usual. The default
with RHI is threaded for Metal, threaded for Vulkan on Windows, basic
for Vulkan on Linux and Android (to be checked later), while the existing
rules apply for OpenGL.
Not supported when running with QRhi:
- particles
- compressed atlases (though this is transparent to the apps)
- QSGRenderNode
- QQuickRenderControl
- QQuickFramebufferObject
- certain QQuickWindow functionality that depends directly on OpenGL
- anisotropic filtering for textures
- native text may lack some gamma correction
- QSGEngine applicability unclear
- some QML profiler logs may be incorrect or irrelevant
Change-Id: I7822e99ad79e342e4166275da6e9e66498d76521
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
With this property, Paths and ShapePaths become scalable.
[ChangeLog][QQuick][Path] Added scale property to scale
a path before sending it in to PathView/Shape.
Change-Id: Id9ce7d1247d55e2cdb0d27a19c86fe0970e66268
Fixes: QTBUG-74456
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Add some more TableViews and buttons that can
be used to test the new syncView functionality.
Change-Id: I0ad649598ef2ff08487c9a0b450861c27535c62c
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
This covers the use case of fetching and showing data from a web API.
Change-Id: I9e9cd6a17f409383ba71bc32f0f9d63a45213784
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
It can be used to change any qreal property of its target Item in
response to wheel rotation, or it can be used in other ways that involve
bindings but without a target item.
[ChangeLog][QtQuick][Event Handlers] Added WheelHandler, which handles
mouse wheel rotation by modifying arbitrary Item properties.
Fixes: QTBUG-68119
Change-Id: I247e2325ee993cc1b91a47fbd6c4ba0ffde7ad49
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
The main reason is that the drawer also demonstrates a different use
of the BoundaryRule (limiting drags, with springy endstops).
Change-Id: I958af65a857fda1b5b8dc1b135414799261afc1f
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
This allows us to support simple object rows by default,
which we expect to be the most common use case for TableModel.
Complex rows are supported, but with a limited subset of functionality.
Things that could be improved:
- Would be nice if we could get arbitrary/dynamic properties
like ListModel has, without the complex code that comes
with it. That way we could get rid of all of the role properties
and users could have their own custom roles. The limitation
of only having built-in roles becomes too restrictive very
quickly.
Change-Id: Icbdb6b39665851c55c69c0b79e0aa523c5d46dfe
Reviewed-by: Venugopal Shivashankar <Venugopal.Shivashankar@qt.io>
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
For multiline texts with word wrapping, it is not so meaningful to add
breaks in the last line if it is anyway going to be elided. Fix by
using the WrapAnywhere strategy for the last line for such situations.
Fixes: QTBUG-72736
Change-Id: I1263c81277b6ca89ba461529fced1094263c026f
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
When a window is entered, due to another window being hidden, then it
is possible that the item under the mouse has a different cursor than
the one previously set for that window. Since there will not be a mouse
move at this point yet, then we should update the cursor right away.
Change-Id: I2ef3c72617ae5c995a4daf7daef1ba3311fdcc12
Fixes: QTBUG-41045
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
In preparation for adding more TableModel-related manual tests. We need
these to ensure that we support different use cases.
Change-Id: Ib771b513a3dd62a372335beb1e97a8c946708ec2
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Avoid red since that is also used for marking visual diffs in the
lancelot results. Replace with a great color.
Change-Id: I1da4d1b6dc3cacbd3b5b2574720fcd3176f49a52
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
This is a QML type that can be used as a model for the new TableView.
The model data is set by assigning a JavaScript array to the rows property
(or by calling appendRow()). After data has been assigned for the first time,
the available columns and roles are fixed for the lifetime of the model,
as opposed to ListModel where the dynamicRoles property could be used.
This is done intentionally to simplify the code.
The API is designed to be familiar to users of ListModel:
- To add new rows, use appendRow() and insertRow().
- To modify existing rows, use setRow(), moveRow(), removeRow(), and clear().
[ChangeLog][Qt Labs QML Models] Added the TableModel QML type, a
JavaScript-based model for the new TableView.
Fixes: QTBUG-70334
Change-Id: I55387a08b122227c5624f78af3d450b7695d974a
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
QQuickItemPrivate::data_append() was not invoked when any kind of
Pointer Handler was directly declared in a Flickable (or subclass)
because QQuickFlickable redefines the default property to be its own
flickableData property. So we need to repeat the special handling
in QQuickFlickablePrivate::data_append() too. The handler must
be added to the private->extra->pointerHandlers vector, so that
QQuickItemPrivate::handlePointerEvent() will attempt to deliver
events to those handlers.
TapHandler seems OK (especially with its default gesturePolicy
so that it does not do an exclusive grab).
PointHandler seems OK.
DragHandler competes with Flickable for the exclusive grab.
pressDelay can help; or set acceptedDevices: PointerDevice.Mouse
to allow the mouse to drag but not flick, and the touchscreen
to flick but not drag.
Fixes: QTBUG-71918
Fixes: QTBUG-73035
Change-Id: Icb97ed5230abe0cb6ec0230b5b5759a0528df7e8
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
This demonstrates that DelegateChooser and DelegateChoice are working
with TableView.
In this use case, DelegateChooser uses a role from the model to
decide which delegate type to instantiate. So we need the model to
provide a type role that it can switch on. Conveniently, by using the
Q_ENUM registration of the Type enum, it automatically becomes
possible to match against the stringified versions of those enum
values in the DelegateChoice.roleValue property.
To demonstrate a set of roles which would work for almost any kind of
numeric data, we choose to have a Value role for the current value,
corresponding to the width of the bar or the numerator of the ratio;
and ValueMax for the maximum possible value, corresponding to the
total width of the bar graph, or the denominator of the ratio.
ValueDisplay and ValueMaxDisplay are roles which provide
string-formatted versions of those for labeling purposes. Maybe in
the future we could consider adding those (plus ValueMin and
ValueMinDisplay) to the ItemDataRole enum; because almost any kind of
data model could need to provide numeric data, but for some reason we
have only made it easy to provide strings (DisplayRole) and booleans
(CheckStateRole). Likewise some sort of type role could be
standardized at the same time.
Free / used space is graphically shown as a bar graph. QStorageInfo
provides bytesFree() but not bytesUsed(), but it's more conventional
to show a bar which grows wider as more space is used, so we reverse
it visually by showing a red background with the bytesFree bar
anchored to the right. Thus the width of the red part showing through
is proportional to bytes used.
The three flags isReady, isReadOnly and isValid are shown with
simulated checkboxes.
This manual test is now on its way to becoming an example of how to
use row, column and role effectively together. It's not enough to say
that TableView is only for spreadsheet-like views, displaying only
text in each cell. To display more than text, we can do the same
thing that we have done in the past with models designed for display
with ListView: use the role, so that data(index, role) gets called
multiple times for each cell, to get the values that each delegate
type needs to use to render itself.
Change-Id: I1060eacc2b7d25f420411828258e7d94ee0bdd0b
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Move all qmlplugindump test cases to the autotest one.
Change-Id: If7b5ea119c862507686c11f4dafaa4648d4808f5
Reviewed-by: Marco Benelli <marco.benelli@qt.io>
Add buttons for adding and removing rows and columns
Change-Id: I8d391db4f61ff4ec4273adc7134bd30ffc73fa3c
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
The name indicates that it should test a SinglePointHandler, which
DragHandler no longer is.
Change-Id: I3c585b43c1334cf6794a98c92f742f92243adac8
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
TableView is now ready for Qt-5.12. The only thing missing
is documentation, which is currently being written, and on the
way. So remove the temporary labs plugin that used to register
TableView, and register it together with the other QtQuick items.
Change-Id: I7f360eac3934d228904a4133363e336afe0c451a
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Improve the test so that you can click on
the cells to change their color.
Change-Id: Ia74620894f2885242f587c4c863bcf3544b13488
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
We should set a good example by using enum classes more: internally,
in examples, and in manual tests which might become examples eventually.
Change-Id: Ife6f3b8eaf2f534d474c35e34370361d026f2c47
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>