Compare commits

..

1 Commits

173 changed files with 678 additions and 5267 deletions

View File

@ -54,7 +54,7 @@ jobs:
echo $(brew --prefix flex)/bin >> $GITHUB_PATH echo $(brew --prefix flex)/bin >> $GITHUB_PATH
echo $(brew --prefix libtool)/bin >> $GITHUB_PATH echo $(brew --prefix libtool)/bin >> $GITHUB_PATH
- uses: actions/setup-python@v6 - uses: actions/setup-python@v5
with: with:
python-version: '3.11' python-version: '3.11'

View File

@ -27,7 +27,7 @@ jobs:
steps: steps:
- name: 'Download artifact' - name: 'Download artifact'
id: download_artifact id: download_artifact
uses: actions/github-script@v8 uses: actions/github-script@v7
with: with:
script: | script: |
const fs = require('fs'); const fs = require('fs');
@ -71,7 +71,7 @@ jobs:
unzip data-*.zip unzip data-*.zip
- name: 'Post artifact download link as comment on PR' - name: 'Post artifact download link as comment on PR'
uses: actions/github-script@v8 uses: actions/github-script@v7
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
script: | script: |

View File

@ -18,7 +18,7 @@ jobs:
run: | run: |
python ./scripts/get_latest_qgis_versions.py --release="stable" --github_token=${{ secrets.GITHUB_TOKEN }} >> $GITHUB_ENV python ./scripts/get_latest_qgis_versions.py --release="stable" --github_token=${{ secrets.GITHUB_TOKEN }} >> $GITHUB_ENV
- name: Write comment - name: Write comment
uses: actions/github-script@v8 uses: actions/github-script@v7
with: with:
script: | script: |
const {ISSUE_BODY, QGIS_VERSION_LTR_PATCH, QGIS_VERSION_STABLE_PATCH} = process.env // Latest released version identified using get_latest_qgis_versions const {ISSUE_BODY, QGIS_VERSION_LTR_PATCH, QGIS_VERSION_STABLE_PATCH} = process.env // Latest released version identified using get_latest_qgis_versions

View File

@ -25,7 +25,7 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v5
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v6 uses: actions/setup-python@v5
with: with:
python-version: '3.13' python-version: '3.13'
- name: Install requirements - name: Install requirements
@ -162,7 +162,7 @@ jobs:
silversearcher-ag silversearcher-ag
- name: Retrieve changed files - name: Retrieve changed files
uses: tj-actions/changed-files@24d32ffd492484c1d75e0c0b894501ddb9d30d62 #v46 uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c #v46
id: changed_files id: changed_files
with: with:
separator: " " separator: " "
@ -177,7 +177,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v6 uses: actions/setup-python@v5
with: with:
python-version: '3.13' python-version: '3.13'
- name: Install Requirements - name: Install Requirements
@ -212,7 +212,7 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v5
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v6 uses: actions/setup-python@v5
with: with:
python-version: '3.13' python-version: '3.13'
- name: Run Check - name: Run Check

View File

@ -15,6 +15,6 @@ jobs:
pull-requests: write pull-requests: write
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/labeler@v6 - uses: actions/labeler@v5
with: with:
repo-token: "${{ secrets.GITHUB_TOKEN }}" repo-token: "${{ secrets.GITHUB_TOKEN }}"

View File

@ -24,7 +24,7 @@ jobs:
fetch-depth: 200 fetch-depth: 200
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v6 uses: actions/setup-python@v5
with: with:
python-version: '3.13' python-version: '3.13'
@ -66,7 +66,7 @@ jobs:
- name: Listen for `/fix-precommit` comment - name: Listen for `/fix-precommit` comment
if: failure() && github.event_name == 'issue_comment' && github.event.comment.body == '/fix-precommit' && github.event.issue.pull_request if: failure() && github.event_name == 'issue_comment' && github.event.comment.body == '/fix-precommit' && github.event.issue.pull_request
uses: actions/github-script@v8 uses: actions/github-script@v7
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
script: | script: |
@ -88,7 +88,7 @@ jobs:
- name: Comment on PR if pre-commit failed - name: Comment on PR if pre-commit failed
if: failure() && github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository if: failure() && github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository
uses: actions/github-script@v8 uses: actions/github-script@v7
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
script: | script: |

View File

@ -12,7 +12,7 @@ jobs:
runs-on: [ubuntu-latest] runs-on: [ubuntu-latest]
steps: steps:
- uses: actions/setup-python@v6 - uses: actions/setup-python@v5
with: with:
python-version: '3.13' python-version: '3.13'

View File

@ -14,7 +14,7 @@ jobs:
if: github.repository_owner == 'qgis' if: github.repository_owner == 'qgis'
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/stale@v10 - uses: actions/stale@v9
with: with:
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-pr-message: > stale-pr-message: >

View File

@ -24,7 +24,7 @@ jobs:
steps: steps:
- name: 'Download artifact' - name: 'Download artifact'
id: download_artifact id: download_artifact
uses: actions/github-script@v8 uses: actions/github-script@v7
with: with:
script: | script: |
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
@ -58,7 +58,7 @@ jobs:
- name: 'Post test report markdown summary as comment on PR' - name: 'Post test report markdown summary as comment on PR'
if: fromJSON(steps.download_artifact.outputs.artifact_id) > 0 if: fromJSON(steps.download_artifact.outputs.artifact_id) > 0
uses: actions/github-script@v8 uses: actions/github-script@v7
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
script: | script: |

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

View File

@ -7,7 +7,6 @@
%Include auto_generated/qgs3dtypes.sip %Include auto_generated/qgs3dtypes.sip
%Include auto_generated/qgs3dmapcanvas.sip %Include auto_generated/qgs3dmapcanvas.sip
%Include auto_generated/qgsabstractvectorlayer3drenderer.sip %Include auto_generated/qgsabstractvectorlayer3drenderer.sip
%Include auto_generated/qgsannotationlayer3drenderer.sip
%Include auto_generated/qgscameracontroller.sip %Include auto_generated/qgscameracontroller.sip
%Include auto_generated/qgscamerapose.sip %Include auto_generated/qgscamerapose.sip
%Include auto_generated/qgslayoutitem3dmap.sip %Include auto_generated/qgslayoutitem3dmap.sip

View File

@ -1,9 +0,0 @@
# The following has been generated automatically from src/3d/qgsannotationlayer3drenderer.h
try:
QgsAnnotationLayer3DRendererMetadata.__overridden_methods__ = ['createRenderer']
except (NameError, AttributeError):
pass
try:
QgsAnnotationLayer3DRenderer.__overridden_methods__ = ['type', 'clone', 'writeXml', 'readXml', 'resolveReferences']
except (NameError, AttributeError):
pass

View File

@ -16,6 +16,10 @@ class Qgs3DMapTool : QObject
%Docstring(signature="appended") %Docstring(signature="appended")
Base class for map tools operating on 3D map canvas. Base class for map tools operating on 3D map canvas.
.. note::
Not available in Python bindings
.. versionadded:: 4.0 .. versionadded:: 4.0
%End %End

View File

@ -1,154 +0,0 @@
/************************************************************************
* This file has been generated automatically from *
* *
* src/3d/qgsannotationlayer3drenderer.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.py again *
************************************************************************/
// this is needed for the "convert to subclass" code below to compile
%ModuleHeaderCode
#include "qgsannotationlayer3drenderer.h"
%End
class QgsAnnotationLayer3DRendererMetadata : Qgs3DRendererAbstractMetadata
{
%Docstring(signature="appended")
Metadata for annotation layer 3D renderer to allow creation of its
instances from XML.
.. warning::
This is not considered stable API, and may change in future QGIS releases. It is
exposed to the Python bindings as a tech preview only.
.. versionadded:: 4.0
%End
%TypeHeaderCode
#include "qgsannotationlayer3drenderer.h"
%End
public:
QgsAnnotationLayer3DRendererMetadata();
virtual QgsAbstract3DRenderer *createRenderer( QDomElement &elem, const QgsReadWriteContext &context ) /Factory/;
%Docstring
Creates an instance of a 3D renderer based on a DOM element with
renderer configuration
%End
};
class QgsAnnotationLayer3DRenderer : QgsAbstract3DRenderer
{
%Docstring(signature="appended")
3D renderers for annotation layers.
.. versionadded:: 4.0
%End
%TypeHeaderCode
#include "qgsannotationlayer3drenderer.h"
%End
%ConvertToSubClassCode
if ( dynamic_cast<QgsAnnotationLayer3DRenderer *>( sipCpp ) != nullptr )
sipType = sipType_QgsAnnotationLayer3DRenderer;
else
sipType = nullptr;
%End
public:
QgsAnnotationLayer3DRenderer();
void setLayer( QgsAnnotationLayer *layer );
%Docstring
Sets the annotation layer associated with the renderer.
.. seealso:: :py:func:`layer`
%End
QgsAnnotationLayer *layer() const;
%Docstring
Returns the annotation layer associated with the renderer.
.. seealso:: :py:func:`setLayer`
%End
virtual QString type() const;
virtual QgsAnnotationLayer3DRenderer *clone() const /Factory/;
virtual void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const;
virtual void readXml( const QDomElement &elem, const QgsReadWriteContext &context );
virtual void resolveReferences( const QgsProject &project );
Qgis::AltitudeClamping altitudeClamping() const;
%Docstring
Returns the altitude clamping method, which determines the vertical
position of annotations.
.. seealso:: :py:func:`setAltitudeClamping`
%End
void setAltitudeClamping( Qgis::AltitudeClamping clamping );
%Docstring
Sets the altitude ``clamping`` method, which determines the vertical
position of annotations.
.. seealso:: :py:func:`altitudeClamping`
%End
double zOffset() const;
%Docstring
Returns the z offset, which is a fixed offset amount which should be
added to z values for the annotations.
.. seealso:: :py:func:`setZOffset`
%End
void setZOffset( double offset );
%Docstring
Sets the z ``offset``, which is a fixed offset amount which will be
added to z values for the annotations.
.. seealso:: :py:func:`zOffset`
%End
bool showCalloutLines() const;
%Docstring
Returns ``True`` if callout lines are shown, vertically joining the
annotations to the terrain.
.. seealso:: :py:func:`setShowCalloutLines`
%End
void setShowCalloutLines( bool show );
%Docstring
Sets whether callout lines are shown, vertically joining the annotations
to the terrain.
.. seealso:: :py:func:`showCalloutLines`
%End
private:
QgsAnnotationLayer3DRenderer( const QgsAnnotationLayer3DRenderer & );
};
/************************************************************************
* This file has been generated automatically from *
* *
* src/3d/qgsannotationlayer3drenderer.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.py again *
************************************************************************/

View File

@ -246,22 +246,6 @@ QgsAbstractVectorLayer3DRenderer.setTilingSettings: src/3d/qgsabstractvectorlaye
QgsAbstractVectorLayer3DRenderer.tilingSettings: src/3d/qgsabstractvectorlayer3drenderer.h#L89 QgsAbstractVectorLayer3DRenderer.tilingSettings: src/3d/qgsabstractvectorlayer3drenderer.h#L89
QgsAbstractVectorLayer3DRenderer.writeXmlBaseProperties: src/3d/qgsabstractvectorlayer3drenderer.h#L97 QgsAbstractVectorLayer3DRenderer.writeXmlBaseProperties: src/3d/qgsabstractvectorlayer3drenderer.h#L97
QgsAbstractVectorLayer3DRenderer: src/3d/qgsabstractvectorlayer3drenderer.h#L76 QgsAbstractVectorLayer3DRenderer: src/3d/qgsabstractvectorlayer3drenderer.h#L76
QgsAnnotationLayer3DRenderer.altitudeClamping: src/3d/qgsannotationlayer3drenderer.h#L100
QgsAnnotationLayer3DRenderer.clone: src/3d/qgsannotationlayer3drenderer.h#L88
QgsAnnotationLayer3DRenderer.layer: src/3d/qgsannotationlayer3drenderer.h#L85
QgsAnnotationLayer3DRenderer.readXml: src/3d/qgsannotationlayer3drenderer.h#L92
QgsAnnotationLayer3DRenderer.resolveReferences: src/3d/qgsannotationlayer3drenderer.h#L93
QgsAnnotationLayer3DRenderer.setAltitudeClamping: src/3d/qgsannotationlayer3drenderer.h#L107
QgsAnnotationLayer3DRenderer.setLayer: src/3d/qgsannotationlayer3drenderer.h#L78
QgsAnnotationLayer3DRenderer.setShowCalloutLines: src/3d/qgsannotationlayer3drenderer.h#L135
QgsAnnotationLayer3DRenderer.setZOffset: src/3d/qgsannotationlayer3drenderer.h#L121
QgsAnnotationLayer3DRenderer.showCalloutLines: src/3d/qgsannotationlayer3drenderer.h#L128
QgsAnnotationLayer3DRenderer.type: src/3d/qgsannotationlayer3drenderer.h#L87
QgsAnnotationLayer3DRenderer.writeXml: src/3d/qgsannotationlayer3drenderer.h#L91
QgsAnnotationLayer3DRenderer.zOffset: src/3d/qgsannotationlayer3drenderer.h#L114
QgsAnnotationLayer3DRenderer: src/3d/qgsannotationlayer3drenderer.h#L59
QgsAnnotationLayer3DRendererMetadata.createRenderer: src/3d/qgsannotationlayer3drenderer.h#L50
QgsAnnotationLayer3DRendererMetadata: src/3d/qgsannotationlayer3drenderer.h#L44
QgsCameraController.cameraChanged: src/3d/qgscameracontroller.h#L360 QgsCameraController.cameraChanged: src/3d/qgscameracontroller.h#L360
QgsCameraController.cameraMovementSpeed: src/3d/qgscameracontroller.h#L89 QgsCameraController.cameraMovementSpeed: src/3d/qgscameracontroller.h#L89
QgsCameraController.cameraMovementSpeedChanged: src/3d/qgscameracontroller.h#L368 QgsCameraController.cameraMovementSpeedChanged: src/3d/qgscameracontroller.h#L368

View File

@ -262,7 +262,7 @@ if (WITH_3D)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/3d/project.py.in ${CMAKE_CURRENT_BINARY_DIR}/3d/project.py @ONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/3d/project.py.in ${CMAKE_CURRENT_BINARY_DIR}/3d/project.py @ONLY)
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/3d/pyproject.toml.temp" "${toml}") file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/3d/pyproject.toml.temp" "${toml}")
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/3d/pyproject.toml.temp ${CMAKE_CURRENT_BINARY_DIR}/3d/pyproject.toml) execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/3d/pyproject.toml.temp ${CMAKE_CURRENT_BINARY_DIR}/3d/pyproject.toml)
SET(SIP_CONCAT_PARTS 8) # 3D doesn't have enough .sip files to fill 15+ .cpp files SET(SIP_CONCAT_PARTS 9) # 3D doesn't have enough .sip files to fill 15+ .cpp files
GENERATE_SIP_PYTHON_MODULE_CODE(qgis._3d_p 3d/3d.sip "${sip_files_3d}" cpp_files) GENERATE_SIP_PYTHON_MODULE_CODE(qgis._3d_p 3d/3d.sip "${sip_files_3d}" cpp_files)
BUILD_SIP_PYTHON_MODULE(qgis._3d_p 3d/3d.sip ${cpp_files} "" qgis_core qgis_3d) BUILD_SIP_PYTHON_MODULE(qgis._3d_p 3d/3d.sip ${cpp_files} "" qgis_core qgis_3d)
endif() endif()

View File

@ -7,7 +7,6 @@
%Include auto_generated/qgs3dtypes.sip %Include auto_generated/qgs3dtypes.sip
%Include auto_generated/qgs3dmapcanvas.sip %Include auto_generated/qgs3dmapcanvas.sip
%Include auto_generated/qgsabstractvectorlayer3drenderer.sip %Include auto_generated/qgsabstractvectorlayer3drenderer.sip
%Include auto_generated/qgsannotationlayer3drenderer.sip
%Include auto_generated/qgscameracontroller.sip %Include auto_generated/qgscameracontroller.sip
%Include auto_generated/qgscamerapose.sip %Include auto_generated/qgscamerapose.sip
%Include auto_generated/qgslayoutitem3dmap.sip %Include auto_generated/qgslayoutitem3dmap.sip

View File

@ -1,9 +0,0 @@
# The following has been generated automatically from src/3d/qgsannotationlayer3drenderer.h
try:
QgsAnnotationLayer3DRendererMetadata.__overridden_methods__ = ['createRenderer']
except (NameError, AttributeError):
pass
try:
QgsAnnotationLayer3DRenderer.__overridden_methods__ = ['type', 'clone', 'writeXml', 'readXml', 'resolveReferences']
except (NameError, AttributeError):
pass

View File

@ -16,6 +16,10 @@ class Qgs3DMapTool : QObject
%Docstring(signature="appended") %Docstring(signature="appended")
Base class for map tools operating on 3D map canvas. Base class for map tools operating on 3D map canvas.
.. note::
Not available in Python bindings
.. versionadded:: 4.0 .. versionadded:: 4.0
%End %End

View File

@ -1,154 +0,0 @@
/************************************************************************
* This file has been generated automatically from *
* *
* src/3d/qgsannotationlayer3drenderer.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.py again *
************************************************************************/
// this is needed for the "convert to subclass" code below to compile
%ModuleHeaderCode
#include "qgsannotationlayer3drenderer.h"
%End
class QgsAnnotationLayer3DRendererMetadata : Qgs3DRendererAbstractMetadata
{
%Docstring(signature="appended")
Metadata for annotation layer 3D renderer to allow creation of its
instances from XML.
.. warning::
This is not considered stable API, and may change in future QGIS releases. It is
exposed to the Python bindings as a tech preview only.
.. versionadded:: 4.0
%End
%TypeHeaderCode
#include "qgsannotationlayer3drenderer.h"
%End
public:
QgsAnnotationLayer3DRendererMetadata();
virtual QgsAbstract3DRenderer *createRenderer( QDomElement &elem, const QgsReadWriteContext &context ) /Factory/;
%Docstring
Creates an instance of a 3D renderer based on a DOM element with
renderer configuration
%End
};
class QgsAnnotationLayer3DRenderer : QgsAbstract3DRenderer
{
%Docstring(signature="appended")
3D renderers for annotation layers.
.. versionadded:: 4.0
%End
%TypeHeaderCode
#include "qgsannotationlayer3drenderer.h"
%End
%ConvertToSubClassCode
if ( dynamic_cast<QgsAnnotationLayer3DRenderer *>( sipCpp ) != nullptr )
sipType = sipType_QgsAnnotationLayer3DRenderer;
else
sipType = nullptr;
%End
public:
QgsAnnotationLayer3DRenderer();
void setLayer( QgsAnnotationLayer *layer );
%Docstring
Sets the annotation layer associated with the renderer.
.. seealso:: :py:func:`layer`
%End
QgsAnnotationLayer *layer() const;
%Docstring
Returns the annotation layer associated with the renderer.
.. seealso:: :py:func:`setLayer`
%End
virtual QString type() const;
virtual QgsAnnotationLayer3DRenderer *clone() const /Factory/;
virtual void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const;
virtual void readXml( const QDomElement &elem, const QgsReadWriteContext &context );
virtual void resolveReferences( const QgsProject &project );
Qgis::AltitudeClamping altitudeClamping() const;
%Docstring
Returns the altitude clamping method, which determines the vertical
position of annotations.
.. seealso:: :py:func:`setAltitudeClamping`
%End
void setAltitudeClamping( Qgis::AltitudeClamping clamping );
%Docstring
Sets the altitude ``clamping`` method, which determines the vertical
position of annotations.
.. seealso:: :py:func:`altitudeClamping`
%End
double zOffset() const;
%Docstring
Returns the z offset, which is a fixed offset amount which should be
added to z values for the annotations.
.. seealso:: :py:func:`setZOffset`
%End
void setZOffset( double offset );
%Docstring
Sets the z ``offset``, which is a fixed offset amount which will be
added to z values for the annotations.
.. seealso:: :py:func:`zOffset`
%End
bool showCalloutLines() const;
%Docstring
Returns ``True`` if callout lines are shown, vertically joining the
annotations to the terrain.
.. seealso:: :py:func:`setShowCalloutLines`
%End
void setShowCalloutLines( bool show );
%Docstring
Sets whether callout lines are shown, vertically joining the annotations
to the terrain.
.. seealso:: :py:func:`showCalloutLines`
%End
private:
QgsAnnotationLayer3DRenderer( const QgsAnnotationLayer3DRenderer & );
};
/************************************************************************
* This file has been generated automatically from *
* *
* src/3d/qgsannotationlayer3drenderer.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.py again *
************************************************************************/

View File

@ -246,22 +246,6 @@ QgsAbstractVectorLayer3DRenderer.setTilingSettings: src/3d/qgsabstractvectorlaye
QgsAbstractVectorLayer3DRenderer.tilingSettings: src/3d/qgsabstractvectorlayer3drenderer.h#L89 QgsAbstractVectorLayer3DRenderer.tilingSettings: src/3d/qgsabstractvectorlayer3drenderer.h#L89
QgsAbstractVectorLayer3DRenderer.writeXmlBaseProperties: src/3d/qgsabstractvectorlayer3drenderer.h#L97 QgsAbstractVectorLayer3DRenderer.writeXmlBaseProperties: src/3d/qgsabstractvectorlayer3drenderer.h#L97
QgsAbstractVectorLayer3DRenderer: src/3d/qgsabstractvectorlayer3drenderer.h#L76 QgsAbstractVectorLayer3DRenderer: src/3d/qgsabstractvectorlayer3drenderer.h#L76
QgsAnnotationLayer3DRenderer.altitudeClamping: src/3d/qgsannotationlayer3drenderer.h#L100
QgsAnnotationLayer3DRenderer.clone: src/3d/qgsannotationlayer3drenderer.h#L88
QgsAnnotationLayer3DRenderer.layer: src/3d/qgsannotationlayer3drenderer.h#L85
QgsAnnotationLayer3DRenderer.readXml: src/3d/qgsannotationlayer3drenderer.h#L92
QgsAnnotationLayer3DRenderer.resolveReferences: src/3d/qgsannotationlayer3drenderer.h#L93
QgsAnnotationLayer3DRenderer.setAltitudeClamping: src/3d/qgsannotationlayer3drenderer.h#L107
QgsAnnotationLayer3DRenderer.setLayer: src/3d/qgsannotationlayer3drenderer.h#L78
QgsAnnotationLayer3DRenderer.setShowCalloutLines: src/3d/qgsannotationlayer3drenderer.h#L135
QgsAnnotationLayer3DRenderer.setZOffset: src/3d/qgsannotationlayer3drenderer.h#L121
QgsAnnotationLayer3DRenderer.showCalloutLines: src/3d/qgsannotationlayer3drenderer.h#L128
QgsAnnotationLayer3DRenderer.type: src/3d/qgsannotationlayer3drenderer.h#L87
QgsAnnotationLayer3DRenderer.writeXml: src/3d/qgsannotationlayer3drenderer.h#L91
QgsAnnotationLayer3DRenderer.zOffset: src/3d/qgsannotationlayer3drenderer.h#L114
QgsAnnotationLayer3DRenderer: src/3d/qgsannotationlayer3drenderer.h#L59
QgsAnnotationLayer3DRendererMetadata.createRenderer: src/3d/qgsannotationlayer3drenderer.h#L50
QgsAnnotationLayer3DRendererMetadata: src/3d/qgsannotationlayer3drenderer.h#L44
QgsCameraController.cameraChanged: src/3d/qgscameracontroller.h#L360 QgsCameraController.cameraChanged: src/3d/qgscameracontroller.h#L360
QgsCameraController.cameraMovementSpeed: src/3d/qgscameracontroller.h#L89 QgsCameraController.cameraMovementSpeed: src/3d/qgscameracontroller.h#L89
QgsCameraController.cameraMovementSpeedChanged: src/3d/qgscameracontroller.h#L368 QgsCameraController.cameraMovementSpeedChanged: src/3d/qgscameracontroller.h#L368

View File

@ -11742,25 +11742,6 @@ Qgis.RasterProcessingParameterCapability.baseClass = Qgis
Qgis.RasterProcessingParameterCapabilities = lambda flags=0: Qgis.RasterProcessingParameterCapability(flags) Qgis.RasterProcessingParameterCapabilities = lambda flags=0: Qgis.RasterProcessingParameterCapability(flags)
Qgis.RasterProcessingParameterCapabilities.baseClass = Qgis Qgis.RasterProcessingParameterCapabilities.baseClass = Qgis
RasterProcessingParameterCapabilities = Qgis # dirty hack since SIP seems to introduce the flags in module RasterProcessingParameterCapabilities = Qgis # dirty hack since SIP seems to introduce the flags in module
# monkey patching scoped based enum
Qgis.DevToolsNodeRole.Status.__doc__ = "Request status role"
Qgis.DevToolsNodeRole.Id.__doc__ = "Request ID role"
Qgis.DevToolsNodeRole.ElapsedTime.__doc__ = "Elapsed time"
Qgis.DevToolsNodeRole.MaximumTime.__doc__ = "Maximum encountered elapsed time"
Qgis.DevToolsNodeRole.Sort.__doc__ = "Sort order role"
Qgis.DevToolsNodeRole.__doc__ = """Dev tools node custom data roles.
.. versionadded:: 4.0
* ``Status``: Request status role
* ``Id``: Request ID role
* ``ElapsedTime``: Elapsed time
* ``MaximumTime``: Maximum encountered elapsed time
* ``Sort``: Sort order role
"""
# --
Qgis.DevToolsNodeRole.baseClass = Qgis
try: try:
Qgis.__attribute_docs__ = {'QGIS_DEV_VERSION': 'The development version', 'DEFAULT_SEARCH_RADIUS_MM': 'Identify search radius in mm', 'DEFAULT_MAPTOPIXEL_THRESHOLD': 'Default threshold between map coordinates and device coordinates for map2pixel simplification', 'DEFAULT_HIGHLIGHT_COLOR': 'Default highlight color. The transparency is expected to only be applied to polygon\nfill. Lines and outlines are rendered opaque.', 'DEFAULT_HIGHLIGHT_BUFFER_MM': 'Default highlight buffer in mm.', 'DEFAULT_HIGHLIGHT_MIN_WIDTH_MM': 'Default highlight line/stroke minimum width in mm.', 'SCALE_PRECISION': 'Fudge factor used to compare two scales. The code is often going from scale to scale\ndenominator. So it looses precision and, when a limit is inclusive, can lead to errors.\nTo avoid that, use this factor instead of using <= or >=.\n\n.. deprecated:: 3.40\n\n No longer used by QGIS and will be removed in QGIS 4.0.', 'DEFAULT_Z_COORDINATE': 'Default Z coordinate value.\nThis value have to be assigned to the Z coordinate for the vertex.', 'DEFAULT_M_COORDINATE': 'Default M coordinate value.\nThis value have to be assigned to the M coordinate for the vertex.\n\n.. versionadded:: 3.20', 'UI_SCALE_FACTOR': 'UI scaling factor. This should be applied to all widget sizes obtained from font metrics,\nto account for differences in the default font sizes across different platforms.', 'DEFAULT_SNAP_TOLERANCE': 'Default snapping distance tolerance.', 'DEFAULT_SNAP_UNITS': 'Default snapping distance units.', 'USER_CRS_START_ID': 'Minimum ID number for a user-defined projection.', 'DEFAULT_POINT_SIZE': 'The default size (in millimeters) for point marker symbols', 'DEFAULT_LINE_WIDTH': 'The default width (in millimeters) for line symbols', 'DEFAULT_SEGMENT_EPSILON': 'Default snapping tolerance for segments'} Qgis.__attribute_docs__ = {'QGIS_DEV_VERSION': 'The development version', 'DEFAULT_SEARCH_RADIUS_MM': 'Identify search radius in mm', 'DEFAULT_MAPTOPIXEL_THRESHOLD': 'Default threshold between map coordinates and device coordinates for map2pixel simplification', 'DEFAULT_HIGHLIGHT_COLOR': 'Default highlight color. The transparency is expected to only be applied to polygon\nfill. Lines and outlines are rendered opaque.', 'DEFAULT_HIGHLIGHT_BUFFER_MM': 'Default highlight buffer in mm.', 'DEFAULT_HIGHLIGHT_MIN_WIDTH_MM': 'Default highlight line/stroke minimum width in mm.', 'SCALE_PRECISION': 'Fudge factor used to compare two scales. The code is often going from scale to scale\ndenominator. So it looses precision and, when a limit is inclusive, can lead to errors.\nTo avoid that, use this factor instead of using <= or >=.\n\n.. deprecated:: 3.40\n\n No longer used by QGIS and will be removed in QGIS 4.0.', 'DEFAULT_Z_COORDINATE': 'Default Z coordinate value.\nThis value have to be assigned to the Z coordinate for the vertex.', 'DEFAULT_M_COORDINATE': 'Default M coordinate value.\nThis value have to be assigned to the M coordinate for the vertex.\n\n.. versionadded:: 3.20', 'UI_SCALE_FACTOR': 'UI scaling factor. This should be applied to all widget sizes obtained from font metrics,\nto account for differences in the default font sizes across different platforms.', 'DEFAULT_SNAP_TOLERANCE': 'Default snapping distance tolerance.', 'DEFAULT_SNAP_UNITS': 'Default snapping distance units.', 'USER_CRS_START_ID': 'Minimum ID number for a user-defined projection.', 'DEFAULT_POINT_SIZE': 'The default size (in millimeters) for point marker symbols', 'DEFAULT_LINE_WIDTH': 'The default width (in millimeters) for line symbols', 'DEFAULT_SEGMENT_EPSILON': 'Default snapping tolerance for segments'}
Qgis.__annotations__ = {'QGIS_DEV_VERSION': str, 'DEFAULT_SEARCH_RADIUS_MM': float, 'DEFAULT_MAPTOPIXEL_THRESHOLD': float, 'DEFAULT_HIGHLIGHT_COLOR': 'QColor', 'DEFAULT_HIGHLIGHT_BUFFER_MM': float, 'DEFAULT_HIGHLIGHT_MIN_WIDTH_MM': float, 'SCALE_PRECISION': float, 'DEFAULT_Z_COORDINATE': float, 'DEFAULT_M_COORDINATE': float, 'UI_SCALE_FACTOR': float, 'DEFAULT_SNAP_TOLERANCE': float, 'DEFAULT_SNAP_UNITS': 'Qgis.MapToolUnit', 'USER_CRS_START_ID': int, 'DEFAULT_POINT_SIZE': float, 'DEFAULT_LINE_WIDTH': float, 'DEFAULT_SEGMENT_EPSILON': float} Qgis.__annotations__ = {'QGIS_DEV_VERSION': str, 'DEFAULT_SEARCH_RADIUS_MM': float, 'DEFAULT_MAPTOPIXEL_THRESHOLD': float, 'DEFAULT_HIGHLIGHT_COLOR': 'QColor', 'DEFAULT_HIGHLIGHT_BUFFER_MM': float, 'DEFAULT_HIGHLIGHT_MIN_WIDTH_MM': float, 'SCALE_PRECISION': float, 'DEFAULT_Z_COORDINATE': float, 'DEFAULT_M_COORDINATE': float, 'UI_SCALE_FACTOR': float, 'DEFAULT_SNAP_TOLERANCE': float, 'DEFAULT_SNAP_UNITS': 'Qgis.MapToolUnit', 'USER_CRS_START_ID': int, 'DEFAULT_POINT_SIZE': float, 'DEFAULT_LINE_WIDTH': float, 'DEFAULT_SEGMENT_EPSILON': float}

View File

@ -3446,15 +3446,6 @@ The development version
typedef QFlags<Qgis::RasterProcessingParameterCapability> RasterProcessingParameterCapabilities; typedef QFlags<Qgis::RasterProcessingParameterCapability> RasterProcessingParameterCapabilities;
enum class DevToolsNodeRole
{
Status,
Id,
ElapsedTime,
MaximumTime,
Sort,
};
static const double DEFAULT_SEARCH_RADIUS_MM; static const double DEFAULT_SEARCH_RADIUS_MM;
static const float DEFAULT_MAPTOPIXEL_THRESHOLD; static const float DEFAULT_MAPTOPIXEL_THRESHOLD;

View File

@ -1,15 +1,15 @@
Qgis.defaultProjectScales: src/core/qgis.h#L6185 Qgis.defaultProjectScales: src/core/qgis.h#L6171
Qgis.devVersion: src/core/qgis.h#L90 Qgis.devVersion: src/core/qgis.h#L90
Qgis.geoNone: src/core/qgis.h#L6237 Qgis.geoNone: src/core/qgis.h#L6223
Qgis.geoProj4: src/core/qgis.h#L6267 Qgis.geoProj4: src/core/qgis.h#L6253
Qgis.geoWkt: src/core/qgis.h#L6258 Qgis.geoWkt: src/core/qgis.h#L6244
Qgis.geographicCrsAuthId: src/core/qgis.h#L6247 Qgis.geographicCrsAuthId: src/core/qgis.h#L6233
Qgis.geosVersion: src/core/qgis.h#L6220 Qgis.geosVersion: src/core/qgis.h#L6206
Qgis.geosVersionInt: src/core/qgis.h#L6192 Qgis.geosVersionInt: src/core/qgis.h#L6178
Qgis.geosVersionMajor: src/core/qgis.h#L6199 Qgis.geosVersionMajor: src/core/qgis.h#L6185
Qgis.geosVersionMinor: src/core/qgis.h#L6206 Qgis.geosVersionMinor: src/core/qgis.h#L6192
Qgis.geosVersionPatch: src/core/qgis.h#L6213 Qgis.geosVersionPatch: src/core/qgis.h#L6199
Qgis.hasQtWebkit: src/core/qgis.h#L6227 Qgis.hasQtWebkit: src/core/qgis.h#L6213
Qgis.releaseName: src/core/qgis.h#L80 Qgis.releaseName: src/core/qgis.h#L80
Qgis.version: src/core/qgis.h#L66 Qgis.version: src/core/qgis.h#L66
Qgis.versionInt: src/core/qgis.h#L73 Qgis.versionInt: src/core/qgis.h#L73

View File

@ -1,18 +0,0 @@
# The following has been generated automatically from src/gui/qgsshortcutsmanager.h
# monkey patching scoped based enum
QgsShortcutsManager.CommonAction.CodeToggleComment.__doc__ = "Toggle code comments"
QgsShortcutsManager.CommonAction.CodeReformat.__doc__ = "Reformat code"
QgsShortcutsManager.CommonAction.CodeRunScript.__doc__ = "Run script"
QgsShortcutsManager.CommonAction.CodeRunSelection.__doc__ = "Run selection from script"
QgsShortcutsManager.CommonAction.__doc__ = """Contains common actions which are used across a variety of classes.
.. versionadded:: 4.0
* ``CodeToggleComment``: Toggle code comments
* ``CodeReformat``: Reformat code
* ``CodeRunScript``: Run script
* ``CodeRunSelection``: Run selection from script
"""
# --
QgsShortcutsManager.CommonAction.baseClass = QgsShortcutsManager

View File

@ -23,14 +23,6 @@ rather accessed through :py:func:`QgsGui.shortcutsManager()`.
#include "qgsshortcutsmanager.h" #include "qgsshortcutsmanager.h"
%End %End
public: public:
enum class CommonAction
{
CodeToggleComment,
CodeReformat,
CodeRunScript,
CodeRunSelection,
};
QgsShortcutsManager( QObject *parent /TransferThis/ = 0, const QString &settingsRoot = "/shortcuts/" ); QgsShortcutsManager( QObject *parent /TransferThis/ = 0, const QString &settingsRoot = "/shortcuts/" );
%Docstring %Docstring
Constructor for QgsShortcutsManager. Constructor for QgsShortcutsManager.
@ -44,8 +36,6 @@ Constructor for QgsShortcutsManager.
QGIS actions. QGIS actions.
%End %End
~QgsShortcutsManager();
void registerAllChildren( QObject *object, bool recursive = false, const QString &section = QString() ); void registerAllChildren( QObject *object, bool recursive = false, const QString &section = QString() );
%Docstring %Docstring
Automatically registers all QActions and QShortcuts which are children Automatically registers all QActions and QShortcuts which are children
@ -115,16 +105,6 @@ in GUI.
.. seealso:: :py:func:`unregisterAction` .. seealso:: :py:func:`unregisterAction`
.. seealso:: :py:func:`registerAllChildActions` .. seealso:: :py:func:`registerAllChildActions`
%End
void initializeCommonAction( QAction *action, CommonAction commonAction );
%Docstring
Initializes an ``action`` as a common action.
This automatically configures the ``action`` to use the properties for
the common action, such as setting the action's tooltip and shortcut.
.. versionadded:: 4.0
%End %End
bool registerShortcut( QShortcut *shortcut, const QString &defaultSequence = QString(), const QString &section = QString() ); bool registerShortcut( QShortcut *shortcut, const QString &defaultSequence = QString(), const QString &section = QString() );
@ -310,14 +290,6 @@ if no shortcut is associated.
.. seealso:: :py:func:`objectForSequence` .. seealso:: :py:func:`objectForSequence`
.. seealso:: :py:func:`actionForSequence` .. seealso:: :py:func:`actionForSequence`
%End
QKeySequence sequenceForCommonAction( CommonAction action ) const;
%Docstring
Returns the key sequence which is associated with a common ``action``,
or an empty sequence if no shortcut is assigned to that action.
.. versionadded:: 4.0
%End %End
QAction *actionByName( const QString &name ) const; QAction *actionByName( const QString &name ) const;

View File

@ -6977,30 +6977,28 @@ QgsShapeburstFillSymbolLayerWidget.setColor: src/gui/symbology/qgssymbollayerwid
QgsShapeburstFillSymbolLayerWidget.setSymbolLayer: src/gui/symbology/qgssymbollayerwidget.h#L426 QgsShapeburstFillSymbolLayerWidget.setSymbolLayer: src/gui/symbology/qgssymbollayerwidget.h#L426
QgsShapeburstFillSymbolLayerWidget.symbolLayer: src/gui/symbology/qgssymbollayerwidget.h#L427 QgsShapeburstFillSymbolLayerWidget.symbolLayer: src/gui/symbology/qgssymbollayerwidget.h#L427
QgsShapeburstFillSymbolLayerWidget: src/gui/symbology/qgssymbollayerwidget.h#L407 QgsShapeburstFillSymbolLayerWidget: src/gui/symbology/qgssymbollayerwidget.h#L407
QgsShortcutsManager.actionByName: src/gui/qgsshortcutsmanager.h#L267 QgsShortcutsManager.actionByName: src/gui/qgsshortcutsmanager.h#L236
QgsShortcutsManager.actionForSequence: src/gui/qgsshortcutsmanager.h#L246 QgsShortcutsManager.actionForSequence: src/gui/qgsshortcutsmanager.h#L221
QgsShortcutsManager.defaultKeySequence: src/gui/qgsshortcutsmanager.h#L188 QgsShortcutsManager.defaultKeySequence: src/gui/qgsshortcutsmanager.h#L163
QgsShortcutsManager.defaultKeySequence: src/gui/qgsshortcutsmanager.h#L196 QgsShortcutsManager.defaultKeySequence: src/gui/qgsshortcutsmanager.h#L171
QgsShortcutsManager.initializeCommonAction: src/gui/qgsshortcutsmanager.h#L119 QgsShortcutsManager.objectDefaultKeySequence: src/gui/qgsshortcutsmanager.h#L155
QgsShortcutsManager.objectDefaultKeySequence: src/gui/qgsshortcutsmanager.h#L180 QgsShortcutsManager.objectForSequence: src/gui/qgsshortcutsmanager.h#L213
QgsShortcutsManager.objectForSequence: src/gui/qgsshortcutsmanager.h#L238 QgsShortcutsManager.objectForSettingKey: src/gui/qgsshortcutsmanager.h#L262
QgsShortcutsManager.objectForSettingKey: src/gui/qgsshortcutsmanager.h#L293 QgsShortcutsManager.objectSettingKey: src/gui/qgsshortcutsmanager.h#L254
QgsShortcutsManager.objectSettingKey: src/gui/qgsshortcutsmanager.h#L285 QgsShortcutsManager.registerAction: src/gui/qgsshortcutsmanager.h#L94
QgsShortcutsManager.registerAction: src/gui/qgsshortcutsmanager.h#L109 QgsShortcutsManager.registerAllChildActions: src/gui/qgsshortcutsmanager.h#L70
QgsShortcutsManager.registerAllChildActions: src/gui/qgsshortcutsmanager.h#L85 QgsShortcutsManager.registerAllChildShortcuts: src/gui/qgsshortcutsmanager.h#L81
QgsShortcutsManager.registerAllChildShortcuts: src/gui/qgsshortcutsmanager.h#L96 QgsShortcutsManager.registerAllChildren: src/gui/qgsshortcutsmanager.h#L59
QgsShortcutsManager.registerAllChildren: src/gui/qgsshortcutsmanager.h#L74 QgsShortcutsManager.registerShortcut: src/gui/qgsshortcutsmanager.h#L106
QgsShortcutsManager.registerShortcut: src/gui/qgsshortcutsmanager.h#L131 QgsShortcutsManager.setKeySequence: src/gui/qgsshortcutsmanager.h#L180
QgsShortcutsManager.sequenceForCommonAction: src/gui/qgsshortcutsmanager.h#L260 QgsShortcutsManager.setKeySequence: src/gui/qgsshortcutsmanager.h#L196
QgsShortcutsManager.setKeySequence: src/gui/qgsshortcutsmanager.h#L205 QgsShortcutsManager.setKeySequence: src/gui/qgsshortcutsmanager.h#L204
QgsShortcutsManager.setKeySequence: src/gui/qgsshortcutsmanager.h#L221 QgsShortcutsManager.setObjectKeySequence: src/gui/qgsshortcutsmanager.h#L188
QgsShortcutsManager.setKeySequence: src/gui/qgsshortcutsmanager.h#L229 QgsShortcutsManager.settingsPath: src/gui/qgsshortcutsmanager.h#L246
QgsShortcutsManager.setObjectKeySequence: src/gui/qgsshortcutsmanager.h#L213 QgsShortcutsManager.shortcutByName: src/gui/qgsshortcutsmanager.h#L243
QgsShortcutsManager.settingsPath: src/gui/qgsshortcutsmanager.h#L277 QgsShortcutsManager.shortcutForSequence: src/gui/qgsshortcutsmanager.h#L229
QgsShortcutsManager.shortcutByName: src/gui/qgsshortcutsmanager.h#L274 QgsShortcutsManager.unregisterAction: src/gui/qgsshortcutsmanager.h#L116
QgsShortcutsManager.shortcutForSequence: src/gui/qgsshortcutsmanager.h#L254 QgsShortcutsManager.unregisterShortcut: src/gui/qgsshortcutsmanager.h#L126
QgsShortcutsManager.unregisterAction: src/gui/qgsshortcutsmanager.h#L141
QgsShortcutsManager.unregisterShortcut: src/gui/qgsshortcutsmanager.h#L151
QgsShortcutsManager: src/gui/qgsshortcutsmanager.h#L36 QgsShortcutsManager: src/gui/qgsshortcutsmanager.h#L36
QgsSimpleFillSymbolLayerWidget.create: src/gui/symbology/qgssymbollayerwidget.h#L264 QgsSimpleFillSymbolLayerWidget.create: src/gui/symbology/qgssymbollayerwidget.h#L264
QgsSimpleFillSymbolLayerWidget.setColor: src/gui/symbology/qgssymbollayerwidget.h#L271 QgsSimpleFillSymbolLayerWidget.setColor: src/gui/symbology/qgssymbollayerwidget.h#L271

View File

@ -19,4 +19,5 @@ __author__ = "Salvatore Larosa"
__date__ = "September 2012" __date__ = "September 2012"
__copyright__ = "(C) 2012, Salvatore Larosa" __copyright__ = "(C) 2012, Salvatore Larosa"
from .console import show_console, init_console # NOQA from .console import show_console # NOQA
from .console import init_options_widget

View File

@ -61,7 +61,6 @@ from qgis.gui import (
QgsGui, QgsGui,
QgsApplicationExitBlockerInterface, QgsApplicationExitBlockerInterface,
QgsCodeEditorDockWidget, QgsCodeEditorDockWidget,
QgsShortcutsManager,
) )
from functools import partial from functools import partial
@ -107,11 +106,8 @@ def console_displayhook(obj):
_console_output = obj _console_output = obj
def init_console(): def init_options_widget():
""" """called from QGIS to add the console options widget"""
Called from QGIS to initialize the console related options and shortcuts,
before the dock is shown
"""
global _options_factory global _options_factory
_options_factory.setTitle(QCoreApplication.translate("PythonConsole", "Python")) _options_factory.setTitle(QCoreApplication.translate("PythonConsole", "Python"))
iface.registerOptionsWidgetFactory(_options_factory) iface.registerOptionsWidgetFactory(_options_factory)
@ -225,137 +221,169 @@ class PythonConsoleWidget(QWidget):
# Action for Open File # Action for Open File
openFileBt = QCoreApplication.translate("PythonConsole", "Open Script…") openFileBt = QCoreApplication.translate("PythonConsole", "Open Script…")
self.open_file_action = QAction(self) self.openFileButton = QAction(self)
self.open_file_action.setIcon( self.openFileButton.setCheckable(False)
self.openFileButton.setEnabled(True)
self.openFileButton.setIcon(
QgsApplication.getThemeIcon("mActionScriptOpen.svg") QgsApplication.getThemeIcon("mActionScriptOpen.svg")
) )
self.open_file_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.openFileButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.open_file_action.setIconVisibleInMenu(True) self.openFileButton.setIconVisibleInMenu(True)
self.open_file_action.setToolTip(f"<b>{openFileBt}</b> (Ctrl+O)") self.openFileButton.setToolTip(openFileBt + " <b>Ctrl+O</b>")
self.open_file_action.setText(openFileBt) self.openFileButton.setText(openFileBt)
openExtEditorBt = QCoreApplication.translate( openExtEditorBt = QCoreApplication.translate(
"PythonConsole", "Open in External Editor" "PythonConsole", "Open in External Editor"
) )
self.open_in_editor_action = QAction(self) self.openInEditorButton = QAction(self)
self.open_in_editor_action.setIcon( self.openInEditorButton.setCheckable(False)
self.openInEditorButton.setEnabled(True)
self.openInEditorButton.setIcon(
QgsApplication.getThemeIcon("console/iconShowEditorConsole.svg") QgsApplication.getThemeIcon("console/iconShowEditorConsole.svg")
) )
self.open_in_editor_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.openInEditorButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.open_in_editor_action.setIconVisibleInMenu(True) self.openInEditorButton.setIconVisibleInMenu(True)
self.open_in_editor_action.setToolTip(openExtEditorBt) self.openInEditorButton.setToolTip(openExtEditorBt)
self.open_in_editor_action.setText(openExtEditorBt) self.openInEditorButton.setText(openExtEditorBt)
# Action for Save File # Action for Save File
saveFileBt = QCoreApplication.translate("PythonConsole", "Save") saveFileBt = QCoreApplication.translate("PythonConsole", "Save")
self.save_file_action = QAction(self) self.saveFileButton = QAction(self)
self.save_file_action.setEnabled(False) self.saveFileButton.setCheckable(False)
self.save_file_action.setIcon( self.saveFileButton.setEnabled(False)
QgsApplication.getThemeIcon("mActionFileSave.svg") self.saveFileButton.setIcon(QgsApplication.getThemeIcon("mActionFileSave.svg"))
) self.saveFileButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.save_file_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.saveFileButton.setIconVisibleInMenu(True)
self.save_file_action.setIconVisibleInMenu(True) self.saveFileButton.setToolTip(saveFileBt + " <b>Ctrl+S</b>")
self.save_file_action.setToolTip(f"<b>{saveFileBt}</b> (Ctrl+S)") self.saveFileButton.setText(saveFileBt)
self.save_file_action.setText(saveFileBt)
# Action for Save File As # Action for Save File As
saveAsFileBt = QCoreApplication.translate("PythonConsole", "Save As…") saveAsFileBt = QCoreApplication.translate("PythonConsole", "Save As…")
self.save_as_file_action = QAction(self) self.saveAsFileButton = QAction(self)
self.save_as_file_action.setIcon( self.saveAsFileButton.setCheckable(False)
self.saveAsFileButton.setEnabled(True)
self.saveAsFileButton.setIcon(
QgsApplication.getThemeIcon("mActionFileSaveAs.svg") QgsApplication.getThemeIcon("mActionFileSaveAs.svg")
) )
self.save_as_file_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.saveAsFileButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.save_as_file_action.setIconVisibleInMenu(True) self.saveAsFileButton.setIconVisibleInMenu(True)
self.save_as_file_action.setToolTip(f"<b>{saveAsFileBt}</b> (Ctrl+Shift+S)") self.saveAsFileButton.setToolTip(saveAsFileBt + " <b>Ctrl+Shift+S</b>")
self.save_as_file_action.setText(saveAsFileBt) self.saveAsFileButton.setText(saveAsFileBt)
# Action Cut # Action Cut
cutEditorBt = QCoreApplication.translate("PythonConsole", "Cut") cutEditorBt = QCoreApplication.translate("PythonConsole", "Cut")
self.cut_action = QAction(self) self.cutEditorButton = QAction(self)
self.cut_action.setIcon(QgsApplication.getThemeIcon("mActionEditCut.svg")) self.cutEditorButton.setCheckable(False)
self.cut_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.cutEditorButton.setEnabled(True)
self.cut_action.setIconVisibleInMenu(True) self.cutEditorButton.setIcon(QgsApplication.getThemeIcon("mActionEditCut.svg"))
self.cut_action.setToolTip(f"<b>{cutEditorBt}</b> (Ctrl+X)") self.cutEditorButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.cut_action.setText(cutEditorBt) self.cutEditorButton.setIconVisibleInMenu(True)
self.cutEditorButton.setToolTip(cutEditorBt + " <b>Ctrl+X</b>")
self.cutEditorButton.setText(cutEditorBt)
# Action Copy # Action Copy
copyEditorBt = QCoreApplication.translate("PythonConsole", "Copy") copyEditorBt = QCoreApplication.translate("PythonConsole", "Copy")
self.copy_action = QAction(self) self.copyEditorButton = QAction(self)
self.copy_action.setIcon(QgsApplication.getThemeIcon("mActionEditCopy.svg")) self.copyEditorButton.setCheckable(False)
self.copy_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.copyEditorButton.setEnabled(True)
self.copy_action.setIconVisibleInMenu(True) self.copyEditorButton.setIcon(
self.copy_action.setToolTip(f"<b>{copyEditorBt}</b> (Ctrl+C)") QgsApplication.getThemeIcon("mActionEditCopy.svg")
self.copy_action.setText(copyEditorBt) )
self.copyEditorButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.copyEditorButton.setIconVisibleInMenu(True)
self.copyEditorButton.setToolTip(copyEditorBt + " <b>Ctrl+C</b>")
self.copyEditorButton.setText(copyEditorBt)
# Action Paste # Action Paste
pasteEditorBt = QCoreApplication.translate("PythonConsole", "Paste") pasteEditorBt = QCoreApplication.translate("PythonConsole", "Paste")
self.paste_action = QAction(self) self.pasteEditorButton = QAction(self)
self.paste_action.setIcon(QgsApplication.getThemeIcon("mActionEditPaste.svg")) self.pasteEditorButton.setCheckable(False)
self.paste_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.pasteEditorButton.setEnabled(True)
self.paste_action.setIconVisibleInMenu(True) self.pasteEditorButton.setIcon(
self.paste_action.setToolTip(f"<b>{pasteEditorBt}</b> (Ctrl+V)") QgsApplication.getThemeIcon("mActionEditPaste.svg")
self.paste_action.setText(pasteEditorBt) )
self.pasteEditorButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.pasteEditorButton.setIconVisibleInMenu(True)
self.pasteEditorButton.setToolTip(pasteEditorBt + " <b>Ctrl+V</b>")
self.pasteEditorButton.setText(pasteEditorBt)
# Action Run Script (subprocess) # Action Run Script (subprocess)
self.run_script_action = QAction(self) runScriptEditorBt = QCoreApplication.translate("PythonConsole", "Run Script")
self.run_script_action.setIcon(QgsApplication.getThemeIcon("mActionStart.svg")) self.runScriptEditorButton = QAction(self)
self.run_script_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.runScriptEditorButton.setCheckable(False)
self.run_script_action.setIconVisibleInMenu(True) self.runScriptEditorButton.setEnabled(True)
QgsGui.shortcutsManager().initializeCommonAction( self.runScriptEditorButton.setIcon(
self.run_script_action, QgsShortcutsManager.CommonAction.CodeRunScript QgsApplication.getThemeIcon("mActionStart.svg")
) )
self.runScriptEditorButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.runScriptEditorButton.setIconVisibleInMenu(True)
self.runScriptEditorButton.setToolTip(
runScriptEditorBt + " <b>Ctrl+Shift+E</b>"
)
self.runScriptEditorButton.setText(runScriptEditorBt)
# Action Run Selected # Action Run Selected
self.run_selection_action = QAction(self) runSelectedEditorBt = QCoreApplication.translate(
self.run_selection_action.setIcon( "PythonConsole", "Run Selected"
)
self.runSelectedEditorButton = QAction(self)
self.runSelectedEditorButton.setCheckable(False)
self.runSelectedEditorButton.setEnabled(True)
self.runSelectedEditorButton.setIcon(
QgsApplication.getThemeIcon("mActionRunSelected.svg") QgsApplication.getThemeIcon("mActionRunSelected.svg")
) )
self.run_selection_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.runSelectedEditorButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.run_selection_action.setIconVisibleInMenu(True) self.runSelectedEditorButton.setIconVisibleInMenu(True)
QgsGui.shortcutsManager().initializeCommonAction( self.runSelectedEditorButton.setToolTip(runSelectedEditorBt + " <b>Ctrl+E</b>")
self.run_selection_action, QgsShortcutsManager.CommonAction.CodeRunSelection self.runSelectedEditorButton.setShortcut("Ctrl+E")
) self.runSelectedEditorButton.setText(runSelectedEditorBt)
# Action Toggle comment # Action Toggle comment
self.toggle_comment_action = QAction(self) toggleText = QCoreApplication.translate("PythonConsole", "Toggle Comment")
self.toggle_comment_action.setIcon( self.toggleCommentEditorButton = QAction(self)
self.toggleCommentEditorButton.setCheckable(False)
self.toggleCommentEditorButton.setEnabled(True)
self.toggleCommentEditorButton.setIcon(
QgsApplication.getThemeIcon( QgsApplication.getThemeIcon(
"console/iconCommentEditorConsole.svg", "console/iconCommentEditorConsole.svg",
self.palette().color(QPalette.ColorRole.WindowText), self.palette().color(QPalette.ColorRole.WindowText),
), ),
) )
self.toggle_comment_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.toggleCommentEditorButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.toggle_comment_action.setIconVisibleInMenu(True) self.toggleCommentEditorButton.setIconVisibleInMenu(True)
QgsGui.shortcutsManager().initializeCommonAction( self.toggleCommentEditorButton.setToolTip(toggleText + " <b>Ctrl+:</b>")
self.toggle_comment_action, self.toggleCommentEditorButton.setText(toggleText)
QgsShortcutsManager.CommonAction.CodeToggleComment,
)
# Action Format code # Action Format code
self.reformat_code_action = QAction(self) reformatCodeText = QCoreApplication.translate("PythonConsole", "Reformat Code")
self.reformat_code_action.setIcon( self.reformatCodeEditorButton = QAction(self)
self.reformatCodeEditorButton.setCheckable(False)
self.reformatCodeEditorButton.setEnabled(True)
self.reformatCodeEditorButton.setIcon(
QgsApplication.getThemeIcon("console/iconFormatCode.svg") QgsApplication.getThemeIcon("console/iconFormatCode.svg")
) )
self.reformat_code_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.reformatCodeEditorButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.reformat_code_action.setIconVisibleInMenu(True) self.reformatCodeEditorButton.setIconVisibleInMenu(True)
QgsGui.shortcutsManager().initializeCommonAction( self.reformatCodeEditorButton.setToolTip(
self.reformat_code_action, QgsShortcutsManager.CommonAction.CodeReformat reformatCodeText + " <b>Ctrl+Alt+F</b>"
) )
self.reformatCodeEditorButton.setShortcut("Ctrl+Alt+F")
self.reformatCodeEditorButton.setText(reformatCodeText)
# Action for Object browser # Action for Object browser
objList = QCoreApplication.translate("PythonConsole", "Object Inspector…") objList = QCoreApplication.translate("PythonConsole", "Object Inspector…")
self.object_inspector_action = QAction(self) self.objectListButton = QAction(self)
self.object_inspector_action.setCheckable(True) self.objectListButton.setCheckable(True)
self.object_inspector_action.setEnabled( self.objectListButton.setEnabled(
QgsSettings().value("pythonConsole/enableObjectInsp", False, type=bool) QgsSettings().value("pythonConsole/enableObjectInsp", False, type=bool)
) )
self.object_inspector_action.setIcon( self.objectListButton.setIcon(
QgsApplication.getThemeIcon("console/iconClassBrowserConsole.svg") QgsApplication.getThemeIcon("console/iconClassBrowserConsole.svg")
) )
self.object_inspector_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.objectListButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.object_inspector_action.setIconVisibleInMenu(True) self.objectListButton.setIconVisibleInMenu(True)
self.object_inspector_action.setToolTip(objList) self.objectListButton.setToolTip(objList)
self.object_inspector_action.setText(objList) self.objectListButton.setText(objList)
# Action for Find text # Action for Find text
findText = QCoreApplication.translate("PythonConsole", "Find Text") findText = QCoreApplication.translate("PythonConsole", "Find Text")
@ -367,7 +395,7 @@ class PythonConsoleWidget(QWidget):
) )
self.find_text_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.find_text_action.setMenuRole(QAction.MenuRole.PreferencesRole)
self.find_text_action.setIconVisibleInMenu(True) self.find_text_action.setIconVisibleInMenu(True)
self.find_text_action.setToolTip(f"<b>{findText}</b> (Ctrl+F)") self.find_text_action.setToolTip(findText + " <b>Ctrl+F</b>")
self.find_text_action.setText(findText) self.find_text_action.setText(findText)
self.tabEditorWidget.search_bar_toggled.connect( self.tabEditorWidget.search_bar_toggled.connect(
@ -379,65 +407,75 @@ class PythonConsoleWidget(QWidget):
# Action Show Editor # Action Show Editor
showEditor = QCoreApplication.translate("PythonConsole", "Show Editor") showEditor = QCoreApplication.translate("PythonConsole", "Show Editor")
self.show_editor_action = QAction(self) self.showEditorButton = QAction(self)
self.show_editor_action.setCheckable(True) self.showEditorButton.setEnabled(True)
self.show_editor_action.setIcon( self.showEditorButton.setCheckable(True)
self.showEditorButton.setIcon(
QgsApplication.getThemeIcon("console/iconShowEditorConsole.svg") QgsApplication.getThemeIcon("console/iconShowEditorConsole.svg")
) )
self.show_editor_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.showEditorButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.show_editor_action.setIconVisibleInMenu(True) self.showEditorButton.setIconVisibleInMenu(True)
self.show_editor_action.setToolTip(showEditor) self.showEditorButton.setToolTip(showEditor)
self.show_editor_action.setText(showEditor) self.showEditorButton.setText(showEditor)
# Action for Clear button # Action for Clear button
clearBt = QCoreApplication.translate("PythonConsole", "Clear Console") clearBt = QCoreApplication.translate("PythonConsole", "Clear Console")
self.clear_action = QAction(self) self.clearButton = QAction(self)
self.clear_action.setIcon( self.clearButton.setCheckable(False)
self.clearButton.setEnabled(True)
self.clearButton.setIcon(
QgsApplication.getThemeIcon("console/iconClearConsole.svg") QgsApplication.getThemeIcon("console/iconClearConsole.svg")
) )
self.clear_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.clearButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.clear_action.setIconVisibleInMenu(True) self.clearButton.setIconVisibleInMenu(True)
self.clear_action.setToolTip(clearBt) self.clearButton.setToolTip(clearBt)
self.clear_action.setText(clearBt) self.clearButton.setText(clearBt)
# Action for settings # Action for settings
optionsBt = QCoreApplication.translate("PythonConsole", "Options…") optionsBt = QCoreApplication.translate("PythonConsole", "Options…")
self.options_action = QAction(self) self.optionsButton = QAction(self)
self.options_action.setIcon( self.optionsButton.setCheckable(False)
self.optionsButton.setEnabled(True)
self.optionsButton.setIcon(
QgsApplication.getThemeIcon("console/iconSettingsConsole.svg") QgsApplication.getThemeIcon("console/iconSettingsConsole.svg")
) )
self.options_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.optionsButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.options_action.setIconVisibleInMenu(True) self.optionsButton.setIconVisibleInMenu(True)
self.options_action.setToolTip(optionsBt) self.optionsButton.setToolTip(optionsBt)
self.options_action.setText(optionsBt) self.optionsButton.setText(optionsBt)
# Action for Run script # Action for Run script
runBt = QCoreApplication.translate("PythonConsole", "Run Command") runBt = QCoreApplication.translate("PythonConsole", "Run Command")
self.run_action = QAction(self) self.runButton = QAction(self)
self.run_action.setIcon(QgsApplication.getThemeIcon("mActionStart.svg")) self.runButton.setCheckable(False)
self.run_action.setMenuRole(QAction.MenuRole.PreferencesRole) self.runButton.setEnabled(True)
self.run_action.setIconVisibleInMenu(True) self.runButton.setIcon(QgsApplication.getThemeIcon("mActionStart.svg"))
self.run_action.setToolTip(runBt) self.runButton.setMenuRole(QAction.MenuRole.PreferencesRole)
self.run_action.setText(runBt) self.runButton.setIconVisibleInMenu(True)
self.runButton.setToolTip(runBt)
self.runButton.setText(runBt)
# Help button # Help button
self.help_console_action = QAction(self) self.helpConsoleAction = QAction(self)
self.help_console_action.setText( self.helpConsoleAction.setEnabled(True)
self.helpConsoleAction.setText(
QCoreApplication.translate("PythonConsole", "Python Console Help") QCoreApplication.translate("PythonConsole", "Python Console Help")
) )
self.help_api_action = QAction(self) self.helpAPIAction = QAction(self)
self.help_api_action.setText( self.helpAPIAction.setEnabled(True)
self.helpAPIAction.setText(
QCoreApplication.translate("PythonConsole", "PyQGIS API Documentation") QCoreApplication.translate("PythonConsole", "PyQGIS API Documentation")
) )
self.help_cookbook_action = QAction(self) self.helpCookbookAction = QAction(self)
self.help_cookbook_action.setText( self.helpCookbookAction.setEnabled(True)
self.helpCookbookAction.setText(
QCoreApplication.translate("PythonConsole", "PyQGIS Cookbook") QCoreApplication.translate("PythonConsole", "PyQGIS Cookbook")
) )
self.helpMenu = QMenu(self) self.helpMenu = QMenu(self)
self.helpMenu.addAction(self.help_console_action) self.helpMenu.addAction(self.helpConsoleAction)
self.helpMenu.addAction(self.help_api_action) self.helpMenu.addAction(self.helpAPIAction)
self.helpMenu.addAction(self.help_cookbook_action) self.helpMenu.addAction(self.helpCookbookAction)
helpBt = QCoreApplication.translate("PythonConsole", "Help…") helpBt = QCoreApplication.translate("PythonConsole", "Help…")
self.helpButton = QToolButton(self) self.helpButton = QToolButton(self)
@ -457,12 +495,12 @@ class PythonConsoleWidget(QWidget):
self.toolBar.setIconSize(icon_size) self.toolBar.setIconSize(icon_size)
self.toolBar.setMovable(False) self.toolBar.setMovable(False)
self.toolBar.setFloatable(False) self.toolBar.setFloatable(False)
self.toolBar.addAction(self.clear_action) self.toolBar.addAction(self.clearButton)
self.toolBar.addAction(self.run_action) self.toolBar.addAction(self.runButton)
self.toolBar.addSeparator() self.toolBar.addSeparator()
self.toolBar.addAction(self.show_editor_action) self.toolBar.addAction(self.showEditorButton)
self.toolBar.addSeparator() self.toolBar.addSeparator()
self.toolBar.addAction(self.options_action) self.toolBar.addAction(self.optionsButton)
self.toolBar.addWidget(self.helpButton) self.toolBar.addWidget(self.helpButton)
self.toolBar.addSeparator() self.toolBar.addSeparator()
self.toolBar.addWidget(parent.dockToggleButton()) self.toolBar.addWidget(parent.dockToggleButton())
@ -475,25 +513,25 @@ class PythonConsoleWidget(QWidget):
self.toolBarEditor.setIconSize(icon_size) self.toolBarEditor.setIconSize(icon_size)
self.toolBarEditor.setMovable(False) self.toolBarEditor.setMovable(False)
self.toolBarEditor.setFloatable(False) self.toolBarEditor.setFloatable(False)
self.toolBarEditor.addAction(self.open_file_action) self.toolBarEditor.addAction(self.openFileButton)
self.toolBarEditor.addAction(self.open_in_editor_action) self.toolBarEditor.addAction(self.openInEditorButton)
self.toolBarEditor.addSeparator() self.toolBarEditor.addSeparator()
self.toolBarEditor.addAction(self.save_file_action) self.toolBarEditor.addAction(self.saveFileButton)
self.toolBarEditor.addAction(self.save_as_file_action) self.toolBarEditor.addAction(self.saveAsFileButton)
self.toolBarEditor.addSeparator() self.toolBarEditor.addSeparator()
self.toolBarEditor.addAction(self.run_script_action) self.toolBarEditor.addAction(self.runScriptEditorButton)
self.toolBarEditor.addAction(self.run_selection_action) self.toolBarEditor.addAction(self.runSelectedEditorButton)
self.toolBarEditor.addSeparator() self.toolBarEditor.addSeparator()
self.toolBarEditor.addAction(self.cut_action) self.toolBarEditor.addAction(self.cutEditorButton)
self.toolBarEditor.addAction(self.copy_action) self.toolBarEditor.addAction(self.copyEditorButton)
self.toolBarEditor.addAction(self.paste_action) self.toolBarEditor.addAction(self.pasteEditorButton)
self.toolBarEditor.addSeparator() self.toolBarEditor.addSeparator()
self.toolBarEditor.addAction(self.find_text_action) self.toolBarEditor.addAction(self.find_text_action)
self.toolBarEditor.addSeparator() self.toolBarEditor.addSeparator()
self.toolBarEditor.addAction(self.toggle_comment_action) self.toolBarEditor.addAction(self.toggleCommentEditorButton)
self.toolBarEditor.addAction(self.reformat_code_action) self.toolBarEditor.addAction(self.reformatCodeEditorButton)
self.toolBarEditor.addSeparator() self.toolBarEditor.addSeparator()
self.toolBarEditor.addAction(self.object_inspector_action) self.toolBarEditor.addAction(self.objectListButton)
self.widgetButton = QWidget() self.widgetButton = QWidget()
sizePolicy = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Preferred) sizePolicy = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Preferred)
@ -547,25 +585,25 @@ class PythonConsoleWidget(QWidget):
# ------------ Signal ------------------------------- # ------------ Signal -------------------------------
self.object_inspector_action.toggled.connect(self.toggleObjectListWidget) self.objectListButton.toggled.connect(self.toggleObjectListWidget)
self.toggle_comment_action.triggered.connect(self.toggleComment) self.toggleCommentEditorButton.triggered.connect(self.toggleComment)
self.reformat_code_action.triggered.connect(self.reformatCode) self.reformatCodeEditorButton.triggered.connect(self.reformatCode)
self.run_script_action.triggered.connect(self.runScriptEditor) self.runScriptEditorButton.triggered.connect(self.runScriptEditor)
self.run_selection_action.triggered.connect(self.runSelectedEditor) self.runSelectedEditorButton.triggered.connect(self.runSelectedEditor)
self.cut_action.triggered.connect(self.cutEditor) self.cutEditorButton.triggered.connect(self.cutEditor)
self.copy_action.triggered.connect(self.copyEditor) self.copyEditorButton.triggered.connect(self.copyEditor)
self.paste_action.triggered.connect(self.pasteEditor) self.pasteEditorButton.triggered.connect(self.pasteEditor)
self.show_editor_action.toggled.connect(self.toggleEditor) self.showEditorButton.toggled.connect(self.toggleEditor)
self.clear_action.triggered.connect(self.shell_output.clearConsole) self.clearButton.triggered.connect(self.shell_output.clearConsole)
self.options_action.triggered.connect(self.openSettings) self.optionsButton.triggered.connect(self.openSettings)
self.run_action.triggered.connect(self.shell.entered) self.runButton.triggered.connect(self.shell.entered)
self.open_file_action.triggered.connect(self.openScriptFile) self.openFileButton.triggered.connect(self.openScriptFile)
self.open_in_editor_action.triggered.connect(self.openScriptFileExtEditor) self.openInEditorButton.triggered.connect(self.openScriptFileExtEditor)
self.save_file_action.triggered.connect(self.saveScriptFile) self.saveFileButton.triggered.connect(self.saveScriptFile)
self.save_as_file_action.triggered.connect(self.saveAsScriptFile) self.saveAsFileButton.triggered.connect(self.saveAsScriptFile)
self.help_console_action.triggered.connect(self.openHelpConsole) self.helpConsoleAction.triggered.connect(self.openHelpConsole)
self.help_api_action.triggered.connect(self.openHelpAPI) self.helpAPIAction.triggered.connect(self.openHelpAPI)
self.help_cookbook_action.triggered.connect(self.openHelpCookbook) self.helpCookbookAction.triggered.connect(self.openHelpCookbook)
self.listClassMethod.itemClicked.connect(self.onClickGoToLine) self.listClassMethod.itemClicked.connect(self.onClickGoToLine)
if iface is not None: if iface is not None:

View File

@ -33,13 +33,7 @@ from operator import itemgetter
from pathlib import Path from pathlib import Path
from qgis.core import Qgis, QgsApplication, QgsBlockingNetworkRequest, QgsSettings from qgis.core import Qgis, QgsApplication, QgsBlockingNetworkRequest, QgsSettings
from qgis.gui import ( from qgis.gui import QgsCodeEditorPython, QgsCodeEditorWidget, QgsMessageBar
QgsCodeEditorPython,
QgsCodeEditorWidget,
QgsGui,
QgsMessageBar,
QgsShortcutsManager,
)
from qgis.PyQt.Qsci import QsciScintilla from qgis.PyQt.Qsci import QsciScintilla
from qgis.PyQt.QtCore import ( from qgis.PyQt.QtCore import (
@ -165,6 +159,15 @@ class Editor(QgsCodeEditorPython):
syntaxCheckAction.setShortcut("Ctrl+4") syntaxCheckAction.setShortcut("Ctrl+4")
menu.addAction(syntaxCheckAction) menu.addAction(syntaxCheckAction)
runSelected = QAction(
QgsApplication.getThemeIcon("mActionRunSelected.svg"), # spellok
QCoreApplication.translate("PythonConsole", "Run Selected"),
menu,
)
runSelected.triggered.connect(self.runSelectedCode) # spellok
runSelected.setShortcut("Ctrl+E") # spellok
menu.addAction(runSelected) # spellok
word = self.selectedText() or self.wordAtPoint(e.pos()) word = self.selectedText() or self.wordAtPoint(e.pos())
if word: if word:
context_help_action = QAction( context_help_action = QAction(
@ -182,24 +185,13 @@ class Editor(QgsCodeEditorPython):
context_help_action.setShortcut(QKeySequence.StandardKey.HelpContents) context_help_action.setShortcut(QKeySequence.StandardKey.HelpContents)
menu.addAction(context_help_action) menu.addAction(context_help_action)
run_selection_action = QAction(menu) start_action = QAction(
run_selection_action.setIcon( QgsApplication.getThemeIcon("mActionStart.svg"),
QgsApplication.getThemeIcon("mActionRunSelected.svg"), QCoreApplication.translate("PythonConsole", "Run Script"),
menu,
) )
run_selection_action.triggered.connect(self.runSelectedCode)
QgsGui.shortcutsManager().initializeCommonAction(
run_selection_action,
QgsShortcutsManager.CommonAction.CodeRunSelection,
)
menu.addAction(run_selection_action)
start_action = QAction(self)
start_action.setIcon(QgsApplication.getThemeIcon("mActionStart.svg"))
start_action.triggered.connect(self.runScriptCode) start_action.triggered.connect(self.runScriptCode)
QgsGui.shortcutsManager().initializeCommonAction( start_action.setShortcut("Ctrl+Shift+E")
start_action,
QgsShortcutsManager.CommonAction.CodeRunScript,
)
menu.addAction(start_action) menu.addAction(start_action)
menu.addSeparator() menu.addSeparator()
@ -266,31 +258,18 @@ class Editor(QgsCodeEditorPython):
menu.addAction(selectAllAction) menu.addAction(selectAllAction)
menu.addSeparator() menu.addSeparator()
toggle_comment_action = QAction(menu) toggle_comment_action = QAction(
toggle_comment_action.setIcon(
QgsApplication.getThemeIcon( QgsApplication.getThemeIcon(
"console/iconCommentEditorConsole.svg", "console/iconCommentEditorConsole.svg",
self.palette().color(QPalette.ColorRole.WindowText), self.palette().color(QPalette.ColorRole.WindowText),
) ),
QCoreApplication.translate("PythonConsole", "Toggle Comment"),
menu,
) )
toggle_comment_action.triggered.connect(self.toggleComment) toggle_comment_action.triggered.connect(self.toggleComment)
QgsGui.shortcutsManager().initializeCommonAction( toggle_comment_action.setShortcut("Ctrl+:")
toggle_comment_action,
QgsShortcutsManager.CommonAction.CodeToggleComment,
)
menu.addAction(toggle_comment_action) menu.addAction(toggle_comment_action)
reformat_code_action = QAction(menu)
reformat_code_action.setIcon(
QgsApplication.getThemeIcon("console/iconFormatCode.svg")
)
reformat_code_action.triggered.connect(self.reformatCode)
QgsGui.shortcutsManager().initializeCommonAction(
reformat_code_action,
QgsShortcutsManager.CommonAction.CodeReformat,
)
menu.addAction(reformat_code_action)
menu.addSeparator() menu.addSeparator()
gist_menu = QMenu(self) gist_menu = QMenu(self)
gist_menu.setTitle( gist_menu.setTitle(
@ -320,14 +299,14 @@ class Editor(QgsCodeEditorPython):
syntaxCheckAction.setEnabled(False) syntaxCheckAction.setEnabled(False)
pasteAction.setEnabled(False) pasteAction.setEnabled(False)
cutAction.setEnabled(False) cutAction.setEnabled(False)
run_selection_action.setEnabled(False) runSelected.setEnabled(False) # spellok
copyAction.setEnabled(False) copyAction.setEnabled(False)
selectAllAction.setEnabled(False) selectAllAction.setEnabled(False)
undoAction.setEnabled(False) undoAction.setEnabled(False)
redoAction.setEnabled(False) redoAction.setEnabled(False)
showCodeInspection.setEnabled(False) showCodeInspection.setEnabled(False)
if self.hasSelectedText(): if self.hasSelectedText():
run_selection_action.setEnabled(True) runSelected.setEnabled(True) # spellok
copyAction.setEnabled(True) copyAction.setEnabled(True)
cutAction.setEnabled(True) cutAction.setEnabled(True)
if not self.text() == "": if not self.text() == "":
@ -347,17 +326,17 @@ class Editor(QgsCodeEditorPython):
listObj = self.console_widget.listClassMethod listObj = self.console_widget.listClassMethod
if listObj.isVisible(): if listObj.isVisible():
listObj.hide() listObj.hide()
self.console_widget.object_inspector_action.setChecked(False) self.console_widget.objectListButton.setChecked(False)
else: else:
listObj.show() listObj.show()
self.console_widget.object_inspector_action.setChecked(True) self.console_widget.objectListButton.setChecked(True)
def shareOnGist(self, is_public): def shareOnGist(self, is_public):
self.code_editor_widget.shareOnGist(is_public) self.code_editor_widget.shareOnGist(is_public)
def hideEditor(self): def hideEditor(self):
self.console_widget.splitterObj.hide() self.console_widget.splitterObj.hide()
self.console_widget.show_editor_action.setChecked(False) self.console_widget.showEditorButton.setChecked(False)
def createTempFile(self): def createTempFile(self):
name = tempfile.NamedTemporaryFile(delete=False).name name = tempfile.NamedTemporaryFile(delete=False).name
@ -496,7 +475,7 @@ class Editor(QgsCodeEditorPython):
) )
self.tab_widget.setTabToolTip(index, self.code_editor_widget.filePath()) self.tab_widget.setTabToolTip(index, self.code_editor_widget.filePath())
self.setModified(False) self.setModified(False)
self.console_widget.save_file_action.setEnabled(False) self.console_widget.saveFileButton.setEnabled(False)
self.console_widget.updateTabListScript( self.console_widget.updateTabListScript(
self.code_editor_widget.filePath(), action="append" self.code_editor_widget.filePath(), action="append"
) )
@ -741,7 +720,7 @@ class EditorTabWidget(QTabWidget):
# New Editor button # New Editor button
self.newTabButton = QToolButton() self.newTabButton = QToolButton()
txtToolTipNewTab = QCoreApplication.translate("PythonConsole", "New Editor") txtToolTipNewTab = QCoreApplication.translate("PythonConsole", "New Editor")
self.newTabButton.setToolTip(f"<b>{txtToolTipNewTab}</b> (Ctrl+T)") self.newTabButton.setToolTip(txtToolTipNewTab + " <b>Ctrl+T</b>")
self.newTabButton.setAutoRaise(True) self.newTabButton.setAutoRaise(True)
self.newTabButton.setIcon( self.newTabButton.setIcon(
QgsApplication.getThemeIcon("console/iconNewTabEditorConsole.svg") QgsApplication.getThemeIcon("console/iconNewTabEditorConsole.svg")
@ -831,7 +810,7 @@ class EditorTabWidget(QTabWidget):
def enableSaveIfModified(self, tab): def enableSaveIfModified(self, tab):
tabWidget = self.widget(tab) tabWidget = self.widget(tab)
if tabWidget: if tabWidget:
self.console_widget.save_file_action.setEnabled(tabWidget.isModified()) self.console_widget.saveFileButton.setEnabled(tabWidget.isModified())
def enableToolBarEditor(self, enable): def enableToolBarEditor(self, enable):
if self.topFrame.isVisible(): if self.topFrame.isVisible():
@ -885,7 +864,7 @@ class EditorTabWidget(QTabWidget):
index = self.indexOf(tab) index = self.indexOf(tab)
s = self.tabText(index) s = self.tabText(index)
self.setTabTitle(index, f"*{s}" if modified else re.sub(r"^(\*)", "", s)) self.setTabTitle(index, f"*{s}" if modified else re.sub(r"^(\*)", "", s))
self.console_widget.save_file_action.setEnabled(modified) self.console_widget.saveFileButton.setEnabled(modified)
def setTabTitle(self, tab, title): def setTabTitle(self, tab, title):
self.setTabText(tab, title) self.setTabText(tab, title)
@ -1092,9 +1071,10 @@ class EditorTabWidget(QTabWidget):
objInspectorEnabled = QgsSettings().value( objInspectorEnabled = QgsSettings().value(
"pythonConsole/enableObjectInsp", False, type=bool "pythonConsole/enableObjectInsp", False, type=bool
) )
listObj = self.console_widget.objectListButton
if self.console_widget.listClassMethod.isVisible(): if self.console_widget.listClassMethod.isVisible():
self.console_widget.object_inspector_action.setChecked(objInspectorEnabled) listObj.setChecked(objInspectorEnabled)
self.console_widget.object_inspector_action.setEnabled(objInspectorEnabled) listObj.setEnabled(objInspectorEnabled)
if objInspectorEnabled: if objInspectorEnabled:
cW = self.currentWidget() cW = self.currentWidget()
if cW and not self.console_widget.listClassMethod.isVisible(): if cW and not self.console_widget.listClassMethod.isVisible():

View File

@ -348,7 +348,7 @@ class ShellOutputScintilla(QgsCodeEditorPython):
Ed = self.console_widget.splitterObj Ed = self.console_widget.splitterObj
if not Ed.isVisible(): if not Ed.isVisible():
Ed.show() Ed.show()
self.console_widget.show_editor_action.setChecked(True) self.console_widget.showEditorButton.setChecked(True)
self.shell_editor.setFocus() self.shell_editor.setFocus()
def copy(self): def copy(self):

View File

@ -11645,25 +11645,6 @@ Qgis.RasterProcessingParameterCapability.__doc__ = """Capabilities of a raster l
Qgis.RasterProcessingParameterCapability.baseClass = Qgis Qgis.RasterProcessingParameterCapability.baseClass = Qgis
Qgis.RasterProcessingParameterCapabilities.baseClass = Qgis Qgis.RasterProcessingParameterCapabilities.baseClass = Qgis
RasterProcessingParameterCapabilities = Qgis # dirty hack since SIP seems to introduce the flags in module RasterProcessingParameterCapabilities = Qgis # dirty hack since SIP seems to introduce the flags in module
# monkey patching scoped based enum
Qgis.DevToolsNodeRole.Status.__doc__ = "Request status role"
Qgis.DevToolsNodeRole.Id.__doc__ = "Request ID role"
Qgis.DevToolsNodeRole.ElapsedTime.__doc__ = "Elapsed time"
Qgis.DevToolsNodeRole.MaximumTime.__doc__ = "Maximum encountered elapsed time"
Qgis.DevToolsNodeRole.Sort.__doc__ = "Sort order role"
Qgis.DevToolsNodeRole.__doc__ = """Dev tools node custom data roles.
.. versionadded:: 4.0
* ``Status``: Request status role
* ``Id``: Request ID role
* ``ElapsedTime``: Elapsed time
* ``MaximumTime``: Maximum encountered elapsed time
* ``Sort``: Sort order role
"""
# --
Qgis.DevToolsNodeRole.baseClass = Qgis
from enum import Enum from enum import Enum

View File

@ -3446,15 +3446,6 @@ The development version
typedef QFlags<Qgis::RasterProcessingParameterCapability> RasterProcessingParameterCapabilities; typedef QFlags<Qgis::RasterProcessingParameterCapability> RasterProcessingParameterCapabilities;
enum class DevToolsNodeRole
{
Status,
Id,
ElapsedTime,
MaximumTime,
Sort,
};
static const double DEFAULT_SEARCH_RADIUS_MM; static const double DEFAULT_SEARCH_RADIUS_MM;
static const float DEFAULT_MAPTOPIXEL_THRESHOLD; static const float DEFAULT_MAPTOPIXEL_THRESHOLD;

View File

@ -1,15 +1,15 @@
Qgis.defaultProjectScales: src/core/qgis.h#L6185 Qgis.defaultProjectScales: src/core/qgis.h#L6171
Qgis.devVersion: src/core/qgis.h#L90 Qgis.devVersion: src/core/qgis.h#L90
Qgis.geoNone: src/core/qgis.h#L6237 Qgis.geoNone: src/core/qgis.h#L6223
Qgis.geoProj4: src/core/qgis.h#L6267 Qgis.geoProj4: src/core/qgis.h#L6253
Qgis.geoWkt: src/core/qgis.h#L6258 Qgis.geoWkt: src/core/qgis.h#L6244
Qgis.geographicCrsAuthId: src/core/qgis.h#L6247 Qgis.geographicCrsAuthId: src/core/qgis.h#L6233
Qgis.geosVersion: src/core/qgis.h#L6220 Qgis.geosVersion: src/core/qgis.h#L6206
Qgis.geosVersionInt: src/core/qgis.h#L6192 Qgis.geosVersionInt: src/core/qgis.h#L6178
Qgis.geosVersionMajor: src/core/qgis.h#L6199 Qgis.geosVersionMajor: src/core/qgis.h#L6185
Qgis.geosVersionMinor: src/core/qgis.h#L6206 Qgis.geosVersionMinor: src/core/qgis.h#L6192
Qgis.geosVersionPatch: src/core/qgis.h#L6213 Qgis.geosVersionPatch: src/core/qgis.h#L6199
Qgis.hasQtWebkit: src/core/qgis.h#L6227 Qgis.hasQtWebkit: src/core/qgis.h#L6213
Qgis.releaseName: src/core/qgis.h#L80 Qgis.releaseName: src/core/qgis.h#L80
Qgis.version: src/core/qgis.h#L66 Qgis.version: src/core/qgis.h#L66
Qgis.versionInt: src/core/qgis.h#L73 Qgis.versionInt: src/core/qgis.h#L73

View File

@ -1,18 +0,0 @@
# The following has been generated automatically from src/gui/qgsshortcutsmanager.h
# monkey patching scoped based enum
QgsShortcutsManager.CommonAction.CodeToggleComment.__doc__ = "Toggle code comments"
QgsShortcutsManager.CommonAction.CodeReformat.__doc__ = "Reformat code"
QgsShortcutsManager.CommonAction.CodeRunScript.__doc__ = "Run script"
QgsShortcutsManager.CommonAction.CodeRunSelection.__doc__ = "Run selection from script"
QgsShortcutsManager.CommonAction.__doc__ = """Contains common actions which are used across a variety of classes.
.. versionadded:: 4.0
* ``CodeToggleComment``: Toggle code comments
* ``CodeReformat``: Reformat code
* ``CodeRunScript``: Run script
* ``CodeRunSelection``: Run selection from script
"""
# --
QgsShortcutsManager.CommonAction.baseClass = QgsShortcutsManager

View File

@ -23,14 +23,6 @@ rather accessed through :py:func:`QgsGui.shortcutsManager()`.
#include "qgsshortcutsmanager.h" #include "qgsshortcutsmanager.h"
%End %End
public: public:
enum class CommonAction
{
CodeToggleComment,
CodeReformat,
CodeRunScript,
CodeRunSelection,
};
QgsShortcutsManager( QObject *parent /TransferThis/ = 0, const QString &settingsRoot = "/shortcuts/" ); QgsShortcutsManager( QObject *parent /TransferThis/ = 0, const QString &settingsRoot = "/shortcuts/" );
%Docstring %Docstring
Constructor for QgsShortcutsManager. Constructor for QgsShortcutsManager.
@ -44,8 +36,6 @@ Constructor for QgsShortcutsManager.
QGIS actions. QGIS actions.
%End %End
~QgsShortcutsManager();
void registerAllChildren( QObject *object, bool recursive = false, const QString &section = QString() ); void registerAllChildren( QObject *object, bool recursive = false, const QString &section = QString() );
%Docstring %Docstring
Automatically registers all QActions and QShortcuts which are children Automatically registers all QActions and QShortcuts which are children
@ -115,16 +105,6 @@ in GUI.
.. seealso:: :py:func:`unregisterAction` .. seealso:: :py:func:`unregisterAction`
.. seealso:: :py:func:`registerAllChildActions` .. seealso:: :py:func:`registerAllChildActions`
%End
void initializeCommonAction( QAction *action, CommonAction commonAction );
%Docstring
Initializes an ``action`` as a common action.
This automatically configures the ``action`` to use the properties for
the common action, such as setting the action's tooltip and shortcut.
.. versionadded:: 4.0
%End %End
bool registerShortcut( QShortcut *shortcut, const QString &defaultSequence = QString(), const QString &section = QString() ); bool registerShortcut( QShortcut *shortcut, const QString &defaultSequence = QString(), const QString &section = QString() );
@ -310,14 +290,6 @@ if no shortcut is associated.
.. seealso:: :py:func:`objectForSequence` .. seealso:: :py:func:`objectForSequence`
.. seealso:: :py:func:`actionForSequence` .. seealso:: :py:func:`actionForSequence`
%End
QKeySequence sequenceForCommonAction( CommonAction action ) const;
%Docstring
Returns the key sequence which is associated with a common ``action``,
or an empty sequence if no shortcut is assigned to that action.
.. versionadded:: 4.0
%End %End
QAction *actionByName( const QString &name ) const; QAction *actionByName( const QString &name ) const;

View File

@ -6977,30 +6977,28 @@ QgsShapeburstFillSymbolLayerWidget.setColor: src/gui/symbology/qgssymbollayerwid
QgsShapeburstFillSymbolLayerWidget.setSymbolLayer: src/gui/symbology/qgssymbollayerwidget.h#L426 QgsShapeburstFillSymbolLayerWidget.setSymbolLayer: src/gui/symbology/qgssymbollayerwidget.h#L426
QgsShapeburstFillSymbolLayerWidget.symbolLayer: src/gui/symbology/qgssymbollayerwidget.h#L427 QgsShapeburstFillSymbolLayerWidget.symbolLayer: src/gui/symbology/qgssymbollayerwidget.h#L427
QgsShapeburstFillSymbolLayerWidget: src/gui/symbology/qgssymbollayerwidget.h#L407 QgsShapeburstFillSymbolLayerWidget: src/gui/symbology/qgssymbollayerwidget.h#L407
QgsShortcutsManager.actionByName: src/gui/qgsshortcutsmanager.h#L267 QgsShortcutsManager.actionByName: src/gui/qgsshortcutsmanager.h#L236
QgsShortcutsManager.actionForSequence: src/gui/qgsshortcutsmanager.h#L246 QgsShortcutsManager.actionForSequence: src/gui/qgsshortcutsmanager.h#L221
QgsShortcutsManager.defaultKeySequence: src/gui/qgsshortcutsmanager.h#L188 QgsShortcutsManager.defaultKeySequence: src/gui/qgsshortcutsmanager.h#L163
QgsShortcutsManager.defaultKeySequence: src/gui/qgsshortcutsmanager.h#L196 QgsShortcutsManager.defaultKeySequence: src/gui/qgsshortcutsmanager.h#L171
QgsShortcutsManager.initializeCommonAction: src/gui/qgsshortcutsmanager.h#L119 QgsShortcutsManager.objectDefaultKeySequence: src/gui/qgsshortcutsmanager.h#L155
QgsShortcutsManager.objectDefaultKeySequence: src/gui/qgsshortcutsmanager.h#L180 QgsShortcutsManager.objectForSequence: src/gui/qgsshortcutsmanager.h#L213
QgsShortcutsManager.objectForSequence: src/gui/qgsshortcutsmanager.h#L238 QgsShortcutsManager.objectForSettingKey: src/gui/qgsshortcutsmanager.h#L262
QgsShortcutsManager.objectForSettingKey: src/gui/qgsshortcutsmanager.h#L293 QgsShortcutsManager.objectSettingKey: src/gui/qgsshortcutsmanager.h#L254
QgsShortcutsManager.objectSettingKey: src/gui/qgsshortcutsmanager.h#L285 QgsShortcutsManager.registerAction: src/gui/qgsshortcutsmanager.h#L94
QgsShortcutsManager.registerAction: src/gui/qgsshortcutsmanager.h#L109 QgsShortcutsManager.registerAllChildActions: src/gui/qgsshortcutsmanager.h#L70
QgsShortcutsManager.registerAllChildActions: src/gui/qgsshortcutsmanager.h#L85 QgsShortcutsManager.registerAllChildShortcuts: src/gui/qgsshortcutsmanager.h#L81
QgsShortcutsManager.registerAllChildShortcuts: src/gui/qgsshortcutsmanager.h#L96 QgsShortcutsManager.registerAllChildren: src/gui/qgsshortcutsmanager.h#L59
QgsShortcutsManager.registerAllChildren: src/gui/qgsshortcutsmanager.h#L74 QgsShortcutsManager.registerShortcut: src/gui/qgsshortcutsmanager.h#L106
QgsShortcutsManager.registerShortcut: src/gui/qgsshortcutsmanager.h#L131 QgsShortcutsManager.setKeySequence: src/gui/qgsshortcutsmanager.h#L180
QgsShortcutsManager.sequenceForCommonAction: src/gui/qgsshortcutsmanager.h#L260 QgsShortcutsManager.setKeySequence: src/gui/qgsshortcutsmanager.h#L196
QgsShortcutsManager.setKeySequence: src/gui/qgsshortcutsmanager.h#L205 QgsShortcutsManager.setKeySequence: src/gui/qgsshortcutsmanager.h#L204
QgsShortcutsManager.setKeySequence: src/gui/qgsshortcutsmanager.h#L221 QgsShortcutsManager.setObjectKeySequence: src/gui/qgsshortcutsmanager.h#L188
QgsShortcutsManager.setKeySequence: src/gui/qgsshortcutsmanager.h#L229 QgsShortcutsManager.settingsPath: src/gui/qgsshortcutsmanager.h#L246
QgsShortcutsManager.setObjectKeySequence: src/gui/qgsshortcutsmanager.h#L213 QgsShortcutsManager.shortcutByName: src/gui/qgsshortcutsmanager.h#L243
QgsShortcutsManager.settingsPath: src/gui/qgsshortcutsmanager.h#L277 QgsShortcutsManager.shortcutForSequence: src/gui/qgsshortcutsmanager.h#L229
QgsShortcutsManager.shortcutByName: src/gui/qgsshortcutsmanager.h#L274 QgsShortcutsManager.unregisterAction: src/gui/qgsshortcutsmanager.h#L116
QgsShortcutsManager.shortcutForSequence: src/gui/qgsshortcutsmanager.h#L254 QgsShortcutsManager.unregisterShortcut: src/gui/qgsshortcutsmanager.h#L126
QgsShortcutsManager.unregisterAction: src/gui/qgsshortcutsmanager.h#L141
QgsShortcutsManager.unregisterShortcut: src/gui/qgsshortcutsmanager.h#L151
QgsShortcutsManager: src/gui/qgsshortcutsmanager.h#L36 QgsShortcutsManager: src/gui/qgsshortcutsmanager.h#L36
QgsSimpleFillSymbolLayerWidget.create: src/gui/symbology/qgssymbollayerwidget.h#L264 QgsSimpleFillSymbolLayerWidget.create: src/gui/symbology/qgssymbollayerwidget.h#L264
QgsSimpleFillSymbolLayerWidget.setColor: src/gui/symbology/qgssymbollayerwidget.h#L271 QgsSimpleFillSymbolLayerWidget.setColor: src/gui/symbology/qgssymbollayerwidget.h#L271

View File

@ -30,7 +30,7 @@ from qgis.PyQt.QtCore import Qt
from qgis.PyQt.QtGui import QPalette from qgis.PyQt.QtGui import QPalette
from qgis.PyQt.QtWidgets import QMessageBox, QFileDialog, QVBoxLayout from qgis.PyQt.QtWidgets import QMessageBox, QFileDialog, QVBoxLayout
from qgis.gui import QgsGui, QgsErrorDialog, QgsCodeEditorWidget, QgsShortcutsManager from qgis.gui import QgsGui, QgsErrorDialog, QgsCodeEditorWidget
from qgis.core import ( from qgis.core import (
QgsApplication, QgsApplication,
QgsFileUtils, QgsFileUtils,
@ -122,9 +122,6 @@ class ScriptEditorDialog(BASE, WIDGET):
self.palette().color(QPalette.ColorRole.WindowText), self.palette().color(QPalette.ColorRole.WindowText),
) )
) )
QgsGui.shortcutsManager().initializeCommonAction(
self.actionToggleComment, QgsShortcutsManager.CommonAction.CodeToggleComment
)
# Connect signals and slots # Connect signals and slots
self.actionOpenScript.triggered.connect(self.openScript) self.actionOpenScript.triggered.connect(self.openScript)

View File

@ -41,7 +41,7 @@ def userFolder():
def defaultOutputFolder(): def defaultOutputFolder():
folder = os.path.join(QDir.homePath(), "processing") folder = os.path.join(userFolder(), "outputs")
if not QDir(folder).exists(): if not QDir(folder).exists():
QDir().mkpath(folder) QDir().mkpath(folder)

View File

@ -8,8 +8,6 @@ set(QGIS_3D_SRCS
qgsaabb.cpp qgsaabb.cpp
qgsabstract3dengine.cpp qgsabstract3dengine.cpp
qgsabstractvectorlayer3drenderer.cpp qgsabstractvectorlayer3drenderer.cpp
qgsannotationlayer3drenderer.cpp
qgsannotationlayerchunkloader_p.cpp
qgs3danimationsettings.cpp qgs3danimationsettings.cpp
qgs3dexportobject.cpp qgs3dexportobject.cpp
qgs3dmapexportsettings.cpp qgs3dmapexportsettings.cpp
@ -156,8 +154,6 @@ set(QGIS_3D_HDRS
qgsaabb.h qgsaabb.h
qgsabstract3dengine.h qgsabstract3dengine.h
qgsabstractvectorlayer3drenderer.h qgsabstractvectorlayer3drenderer.h
qgsannotationlayer3drenderer.h
qgsannotationlayerchunkloader_p.h
qgscameracontroller.h qgscameracontroller.h
qgscamerapose.h qgscamerapose.h
qgsgeotransform.h qgsgeotransform.h

View File

@ -27,7 +27,6 @@
#include "qgsmeshlayer3drenderer.h" #include "qgsmeshlayer3drenderer.h"
#include "qgspointcloudlayer3drenderer.h" #include "qgspointcloudlayer3drenderer.h"
#include "qgstiledscenelayer3drenderer.h" #include "qgstiledscenelayer3drenderer.h"
#include "qgsannotationlayer3drenderer.h"
#include "qgs3dsymbolregistry.h" #include "qgs3dsymbolregistry.h"
#include "qgspoint3dsymbol.h" #include "qgspoint3dsymbol.h"
#include "qgsline3dsymbol.h" #include "qgsline3dsymbol.h"
@ -69,7 +68,6 @@ void Qgs3D::initialize()
QgsApplication::renderer3DRegistry()->addRenderer( new QgsMeshLayer3DRendererMetadata ); QgsApplication::renderer3DRegistry()->addRenderer( new QgsMeshLayer3DRendererMetadata );
QgsApplication::renderer3DRegistry()->addRenderer( new QgsPointCloudLayer3DRendererMetadata ); QgsApplication::renderer3DRegistry()->addRenderer( new QgsPointCloudLayer3DRendererMetadata );
QgsApplication::renderer3DRegistry()->addRenderer( new QgsTiledSceneLayer3DRendererMetadata ); QgsApplication::renderer3DRegistry()->addRenderer( new QgsTiledSceneLayer3DRendererMetadata );
QgsApplication::renderer3DRegistry()->addRenderer( new QgsAnnotationLayer3DRendererMetadata );
QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( QStringLiteral( "point" ), QObject::tr( "Point" ), &QgsPoint3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForPoint3DSymbol ) ); QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( QStringLiteral( "point" ), QObject::tr( "Point" ), &QgsPoint3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForPoint3DSymbol ) );
QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( QStringLiteral( "line" ), QObject::tr( "Line" ), &QgsLine3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForLine3DSymbol ) ); QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( QStringLiteral( "line" ), QObject::tr( "Line" ), &QgsLine3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForLine3DSymbol ) );

View File

@ -45,7 +45,6 @@
#include "qgsapplication.h" #include "qgsapplication.h"
#include "qgsaabb.h" #include "qgsaabb.h"
#include "qgsabstract3dengine.h" #include "qgsabstract3dengine.h"
#include "qgsannotationlayer.h"
#include "qgs3dmapsettings.h" #include "qgs3dmapsettings.h"
#include "qgs3dutils.h" #include "qgs3dutils.h"
#include "qgsabstract3drenderer.h" #include "qgsabstract3drenderer.h"
@ -67,7 +66,6 @@
#include "qgsterraingenerator.h" #include "qgsterraingenerator.h"
#include "qgstiledscenelayer.h" #include "qgstiledscenelayer.h"
#include "qgstiledscenelayer3drenderer.h" #include "qgstiledscenelayer3drenderer.h"
#include "qgsannotationlayer3drenderer.h"
#include "qgsdirectionallightsettings.h" #include "qgsdirectionallightsettings.h"
#include "qgsvectorlayer.h" #include "qgsvectorlayer.h"
#include "qgsvectorlayer3drenderer.h" #include "qgsvectorlayer3drenderer.h"
@ -748,11 +746,6 @@ void Qgs3DMapScene::addLayerEntity( QgsMapLayer *layer )
QgsTiledSceneLayer3DRenderer *tiledSceneRenderer = static_cast<QgsTiledSceneLayer3DRenderer *>( renderer ); QgsTiledSceneLayer3DRenderer *tiledSceneRenderer = static_cast<QgsTiledSceneLayer3DRenderer *>( renderer );
tiledSceneRenderer->setLayer( static_cast<QgsTiledSceneLayer *>( layer ) ); tiledSceneRenderer->setLayer( static_cast<QgsTiledSceneLayer *>( layer ) );
} }
else if ( layer->type() == Qgis::LayerType::Annotation && renderer->type() == QLatin1String( "annotation" ) )
{
auto annotationLayerRenderer = qgis::down_cast<QgsAnnotationLayer3DRenderer *>( renderer );
annotationLayerRenderer->setLayer( qobject_cast<QgsAnnotationLayer *>( layer ) );
}
Qt3DCore::QEntity *newEntity = renderer->createEntity( &mMap ); Qt3DCore::QEntity *newEntity = renderer->createEntity( &mMap );
if ( newEntity ) if ( newEntity )

View File

@ -29,6 +29,7 @@ class QWheelEvent;
/** /**
* \ingroup qgis_3d * \ingroup qgis_3d
* \brief Base class for map tools operating on 3D map canvas. * \brief Base class for map tools operating on 3D map canvas.
* \note Not available in Python bindings
* \since QGIS 4.0 (since QGIS 3.36 in QGIS_3D library, since QGIS 3.4 in QGIS_APP library) * \since QGIS 4.0 (since QGIS 3.36 in QGIS_3D library, since QGIS 3.4 in QGIS_APP library)
*/ */
class _3D_EXPORT Qgs3DMapTool : public QObject class _3D_EXPORT Qgs3DMapTool : public QObject

View File

@ -1161,7 +1161,7 @@ QgsCameraPose Qgs3DUtils::lineSegmentToCameraPose( const QgsVector3D &startPoint
std::unique_ptr<Qt3DRender::QCamera> Qgs3DUtils::copyCamera( Qt3DRender::QCamera *cam ) std::unique_ptr<Qt3DRender::QCamera> Qgs3DUtils::copyCamera( Qt3DRender::QCamera *cam )
{ {
auto copy = std::make_unique<Qt3DRender::QCamera>(); std::unique_ptr<Qt3DRender::QCamera> copy = std::make_unique<Qt3DRender::QCamera>();
copy->setPosition( cam->position() ); copy->setPosition( cam->position() );
copy->setViewCenter( cam->viewCenter() ); copy->setViewCenter( cam->viewCenter() );
copy->setUpVector( cam->upVector() ); copy->setUpVector( cam->upVector() );

View File

@ -1,155 +0,0 @@
/***************************************************************************
qgsannotationlayer3drenderer.cpp
--------------------------------------
Date : January 2020
Copyright : (C) 2020 by Martin Dobias
Email : wonder dot sk at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgsannotationlayer3drenderer.h"
#include "qgsannotationlayer.h"
#include "qgsannotationlayerchunkloader_p.h"
#include "qgis.h"
//
// QgsAnnotationLayer3DRendererMetadata
//
QgsAnnotationLayer3DRendererMetadata::QgsAnnotationLayer3DRendererMetadata()
: Qgs3DRendererAbstractMetadata( QStringLiteral( "annotation" ) )
{
}
QgsAbstract3DRenderer *QgsAnnotationLayer3DRendererMetadata::createRenderer( QDomElement &elem, const QgsReadWriteContext &context )
{
auto r = std::make_unique< QgsAnnotationLayer3DRenderer >();
r->readXml( elem, context );
return r.release();
}
//
// QgsAnnotationLayer3DRenderer
//
QgsAnnotationLayer3DRenderer::QgsAnnotationLayer3DRenderer() = default;
void QgsAnnotationLayer3DRenderer::setLayer( QgsAnnotationLayer *layer )
{
mLayerRef = QgsMapLayerRef( layer );
}
QgsAnnotationLayer *QgsAnnotationLayer3DRenderer::layer() const
{
return qobject_cast<QgsAnnotationLayer *>( mLayerRef.layer );
}
void QgsAnnotationLayer3DRenderer::resolveReferences( const QgsProject &project )
{
mLayerRef.resolve( &project );
}
bool QgsAnnotationLayer3DRenderer::showCalloutLines() const
{
return mShowCalloutLines;
}
void QgsAnnotationLayer3DRenderer::setShowCalloutLines( bool show )
{
mShowCalloutLines = show;
}
void QgsAnnotationLayer3DRenderer::setCalloutLineColor( const QColor &color )
{
mCalloutLineColor = color;
}
QColor QgsAnnotationLayer3DRenderer::calloutLineColor() const
{
return mCalloutLineColor;
}
void QgsAnnotationLayer3DRenderer::setCalloutLineWidth( double width )
{
mCalloutLineWidth = width;
}
double QgsAnnotationLayer3DRenderer::calloutLineWidth() const
{
return mCalloutLineWidth;
}
QString QgsAnnotationLayer3DRenderer::type() const
{
return "annotation";
}
QgsAnnotationLayer3DRenderer *QgsAnnotationLayer3DRenderer::clone() const
{
auto r = std::make_unique< QgsAnnotationLayer3DRenderer >();
r->mLayerRef = mLayerRef;
r->mAltClamping = mAltClamping;
r->mZOffset = mZOffset;
r->mShowCalloutLines = mShowCalloutLines;
r->mCalloutLineColor = mCalloutLineColor;
r->mCalloutLineWidth = mCalloutLineWidth;
return r.release();
}
Qt3DCore::QEntity *QgsAnnotationLayer3DRenderer::createEntity( Qgs3DMapSettings *map ) const
{
QgsAnnotationLayer *l = layer();
if ( !l )
return nullptr;
// For some cases we start with a maximal z range because we can't know this upfront, as it potentially involves terrain heights.
// This range will be refined after populating the nodes to the actual z range of the generated chunks nodes.
// Assuming the vertical height is in meter, then it's extremely unlikely that a real vertical
// height will exceed this amount!
constexpr double MINIMUM_ANNOTATION_Z_ESTIMATE = -100000;
constexpr double MAXIMUM_ANNOTATION_Z_ESTIMATE = 100000;
double minimumZ = MINIMUM_ANNOTATION_Z_ESTIMATE;
double maximumZ = MAXIMUM_ANNOTATION_Z_ESTIMATE;
switch ( mAltClamping )
{
case Qgis::AltitudeClamping::Absolute:
// special case where we DO know the exact z range upfront!
minimumZ = mZOffset;
maximumZ = mZOffset;
break;
case Qgis::AltitudeClamping::Relative:
case Qgis::AltitudeClamping::Terrain:
break;
}
return new QgsAnnotationLayerChunkedEntity( map, l, mAltClamping, mZOffset, mShowCalloutLines, mCalloutLineColor, mCalloutLineWidth, minimumZ, maximumZ );
}
void QgsAnnotationLayer3DRenderer::writeXml( QDomElement &elem, const QgsReadWriteContext & ) const
{
QDomDocument doc = elem.ownerDocument();
elem.setAttribute( QStringLiteral( "layer" ), mLayerRef.layerId );
elem.setAttribute( QStringLiteral( "clamping" ), qgsEnumValueToKey( mAltClamping ) );
elem.setAttribute( QStringLiteral( "offset" ), mZOffset );
if ( mShowCalloutLines )
elem.setAttribute( QStringLiteral( "callouts" ), QStringLiteral( "1" ) );
}
void QgsAnnotationLayer3DRenderer::readXml( const QDomElement &elem, const QgsReadWriteContext & )
{
mLayerRef = QgsMapLayerRef( elem.attribute( QStringLiteral( "layer" ) ) );
mAltClamping = qgsEnumKeyToValue( elem.attribute( QStringLiteral( "clamping" ) ), Qgis::AltitudeClamping::Relative );
mZOffset = elem.attribute( QStringLiteral( "offset" ), QString::number( DEFAULT_Z_OFFSET ) ).toDouble();
mShowCalloutLines = elem.attribute( QStringLiteral( "callouts" ), QStringLiteral( "0" ) ).toInt();
}

View File

@ -1,185 +0,0 @@
/***************************************************************************
qgsannotationlayer3drenderer.h
--------------------------------------
Date : September 2025
Copyright : (C) 2025 by Nyall Dawson
Email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSANNOTATIONLAYER3DRENDERER_H
#define QGSANNOTATIONLAYER3DRENDERER_H
#include "qgis_3d.h"
#include "qgis_sip.h"
#include "qgs3drendererregistry.h"
#include "qgsabstract3drenderer.h"
#include "qgsmaplayerref.h"
class QgsAnnotationLayer;
#ifdef SIP_RUN
// this is needed for the "convert to subclass" code below to compile
% ModuleHeaderCode
#include "qgsannotationlayer3drenderer.h"
% End
#endif
/**
* \ingroup core
* \brief Metadata for annotation layer 3D renderer to allow creation of its instances from XML.
*
* \warning This is not considered stable API, and may change in future QGIS releases. It is
* exposed to the Python bindings as a tech preview only.
*
* \since QGIS 4.0
*/
class _3D_EXPORT QgsAnnotationLayer3DRendererMetadata : public Qgs3DRendererAbstractMetadata
{
public:
QgsAnnotationLayer3DRendererMetadata();
//! Creates an instance of a 3D renderer based on a DOM element with renderer configuration
QgsAbstract3DRenderer *createRenderer( QDomElement &elem, const QgsReadWriteContext &context ) override SIP_FACTORY;
};
/**
* \ingroup qgis_3d
* \brief 3D renderers for annotation layers.
*
* \since QGIS 4.0
*/
class _3D_EXPORT QgsAnnotationLayer3DRenderer : public QgsAbstract3DRenderer
{
#ifdef SIP_RUN
SIP_CONVERT_TO_SUBCLASS_CODE
if ( dynamic_cast<QgsAnnotationLayer3DRenderer *>( sipCpp ) != nullptr )
sipType = sipType_QgsAnnotationLayer3DRenderer;
else
sipType = nullptr;
SIP_END
#endif
public:
QgsAnnotationLayer3DRenderer();
/**
* Sets the annotation layer associated with the renderer.
*
* \see layer()
*/
void setLayer( QgsAnnotationLayer *layer );
/**
* Returns the annotation layer associated with the renderer.
*
* \see setLayer()
*/
QgsAnnotationLayer *layer() const;
QString type() const override;
QgsAnnotationLayer3DRenderer *clone() const override SIP_FACTORY;
Qt3DCore::QEntity *createEntity( Qgs3DMapSettings *map ) const override SIP_SKIP;
void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const override;
void readXml( const QDomElement &elem, const QgsReadWriteContext &context ) override;
void resolveReferences( const QgsProject &project ) override;
/**
* Returns the altitude clamping method, which determines the vertical position of annotations.
*
* \see setAltitudeClamping()
*/
Qgis::AltitudeClamping altitudeClamping() const { return mAltClamping; }
/**
* Sets the altitude \a clamping method, which determines the vertical position of annotations.
*
* \see altitudeClamping()
*/
void setAltitudeClamping( Qgis::AltitudeClamping clamping ) { mAltClamping = clamping; }
/**
* Returns the z offset, which is a fixed offset amount which should be added to z values for the annotations.
*
* \see setZOffset()
*/
double zOffset() const { return mZOffset; }
/**
* Sets the z \a offset, which is a fixed offset amount which will be added to z values for the annotations.
*
* \see zOffset()
*/
void setZOffset( double offset ) { mZOffset = offset; }
/**
* Returns TRUE if callout lines are shown, vertically joining the annotations to the terrain.
*
* \see setShowCalloutLines()
*/
bool showCalloutLines() const;
/**
* Sets whether callout lines are shown, vertically joining the annotations to the terrain.
*
* \see showCalloutLines()
*/
void setShowCalloutLines( bool show );
// TODO -- consider exposing via QgsSimpleLineMaterialSettings, for now, for testing only
/**
* Sets the callout line \a color.
*
* \see calloutLineColor()
* \note Not available in Python bindings
*/
SIP_SKIP void setCalloutLineColor( const QColor &color );
/**
* Returns the callout line color.
*
* \see setCalloutLineColor()
* \note Not available in Python bindings
*/
SIP_SKIP QColor calloutLineColor() const;
/**
* Sets the callout line \a width.
*
* \see calloutLineWidth()
* \note Not available in Python bindings
*/
SIP_SKIP void setCalloutLineWidth( double width );
/**
* Returns the callout line width.
*
* \see setCalloutLineWidth()
* \note Not available in Python bindings
*/
SIP_SKIP double calloutLineWidth() const;
private:
#ifdef SIP_RUN
QgsAnnotationLayer3DRenderer( const QgsAnnotationLayer3DRenderer & );
#endif
static constexpr double DEFAULT_Z_OFFSET = 50;
QgsMapLayerRef mLayerRef;
Qgis::AltitudeClamping mAltClamping = Qgis::AltitudeClamping::Relative;
double mZOffset = DEFAULT_Z_OFFSET;
bool mShowCalloutLines = true;
QColor mCalloutLineColor { 0, 0, 0 };
double mCalloutLineWidth = 2;
};
#endif // QGSANNOTATIONLAYER3DRENDERER_H

View File

@ -1,396 +0,0 @@
/***************************************************************************
qgsannotationlayerchunkloader_p.cpp
--------------------------------------
Date : September 2025
Copyright : (C) 2025 by Nyall Dawson
Email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgsannotationlayerchunkloader_p.h"
#include "moc_qgsannotationlayerchunkloader_p.cpp"
#include "qgs3dutils.h"
#include "qgsannotationitem.h"
#include "qgstessellatedpolygongeometry.h"
#include "qgschunknode.h"
#include "qgseventtracing.h"
#include "qgslogger.h"
#include "qgsannotationlayer.h"
#include "qgsabstract3dsymbol.h"
#include "qgsabstractterrainsettings.h"
#include "qgsannotationmarkeritem.h"
#include "qgsbillboardgeometry.h"
#include "qgspoint3dbillboardmaterial.h"
#include "qgsgeotransform.h"
#include "qgsexpressioncontextutils.h"
#include "qgstextureatlasgenerator.h"
#include "qgslinevertexdata_p.h"
#include "qgslinematerial_p.h"
#include <QtConcurrent>
#include <Qt3DCore/QTransform>
///@cond PRIVATE
QgsAnnotationLayerChunkLoader::QgsAnnotationLayerChunkLoader( const QgsAnnotationLayerChunkLoaderFactory *factory, QgsChunkNode *node )
: QgsChunkLoader( node )
, mFactory( factory )
, mRenderContext( factory->mRenderContext )
{
}
struct Billboard
{
QVector3D position;
int textureId;
};
void QgsAnnotationLayerChunkLoader::start()
{
QgsChunkNode *node = chunk();
if ( node->level() < mFactory->mLeafLevel )
{
QTimer::singleShot( 0, this, &QgsAnnotationLayerChunkLoader::finished );
return;
}
QgsAnnotationLayer *layer = mFactory->mLayer;
mLayerName = mFactory->mLayer->name();
// only a subset of data to be queried
const QgsRectangle rect = node->box3D().toRectangle();
// origin for coordinates of the chunk - it is kind of arbitrary, but it should be
// picked so that the coordinates are relatively small to avoid numerical precision issues
mChunkOrigin = QgsVector3D( rect.center().x(), rect.center().y(), 0 );
QgsExpressionContext exprContext;
exprContext.appendScopes( QgsExpressionContextUtils::globalProjectLayerScopes( layer ) );
mRenderContext.setExpressionContext( exprContext );
QgsCoordinateTransform layerToMapTransform( layer->crs(), mRenderContext.crs(), mRenderContext.transformContext() );
QgsRectangle layerExtent;
try
{
layerExtent = layerToMapTransform.transformBoundingBox( rect, Qgis::TransformDirection::Reverse );
}
catch ( QgsCsException &e )
{
QgsDebugError( QStringLiteral( "Error transforming annotation layer extent to 3d map extent: %1" ).arg( e.what() ) );
return;
}
const double zOffset = mFactory->mZOffset;
const Qgis::AltitudeClamping altitudeClamping = mFactory->mClamping;
bool showCallouts = mFactory->mShowCallouts;
// see logic from QgsAnnotationLayerRenderer
const QStringList itemsList = layer->queryIndex( layerExtent );
QSet< QString > itemIds( itemsList.begin(), itemsList.end() );
// we also have NO choice but to clone ALL non-indexed items (i.e. those with a scale-dependent bounding box)
// since these won't be in the layer's spatial index, and it's too expensive to determine their actual bounding box
// upfront (we are blocking the main thread right now!)
// TODO -- come up with some brilliant way to avoid this and also index scale-dependent items ;)
itemIds.unite( layer->mNonIndexedItems );
mItemsToRender.reserve( itemIds.size() );
std::transform( itemIds.begin(), itemIds.end(), std::back_inserter( mItemsToRender ), [layer]( const QString &id ) -> std::unique_ptr< QgsAnnotationItem > {
return std::unique_ptr< QgsAnnotationItem >( layer->item( id )->clone() );
} );
//
// this will be run in a background thread
//
mFutureWatcher = new QFutureWatcher<void>( this );
connect( mFutureWatcher, &QFutureWatcher<void>::finished, this, &QgsChunkQueueJob::finished );
const QFuture<void> future = QtConcurrent::run( [this, rect, layerToMapTransform, zOffset, altitudeClamping, showCallouts] {
const QgsEventTracing::ScopedEvent e( QStringLiteral( "3D" ), QStringLiteral( "Annotation layer chunk load" ) );
std::vector< Billboard > billboards;
billboards.reserve( mItemsToRender.size() );
QVector< QImage > textures;
textures.reserve( mItemsToRender.size() );
for ( const std::unique_ptr< QgsAnnotationItem > &item : std::as_const( mItemsToRender ) )
{
if ( mCanceled )
break;
QgsAnnotationItem *annotation = item.get();
if ( !annotation->enabled() )
continue;
if ( QgsAnnotationMarkerItem *marker = dynamic_cast< QgsAnnotationMarkerItem * >( annotation ) )
{
if ( marker->symbol() )
{
QgsPointXY p = marker->geometry();
try
{
const QgsPointXY mapPoint = layerToMapTransform.transform( p );
if ( !rect.contains( mapPoint ) )
continue;
double z = 0;
const float terrainZ = ( altitudeClamping == Qgis::AltitudeClamping::Absolute && !showCallouts ) ? 0 : mRenderContext.terrainRenderingEnabled() && mRenderContext.terrainGenerator() ? static_cast<float>( mRenderContext.terrainGenerator()->heightAt( mapPoint.x(), mapPoint.y(), mRenderContext ) * mRenderContext.terrainSettings()->verticalScale() )
: 0.f;
switch ( altitudeClamping )
{
case Qgis::AltitudeClamping::Absolute:
z = zOffset;
break;
case Qgis::AltitudeClamping::Terrain:
z = terrainZ;
break;
case Qgis::AltitudeClamping::Relative:
z = terrainZ + zOffset;
break;
}
Billboard billboard;
billboard.position = ( QgsVector3D( mapPoint.x(), mapPoint.y(), z ) - mChunkOrigin ).toVector3D();
billboard.textureId = textures.size();
textures.append( QgsPoint3DBillboardMaterial::renderSymbolToImage( marker->symbol(), mRenderContext ) );
billboards.emplace_back( std::move( billboard ) );
if ( showCallouts )
{
mCalloutLines << QgsLineString( { mapPoint.x(), mapPoint.x() }, { mapPoint.y(), mapPoint.y() }, { terrainZ, z } );
}
mZMax = std::max( mZMax, showCallouts ? std::max( 0.0, z ) : z );
mZMin = std::min( mZMin, showCallouts ? std::min( 0.0, z ) : z );
}
catch ( QgsCsException &e )
{
QgsDebugError( e.what() );
}
}
}
}
// free memory
mItemsToRender.clear();
const QgsTextureAtlas atlas = QgsTextureAtlasGenerator::createFromImages( textures, 2048 );
if ( atlas.isValid() )
{
mBillboardAtlas = atlas.renderAtlasTexture();
mBillboardPositions.reserve( static_cast< int >( billboards.size() ) );
for ( Billboard &billboard : billboards )
{
const QRect textureRect = atlas.rect( billboard.textureId );
QgsBillboardGeometry::BillboardAtlasData geometry;
geometry.position = billboard.position;
geometry.textureAtlasOffset = QVector2D( static_cast< float >( textureRect.left() ) / static_cast< float>( mBillboardAtlas.width() ), 1 - ( static_cast< float >( textureRect.bottom() ) / static_cast< float>( mBillboardAtlas.height() ) ) );
geometry.textureAtlasSize = QVector2D( static_cast< float >( textureRect.width() ) / static_cast< float>( mBillboardAtlas.width() ), static_cast< float>( textureRect.height() ) / static_cast< float>( mBillboardAtlas.height() ) );
mBillboardPositions.append( geometry );
}
}
else
{
QgsDebugError( QStringLiteral( "Error encountered building texture atlas" ) );
mBillboardAtlas = QImage();
}
} );
// emit finished() as soon as the handler is populated with features
mFutureWatcher->setFuture( future );
}
QgsAnnotationLayerChunkLoader::~QgsAnnotationLayerChunkLoader()
{
if ( mFutureWatcher && !mFutureWatcher->isFinished() )
{
disconnect( mFutureWatcher, &QFutureWatcher<void>::finished, this, &QgsChunkQueueJob::finished );
mFutureWatcher->waitForFinished();
}
}
void QgsAnnotationLayerChunkLoader::cancel()
{
mCanceled = true;
}
Qt3DCore::QEntity *QgsAnnotationLayerChunkLoader::createEntity( Qt3DCore::QEntity *parent )
{
if ( mNode->level() < mFactory->mLeafLevel )
{
Qt3DCore::QEntity *entity = new Qt3DCore::QEntity( parent ); // dummy entity
entity->setObjectName( mLayerName + "_CONTAINER_" + mNode->tileId().text() );
return entity;
}
if ( mBillboardPositions.empty() )
{
// an empty node, so we return no entity. This tags the node as having no data and effectively removes it.
// we just make sure first that its initial estimated vertical range does not affect its parents' bboxes calculation
mNode->setExactBox3D( QgsBox3D() );
mNode->updateParentBoundingBoxesRecursively();
return nullptr;
}
Qt3DCore::QEntity *entity = new Qt3DCore::QEntity( parent );
entity->setObjectName( mLayerName + "_" + mNode->tileId().text() );
QgsBillboardGeometry *billboardGeometry = new QgsBillboardGeometry();
billboardGeometry->setBillboardData( mBillboardPositions );
Qt3DRender::QGeometryRenderer *billboardGeometryRenderer = new Qt3DRender::QGeometryRenderer;
billboardGeometryRenderer->setPrimitiveType( Qt3DRender::QGeometryRenderer::Points );
billboardGeometryRenderer->setGeometry( billboardGeometry );
billboardGeometryRenderer->setVertexCount( billboardGeometry->count() );
QgsPoint3DBillboardMaterial *billboardMaterial = new QgsPoint3DBillboardMaterial( QgsPoint3DBillboardMaterial::Mode::AtlasTexture );
billboardMaterial->setTexture2DFromImage( mBillboardAtlas );
QgsGeoTransform *billboardTransform = new QgsGeoTransform;
billboardTransform->setGeoTranslation( mChunkOrigin );
Qt3DCore::QEntity *billboardEntity = new Qt3DCore::QEntity;
billboardEntity->addComponent( billboardMaterial );
billboardEntity->addComponent( billboardTransform );
billboardEntity->addComponent( billboardGeometryRenderer );
billboardEntity->setParent( entity );
if ( mFactory->mShowCallouts )
{
QgsLineVertexData lineData;
lineData.withAdjacency = true;
lineData.geocentricCoordinates = false; // mMapSettings->sceneMode() == Qgis::SceneMode::Globe;
lineData.init( Qgis::AltitudeClamping::Absolute, Qgis::AltitudeBinding::Vertex, 0, mRenderContext, mChunkOrigin );
for ( const QgsLineString &line : mCalloutLines )
{
lineData.addLineString( line, 0, false );
}
QgsLineMaterial *mat = new QgsLineMaterial;
mat->setLineColor( mFactory->mCalloutLineColor );
mat->setLineWidth( mFactory->mCalloutLineWidth );
Qt3DCore::QEntity *calloutEntity = new Qt3DCore::QEntity;
calloutEntity->setObjectName( parent->objectName() + "_CALLOUTS" );
// geometry renderer
Qt3DRender::QGeometryRenderer *calloutRenderer = new Qt3DRender::QGeometryRenderer;
calloutRenderer->setPrimitiveType( Qt3DRender::QGeometryRenderer::LineStripAdjacency );
calloutRenderer->setGeometry( lineData.createGeometry( calloutEntity ) );
calloutRenderer->setVertexCount( lineData.indexes.count() );
calloutRenderer->setPrimitiveRestartEnabled( true );
calloutRenderer->setRestartIndexValue( 0 );
// make entity
calloutEntity->addComponent( calloutRenderer );
calloutEntity->addComponent( mat );
calloutEntity->setParent( billboardEntity );
}
// fix the vertical range of the node from the estimated vertical range to the true range
if ( mZMin != std::numeric_limits<float>::max() && mZMax != std::numeric_limits<float>::lowest() )
{
QgsBox3D box = mNode->box3D();
box.setZMinimum( mZMin );
box.setZMaximum( mZMax );
mNode->setExactBox3D( box );
mNode->updateParentBoundingBoxesRecursively();
}
return entity;
}
///////////////
QgsAnnotationLayerChunkLoaderFactory::QgsAnnotationLayerChunkLoaderFactory( const Qgs3DRenderContext &context, QgsAnnotationLayer *layer, int leafLevel, Qgis::AltitudeClamping clamping, double zOffset, bool showCallouts, const QColor &calloutLineColor, double calloutLineWidth, double zMin, double zMax )
: mRenderContext( context )
, mLayer( layer )
, mLeafLevel( leafLevel )
, mClamping( clamping )
, mZOffset( zOffset )
, mShowCallouts( showCallouts )
, mCalloutLineColor( calloutLineColor )
, mCalloutLineWidth( calloutLineWidth )
{
if ( context.crs().type() == Qgis::CrsType::Geocentric )
{
// TODO: add support for handling of annotation layers
// (we're using dummy quadtree here to make sure the empty extent does not break the scene completely)
QgsDebugError( QStringLiteral( "Annotation layers in globe scenes are not supported yet!" ) );
setupQuadtree( QgsBox3D( -1e7, -1e7, -1e7, 1e7, 1e7, 1e7 ), -1, leafLevel );
return;
}
QgsBox3D rootBox3D( context.extent(), zMin, zMax );
// add small padding to avoid clipping of point features located at the edge of the bounding box
rootBox3D.grow( 1.0 );
setupQuadtree( rootBox3D, -1, leafLevel ); // negative root error means that the node does not contain anything
}
QgsChunkLoader *QgsAnnotationLayerChunkLoaderFactory::createChunkLoader( QgsChunkNode *node ) const
{
return new QgsAnnotationLayerChunkLoader( this, node );
}
///////////////
QgsAnnotationLayerChunkedEntity::QgsAnnotationLayerChunkedEntity( Qgs3DMapSettings *map, QgsAnnotationLayer *layer, Qgis::AltitudeClamping clamping, double zOffset, bool showCallouts, const QColor &calloutLineColor, double calloutLineWidth, double zMin, double zMax )
: QgsChunkedEntity( map,
-1, // max. allowed screen error (negative tau means that we need to go until leaves are reached)
new QgsAnnotationLayerChunkLoaderFactory( Qgs3DRenderContext::fromMapSettings( map ), layer, 3, clamping, zOffset, showCallouts, calloutLineColor, calloutLineWidth, zMin, zMax ), true )
{
mTransform = new Qt3DCore::QTransform;
if ( applyTerrainOffset() )
{
mTransform->setTranslation( QVector3D( 0.0f, 0.0f, static_cast<float>( map->terrainSettings()->elevationOffset() ) ) );
}
this->addComponent( mTransform );
connect( map, &Qgs3DMapSettings::terrainSettingsChanged, this, &QgsAnnotationLayerChunkedEntity::onTerrainElevationOffsetChanged );
}
QgsAnnotationLayerChunkedEntity::~QgsAnnotationLayerChunkedEntity()
{
// cancel / wait for jobs
cancelActiveJobs();
}
// if the AltitudeClamping is `Absolute`, do not apply the offset
bool QgsAnnotationLayerChunkedEntity::applyTerrainOffset() const
{
if ( auto loaderFactory = static_cast<QgsAnnotationLayerChunkLoaderFactory *>( mChunkLoaderFactory ) )
{
return loaderFactory->mClamping != Qgis::AltitudeClamping::Absolute;
}
return true;
}
void QgsAnnotationLayerChunkedEntity::onTerrainElevationOffsetChanged()
{
QgsDebugMsgLevel( QStringLiteral( "QgsAnnotationLayerChunkedEntity::onTerrainElevationOffsetChanged" ), 2 );
float newOffset = static_cast<float>( qobject_cast<Qgs3DMapSettings *>( sender() )->terrainSettings()->elevationOffset() );
if ( !applyTerrainOffset() )
{
newOffset = 0.0;
}
mTransform->setTranslation( QVector3D( 0.0f, 0.0f, newOffset ) );
}
/// @endcond

View File

@ -1,146 +0,0 @@
/***************************************************************************
qgsannotationlayerchunkloader_p.h
--------------------------------------
Date : September 2025
Copyright : (C) 2025 by Nyall Dawson
Email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSANNOTATIONLAYERCHUNKLOADER_P_H
#define QGSANNOTATIONLAYERCHUNKLOADER_P_H
///@cond PRIVATE
//
// W A R N I N G
// -------------
//
// This file is not part of the QGIS API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
#include "qgschunkloader.h"
#include "qgschunkedentity.h"
#include "qgs3drendercontext.h"
#include "qgsbillboardgeometry.h"
#include <QImage>
#define SIP_NO_FILE
class QgsAnnotationLayer;
class QgsAnnotationItem;
namespace Qt3DCore
{
class QTransform;
}
#include <QFutureWatcher>
/**
* \ingroup qgis_3d
* \brief This loader factory is responsible for creation of loaders of QgsAnnotationLayerChunkedEntity.
*
* \since QGIS 4.0
*/
class QgsAnnotationLayerChunkLoaderFactory : public QgsQuadtreeChunkLoaderFactory
{
Q_OBJECT
public:
//! Constructs the factory
QgsAnnotationLayerChunkLoaderFactory( const Qgs3DRenderContext &context, QgsAnnotationLayer *layer, int leafLevel, Qgis::AltitudeClamping clamping, double zOffset, bool showCallouts, const QColor &calloutLineColor, double calloutLineWidth, double zMin, double zMax );
//! Creates loader for the given chunk node. Ownership of the returned is passed to the caller.
virtual QgsChunkLoader *createChunkLoader( QgsChunkNode *node ) const override;
Qgs3DRenderContext mRenderContext;
QgsAnnotationLayer *mLayer = nullptr;
int mLeafLevel = 0;
Qgis::AltitudeClamping mClamping = Qgis::AltitudeClamping::Relative;
double mZOffset = 0;
bool mShowCallouts = false;
QColor mCalloutLineColor;
double mCalloutLineWidth = 2;
};
/**
* \ingroup qgis_3d
* \brief This loader class is responsible for async loading of data for QgsAnnotationLayerChunkedEntity
* and creation of final 3D entity from the data previously prepared in a worker thread.
*
* \since QGIS 4.0
*/
class QgsAnnotationLayerChunkLoader : public QgsChunkLoader
{
Q_OBJECT
public:
//! Constructs the loader
QgsAnnotationLayerChunkLoader( const QgsAnnotationLayerChunkLoaderFactory *factory, QgsChunkNode *node );
~QgsAnnotationLayerChunkLoader() override;
void start() override;
virtual void cancel() override;
virtual Qt3DCore::QEntity *createEntity( Qt3DCore::QEntity *parent ) override;
private:
const QgsAnnotationLayerChunkLoaderFactory *mFactory = nullptr;
Qgs3DRenderContext mRenderContext;
bool mCanceled = false;
QFutureWatcher<void> *mFutureWatcher = nullptr;
QString mLayerName;
QgsVector3D mChunkOrigin;
std::vector< std::unique_ptr< QgsAnnotationItem > > mItemsToRender;
QVector< QgsBillboardGeometry::BillboardAtlasData > mBillboardPositions;
QVector< QgsLineString > mCalloutLines;
QImage mBillboardAtlas;
double mZMin = std::numeric_limits< double >::max();
double mZMax = std::numeric_limits< double >::lowest();
};
/**
* \ingroup qgis_3d
* \brief 3D entity used for rendering of annotation layers.
*
* Internally it uses QgsAnnotationLayerChunkLoaderFactory and
* QgsAnnotationLayerChunkLoader to do the actual work
* of loading and creating 3D sub-entities for the layer.
*
* \since QGIS 4.0
*/
class QgsAnnotationLayerChunkedEntity : public QgsChunkedEntity
{
Q_OBJECT
public:
//! Constructs the entity.
explicit QgsAnnotationLayerChunkedEntity( Qgs3DMapSettings *map, QgsAnnotationLayer *layer, Qgis::AltitudeClamping clamping, double zOffset, bool showCallouts, const QColor &calloutLineColor, double calloutLineWidth, double zMin, double zMax );
~QgsAnnotationLayerChunkedEntity();
private slots:
void onTerrainElevationOffsetChanged();
private:
Qt3DCore::QTransform *mTransform = nullptr;
bool applyTerrainOffset() const;
friend class TestQgsChunkedEntity;
};
/// @endcond
#endif // QGSANNOTATIONLAYERCHUNKLOADER_P_H

View File

@ -22,7 +22,6 @@
#include "qgscesiumutils.h" #include "qgscesiumutils.h"
#include "qgscoordinatetransform.h" #include "qgscoordinatetransform.h"
#include "qgsgeotransform.h" #include "qgsgeotransform.h"
#include "qgsgltfutils.h"
#include "qgsgltf3dutils.h" #include "qgsgltf3dutils.h"
#include "qgsquantizedmeshtiles.h" #include "qgsquantizedmeshtiles.h"
#include "qgsraycastingutils_p.h" #include "qgsraycastingutils_p.h"
@ -125,7 +124,7 @@ void QgsTiledSceneChunkLoader::start()
errors.append( QStringLiteral( "Failed to parse tile from '%1'" ).arg( uri ) ); errors.append( QStringLiteral( "Failed to parse tile from '%1'" ).arg( uri ) );
} }
} }
else if ( format == QLatin1String( "cesiumtiles" ) ) else if ( format == "cesiumtiles" )
{ {
const QgsCesiumUtils::TileContents tileContent = QgsCesiumUtils::extractGltfFromTileContent( content ); const QgsCesiumUtils::TileContents tileContent = QgsCesiumUtils::extractGltfFromTileContent( content );
if ( tileContent.gltf.isEmpty() ) if ( tileContent.gltf.isEmpty() )
@ -133,21 +132,6 @@ void QgsTiledSceneChunkLoader::start()
entityTransform.tileTransform.translate( tileContent.rtcCenter ); entityTransform.tileTransform.translate( tileContent.rtcCenter );
mEntity = QgsGltf3DUtils::gltfToEntity( tileContent.gltf, entityTransform, uri, &errors ); mEntity = QgsGltf3DUtils::gltfToEntity( tileContent.gltf, entityTransform, uri, &errors );
} }
else if ( format == QLatin1String( "draco" ) )
{
QgsGltfUtils::I3SNodeContext i3sContext;
i3sContext.initFromTile( tile, mFactory.mLayerCrs, mFactory.mBoundsTransform.sourceCrs(), mFactory.mRenderContext.transformContext() );
QString dracoLoadError;
tinygltf::Model model;
if ( !QgsGltfUtils::loadDracoModel( content, i3sContext, model, &dracoLoadError ) )
{
errors.append( dracoLoadError );
return;
}
mEntity = QgsGltf3DUtils::parsedGltfToEntity( model, entityTransform, QString(), &errors );
}
else else
return; // unsupported tile content type return; // unsupported tile content type
@ -189,19 +173,11 @@ Qt3DCore::QEntity *QgsTiledSceneChunkLoader::createEntity( Qt3DCore::QEntity *pa
/// ///
QgsTiledSceneChunkLoaderFactory::QgsTiledSceneChunkLoaderFactory( QgsTiledSceneChunkLoaderFactory::QgsTiledSceneChunkLoaderFactory( const Qgs3DRenderContext &context, const QgsTiledSceneIndex &index, QgsCoordinateReferenceSystem tileCrs, double zValueScale, double zValueOffset )
const Qgs3DRenderContext &context,
const QgsTiledSceneIndex &index,
QgsCoordinateReferenceSystem tileCrs,
QgsCoordinateReferenceSystem layerCrs,
double zValueScale,
double zValueOffset
)
: mRenderContext( context ) : mRenderContext( context )
, mIndex( index ) , mIndex( index )
, mZValueScale( zValueScale ) , mZValueScale( zValueScale )
, mZValueOffset( zValueOffset ) , mZValueOffset( zValueOffset )
, mLayerCrs( layerCrs )
{ {
mBoundsTransform = QgsCoordinateTransform( tileCrs, context.crs(), context.transformContext() ); mBoundsTransform = QgsCoordinateTransform( tileCrs, context.crs(), context.transformContext() );
} }
@ -370,17 +346,8 @@ void QgsTiledSceneChunkLoaderFactory::prepareChildren( QgsChunkNode *node )
/// ///
QgsTiledSceneLayerChunkedEntity::QgsTiledSceneLayerChunkedEntity( QgsTiledSceneLayerChunkedEntity::QgsTiledSceneLayerChunkedEntity( Qgs3DMapSettings *map, const QgsTiledSceneIndex &index, QgsCoordinateReferenceSystem tileCrs, double maximumScreenError, bool showBoundingBoxes, double zValueScale, double zValueOffset )
Qgs3DMapSettings *map, : QgsChunkedEntity( map, maximumScreenError, new QgsTiledSceneChunkLoaderFactory( Qgs3DRenderContext::fromMapSettings( map ), index, tileCrs, zValueScale, zValueOffset ), true )
const QgsTiledSceneIndex &index,
QgsCoordinateReferenceSystem tileCrs,
QgsCoordinateReferenceSystem layerCrs,
double maximumScreenError,
bool showBoundingBoxes,
double zValueScale,
double zValueOffset
)
: QgsChunkedEntity( map, maximumScreenError, new QgsTiledSceneChunkLoaderFactory( Qgs3DRenderContext::fromMapSettings( map ), index, tileCrs, layerCrs, zValueScale, zValueOffset ), true )
, mIndex( index ) , mIndex( index )
{ {
setShowBoundingBoxes( showBoundingBoxes ); setShowBoundingBoxes( showBoundingBoxes );

View File

@ -84,12 +84,8 @@ class QgsTiledSceneChunkLoaderFactory : public QgsChunkLoaderFactory
Q_OBJECT Q_OBJECT
public: public:
QgsTiledSceneChunkLoaderFactory( QgsTiledSceneChunkLoaderFactory(
const Qgs3DRenderContext &context, const Qgs3DRenderContext &context, const QgsTiledSceneIndex &index, QgsCoordinateReferenceSystem tileCrs,
const QgsTiledSceneIndex &index, double zValueScale, double zValueOffset
QgsCoordinateReferenceSystem tileCrs,
QgsCoordinateReferenceSystem layerCrs,
double zValueScale,
double zValueOffset
); );
virtual QgsChunkLoader *createChunkLoader( QgsChunkNode *node ) const override; virtual QgsChunkLoader *createChunkLoader( QgsChunkNode *node ) const override;
@ -108,7 +104,6 @@ class QgsTiledSceneChunkLoaderFactory : public QgsChunkLoaderFactory
double mZValueScale = 1.0; double mZValueScale = 1.0;
double mZValueOffset = 0; double mZValueOffset = 0;
QgsCoordinateTransform mBoundsTransform; QgsCoordinateTransform mBoundsTransform;
QgsCoordinateReferenceSystem mLayerCrs;
QSet<long long> mPendingHierarchyFetches; QSet<long long> mPendingHierarchyFetches;
QSet<long long> mFutureHierarchyFetches; QSet<long long> mFutureHierarchyFetches;
}; };
@ -128,7 +123,7 @@ class QgsTiledSceneLayerChunkedEntity : public QgsChunkedEntity
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit QgsTiledSceneLayerChunkedEntity( Qgs3DMapSettings *map, const QgsTiledSceneIndex &index, QgsCoordinateReferenceSystem tileCrs, QgsCoordinateReferenceSystem layerCrs, double maximumScreenError, bool showBoundingBoxes, double zValueScale, double zValueOffset ); explicit QgsTiledSceneLayerChunkedEntity( Qgs3DMapSettings *map, const QgsTiledSceneIndex &index, QgsCoordinateReferenceSystem tileCrs, double maximumScreenError, bool showBoundingBoxes, double zValueScale, double zValueOffset );
~QgsTiledSceneLayerChunkedEntity(); ~QgsTiledSceneLayerChunkedEntity();

View File

@ -66,7 +66,7 @@ Qt3DCore::QEntity *QgsTiledSceneLayer3DRenderer::createEntity( Qgs3DMapSettings
QgsTiledSceneIndex index = tsl->dataProvider()->index(); QgsTiledSceneIndex index = tsl->dataProvider()->index();
return new QgsTiledSceneLayerChunkedEntity( map, index, tsl->dataProvider()->sceneCrs(), tsl->dataProvider()->crs(), maximumScreenError(), showBoundingBoxes(), qgis::down_cast<const QgsTiledSceneLayerElevationProperties *>( tsl->elevationProperties() )->zScale(), qgis::down_cast<const QgsTiledSceneLayerElevationProperties *>( tsl->elevationProperties() )->zOffset() ); return new QgsTiledSceneLayerChunkedEntity( map, index, tsl->dataProvider()->sceneCrs(), maximumScreenError(), showBoundingBoxes(), qgis::down_cast<const QgsTiledSceneLayerElevationProperties *>( tsl->elevationProperties() )->zScale(), qgis::down_cast<const QgsTiledSceneLayerElevationProperties *>( tsl->elevationProperties() )->zOffset() );
} }
void QgsTiledSceneLayer3DRenderer::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const void QgsTiledSceneLayer3DRenderer::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const

View File

@ -296,7 +296,7 @@ QgsPointCloudLayer *QgsPdalAlgorithmBase::parameterAsPointCloudLayer( const QVar
return nullptr; return nullptr;
// if COPC provider, return as it is // if COPC provider, return as it is
if ( layer->dataProvider()->name() == QLatin1String( "copc" ) ) if ( layer->dataProvider()->name() == QStringLiteral( "copc" ) )
{ {
return layer; return layer;
} }

View File

@ -94,7 +94,7 @@ void QgsGeometryCheckAngleAlgorithm::initAlgorithm( const QVariantMap &configura
QStringLiteral( "ERRORS" ), QObject::tr( "Small angle errors" ), Qgis::ProcessingSourceType::VectorPoint QStringLiteral( "ERRORS" ), QObject::tr( "Small angle errors" ), Qgis::ProcessingSourceType::VectorPoint
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -97,7 +97,7 @@ void QgsGeometryCheckAreaAlgorithm::initAlgorithm( const QVariantMap &configurat
QStringLiteral( "OUTPUT" ), QObject::tr( "Small polygons features" ), Qgis::ProcessingSourceType::VectorPolygon, QVariant(), true, false QStringLiteral( "OUTPUT" ), QObject::tr( "Small polygons features" ), Qgis::ProcessingSourceType::VectorPolygon, QVariant(), true, false
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -98,7 +98,7 @@ void QgsGeometryCheckContainedAlgorithm::initAlgorithm( const QVariantMap &confi
QStringLiteral( "OUTPUT" ), QObject::tr( "Contained features" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false QStringLiteral( "OUTPUT" ), QObject::tr( "Contained features" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );

View File

@ -88,7 +88,7 @@ void QgsGeometryCheckDangleAlgorithm::initAlgorithm( const QVariantMap &configur
QStringLiteral( "OUTPUT" ), QObject::tr( "Dangle-end features" ), Qgis::ProcessingSourceType::VectorLine, QVariant(), true, false QStringLiteral( "OUTPUT" ), QObject::tr( "Dangle-end features" ), Qgis::ProcessingSourceType::VectorLine, QVariant(), true, false
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -87,7 +87,7 @@ void QgsGeometryCheckDegeneratePolygonAlgorithm::initAlgorithm( const QVariantMa
QStringLiteral( "OUTPUT" ), QObject::tr( "Degenerate polygons features" ), Qgis::ProcessingSourceType::VectorPolygon, QVariant(), true, false QStringLiteral( "OUTPUT" ), QObject::tr( "Degenerate polygons features" ), Qgis::ProcessingSourceType::VectorPolygon, QVariant(), true, false
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 ); std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>( QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );
tolerance->setHelp( QObject::tr( "The \"Tolerance\" advanced parameter defines the numerical precision of geometric operations, " tolerance->setHelp( QObject::tr( "The \"Tolerance\" advanced parameter defines the numerical precision of geometric operations, "
"given as an integer n, meaning that any difference smaller than 10⁻ⁿ (in map units) is considered zero." ) ); "given as an integer n, meaning that any difference smaller than 10⁻ⁿ (in map units) is considered zero." ) );

View File

@ -94,7 +94,7 @@ void QgsGeometryCheckDuplicateAlgorithm::initAlgorithm( const QVariantMap &confi
QStringLiteral( "OUTPUT" ), QObject::tr( "Duplicate geometries" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false QStringLiteral( "OUTPUT" ), QObject::tr( "Duplicate geometries" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -89,7 +89,7 @@ void QgsGeometryCheckDuplicateNodesAlgorithm::initAlgorithm( const QVariantMap &
QStringLiteral( "OUTPUT" ), QObject::tr( "Duplicated vertices features" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false QStringLiteral( "OUTPUT" ), QObject::tr( "Duplicated vertices features" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -92,7 +92,7 @@ void QgsGeometryCheckFollowBoundariesAlgorithm::initAlgorithm( const QVariantMap
QStringLiteral( "REF_LAYER" ), QObject::tr( "Reference layer" ), QList<int>() << static_cast<int>( Qgis::ProcessingSourceType::VectorPolygon ) QStringLiteral( "REF_LAYER" ), QObject::tr( "Reference layer" ), QList<int>() << static_cast<int>( Qgis::ProcessingSourceType::VectorPolygon )
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -108,7 +108,7 @@ void QgsGeometryCheckGapAlgorithm::initAlgorithm( const QVariantMap &configurati
QStringLiteral( "OUTPUT" ), QObject::tr( "Gap features" ), Qgis::ProcessingSourceType::VectorPolygon QStringLiteral( "OUTPUT" ), QObject::tr( "Gap features" ), Qgis::ProcessingSourceType::VectorPolygon
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -94,7 +94,7 @@ void QgsGeometryCheckHoleAlgorithm::initAlgorithm( const QVariantMap &configurat
QStringLiteral( "OUTPUT" ), QObject::tr( "Polygons with holes" ), Qgis::ProcessingSourceType::VectorPolygon, QVariant(), true, false QStringLiteral( "OUTPUT" ), QObject::tr( "Polygons with holes" ), Qgis::ProcessingSourceType::VectorPolygon, QVariant(), true, false
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -88,7 +88,7 @@ void QgsGeometryCheckLineIntersectionAlgorithm::initAlgorithm( const QVariantMap
QStringLiteral( "OUTPUT" ), QObject::tr( "Intersecting feature" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false QStringLiteral( "OUTPUT" ), QObject::tr( "Intersecting feature" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -94,7 +94,7 @@ void QgsGeometryCheckLineLayerIntersectionAlgorithm::initAlgorithm( const QVaria
QStringLiteral( "OUTPUT" ), QObject::tr( "Line intersecting other layer features" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false QStringLiteral( "OUTPUT" ), QObject::tr( "Line intersecting other layer features" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -95,7 +95,7 @@ void QgsGeometryCheckMissingVertexAlgorithm::initAlgorithm( const QVariantMap &c
QStringLiteral( "OUTPUT" ), QObject::tr( "Missing vertices features" ), Qgis::ProcessingSourceType::VectorPolygon, QVariant(), true, false QStringLiteral( "OUTPUT" ), QObject::tr( "Missing vertices features" ), Qgis::ProcessingSourceType::VectorPolygon, QVariant(), true, false
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -93,7 +93,7 @@ void QgsGeometryCheckMultipartAlgorithm::initAlgorithm( const QVariantMap &confi
QStringLiteral( "OUTPUT" ), QObject::tr( "One-part geometry features" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false QStringLiteral( "OUTPUT" ), QObject::tr( "One-part geometry features" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -92,7 +92,7 @@ void QgsGeometryCheckOverlapAlgorithm::initAlgorithm( const QVariantMap &configu
QStringLiteral( "MIN_OVERLAP_AREA" ), QObject::tr( "Minimum overlap area" ), Qgis::ProcessingNumberParameterType::Double, 0, false, 0.0 QStringLiteral( "MIN_OVERLAP_AREA" ), QObject::tr( "Minimum overlap area" ), Qgis::ProcessingNumberParameterType::Double, 0, false, 0.0
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -88,7 +88,7 @@ void QgsGeometryCheckPointCoveredByLineAlgorithm::initAlgorithm( const QVariantM
QStringLiteral( "ERRORS" ), QObject::tr( "Points not covered by a line" ), Qgis::ProcessingSourceType::VectorPoint QStringLiteral( "ERRORS" ), QObject::tr( "Points not covered by a line" ), Qgis::ProcessingSourceType::VectorPoint
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -88,7 +88,7 @@ void QgsGeometryCheckPointInPolygonAlgorithm::initAlgorithm( const QVariantMap &
QStringLiteral( "ERRORS" ), QObject::tr( "Points outside polygons errors" ), Qgis::ProcessingSourceType::VectorPoint QStringLiteral( "ERRORS" ), QObject::tr( "Points outside polygons errors" ), Qgis::ProcessingSourceType::VectorPoint
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -93,7 +93,7 @@ void QgsGeometryCheckSegmentLengthAlgorithm::initAlgorithm( const QVariantMap &c
QStringLiteral( "MIN_SEGMENT_LENGTH" ), QObject::tr( "Minimum segment length" ), Qgis::ProcessingNumberParameterType::Double, 0, false, 0.0 QStringLiteral( "MIN_SEGMENT_LENGTH" ), QObject::tr( "Minimum segment length" ), Qgis::ProcessingNumberParameterType::Double, 0, false, 0.0
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -89,7 +89,7 @@ void QgsGeometryCheckSelfContactAlgorithm::initAlgorithm( const QVariantMap &con
QStringLiteral( "OUTPUT" ), QObject::tr( "Self contact features" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false QStringLiteral( "OUTPUT" ), QObject::tr( "Self contact features" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -91,7 +91,7 @@ void QgsGeometryCheckSelfIntersectionAlgorithm::initAlgorithm( const QVariantMap
QStringLiteral( "OUTPUT" ), QObject::tr( "Self-intersecting features" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false QStringLiteral( "OUTPUT" ), QObject::tr( "Self-intersecting features" ), Qgis::ProcessingSourceType::VectorAnyGeometry, QVariant(), true, false
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -100,7 +100,7 @@ void QgsGeometryCheckSliverPolygonAlgorithm::initAlgorithm( const QVariantMap &c
QStringLiteral( "MAX_AREA" ), QObject::tr( "Maximum area (map units squared)" ), Qgis::ProcessingNumberParameterType::Double, 0, false, 0.0 QStringLiteral( "MAX_AREA" ), QObject::tr( "Maximum area (map units squared)" ), Qgis::ProcessingNumberParameterType::Double, 0, false, 0.0
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -196,11 +196,11 @@ QVariantMap QgsClimbAlgorithm::processAlgorithm( const QVariantMap &parameters,
if ( !noGeometry.empty() ) if ( !noGeometry.empty() )
{ {
feedback->pushInfo( QObject::tr( "The following features do not have geometry: %1" ).arg( noGeometry.join( QLatin1String( ", " ) ) ) ); feedback->pushInfo( QObject::tr( "The following features do not have geometry: %1" ).arg( noGeometry.join( QStringLiteral( ", " ) ) ) );
} }
if ( !noZValue.empty() ) if ( !noZValue.empty() )
{ {
feedback->pushInfo( QObject::tr( "The following points do not have Z value: %1" ).arg( noZValue.join( QLatin1String( ", " ) ) ) ); feedback->pushInfo( QObject::tr( "The following points do not have Z value: %1" ).arg( noZValue.join( QStringLiteral( ", " ) ) ) );
} }
QVariantMap results; QVariantMap results;

View File

@ -107,7 +107,7 @@ void QgsFixGeometryAngleAlgorithm::initAlgorithm( const QVariantMap &configurati
QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing small angles" ), Qgis::ProcessingSourceType::VectorPoint QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing small angles" ), Qgis::ProcessingSourceType::VectorPoint
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -120,7 +120,7 @@ void QgsFixGeometryAreaAlgorithm::initAlgorithm( const QVariantMap &configuratio
QStringLiteral( "REPORT" ), QObject::tr( "Report layer from merging small polygons" ), Qgis::ProcessingSourceType::VectorPoint QStringLiteral( "REPORT" ), QObject::tr( "Report layer from merging small polygons" ), Qgis::ProcessingSourceType::VectorPoint
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -104,7 +104,7 @@ void QgsFixGeometryDuplicateNodesAlgorithm::initAlgorithm( const QVariantMap &co
QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing duplicate vertices" ), Qgis::ProcessingSourceType::VectorPoint QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing duplicate vertices" ), Qgis::ProcessingSourceType::VectorPoint
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -108,7 +108,7 @@ void QgsFixGeometryGapAlgorithm::initAlgorithm( const QVariantMap &configuration
QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing gaps" ), Qgis::ProcessingSourceType::VectorPoint QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing gaps" ), Qgis::ProcessingSourceType::VectorPoint
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -104,7 +104,7 @@ void QgsFixGeometryHoleAlgorithm::initAlgorithm( const QVariantMap &configuratio
QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing holes" ), Qgis::ProcessingSourceType::VectorPoint QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing holes" ), Qgis::ProcessingSourceType::VectorPoint
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -105,7 +105,7 @@ void QgsFixGeometryMissingVertexAlgorithm::initAlgorithm( const QVariantMap &con
QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing border vertices" ), Qgis::ProcessingSourceType::VectorPoint QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing border vertices" ), Qgis::ProcessingSourceType::VectorPoint
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -91,7 +91,7 @@ void QgsFixGeometryMultipartAlgorithm::initAlgorithm( const QVariantMap &configu
QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing multiparts" ), Qgis::ProcessingSourceType::VectorPoint QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing multiparts" ), Qgis::ProcessingSourceType::VectorPoint
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -99,7 +99,7 @@ void QgsFixGeometryOverlapAlgorithm::initAlgorithm( const QVariantMap &configura
QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing overlaps" ), Qgis::ProcessingSourceType::VectorPoint QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing overlaps" ), Qgis::ProcessingSourceType::VectorPoint
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -129,7 +129,7 @@ void QgsFixGeometrySelfIntersectionAlgorithm::initAlgorithm( const QVariantMap &
QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing self-intersections" ), Qgis::ProcessingSourceType::VectorPoint QStringLiteral( "REPORT" ), QObject::tr( "Report layer from fixing self-intersections" ), Qgis::ProcessingSourceType::VectorPoint
) ); ) );
auto tolerance = std::make_unique<QgsProcessingParameterNumber>( std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13 QStringLiteral( "TOLERANCE" ), QObject::tr( "Tolerance" ), Qgis::ProcessingNumberParameterType::Integer, 8, false, 1, 13
); );
tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced ); tolerance->setFlags( tolerance->flags() | Qgis::ProcessingParameterFlag::Advanced );

View File

@ -90,7 +90,7 @@ Qgis::ProcessingFeatureSourceFlags QgsRemovePartsByAreaAlgorithm::sourceFlags()
void QgsRemovePartsByAreaAlgorithm::initParameters( const QVariantMap & ) void QgsRemovePartsByAreaAlgorithm::initParameters( const QVariantMap & )
{ {
auto minArea = std::make_unique< QgsProcessingParameterArea >( QStringLiteral( "MIN_AREA" ), QObject::tr( "Remove parts with area less than" ), 0.0, QStringLiteral( "INPUT" ), false, 0 ); std::unique_ptr< QgsProcessingParameterArea > minArea = std::make_unique< QgsProcessingParameterArea >( QStringLiteral( "MIN_AREA" ), QObject::tr( "Remove parts with area less than" ), 0.0, QStringLiteral( "INPUT" ), false, 0 );
minArea->setIsDynamic( true ); minArea->setIsDynamic( true );
minArea->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "MIN_AREA" ), QObject::tr( "Remove parts with area less than" ), QgsPropertyDefinition::DoublePositive ) ); minArea->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "MIN_AREA" ), QObject::tr( "Remove parts with area less than" ), QgsPropertyDefinition::DoublePositive ) );
minArea->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) ); minArea->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) );

View File

@ -90,7 +90,7 @@ Qgis::ProcessingFeatureSourceFlags QgsRemovePartsByLengthAlgorithm::sourceFlags(
void QgsRemovePartsByLengthAlgorithm::initParameters( const QVariantMap & ) void QgsRemovePartsByLengthAlgorithm::initParameters( const QVariantMap & )
{ {
auto minLength = std::make_unique< QgsProcessingParameterDistance >( QStringLiteral( "MIN_LENGTH" ), QObject::tr( "Remove parts with lengths less than" ), 0.0, QStringLiteral( "INPUT" ), false, 0 ); std::unique_ptr< QgsProcessingParameterDistance > minLength = std::make_unique< QgsProcessingParameterDistance >( QStringLiteral( "MIN_LENGTH" ), QObject::tr( "Remove parts with lengths less than" ), 0.0, QStringLiteral( "INPUT" ), false, 0 );
minLength->setIsDynamic( true ); minLength->setIsDynamic( true );
minLength->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "MIN_LENGTH" ), QObject::tr( "Remove parts with length less than" ), QgsPropertyDefinition::DoublePositive ) ); minLength->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "MIN_LENGTH" ), QObject::tr( "Remove parts with length less than" ), QgsPropertyDefinition::DoublePositive ) );
minLength->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) ); minLength->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) );

View File

@ -1,199 +0,0 @@
/***************************************************************************
qgsannotationlayer3drendererwidget.cpp
------------------------------
Date : September 2025
Copyright : (C) 2025 by Nyall Dawson
Email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgsannotationlayer3drendererwidget.h"
#include "moc_qgsannotationlayer3drendererwidget.cpp"
#include "qgsapplication.h"
#include "qgsannotationlayer.h"
#include "qgsannotationlayer3drenderer.h"
#include <QBoxLayout>
#include <QCheckBox>
QgsAnnotationLayer3DRendererWidget::QgsAnnotationLayer3DRendererWidget( QgsAnnotationLayer *layer, QgsMapCanvas *canvas, QWidget *parent )
: QgsMapLayerConfigWidget( layer, canvas, parent )
{
setPanelTitle( tr( "3D View" ) );
setObjectName( QStringLiteral( "mOptsPage_3DView" ) );
setupUi( this );
mComboRendererType->addItem( QgsApplication::getThemeIcon( QStringLiteral( "rendererNullSymbol.svg" ) ), tr( "No Symbols" ), QVariant::fromValue( RendererType::None ) );
mComboRendererType->addItem( QgsApplication::getThemeIcon( QStringLiteral( "rendererSingleSymbol.svg" ) ), tr( "3D Billboards" ), QVariant::fromValue( RendererType::Billboards ) );
mComboRendererType->setCurrentIndex( mComboRendererType->findData( QVariant::fromValue( RendererType::None ) ) );
mStackedWidget->setCurrentWidget( mPageNoRenderer );
connect( mComboRendererType, qOverload< int >( &QComboBox::currentIndexChanged ), this, &QgsAnnotationLayer3DRendererWidget::rendererTypeChanged );
mComboClamping->addItem( tr( "Relative to Terrain" ), QVariant::fromValue( Qgis::AltitudeClamping::Relative ) );
mComboClamping->addItem( tr( "Absolute" ), QVariant::fromValue( Qgis::AltitudeClamping::Absolute ) );
connect( mComboClamping, qOverload<int>( &QComboBox::currentIndexChanged ), this, &QgsAnnotationLayer3DRendererWidget::clampingChanged );
mComboClamping->setCurrentIndex( mComboClamping->findData( QVariant::fromValue( Qgis::AltitudeClamping::Relative ) ) );
clampingChanged();
connect( mOffsetZSpinBox, qOverload< double >( &QDoubleSpinBox::valueChanged ), this, [this]( double ) {
if ( !mBlockChanges )
emit widgetChanged();
} );
connect( mCheckShowCallouts, &QCheckBox::toggled, this, [this] {
if ( !mBlockChanges )
emit widgetChanged();
} );
syncToLayer( layer );
}
void QgsAnnotationLayer3DRendererWidget::setRenderer( const QgsAnnotationLayer3DRenderer *renderer )
{
mBlockChanges++;
mRenderer.reset( renderer ? renderer->clone() : nullptr );
if ( renderer )
{
mComboRendererType->setCurrentIndex( mComboRendererType->findData( QVariant::fromValue( RendererType::Billboards ) ) );
mComboClamping->setCurrentIndex( mComboClamping->findData( QVariant::fromValue( renderer->altitudeClamping() ) ) );
mOffsetZSpinBox->setValue( renderer->zOffset() );
mCheckShowCallouts->setChecked( renderer->showCalloutLines() );
}
else
{
mComboRendererType->setCurrentIndex( mComboRendererType->findData( QVariant::fromValue( RendererType::None ) ) );
}
mBlockChanges--;
}
std::unique_ptr< QgsAnnotationLayer3DRenderer > QgsAnnotationLayer3DRendererWidget::renderer()
{
const RendererType type = mComboRendererType->currentData().value< RendererType >();
switch ( type )
{
case RendererType::None:
return nullptr;
break;
case RendererType::Billboards:
{
auto renderer = std::make_unique< QgsAnnotationLayer3DRenderer >();
renderer->setAltitudeClamping( mComboClamping->currentData().value< Qgis::AltitudeClamping >() );
renderer->setZOffset( mOffsetZSpinBox->value() );
renderer->setShowCalloutLines( mCheckShowCallouts->isChecked() );
return renderer;
}
}
BUILTIN_UNREACHABLE
}
void QgsAnnotationLayer3DRendererWidget::apply()
{
std::unique_ptr< QgsAnnotationLayer3DRenderer > r = renderer();
mLayer->setRenderer3D( r.release() );
}
void QgsAnnotationLayer3DRendererWidget::rendererTypeChanged()
{
const RendererType type = mComboRendererType->currentData().value< RendererType >();
switch ( type )
{
case RendererType::None:
mStackedWidget->setCurrentWidget( mPageNoRenderer );
break;
case RendererType::Billboards:
mStackedWidget->setCurrentWidget( mPageBillboards );
break;
}
if ( !mBlockChanges )
emit widgetChanged();
}
void QgsAnnotationLayer3DRendererWidget::clampingChanged()
{
switch ( mComboClamping->currentData().value< Qgis::AltitudeClamping >() )
{
case Qgis::AltitudeClamping::Absolute:
mLabelClampingExplanation->setText(
QStringLiteral( "<p><b>%1</b></p><p>%2</p>" ).arg( tr( "All billboards will be placed at the same elevation." ), tr( "The terrain height will be ignored." ) )
);
break;
case Qgis::AltitudeClamping::Relative:
mLabelClampingExplanation->setText(
QStringLiteral( "<p><b>%1</b></p>" ).arg( tr( "Billboard elevation is relative to terrain height." ) )
);
break;
case Qgis::AltitudeClamping::Terrain:
mLabelClampingExplanation->setText(
QStringLiteral( "<p><b>%1</b></p><p>%2</p>" ).arg( tr( "Billboard elevation will be taken directly from the terrain height." ), tr( "Billboards will be placed directly on the terrain." ) )
);
break;
}
if ( !mBlockChanges )
emit widgetChanged();
}
void QgsAnnotationLayer3DRendererWidget::syncToLayer( QgsMapLayer *layer )
{
mLayer = layer;
QgsAbstract3DRenderer *r = layer->renderer3D();
if ( r && r->type() == QLatin1String( "annotation" ) )
{
QgsAnnotationLayer3DRenderer *annotationRenderer = qgis::down_cast<QgsAnnotationLayer3DRenderer *>( r );
setRenderer( annotationRenderer );
}
else
{
setRenderer( nullptr );
}
}
//
// QgsAnnotationLayer3DRendererWidgetFactory
//
QgsAnnotationLayer3DRendererWidgetFactory::QgsAnnotationLayer3DRendererWidgetFactory( QObject *parent )
: QObject( parent )
{
setIcon( QIcon( ":/images/themes/default/3d.svg" ) );
setTitle( tr( "3D View" ) );
}
QgsMapLayerConfigWidget *QgsAnnotationLayer3DRendererWidgetFactory::createWidget( QgsMapLayer *layer, QgsMapCanvas *canvas, bool dockWidget, QWidget *parent ) const
{
Q_UNUSED( dockWidget )
QgsAnnotationLayer *annotationLayer = qobject_cast<QgsAnnotationLayer *>( layer );
if ( !annotationLayer )
return nullptr;
return new QgsAnnotationLayer3DRendererWidget( annotationLayer, canvas, parent );
}
bool QgsAnnotationLayer3DRendererWidgetFactory::supportLayerPropertiesDialog() const
{
return true;
}
bool QgsAnnotationLayer3DRendererWidgetFactory::supportsStyleDock() const
{
return true;
}
bool QgsAnnotationLayer3DRendererWidgetFactory::supportsLayer( QgsMapLayer *layer ) const
{
return layer->type() == Qgis::LayerType::Annotation;
}
QString QgsAnnotationLayer3DRendererWidgetFactory::layerPropertiesPagePositionHint() const
{
return QStringLiteral( "mOptsPage_Rendering" );
}

View File

@ -1,75 +0,0 @@
/***************************************************************************
qgsannotationlayer3drendererwidget.h
------------------------------
Date : September 2025
Copyright : (C) 2025 by Nyall Dawson
Email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSANNOTATIONLAYER3DRENDERERWIDGET_H
#define QGSANNOTATIONLAYER3DRENDERERWIDGET_H
#include <memory>
#include "qgsmaplayerconfigwidget.h"
#include "qgsmaplayerconfigwidgetfactory.h"
#include "ui_qgsannotationlayer3drendererwidget.h"
class QgsAnnotationLayer;
class QgsAnnotationLayer3DRenderer;
class QgsMapCanvas;
//! Widget for configuration of 3D renderer of an annotation layer
class QgsAnnotationLayer3DRendererWidget : public QgsMapLayerConfigWidget, private Ui::QgsAnnotationLayer3dRendererWidgetBase
{
Q_OBJECT
public:
enum class RendererType
{
None,
Billboards,
};
Q_ENUM( RendererType )
explicit QgsAnnotationLayer3DRendererWidget( QgsAnnotationLayer *layer, QgsMapCanvas *canvas, QWidget *parent = nullptr );
void syncToLayer( QgsMapLayer *layer ) final;
//! no transfer of ownership
void setRenderer( const QgsAnnotationLayer3DRenderer *renderer );
std::unique_ptr< QgsAnnotationLayer3DRenderer > renderer();
public slots:
void apply() override;
private slots:
void rendererTypeChanged();
void clampingChanged();
private:
int mBlockChanges = 0;
std::unique_ptr<QgsAnnotationLayer3DRenderer> mRenderer;
};
class QgsAnnotationLayer3DRendererWidgetFactory : public QObject, public QgsMapLayerConfigWidgetFactory
{
Q_OBJECT
public:
explicit QgsAnnotationLayer3DRendererWidgetFactory( QObject *parent = nullptr );
QgsMapLayerConfigWidget *createWidget( QgsMapLayer *layer, QgsMapCanvas *canvas, bool dockWidget, QWidget *parent ) const override;
bool supportLayerPropertiesDialog() const override;
bool supportsStyleDock() const override;
bool supportsLayer( QgsMapLayer *layer ) const override;
QString layerPropertiesPagePositionHint() const override;
};
#endif // QGSANNOTATIONLAYER3DRENDERERWIDGET_H

View File

@ -168,6 +168,11 @@ set(QGIS_APP_SRCS
browser/qgsinbuiltdataitemproviders.cpp browser/qgsinbuiltdataitemproviders.cpp
devtools/qgsappdevtoolutils.cpp devtools/qgsappdevtoolutils.cpp
devtools/qgsdevtoolsmodelnode.cpp
devtools/networklogger/qgsnetworklogger.cpp
devtools/networklogger/qgsnetworkloggernode.cpp
devtools/networklogger/qgsnetworkloggerpanelwidget.cpp
devtools/networklogger/qgsnetworkloggerwidgetfactory.cpp
devtools/profiler/qgsprofilerpanelwidget.cpp devtools/profiler/qgsprofilerpanelwidget.cpp
devtools/profiler/qgsprofilerwidgetfactory.cpp devtools/profiler/qgsprofilerwidgetfactory.cpp
devtools/documentation/qgsdocumentationpanelwidget.cpp devtools/documentation/qgsdocumentationpanelwidget.cpp
@ -353,7 +358,6 @@ if (WITH_3D)
3d/qgs3dmodelsourcelineedit.cpp 3d/qgs3dmodelsourcelineedit.cpp
3d/qgs3dnavigationwidget.cpp 3d/qgs3dnavigationwidget.cpp
3d/qgs3doptions.cpp 3d/qgs3doptions.cpp
3d/qgsannotationlayer3drendererwidget.cpp
3d/qgsgoochmaterialwidget.cpp 3d/qgsgoochmaterialwidget.cpp
3d/qgslightswidget.cpp 3d/qgslightswidget.cpp
3d/qgsline3dsymbolwidget.cpp 3d/qgsline3dsymbolwidget.cpp
@ -503,6 +507,7 @@ target_include_directories(qgis_app PUBLIC
${CMAKE_SOURCE_DIR}/src/app ${CMAKE_SOURCE_DIR}/src/app
${CMAKE_SOURCE_DIR}/src/app/decorations ${CMAKE_SOURCE_DIR}/src/app/decorations
${CMAKE_SOURCE_DIR}/src/app/devtools ${CMAKE_SOURCE_DIR}/src/app/devtools
${CMAKE_SOURCE_DIR}/src/app/devtools/networklogger
${CMAKE_SOURCE_DIR}/src/app/georeferencer ${CMAKE_SOURCE_DIR}/src/app/georeferencer
${CMAKE_SOURCE_DIR}/src/app/labeling ${CMAKE_SOURCE_DIR}/src/app/labeling
${CMAKE_SOURCE_DIR}/src/app/layout ${CMAKE_SOURCE_DIR}/src/app/layout

View File

@ -215,7 +215,7 @@ void QgsNetworkLogger::removeRequestRows( const QList<int> &rows )
for ( int row : std::as_const( res ) ) for ( int row : std::as_const( res ) )
{ {
int popId = data( index( row, 0, QModelIndex() ), static_cast<int>( Qgis::DevToolsNodeRole::Id ) ).toInt(); int popId = data( index( row, 0, QModelIndex() ), QgsDevToolsModelNode::RoleId ).toInt();
mRequestGroups.remove( popId ); mRequestGroups.remove( popId );
beginRemoveRows( QModelIndex(), row, row ); beginRemoveRows( QModelIndex(), row, row );

View File

@ -15,13 +15,9 @@
#ifndef QGSNETWORKLOGGER_H #ifndef QGSNETWORKLOGGER_H
#define QGSNETWORKLOGGER_H #define QGSNETWORKLOGGER_H
#define SIP_NO_FILE
#include <QAbstractItemModel> #include <QAbstractItemModel>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include <QElapsedTimer> #include <QElapsedTimer>
#include "qgis_gui.h"
#include "qgsnetworkaccessmanager.h" #include "qgsnetworkaccessmanager.h"
class QgsDevToolsModelNode; class QgsDevToolsModelNode;
@ -30,14 +26,14 @@ class QgsNetworkLoggerRootNode;
class QAction; class QAction;
/** /**
* \ingroup gui * \ingroup app
* \class QgsNetworkLogger * \class QgsNetworkLogger
* \brief Logs network requests from a QgsNetworkAccessManager, converting them * \brief Logs network requests from a QgsNetworkAccessManager, converting them
* to a QAbstractItemModel representing the request and response details. * to a QAbstractItemModel representing the request and response details.
* *
* \since QGIS 3.14 * \since QGIS 3.14
*/ */
class GUI_EXPORT QgsNetworkLogger : public QAbstractItemModel class QgsNetworkLogger : public QAbstractItemModel
{ {
Q_OBJECT Q_OBJECT
@ -124,14 +120,14 @@ class GUI_EXPORT QgsNetworkLogger : public QAbstractItemModel
}; };
/** /**
* \ingroup gui * \ingroup app
* \class QgsNetworkLoggerProxyModel * \class QgsNetworkLoggerProxyModel
* \brief A proxy model for filtering QgsNetworkLogger models by url string subsets * \brief A proxy model for filtering QgsNetworkLogger models by url string subsets
* or request status. * or request status.
* *
* \since QGIS 3.14 * \since QGIS 3.14
*/ */
class GUI_EXPORT QgsNetworkLoggerProxyModel : public QSortFilterProxyModel class QgsNetworkLoggerProxyModel : public QSortFilterProxyModel
{ {
Q_OBJECT Q_OBJECT
public: public:

View File

@ -101,10 +101,10 @@ QVariant QgsNetworkLoggerRequestGroup::data( int role ) const
.arg( mUrl.url(), statusToString( mStatus ), QString::number( mHttpStatus ), mContentType, bytes, mStatus == Status::Pending ? QString::number( mTimer.elapsed() / 1000 ) : QString::number( mTotalTime ), QString::number( mReplies ) ); .arg( mUrl.url(), statusToString( mStatus ), QString::number( mHttpStatus ), mContentType, bytes, mStatus == Status::Pending ? QString::number( mTimer.elapsed() / 1000 ) : QString::number( mTotalTime ), QString::number( mReplies ) );
} }
case static_cast<int>( Qgis::DevToolsNodeRole::Status ): case RoleStatus:
return static_cast<int>( mStatus ); return static_cast<int>( mStatus );
case static_cast<int>( Qgis::DevToolsNodeRole::Id ): case RoleId:
return mRequestId; return mRequestId;
case Qt::ForegroundRole: case Qt::ForegroundRole:

View File

@ -15,11 +15,8 @@
#ifndef QGSNETWORKLOGGERNODE_H #ifndef QGSNETWORKLOGGERNODE_H
#define QGSNETWORKLOGGERNODE_H #define QGSNETWORKLOGGERNODE_H
#define SIP_NO_FILE
#include "qgis_gui.h"
#include "qgsnetworkaccessmanager.h" #include "qgsnetworkaccessmanager.h"
#include "qgsdevtoolsmodelnode.h" #include "devtools/qgsdevtoolsmodelnode.h"
#include <QElapsedTimer> #include <QElapsedTimer>
#include <QVariant> #include <QVariant>
#include <QColor> #include <QColor>
@ -30,13 +27,13 @@
class QAction; class QAction;
/** /**
* \ingroup gui * \ingroup app
* \class QgsNetworkLoggerRootNode * \class QgsNetworkLoggerRootNode
* \brief Root node for the network logger model. * \brief Root node for the network logger model.
* *
* \since QGIS 3.14 * \since QGIS 3.14
*/ */
class GUI_EXPORT QgsNetworkLoggerRootNode final : public QgsDevToolsModelGroup class QgsNetworkLoggerRootNode final : public QgsDevToolsModelGroup
{ {
public: public:
QgsNetworkLoggerRootNode(); QgsNetworkLoggerRootNode();
@ -55,7 +52,7 @@ class QgsNetworkLoggerReplyGroup;
class QgsNetworkLoggerSslErrorGroup; class QgsNetworkLoggerSslErrorGroup;
/** /**
* \ingroup gui * \ingroup app
* \class QgsNetworkLoggerRequestGroup * \class QgsNetworkLoggerRequestGroup
* \brief Parent group for all network requests, showing the request id, type, url, * \brief Parent group for all network requests, showing the request id, type, url,
* and containing child groups with detailed request and response information. * and containing child groups with detailed request and response information.
@ -80,7 +77,7 @@ class QgsNetworkLoggerSslErrorGroup;
* *
* \since QGIS 3.14 * \since QGIS 3.14
*/ */
class GUI_EXPORT QgsNetworkLoggerRequestGroup final : public QgsDevToolsModelGroup class QgsNetworkLoggerRequestGroup final : public QgsDevToolsModelGroup
{ {
public: public:
//! Request statu //! Request statu
@ -186,7 +183,7 @@ class QgsNetworkLoggerRequestHeadersGroup;
class QgsNetworkLoggerPostContentGroup; class QgsNetworkLoggerPostContentGroup;
/** /**
* \ingroup gui * \ingroup app
* \class QgsNetworkLoggerRequestGroup * \class QgsNetworkLoggerRequestGroup
* \brief Parent group for all network request details, showing the request parameters * \brief Parent group for all network request details, showing the request parameters
* and header information. * and header information.
@ -210,7 +207,7 @@ class QgsNetworkLoggerPostContentGroup;
* *
* \since QGIS 3.14 * \since QGIS 3.14
*/ */
class GUI_EXPORT QgsNetworkLoggerRequestDetailsGroup final : public QgsDevToolsModelGroup class QgsNetworkLoggerRequestDetailsGroup final : public QgsDevToolsModelGroup
{ {
public: public:
/** /**
@ -228,7 +225,7 @@ class GUI_EXPORT QgsNetworkLoggerRequestDetailsGroup final : public QgsDevToolsM
/** /**
* \ingroup gui * \ingroup app
* \class QgsNetworkLoggerRequestHeadersGroup * \class QgsNetworkLoggerRequestHeadersGroup
* \brief Parent group for all network request header information. * \brief Parent group for all network request header information.
* *
@ -240,7 +237,7 @@ class GUI_EXPORT QgsNetworkLoggerRequestDetailsGroup final : public QgsDevToolsM
* *
* \since QGIS 3.14 * \since QGIS 3.14
*/ */
class GUI_EXPORT QgsNetworkLoggerRequestHeadersGroup final : public QgsDevToolsModelGroup class QgsNetworkLoggerRequestHeadersGroup final : public QgsDevToolsModelGroup
{ {
public: public:
/** /**
@ -252,7 +249,7 @@ class GUI_EXPORT QgsNetworkLoggerRequestHeadersGroup final : public QgsDevToolsM
/** /**
* \ingroup gui * \ingroup app
* \class QgsNetworkLoggerRequestQueryGroup * \class QgsNetworkLoggerRequestQueryGroup
* \brief Parent group for all network request query information. * \brief Parent group for all network request query information.
* *
@ -264,7 +261,7 @@ class GUI_EXPORT QgsNetworkLoggerRequestHeadersGroup final : public QgsDevToolsM
* *
* \since QGIS 3.14 * \since QGIS 3.14
*/ */
class GUI_EXPORT QgsNetworkLoggerRequestQueryGroup final : public QgsDevToolsModelGroup class QgsNetworkLoggerRequestQueryGroup final : public QgsDevToolsModelGroup
{ {
public: public:
/** /**
@ -275,7 +272,7 @@ class GUI_EXPORT QgsNetworkLoggerRequestQueryGroup final : public QgsDevToolsMod
}; };
/** /**
* \ingroup gui * \ingroup app
* \class QgsNetworkLoggerPostContentGroup * \class QgsNetworkLoggerPostContentGroup
* \brief Parent group for all request post data, showing POST data. * \brief Parent group for all request post data, showing POST data.
* *
@ -286,7 +283,7 @@ class GUI_EXPORT QgsNetworkLoggerRequestQueryGroup final : public QgsDevToolsMod
* *
* \since QGIS 3.14 * \since QGIS 3.14
*/ */
class GUI_EXPORT QgsNetworkLoggerPostContentGroup final : public QgsDevToolsModelGroup class QgsNetworkLoggerPostContentGroup final : public QgsDevToolsModelGroup
{ {
public: public:
/** /**
@ -299,7 +296,7 @@ class GUI_EXPORT QgsNetworkLoggerPostContentGroup final : public QgsDevToolsMode
class QgsNetworkLoggerReplyHeadersGroup; class QgsNetworkLoggerReplyHeadersGroup;
/** /**
* \ingroup gui * \ingroup app
* \class QgsNetworkLoggerReplyGroup * \class QgsNetworkLoggerReplyGroup
* \brief Parent group for all network replies, showing the reply details. * \brief Parent group for all network replies, showing the reply details.
* *
@ -314,7 +311,7 @@ class QgsNetworkLoggerReplyHeadersGroup;
* *
* \since QGIS 3.14 * \since QGIS 3.14
*/ */
class GUI_EXPORT QgsNetworkLoggerReplyGroup final : public QgsDevToolsModelGroup class QgsNetworkLoggerReplyGroup final : public QgsDevToolsModelGroup
{ {
public: public:
/** /**
@ -329,7 +326,7 @@ class GUI_EXPORT QgsNetworkLoggerReplyGroup final : public QgsDevToolsModelGroup
}; };
/** /**
* \ingroup gui * \ingroup app
* \class QgsNetworkLoggerReplyHeadersGroup * \class QgsNetworkLoggerReplyHeadersGroup
* \brief Parent group for network reply headers, showing the reply header details. * \brief Parent group for network reply headers, showing the reply header details.
* *
@ -342,7 +339,7 @@ class GUI_EXPORT QgsNetworkLoggerReplyGroup final : public QgsDevToolsModelGroup
* *
* \since QGIS 3.14 * \since QGIS 3.14
*/ */
class GUI_EXPORT QgsNetworkLoggerReplyHeadersGroup final : public QgsDevToolsModelGroup class QgsNetworkLoggerReplyHeadersGroup final : public QgsDevToolsModelGroup
{ {
public: public:
/** /**
@ -353,7 +350,7 @@ class GUI_EXPORT QgsNetworkLoggerReplyHeadersGroup final : public QgsDevToolsMod
}; };
/** /**
* \ingroup gui * \ingroup app
* \class QgsNetworkLoggerSslErrorNode * \class QgsNetworkLoggerSslErrorNode
* \brief Parent group for SSQL errors, showing the error details. * \brief Parent group for SSQL errors, showing the error details.
* *
@ -366,7 +363,7 @@ class GUI_EXPORT QgsNetworkLoggerReplyHeadersGroup final : public QgsDevToolsMod
* *
* \since QGIS 3.14 * \since QGIS 3.14
*/ */
class GUI_EXPORT QgsNetworkLoggerSslErrorGroup final : public QgsDevToolsModelGroup class QgsNetworkLoggerSslErrorGroup final : public QgsDevToolsModelGroup
{ {
public: public:
/** /**

View File

@ -15,9 +15,6 @@
#ifndef QGSNETWORKLOGGERPANELWIDGET_H #ifndef QGSNETWORKLOGGERPANELWIDGET_H
#define QGSNETWORKLOGGERPANELWIDGET_H #define QGSNETWORKLOGGERPANELWIDGET_H
#define SIP_NO_FILE
#include "qgis_gui.h"
#include "qgsdevtoolwidget.h" #include "qgsdevtoolwidget.h"
#include "ui_qgsnetworkloggerpanelbase.h" #include "ui_qgsnetworkloggerpanelbase.h"
#include <QTreeView> #include <QTreeView>
@ -26,13 +23,13 @@ class QgsNetworkLogger;
class QgsNetworkLoggerProxyModel; class QgsNetworkLoggerProxyModel;
/** /**
* \ingroup gui * \ingroup app
* \class QgsNetworkLoggerTreeView * \class QgsNetworkLoggerTreeView
* \brief A custom QTreeView subclass for showing logged network requests. * \brief A custom QTreeView subclass for showing logged network requests.
* *
* \since QGIS 3.14 * \since QGIS 3.14
*/ */
class GUI_EXPORT QgsNetworkLoggerTreeView : public QTreeView class QgsNetworkLoggerTreeView : public QTreeView
{ {
Q_OBJECT Q_OBJECT
public: public:
@ -77,13 +74,13 @@ class GUI_EXPORT QgsNetworkLoggerTreeView : public QTreeView
/** /**
* \ingroup gui * \ingroup app
* \class QgsNetworkLoggerPanelWidget * \class QgsNetworkLoggerPanelWidget
* \brief A panel widget showing logged network requests. * \brief A panel widget showing logged network requests.
* *
* \since QGIS 3.14 * \since QGIS 3.14
*/ */
class GUI_EXPORT QgsNetworkLoggerPanelWidget : public QgsDevToolWidget, private Ui::QgsNetworkLoggerPanelBase class QgsNetworkLoggerPanelWidget : public QgsDevToolWidget, private Ui::QgsNetworkLoggerPanelBase
{ {
Q_OBJECT Q_OBJECT

View File

@ -15,32 +15,14 @@
#ifndef QGSNETWORKLOGGERWIDGETFACTORY_H #ifndef QGSNETWORKLOGGERWIDGETFACTORY_H
#define QGSNETWORKLOGGERWIDGETFACTORY_H #define QGSNETWORKLOGGERWIDGETFACTORY_H
#define SIP_NO_FILE
#include "qgis_gui.h"
#include "qgsdevtoolwidgetfactory.h" #include "qgsdevtoolwidgetfactory.h"
class QgsNetworkLogger; class QgsNetworkLogger;
/** class QgsNetworkLoggerWidgetFactory : public QgsDevToolWidgetFactory
* \ingroup gui
* \class QgsNetworkLoggerWidgetFactory
* \brief Factory class for creating network logger debugging page.
* \since QGIS 4.0
*/
class GUI_EXPORT QgsNetworkLoggerWidgetFactory : public QgsDevToolWidgetFactory
{ {
public: public:
/**
* Constructor for a QgsNetworkLoggerWidgetFactory.
*/
QgsNetworkLoggerWidgetFactory( QgsNetworkLogger *logger ); QgsNetworkLoggerWidgetFactory( QgsNetworkLogger *logger );
/**
* Factory function to create the widget on demand as needed by the dock.
*
* The \a parent argument gives the correct parent for the newly created widget.
*/
QgsDevToolWidget *createWidget( QWidget *parent = nullptr ) const override; QgsDevToolWidget *createWidget( QWidget *parent = nullptr ) const override;
private: private:

View File

@ -52,8 +52,6 @@ QgsDevToolsModelGroup::QgsDevToolsModelGroup( const QString &title )
{ {
} }
QgsDevToolsModelGroup::~QgsDevToolsModelGroup() = default;
QgsDevToolsModelNode *QgsDevToolsModelGroup::addChild( std::unique_ptr<QgsDevToolsModelNode> child ) QgsDevToolsModelNode *QgsDevToolsModelGroup::addChild( std::unique_ptr<QgsDevToolsModelNode> child )
{ {
if ( !child ) if ( !child )

View File

@ -15,9 +15,6 @@
#ifndef QGSDEVTOOLSMODELNODE_H #ifndef QGSDEVTOOLSMODELNODE_H
#define QGSDEVTOOLSMODELNODE_H #define QGSDEVTOOLSMODELNODE_H
#define SIP_NO_FILE
#include "qgis_gui.h"
#include <QElapsedTimer> #include <QElapsedTimer>
#include <QVariant> #include <QVariant>
#include <QColor> #include <QColor>
@ -29,14 +26,23 @@ class QAction;
class QgsDevToolsModelGroup; class QgsDevToolsModelGroup;
/** /**
* \ingroup gui * \ingroup app
* \class QgsDevToolsModelNode * \class QgsDevToolsModelNode
* \brief Base class for nodes in a dev tools model. * \brief Base class for nodes in a dev tools model.
* \since QGIS 4.0
*/ */
class GUI_EXPORT QgsDevToolsModelNode class QgsDevToolsModelNode
{ {
public: public:
//! Custom node data roles
enum Roles
{
RoleStatus = Qt::UserRole + 1, //!< Request status role
RoleId, //!< Request ID role
RoleElapsedTime, //!< Elapsed time
RoleMaximumTime, //!< Maximum encountered elapsed time
RoleSort, //!< Sort order role
};
virtual ~QgsDevToolsModelNode(); virtual ~QgsDevToolsModelNode();
/** /**
@ -77,26 +83,12 @@ class GUI_EXPORT QgsDevToolsModelNode
}; };
/** /**
* \ingroup gui * \ingroup app
* \class QgsDevToolsModelGroup * \class QgsDevToolsModelGroup
* \brief Base class for dev tools model "group" nodes, which contain children of their own. * \brief Base class for dev tools model "group" nodes, which contain children of their own.
* \since QGIS 4.0
*/ */
class GUI_EXPORT QgsDevToolsModelGroup : public QgsDevToolsModelNode class QgsDevToolsModelGroup : public QgsDevToolsModelNode
{ {
public:
~QgsDevToolsModelGroup() override;
/**
* Constructor for a QgsDevToolsModelGroup. Copy constructor is disabled
*/
QgsDevToolsModelGroup( QgsDevToolsModelGroup &&other ) noexcept = default;
/**
* Assignment operator for QgsDevToolsModelGroup. Copy assignment is disabled
*/
QgsDevToolsModelGroup &operator=( QgsDevToolsModelGroup &&other ) noexcept = default;
public: public:
/** /**
* Adds a \a child node to this node. * Adds a \a child node to this node.
@ -141,20 +133,15 @@ class GUI_EXPORT QgsDevToolsModelGroup : public QgsDevToolsModelNode
std::deque<std::unique_ptr<QgsDevToolsModelNode>> mChildren; std::deque<std::unique_ptr<QgsDevToolsModelNode>> mChildren;
private: private:
// Prevent copying
QgsDevToolsModelGroup( const QgsDevToolsModelGroup & ) = delete;
QgsDevToolsModelGroup &operator=( const QgsDevToolsModelGroup & ) = delete;
QString mGroupTitle; QString mGroupTitle;
}; };
/** /**
* \ingroup gui * \ingroup app
* \class QgsDevToolsModelValueNode * \class QgsDevToolsModelValueNode
* \brief A "key: value" style node for a dev tools model. * \brief A "key: value" style node for a dev tools model.
* \since QGIS 4.0
*/ */
class GUI_EXPORT QgsDevToolsModelValueNode : public QgsDevToolsModelNode class QgsDevToolsModelValueNode : public QgsDevToolsModelNode
{ {
public: public:
/** /**

View File

@ -141,7 +141,7 @@ void QgsAppQueryLogger::removeRequestRows( const QList<int> &rows )
for ( int row : std::as_const( res ) ) for ( int row : std::as_const( res ) )
{ {
int popId = data( index( row, 0, QModelIndex() ), static_cast<int>( Qgis::DevToolsNodeRole::Id ) ).toInt(); int popId = data( index( row, 0, QModelIndex() ), QgsDevToolsModelNode::RoleId ).toInt();
mQueryGroups.remove( popId ); mQueryGroups.remove( popId );
beginRemoveRows( QModelIndex(), row, row ); beginRemoveRows( QModelIndex(), row, row );
@ -217,11 +217,11 @@ QVariant QgsAppQueryLogger::data( const QModelIndex &index, int role ) const
switch ( role ) switch ( role )
{ {
case Qt::DisplayRole: case Qt::DisplayRole:
case static_cast<int>( Qgis::DevToolsNodeRole::ElapsedTime ): case QgsDevToolsModelNode::RoleElapsedTime:
case static_cast<int>( Qgis::DevToolsNodeRole::Sort ): case QgsDevToolsModelNode::RoleSort:
return node->data( static_cast<int>( Qgis::DevToolsNodeRole::ElapsedTime ) ); return node->data( QgsDevToolsModelNode::RoleElapsedTime );
case static_cast<int>( Qgis::DevToolsNodeRole::MaximumTime ): case QgsDevToolsModelNode::RoleMaximumTime:
return mMaxCost; return mMaxCost;
default: default:

View File

@ -88,7 +88,7 @@ QVariant QgsDatabaseQueryLoggerQueryGroup::data( int role ) const
case Qt::DisplayRole: case Qt::DisplayRole:
return QStringLiteral( "%1 %2" ).arg( QString::number( mQueryId ), mSql ); return QStringLiteral( "%1 %2" ).arg( QString::number( mQueryId ), mSql );
case static_cast<int>( Qgis::DevToolsNodeRole::Sort ): case QgsDevToolsModelNode::RoleSort:
return mQueryId; return mQueryId;
case Qt::ToolTipRole: case Qt::ToolTipRole:
@ -118,13 +118,13 @@ QVariant QgsDatabaseQueryLoggerQueryGroup::data( int role ) const
#endif #endif
} }
case static_cast<int>( Qgis::DevToolsNodeRole::Status ): case RoleStatus:
return static_cast<int>( mStatus ); return static_cast<int>( mStatus );
case static_cast<int>( Qgis::DevToolsNodeRole::Id ): case RoleId:
return mQueryId; return mQueryId;
case static_cast<int>( Qgis::DevToolsNodeRole::ElapsedTime ): case RoleElapsedTime:
return mElapsed; return mElapsed;
case Qt::ForegroundRole: case Qt::ForegroundRole:

Some files were not shown because too many files have changed in this diff Show More