There is no need to copy the string from the container.
Change-Id: Idebe6a40e6f76ea22d8a8dc6d5d65f3fa277b9d9
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
Use std::copy() instead of memmove(), cppreference.com docs mentions that
it will use memmove() internally, I confirmed that by following the code in
gdb, I did see that it uses:.
__builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
in /usr/include/c++/12/bits/stl_algobase.h
std::copy is more readable / easier-to-use API than memmove.
Change-Id: Iccb2fa1dc9897fd6a922ef96bc25308493d39eac
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
For now this plumbs the QPixmap directly, but as a follow up we should
teach QMessageBox to deal with QIcons instead, and rejig the plumbing
correspondingly.
Change-Id: I51dee4240082abf0acb33b6ade553327295a99bd
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Unlike a regular QWidget or QDialog, a QMessageBox is initialized
to be application modal by default. Make sure we document this quirk
for both of the QMessageBox constructors, and tell the user that it's
possible to override this default.
Add a note about open() and exec() coming with their own set of
semantics when it comes to window modality.
Change-Id: I37a429633cefec94f790d3b0b30d0a8995ef60ae
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Currently QtBase contains multiple implementation of how to get the Win32
and COM error messages, and they are almost exactly the same, what's worse,
Qt already has a private QSystemError class to do such things, so we are
re-inventing the wheel in many places. This patch removes all other custom
error message implementations besides the QSystemError one. And since there
are a lot of places need the COM error message, move the implementation to
QSystemError so that it can handle both Win32 error and COM error.
Since I'm touching these lines anyway, break them into short lines if they
are above the length limit.
Change-Id: I1067c874011800303f0f114b5cb8830ac6810fc0
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
Test causes integrations on macOS to fail.
Temporary solution, fixing of auto test required.
Task-number: QTBUG-108402
Change-Id: I9ceef8ec425cdd5131bce0cfffcb4daf739e674d
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Scale samples up by periodically repeating the bit pattern of each value to fill
up the lower bits instead of padding them with 0.
Vice versa truncate samples that exceed the bit depth of QRgb.
Change-Id: I777519e359932f52e54a33073a1ff297a76f620c
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
We go from non-template toInt/toLongLong/etc. to template
QString::toIntegral_helper<T>, then to non-template
QString::toIntegral_helper, then back to template ::toIntegral().
I could maybe use QtPrivate::to{Signed,Unsigned}Integer, which operate
on QByteArrayView, but its use of QtPrivate::ParsedNumber as a return
type is slightly worse.
Change-Id: I3d74c753055744deb8acfffd1723cbc567837483
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
The original implementation of the toIntegral_helper() called these two
functions, before we added the out-of-line non-template
toIntegral_helper() overloads taking QStringView for Qt 5.15 in commit
f1cbc3c9d2. They should have been inlined
in Qt 6.0, but no one noticed this.
Change-Id: Id8e48e8f498c4a029619fffd172795aaba2d815b
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Support for 1D textures on Vulkan, OpenGL, Metal, and D3D.
Change-Id: Ie74ec103da9cfcbf83fa78588cf8cfc1bd6e104f
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
The native implementation uses NSAlert, making a best effort to map the
QMessageBox properties to the native dialog, falling back to the cross
platform non-native dialog if the discrepancy is too big.
The initial implementation focuses on the current state of the
native dialog helper "protocol", but there's room for improvement
here, which would allow even more dialog types and properties to
be native.
[ChangeLog][macOS] Message boxes such as QMessageBox now follow
the platform look and feel by using native dialogs if possible.
Change-Id: I4da33f99894194a7b301628cd1fbb44d646ddf18
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
As reported by a user.
Fixes: QTBUG-108382
Pick-to: 6.4
Change-Id: Ic94c65d533edd84c8fda5d713d9579a9492b88ae
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
This code became out of sync with the changes to the
LOGFONT_to_QFont() implementation introduced in edb00660.
After that, LOGFONT_to_QFont() on longer adjusts the font size
according to the DPI for the primary display. This means that
the the code should also not get font metrics from the first
display, but instead get metrics at 96 DPI.
Fixes: QTBUG-105857
Pick-to: 6.4 6.2
Change-Id: I5974a77593e1944d889a45a352923fb9aa9a0dec
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Repaint top level window with system background color when it shows up
first time. The system background color will be affected by dark or
light mode settings in windows
Fixes: QTBUG-106583
Pick-to: 6.4
Change-Id: I9205335540e74e90bb068e30fc3d4db037fd580f
Reviewed-by: Yuhang Zhao <2546789017@qq.com>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Not all platforms clean up the shared memory entries on exit, so the
example needs to handle that case, by attaching instead, as documented.
Change-Id: Ifbcf92d0fad429caf30710bd8a344831cb0d859c
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
When a QMessageBox has a native backend we want the QWidget state of
the dialog to still reflect whether the dialog is visible or not,
as this is used by various features of QMessageBox, such as resolving
the default escape button, for example.
It is also key to being able to test the dialog, since the auto test
relies on the observable widget state, and being able to send key events
to the widget to trigger hiding of the dialog.
The other QDialog subclasses with native dialog backends handle this
by showing the native dialog, and then setting Qt::WA_DontShowOnScreen
before calling QDialog::setVisible(), which results in the widget
state being "correct", but not showing any widget-based dialog.
QMessageBox however, did not implement setVisible(), and relied on
the QDialog implementation, which does not contain similar logic.
Ideally we want to clean up these overrides of setVisible(), and let
QDialog handle Qt::WA_DontShowOnScreen for all native dialogs, but
in the meantime we teach QMessageBox to do the same trick as the
other dialog subclasses.
Task-number: QTBUG-108153
Change-Id: I44c67cc9cd89660a703883bd57f351df70d7bdd3
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Our tst_QMessageBox tests exhibits many cases of adding a button
to a message box without a specific title, e.g.:
QPushButton *button = new QPushButton;
msgBox.addButton(button, QMessageBox::DestructiveRole);
This results in buttons without a title, which for a native backend
may be an error. We mitigate the issue by resolving a default button
title based on its role.
Change-Id: Ib8a15818a83021771793ea85a5f782690fe677ec
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
When processing events without QEventLoop::EventLoopExec we can not rely
on [NSApp run] for running the native run loop. This can happen e.g. when
running a dialog, or when processing events manually via processEvents().
Unfortunately, AppKit relies on at least one call to [NSApp run] for doing
critical initialization of NSApplication, so when we end up spinning the
native runloop via other means, we still need to ensure we pass through
[NSApp run] at least once.
Doing so in a way that relies on our own runloop sources firing and
interrupting the NSApp run is fragile though. For example, the logic
added in bffbfc5b33 to avoid live locks
in CFRunLoop by skipping out event runloop source when processEvents()
is called manually will also result in the [NSApp run] never being
stopped.
To fix this we use a dedicated runloop block instead, where we
explicitly call [NSApp stop:] when first entering the runloop.
In addition we ensure that none of our sources will process
events, so that we don't end up recursing into a runModal
or similar call until after we've initialized NSApp.
Change-Id: I137df46d5fa4105cdc39fe74b6c12275cfd46127
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
The two symbols are linked in & exported by using a publicly
visible symbol emscripten_set_wheel_callback. To actually link it,
but avoid calling it, a volatile false boolean flag is used in a
guarding if.
This should ideally be done by setting DEFAULT_LIBRARY_FUNCS_TO_INCLUDE,
but a cmake bug (see QTBUG-108444) is preventing this.
Fixes: QTBUG-108423
Task-number: QTBUG-108444
Change-Id: I6b0406d1059dcec63b3942468e210c53292ffe90
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Skip on crashing tst_qvulkan test
Blacklisted completer_data on qfiledialog
(8d76c5af51 should have been enough but
it is still failing)
Task-number: QTBUG-108328
Task-number: QTBUG-108329
Change-Id: Iad5573af60cca16d16ba0462293e276186e25653
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
shader = QShader() would crash because qAtomicAssign() requires that
the other's d-pointer is non-null. Follows pattern from other usages
in Qt.
Pick-to: 6.2 6.4
Fixes: QTBUG-108121
Change-Id: I57d25a804340839d03f9dadcbd44e956fb259c30
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
This effectively reverts a4a51f6a64
while solving the problem that change intended to fix by an
alternative approach: Swap the order of checks for rhi-based
flushing. Checking the widgets' wishes first was a mistake. We should
first check what is forced, e.g. via the env.vars. Then only move on
investigating the child widget hierarchy if there was nothing specific
requested.
This way having a QOpenGLWidget in a window and running with
QT_WIDGETS_RHI=1 QT_WIDGETS_RHI_BACKEND=vulkan will prioritize the
forced request (Vulkan) and so the QOpenGLWidget will gracefully not
render anything while printing the expected warning to tell what's
going on.
The expensive recursion plaguing the construction of larger widget
hierarchies is now avoided, that should no longer take seconds due to
walking the entire widget hierarchy of the top-level window every time
a new widget is added to it.
However, this then uncovered a set of problems concerning native child
widgets. The repaint manager seems to have an obvious mistake where
the usage of rhi (and so textures and whatnot) is decided based on
'widget' (which is either a top-level or a native child) instead of
'tlw' (which is the top-level with the backingstore). The usesRhiFlush
flag only really matters for a real top-level, not for native child
widgets. The rhi-based flushing is tied to the backingstore, and the
backingstore comes from the top-level widget.
Finally, make the qopenglwidget autotest to actually exercise
something when it comes to QOpenGLWidgets (or their ancestors) turned
native. The original code from a long time ago does not really test
native child widgets, because it turns the top-level into native which
is quite superfluous since the toplevel is backed by a native window
(and a backingstore) anyway.
Pick-to: 6.4
Task-number: QTBUG-105017
Fixes: QTBUG-108344
Fixes: QTBUG-108277
Change-Id: I1785b0ca627cf151aad06a5489f63874d787f087
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
In QAccessibleTable's model, cells (rather than rows or columns)
are direct children of the table and therefore items handled in
the selection, so forward/make use of the corresponding methods
that handle cells.
(In QAccessibleTable::select and QAccessibleTable::unselect,
cast the child cell to QAccessibleTableCell*, as is already
done in QAccessibleTable::indexOfChild and
QAccessibleTree::indexOfChild.)
This can be tested e.g. by calling the methods from the
AT-SPI Selection interface using Accerciser and the
"interview" example
(qtbase/examples/widgets/itemviews/interview/interview).
Change-Id: Ic650a8a01b56653cae4f2cb26e28aed4dc566a7e
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
QPdfEngine already supported links to external URIs, but not internal
links for navigation in a document.
For internal links, PDF supports "named destinations" instead of
direct coordinates. That way, we avoid the need for a two-pass
implementation. Instead, we just store the name and position of all
anchors as we enounter them. At document finishing time, we export the
list of named destinations in a PDF "name tree" structure.
The PDF named destinations feature uses the same main catalog item
("Names") as the attached files feature. Hence, this commit must
slightly change the implementation of file attachment support also, so
that the structure supports both. Now, we always add a reference to a
Names object in the catalog when we start the document. When we
finish, we write that object, making it reference the attached
files-structure and/or the named destinations-structure, as needed.
Fixes: QTBUG-83458
Change-Id: I9c43e7b423062d3f21965ab8a0d81a53c4dd72cb
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
QtVirtualKeyboard can be used for non touch apps as well. We were not
taking this into consideration and only allowing touch devices to
access it.
Pick-to: 6.4
Change-Id: I17fcb360b6655ace4fba7447eb85561ba75338a5
Reviewed-by: David Skoland <david.skoland@qt.io>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
This bridges the newly introduced QAccessibleSelectionInterface
to AT-SPI by exposing the AT-SPI Selection interface for
objects implementing QAccessibleSelectionInterface and
implementing the methods of the AT-SPI Selection
interface.
Fixes: QTBUG-105909
Change-Id: Ia05cef6c7dad8675ba8573f662f4338d301cf0e3
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
`dlopen` feature is used in qlibraryinfo.cpp without `library` feature.
Change condition that adds libdl library to make sure that we can build without `library` feature.
Pick-to: 6.4
Change-Id: I5051e6b2e0a8daae5f7e269ed8980df99ecaa192
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
The problem is caused by GCC 13 having an intrinsic for is_convertible,
and that (correctly) checks for incomplete types. We then manage to
trigger the instantiation of the QAnyStringView converting constructor from isUtf16 etc.,
and that triggers the enable_if and is_convertible. The fix is to move
the Tag definition earlier, and to eagerly SFINAE away the Tag type so
that the converting constructor rejects it. Otherwise, the converting
constructor is considered a candidate for comparisons of Tags, and gets
instantiated for overload resolution.
Fixes: QTBUG-108136
Change-Id: I9b0c0f7ac771cdbf6a9c35a3d3b0ea01b88b970e
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
The qtUpdateDpi function is a module function, not a scope function
(regardless of it being window-scope self or QtLoader-scope self).
Therefore it should be executed with module as this.
Fixes: QTBUG-108112
Pick-to: 6.4
Change-Id: Ib4604a43dbdd0caa114d3d892ea97b5ee4c9a9a8
Reviewed-by: Aleksandr Reviakin <aleksandr.reviakin@qt.io>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
It's in the way of the planned QtCore std::span reimplementation of
the same name.
Task-number: QTBUG-108124
Change-Id: I55d9391d72644c02e4e4143f4ad2f6756404dcc7
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
This frees up the QSpan name for the planned QtCore std::span
reimplementation, also called QSpan.
This is binary compatible because QSpan was just a typedef and because
it's all private API.
Task-number: QTBUG-108124
Change-Id: I3b5c1ea82673934e2d1eb490fddeae3f8e6a6ea3
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
saveRestoreGeometry() somtimes creates a 29px offset when debugged in
Qt Creator, which makes the test fail.
This patch adds a code comment to make developers aware of this fact.
Pick-to: 6.2 6.4
Change-Id: I920bd02eb7543faf8b25a0a242b888f3a3745e2a
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Nothing in this class uses it, so there's no reason to document the
typedef. It will just confuse both the compiler and the user when we
add QSpan (a std::span implementation).
Pick-to: 6.4 6.2
Task-number: QTBUG-108124
Change-Id: Iff0249d2e12a05fca15998a046a0b1bf607b60be
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
multipleToplevelFocusCheck() occasionally failed on XCB because
QApplication::activeWindow() was nullptr immediately after
qWaitForWindowActive() returned true.
This patch replaces QCOMPARE on QGuiApplicaiton::activeWindow() with
QTRY_COMPARE in order to continue spinning the event loop until the
condition has been met. It adds QWidget::activateWindow after show()
to ensure focus is acquired also when another window has received
focus in the meanwhile.
Pick-to: 6.2 6.4
Change-Id: If84eb8b77c5a6b16af271334a1fe5eb92c05644b
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
This adds a new QAccessibleSelectionInterface
that implements support for handling selections,
both retrieving information about the current selection
as well as modifying the selection, thus providing
the necessary foundation for exposing selections
to assistive technology.
This is similar to AT-SPI's Selection interface [1],
but uses QAccessibleInterface pointers instead of
child indices as parameters for methods.
Bridging this newly introduced interface to AT-SPI
will be done in a follow-up change.
The concept for selection handling in Microsoft's
UI Automation looks similar, so bridging this to the
corresponding UIA interfaces ISelectionProvider [2],
ISelectionItemProvider [3] and ISelectionProvider2 [4]
should also be reasonably straightforward.
At this point, this is only meant to be used for
handling selection of direct children as is the
concept in AT-SPI's Selection and presumably
in UIA as well. (The ISelectionItemProvider and
ISelectionProvider doc speaks of "child controls
of containers" etc., but doesn't explicitly mention
that this is only for direct children or whether
grand children are also allowed.)
(The proposed API itself could
also be used to support selection of objects
that are no direct children, but the practical
use of that is unclear and it would make mapping/
bridging to platform a11y layers tricky.)
[5] demonstrates a sample implementation of the
QAccessibleSelectionInterface for the Qt-based
UI variants of LibreOffice (screencast that
shows the use of the interface attached to
QTBUG-105909).
This interface is marked \preliminary until:
1. There is a working a11y bridge for macOS/VoiceOver
2. There is a working a11y bridge for Windows/UI Automation
3. There is a working a11y bridge for linux/AT-SPI
4. There is at least one implementation (e.g. QAccessibleTable)
that implements it successfully (second candidate:
Qt Quick TableView [6])
[1] https://lazka.github.io/pgi-docs/Atspi-2.0/classes/Selection.html
[2] https://docs.microsoft.com/en-us/windows/win32/api/uiautomationcore/nn-uiautomationcore-iselectionprovider
[3] https://docs.microsoft.com/en-us/windows/win32/api/uiautomationcore/nn-uiautomationcore-iselectionitemprovider
[4] https://docs.microsoft.com/en-us/windows/win32/api/uiautomationcore/nn-uiautomationcore-iselectionprovider2
[5] https://gerrit.libreoffice.org/c/core/+/138750
[6] https://doc-snapshots.qt.io/qt6-dev/qml-qtquick-tableview.html
[ChangeLog][QtGui][QAccessibleSelectionInterface] Added new
preliminary QAccessibleSelectionInterface that can be used to expose
selections to assistive technology.
Task-number: QTBUG-105909
Change-Id: If77beacd94fa3eb663f0fbb2373f12382bab2ee3
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
The test function raise() occasionally failed because of unexpected
paint events being counted.
This is due to a QTRY_VERIFY returning after consumption of the first
paint event. If more than one paint event got posted, it will be
delivered and counted when no more paint events are expected.
This patch ensures that all paint events are consumed before resetting
the count and expecting no more paint events.
Fixes: QTBUG-68175
Pick-to: 6.2 6.4
Change-Id: I3e91a34e851da4bd01c7429e824d2b9101077a06
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Which can be used by Qt Creator and Assistant.
Task-number: QTBUG-97125
Task-number: QTCREATORBUG-26557
Change-Id: I03e5ac0a15f84101c73887724693e9eb27670754
Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
The color dialog implementation lazily initializes the widget hierarchy,
so that they are not created if we're using a native dialog. But unlike
QFileDialog, which does the same, QColorDialog failed to handle the case
where the native helper could not show a native dialog.
We now correctly lazy initialize the widget hierarchy if the native
show fails.
The WA_DontShowOnScreen state management has been left out, as it
needs some general refactoring. This patch doesn't fix, or regress,
any logic related to WA_DontShowOnScreen.
Task-number: QTBUG-108153
Change-Id: Icbd506617a2fe302bb61aab977e7c8ea4bd64878
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
The "Show Details..." button is not plumbed in any way to the native
dialog, so when added to a native dialog it will just result in the
dialog being dismissed, instead of revealing any extra content in
the native dialog.
Both the iOS and Android native message dialog implementations add
the details text directly to the dialog, without any action to
explicitly reveal it.
Task-number: QTBUG-108153
Change-Id: I92e00c59b7836f633be44caebd534a47ac58be00
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
The QDialogPrivate::nativeDialogInUse member is used to track whether
a native dialog will be used down the line when the dialog is shown,
or if a native dialog is actively showing or has been shown once.
The former case applies to QFileDialog and QColorDialog, which both
set nativeDialogInUse based on the result of creating a platform
dialog helper in Q(File|Color)DialogPrivate::init(), and then use
that information to avoid creating a widget hierarchy if not needed.
The latter case applies when the native dialog is attempted to be
shown(), where failure to show the native dialog results in the
nativeDialogInUse member being set to false.
The QFontDialog and QMessageBox subclasses do not rely on the former
mechanism, and will only have nativeDialogInUse set to true if the
native dialog has been actively shown at least once.
The QPlatformDialogHelper on the other hand, tracked by the member
QDialogPrivate::m_platformHelper, does not map 1:1 to the state of
nativeDialogInUse, as in the case of QPlatformFileDialogHelper
there is also functionality in the helper to give hints to the
widget-based non-native dialog on how to behave. As a result,
we can have a valid m_platformHelper, but with nativeDialogInUse
being false.
To decouple this and simplify the code we let QFileDialog::setOption()
reset the nativeDialogInUse based on QDialog::DontUseNativeDialog,
just like QColorDialog does, and let QFileDialogPrivate::createWidgets()
proceed without having to delete the platform helper, which would
otherwise be necessary to reset nativeDialogInUse.
The only side effect of this is that a widget-based non-native
dialog will still have a QPlatformFileDialogHelper alive, but
since this dialog is not going to be shown this should not be
an issue in practice.
Task-number: QTBUG-108153
Change-Id: I96af6cfa715717c0907fe840aa86d4e5b280d54c
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
The uses of the click_cocoa_button() function was removed in 2012,
in ba21ca7b5b.
Change-Id: If7abfc56bb307cfbf9f6628cec9c7267a8a1f31f
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
The handling of a digit was done in two parts, separating the case for
the first digit from the handling of later digits. Nothing in the
else/if chain between involved digits, so the latter can move to the
front and be combined with the former.
Change-Id: I4c93515f36452721bdef472cc2f0af7ceeb00527
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Checking the value of last, instead of the index, prepares the way for
using QStringIterator here.
Change-Id: Ided0530413211e918acd406ebdb37f16006ef07d
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>