Avoiding the very high constrast pure black results in cartographically
more pleasing styles, so it's nice to do this by default.
This should result in nicer looking maps being created in QGIS
when users don't do any manual style tweaks.
But always prefer case-exact matches for parameter names. Turns
out the grass provider requires use of parameters with the same
name but different case, so we need to be able to handle this.
This fixes an unreported bug that without detecting an
invalid input when using a comma as a decimal separator
silently converts the entered value to NULL.
Since locale support in QGIS is in its early stages
we convert commas to dots within the validator,
this is common practice in almost all web applications
where you can enter a comma instead of a dot and
the conversion appears while you digit.
This comes with brand new tests for QgsFieldValidator.
Bonus: small fix in sipify.
I wanted to add the test for gpkg subsetstring even if
it was not bugged, while testing that, I hit an assert
in Qt core that pointed me to double unlocked locks.
options should be available for certain model outputs and script
algorithm outputs
We do this by swapping the test for non-file based output support
from checking only the algorithm's provider to instead checking
on a parameter-by-parameter basis.
This is done in order to support models. For models, depending
on what child algorithm a model output is based off, an individual
model may or may not have support for non-file based outputs. E.g
a model may generate outputs from a native qgis alg (supporting
these outputs) AND an output from a GDAL alg (with no support
for these outputs). In this case we need to enable or disable
the ui controls for non-file based outputs on an individual
output basis.
For scripts (for now) we blindly just say all outputs support
non-file based formats. This is going to be the case most of
the time, since scripts will usually be written using PyQGIS
API. For the exceptions (e.g. scripts which call other algs
like GDAL algs) we probably should add some way for the script
to indicate whether an individual output supports this, but
for now we just say they all do.
Fixes#17949
Avoids incorrect warnings about duplicate shortcuts on startup.
What's happening here is:
- on QGIS startup, plugins are loaded, adding their actions to
the interface via iface.registerMainWindowAction()
- after ALL plugins and qgis native menus and actions are created,
the shortcut manager registers ALL children from the main window.
This includes the actions and widgets created by plugins, which
have already been registered to the manager.
- There's no way to avoid this duplicate registration - we could
move the child shortcut registration to occur before plugin
initialization, but it's actually nice to have this "catch-all"
occur after plugins are loaded (so that plugins which don't
correctly register actions still have them included in the shortcut
manager). Similarly, plugins MUST use the registerMainWindowAction
call instead of just relying on the Qt QAction.setShortcut method
because otherwise the shortcuts manager is unaware of actions
created after QGIS load - e.g. enabling a plugin after startup.
So we avoid this by just refusing to re-register a shortcut
that the manager is already aware of... no more startup warnings!
Fixes#17872 - WFS 2.0.0 DescribeFeatureType : TypeNames vs TypeName
This PR introduces the plural form of TYPENAME for
2.0.0 WFS servers, with some additional logic to
allow for 2.0.0 servers that only support TYPENAME
for DescribeFeatureType: in this case, the singular
form is also tried in case the plural one fails.
There is still some work to do for transactional
support but at least the read-only client part
should now be ok.
Tests have been added to check that:
- TYPENAME form still works with old 2.0.0
- TYPENAMES form works with compliant 2.0.0
- choice geometry types are handled by calling
GetFeature and examining the result
Instead of requiring a single layer for use with nested field group
sections, allow use of different layers. In this case the child
layers are filtered so that any fields with names matching their
parent groups are filtered to match the parent section's value.
Also only include headers and footers for child field group sections
if the child has matching features found.