...
 
Commits (37)
    https://gitcode.net/mrbaolong/qgis/-/commit/4939fffa7d1a9276a61bf8cab9c65c4db75ae0f4 Fix CAD distance units 2023-07-31T12:48:38+10:00 Alessandro Pasotti elpaso@itopen.it Fix #53899 https://gitcode.net/mrbaolong/qgis/-/commit/369851afc6e862f2002b236dae8cfa3fd569a049 Fix test 2023-07-31T12:48:38+10:00 Alessandro Pasotti elpaso@itopen.it https://gitcode.net/mrbaolong/qgis/-/commit/e707e70449ef03ca07c26ad8dbf084b1692a08a2 QgsGeometryUtils: Fix wktReadBlock for EMPTY wkt string 2023-08-01T14:05:53+10:00 Loïc Bartoletti loic.bartoletti@oslandia.com Relaxed parser to allow more flexible input. Previously, it accepted 'PointZ EMPTY' but not 'Point Z Empty.' Now, it also accepts 'Point Z M Empty' while still being permissive compared to other implementations like PostGIS. The correct rule should be: 'Type Extension Empty|Coordinates' or 'TypeExtension Empty|Coordinates', rather than 'Type Z M Empty|Coordinates'. We maintain the principle that the parser should be lenient. https://gitcode.net/mrbaolong/qgis/-/commit/c87fcfb8cbb84a85cf68e902594cfdebe1c928b5 remove commented block and use QLatin1string with size method instead of QStr... 2023-08-01T14:05:53+10:00 Loïc Bartoletti loic.bartoletti@oslandia.com https://gitcode.net/mrbaolong/qgis/-/commit/5be3172f3ddf0a1f79fc2f7e7100dc15fd69a321 [themes] Improve editable spinbox styling so it differs enough from combobox 2023-08-02T01:34:10+00:00 Mathieu Pellerin nirvn.asia@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/f4279bbb4ee1178e364e2f87c39a784a5fd944a0 [themes] Harmonize combo and spin boxes as well as color,font,symbol,ramp bor... 2023-08-02T01:34:10+00:00 Mathieu Pellerin nirvn.asia@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/e1e8af124ad90e18560e892358e70052dd6dadf8 [themes] Fix long-standing issue with Qgs{Color,Font,Ramp,Symbol}Button drop... 2023-08-02T01:34:10+00:00 Mathieu Pellerin nirvn.asia@gmail.com [themes] Fix long-standing issue with Qgs{Color,Font,Ramp,Symbol}Button drop down arrow moving around on mouse hovering https://gitcode.net/mrbaolong/qgis/-/commit/1b1482b69b0b41fb9d8460b1537219a159a737d5 Read app settings slightly earlier so the status bar creation gets the right ... 2023-08-02T01:34:10+00:00 Mathieu Pellerin nirvn.asia@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/76d37735c83b3cc0df9a018f42ea8ff924a5da32 [themes] With status bar colors fixed, make our dark theme truly dark 2023-08-02T01:34:10+00:00 Mathieu Pellerin nirvn.asia@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/8a9042e732d2ae3e436658021194c84650f31e72 Don't show incorred error messages when trying to load optional symbols 2023-08-02T12:49:56+10:00 Nyall Dawson nyall.dawson@gmail.com from empty DOM elements https://gitcode.net/mrbaolong/qgis/-/commit/27c710adc84cc44c00625a0353c76170f248ccde Merge pull request #54017 from qgis/backport-54010-to-release-3_32 2023-08-02T19:24:43+07:00 Mathieu Pellerin nirvn.asia@gmail.com [Backport release-3_32] [themes] Improve editable spinbox styling so it differs enough from combobox https://gitcode.net/mrbaolong/qgis/-/commit/498907ca33f70a399e84849ee03934080698f2e6 OWS Fix unreported regression with credentials 2023-08-03T10:07:18+10:00 Alessandro Pasotti elpaso@itopen.it authcfg/username/password were not correctly read from the settings. https://gitcode.net/mrbaolong/qgis/-/commit/42e5f7bce8a00b581f67dfe6c87a148c7c4ba278 Remove the password when a layer is not found from the log 2023-08-03T16:35:14+10:00 Etienne Trimaille gustrimaille@yahoo.fr https://gitcode.net/mrbaolong/qgis/-/commit/ef01e10e3da8d4079650674a4faf97889506b0d3 debian packaging: 2023-08-03T16:34:38+02:00 Juergen E. Fischer jef@norbit.de * override HOME when running crssync * use DEB_PYTHON_INSTALL_LAYOUT=deb_system (cherry picked from commit <a href="/mrbaolong/qgis/-/commit/5d68226783508629888c37b74685d61a00285aa1" data-original="5d68226783508629888c37b74685d61a00285aa1" data-link="false" data-link-reference="false" data-project="82012" data-commit="5d68226783508629888c37b74685d61a00285aa1" data-reference-type="commit" data-container="body" data-placement="top" title="debian packaging:" class="gfm gfm-commit has-tooltip">5d682267</a>) https://gitcode.net/mrbaolong/qgis/-/commit/62e7c560faa2803779ad12da13ee4c9fd7ded23d Try to free some space 2023-08-05T05:06:24+10:00 Nyall Dawson nyall.dawson@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/21cc362a9de8a0bf11c371241c47064047f31efe Moaw space 2023-08-05T05:06:24+10:00 Nyall Dawson nyall.dawson@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/06635de74c059e5cdadb7b591c5e158b6c7cce58 Try to get oracle test passing again 2023-08-05T09:33:00+10:00 Nyall Dawson nyall.dawson@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/e9696ab0eb76bb3fd749a5840a8299bffd81b1c4 [themes] Fix black label on dark layout designer ruler issue 2023-08-05T11:18:08+10:00 Mathieu Pellerin nirvn.asia@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/289461a430457956e7ff903dd4eb37e4e997715b grass on windows: 2023-08-05T14:54:26+10:00 Juergen E. Fischer jef@norbit.de * avoid running grassMm.bat found in the current directory * avoid finding and running GRASS pager found in the current directory https://gitcode.net/mrbaolong/qgis/-/commit/2aead53955351f6fc1141fd9ea09c5e2e080a94f qgis_process: fix unreported deadlock 2023-08-05T14:54:53+10:00 Alessandro Pasotti elpaso@itopen.it https://gitcode.net/mrbaolong/qgis/-/commit/c0badd6cab632f6d8c329fbb53f2e41dde02e903 [ui] Fix visual glitches when resizing the overview panel 2023-08-05T14:56:07+10:00 Mathieu Pellerin nirvn.asia@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/5426e594ab449de69c98a866a91606cecfbbf05d Fix #53990 2023-08-05T19:17:04+10:00 Yoann Quenach de Quivillic yoann.quenach@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/9b4535d8a354dac67da34af6ddf184226b82592d [ui] Fix source fields' virtual field comment widget on dark themes 2023-08-06T05:36:48+10:00 Mathieu Pellerin nirvn.asia@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/33eb8a36602ae33c9b2484b292df1ae526839ffa [ui] Fix black labels on black background within color ramp legend items 2023-08-06T05:36:48+10:00 Mathieu Pellerin nirvn.asia@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/1110ac98c2cba70797ce735a347873b7e6f71aa9 [ui] Fix black labels on black background in the elevation profile canvas 2023-08-06T05:36:48+10:00 Mathieu Pellerin nirvn.asia@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/e7ef78dddf3825df2fa571e3039cd24295e0098c [ui] Fix hard-to-see connecting arrows and text within the processing's mode... 2023-08-06T11:11:18+10:00 Mathieu Pellerin nirvn.asia@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/11833bf8372a2943640ce8b1f0dfe727979d26e7 [ui] Fix the main window's status bar text color on dark themes 2023-08-06T11:11:32+10:00 Mathieu Pellerin nirvn.asia@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/fcbdbb4a5164975d9c0b8ab3eaed95c7ca130b71 Use localized format to display release date of plugins 2023-08-07T13:11:11+10:00 Andrea Giudiceandrea andreaerdna@libero.it https://gitcode.net/mrbaolong/qgis/-/commit/646809b67fa9fd0a4471607702aec231c3960968 Add PyQgsExternalStorageAwsS3 to ci blocklist 2023-08-07T17:49:03+10:00 Nyall Dawson nyall.dawson@gmail.com The CI setup is no longer working for this test, resulting in continuous false positives https://gitcode.net/mrbaolong/qgis/-/commit/a04a4bb9e6f173504d9f7e36849db016fc8c3e6e [themes] Fix Night Mapping checkbox and radiobox not friendly to colour blind... 2023-08-07T17:49:44+10:00 Mathieu Pellerin nirvn.asia@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/9bb524c2a139e9204bbc6d3438c378f6e06a401b [themes] Fix dark on dark layer tree indicators on Night Mapping 2023-08-07T17:49:44+10:00 Mathieu Pellerin nirvn.asia@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/31252463fde0728ee6bef0235bc4b875fb213c1f Fix widget z range restrictions for layer metadata 2023-08-07T20:12:38+10:00 Nyall Dawson nyall.dawson@gmail.com Expand the range to allow negative values, set max to &gt;99 https://gitcode.net/mrbaolong/qgis/-/commit/f6e9d01eaddcef45523be3275d92d6e75ded0202 Fix ci test for AWS S3 2023-08-08T15:03:57+10:00 Jacky Volpes jacky.volpes@oslandia.com https://gitcode.net/mrbaolong/qgis/-/commit/c2a11bdcc2da393e8e564e2164623159f7df2654 Fix #53988 - Crash when saving layout after removing map 2023-08-08T17:37:16+10:00 Yoann Quenach de Quivillic yoann.quenach@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/b36ba42994b605aaf2c28488e07424585a51a8f6 Fix mingw build 2023-08-09T19:10:16+10:00 Nyall Dawson nyall.dawson@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/2073f4cad9f24ed604df899ec4dfb6c29b7488dd Fix #53776 - Annotation DPI 2023-08-10T08:41:44+10:00 Yoann Quenach de Quivillic yoann.quenach@gmail.com https://gitcode.net/mrbaolong/qgis/-/commit/cbb7a36427a667b4e37acc7d2a7a635881b738b7 Fix ci 2023-08-13T17:38:33+10:00 Nyall Dawson nyall.dawson@gmail.com
......@@ -124,7 +124,7 @@ else
fi
# Create an empty minio folder with appropriate permissions so www user can write inside it
mkdir -p /tmp/minio_tests/test_bucket && chmod -R 777 /tmp/minio_tests
mkdir -p /tmp/minio_tests/test-bucket && chmod -R 777 /tmp/minio_tests
# Create an empty webdav folder with appropriate permissions so www user can write inside it
mkdir -p /tmp/webdav_tests && chmod 777 /tmp/webdav_tests
......
......@@ -37,10 +37,10 @@ jobs:
run: printf '[main]\ngpgcheck=True\ninstallonly_limit=3\nclean_requirements_on_remove=True\nbest=False\nskip_if_unavailable=True\ntsflags=nodocs' > /etc/dnf/dnf.conf
- name: Update system
run: dnf -y update
run: dnf5 -y update
- name: Install core dependencies
run: dnf -y install zip
run: dnf5 -y install zip
- name: Install build dependencies
run: ./ms-windows/mingw/mingwdeps.sh
......
......@@ -77,6 +77,15 @@ jobs:
runners_outcome: ${{ steps.runners.outcome }}
steps:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
with:
tool-cache: true
large-packages: false
docker-images: false
swap-storage: true
- name: Checkout
uses: actions/checkout@v3
......@@ -318,10 +327,13 @@ jobs:
steps:
- name: Print disk space
run: |
echo "DF -H"
sudo df -h
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
with:
tool-cache: true
large-packages: false
docker-images: false
swap-storage: true
- name: Checkout
uses: actions/checkout@v3
......@@ -397,7 +409,7 @@ jobs:
echo "TEST_BATCH=$TEST_BATCH"
echo "DOCKERFILE=$DOCKERFILE"
mkdir -p /tmp/webdav_tests && chmod 777 /tmp/webdav_tests
mkdir -p /tmp/minio_tests/test_bucket && chmod -R 777 /tmp/minio_tests
mkdir -p /tmp/minio_tests/test-bucket && chmod -R 777 /tmp/minio_tests
docker-compose -f .docker/$DOCKERFILE run qgis-deps /root/QGIS/.docker/docker-qgis-test.sh $TEST_BATCH
- name: Archive test results report
......
......@@ -3,7 +3,7 @@ set -e
if [ "$1" = "triggered" ] || [ "$1" = "configure" ]; then
if [ -w /usr/share/qgis/resources/srs.db ] && [ -x /usr/lib/qgis/crssync ]; then
/usr/lib/qgis/crssync
HOME=/tmp XDG_DATA_HOME="" XDG_CONFIG_HOME="" XDG_STATE_HOME="" XDG_CACHE_HOME="" /usr/lib/qgis/crssync
fi
fi
......
......@@ -10,6 +10,8 @@ export DH_OPTIONS
# Enable hardening build flags
export DEB_BUILD_MAINT_OPTIONS=hardening=+all
export DEB_PYTHON_INSTALL_LAYOUT=deb_system
include /usr/share/dpkg/pkg-info.mk
# These are used for cross-compiling and for saving the configure script
......
......@@ -5,7 +5,7 @@
# just the "tsflags=nodocs" line
printf '[main]\ngpgcheck=True\ninstallonly_limit=3\nclean_requirements_on_remove=True\nbest=False\nskip_if_unavailable=True\ntsflags=nodocs' > /etc/dnf/dnf.conf
dnf install -y --nogpgcheck \
dnf5 install -y --nogpgcheck \
mingw64-dlfcn \
mingw64-exiv2 \
mingw64-fcgi \
......
......@@ -21,7 +21,6 @@ __copyright__ = '(C) 2014-2015, Victor Olaya'
import stat
import shutil
import shlex
import subprocess
import os
import sys
......@@ -35,7 +34,6 @@ from qgis.core import (Qgis,
from qgis.PyQt.QtCore import QCoreApplication
from processing.core.ProcessingConfig import ProcessingConfig
from processing.tools.system import userFolder, isWindows, isMac, mkdir
from processing.tests.TestData import points
from processing.algs.gdal.GdalUtils import GdalUtils
......@@ -168,14 +166,12 @@ class Grass7Utils:
cmdList = [
"grass{}{}{}".format(major, minor, patch),
"grass",
"grass{}{}{}.sh".format(major, minor, patch),
"grass.sh"
"grass{}{}{}.{}".format(major, minor, patch, "bat" if isWindows() else "sh"),
"grass.{}".format("bat" if isWindows() else "sh")
]
else:
cmdList = [
"grass80", "grass78", "grass76", "grass74", "grass72", "grass70", "grass",
"grass80.sh", "grass78.sh", "grass76.sh", "grass74.sh", "grass72.sh", "grass70.sh", "grass.sh"
]
cmdList = ["grass80", "grass78", "grass76", "grass74", "grass72", "grass70", "grass"]
cmdList.extend(["{}.{}".format(b, "bat" if isWindows() else "sh") for b in cmdList])
# For MS-Windows there is a difference between GRASS Path and GRASS binary
if isWindows():
......@@ -190,8 +186,8 @@ class Grass7Utils:
# Search in grassPath
command = searchFolder(path)
# If everything has failed, use shutil
if not command:
# If everything has failed, use shutil (but not for Windows as it'd include .)
if not command and not isWindows():
for cmd in cmdList:
testBin = shutil.which(cmd)
if testBin:
......
......@@ -58,41 +58,53 @@ QMenuBar::item:pressed
color: @text;
}
/* ==================================================================================== */
/* SPIN BOX */
/* ==================================================================================== */
QAbstractSpinBox {
padding: 0.12em 0em 0.12em 0.12em;
border: 1px solid #222;
padding: 0.12em;
border-width: 1px;
border-color: @itemdarkbackground;
border-style: solid;
border-radius: 0.2em;
background-color: @darkgradient;
color:@itembackground;
background-color:@itembackground;
selection-background-color: @selection;
selection-color: @itemdarkbackground;
color: @text;
}
QAbstractSpinBox::up-button {
subcontrol-origin: border;
subcontrol-position: top right;
padding-top:0em;
padding-right:0.05em;
margin-top:2px;
margin-right:2px;
margin-bottom:-1px;
width: 0.8em;
height: 0.8em;
image: url(@theme_path/icons/arrow-up.svg);
background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #535353, stop: 1 #464646);
border: 0;
border-top-right-radius: 0.15em;
border-top-left-radius: 0.15em;
}
QAbstractSpinBox::down-button {
subcontrol-origin: border;
subcontrol-position: bottom right;
padding-top:0.2em;
padding-right:0.05em;
margin-bottom:2px;
margin-right:2px;
margin-top:-1px;
width: 0.8em;
height: 0.8em;
image: url(@theme_path/icons/arrow-down.svg);
background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #464646, stop: 1 #373737);
border: 0;
border-bottom-right-radius: 0.15em;
border-bottom-left-radius: 0.15em;
}
QAbstractSpinBox::drop-down {
subcontrol-origin: border;
subcontrol-position: top right;
width: 0.8em;
border: 0px;
QAbstractSpinBox::up-arrow
{
image: url(@theme_path/icons/arrow-up.svg);
width: 0.8em;
height: 1.2em;
}
QAbstractSpinBox::down-arrow
......@@ -102,6 +114,33 @@ QAbstractSpinBox::down-arrow
height: 1.2em;
}
QAbstractSpinBox::up-button:hover, QAbstractSpinBox::down-button:hover {
background-color: @darkalternativegradient;
}
QAbstractSpinBox::up-button:disabled, QAbstractSpinBox::down-button:disabled {
background-color: transparent !important;
}
QAbstractSpinBox::drop-down {
subcontrol-origin: border;
subcontrol-position: top right;
margin-top:1px;
margin-right:1px;
margin-bottom:1px;
width: 0.8em;
background-color: @darkgradient;
color:@itembackground;
border-style: solid;
border: 1px solid @itembackground;
border-radius: 0.1em;
}
QAbstractSpinBox::drop-down:hover {
background-color: @darkalternativegradient;
}
QAbstractSpinBox::drop-down:disabled {
background-color: transparent !important;
}
/* ==================================================================================== */
/* CALENDAR
/* ==================================================================================== */
......@@ -234,8 +273,7 @@ QToolButton[popupMode="1"]
}
QToolButton::menu-button {
width: 0.8em;
border-width: 1px;
border-color: none;
border: 1px solid rgba(0,0,0,0);
border-radius: 0.2em;
background:@itemdarkbackground;
}
......@@ -313,7 +351,7 @@ QComboBox {
}
QComboBox:hover, QAbstractSpinBox:hover {
QComboBox:hover {
background-color: @darkalternativegradient;
}
......@@ -344,14 +382,18 @@ QComboBox QAbstractItemView, QComboBox QListView {
selection-color: @text;
}
QComboBox::drop-down {
subcontrol-origin: padding;
subcontrol-origin: border;
subcontrol-position: top right;
margin-right: 2px;
width: 0.8em;
border: 0px;
}
QComboBox::drop-down:editable {
subcontrol-origin: padding;
subcontrol-origin: border;
subcontrol-position: top right;
margin-top:1px;
margin-right:1px;
margin-bottom:1px;
width: 0.8em;
background-color: @darkgradient;
color:@itembackground;
......@@ -359,6 +401,9 @@ QComboBox::drop-down:editable {
border: 1px solid @itembackground;
border-radius: 0.1em;
}
QComboBox::drop-down:editable:hover {
background-color: @darkalternativegradient;
}
QComboBox::drop-down:editable:disabled {
background-color: transparent !important;
border-color: transparent !important;
......@@ -394,7 +439,7 @@ QComboBox::indicator {
QComboBox:editable {
padding: 0.12em;
border-width: 1px;
border-color: @itemdarkbackground;
border-color: #1e1e1e;
border-style: solid;
border-radius: 0.2em;
background-color:@itembackground;
......@@ -1042,6 +1087,7 @@ QVideoWidget QWidget {
QgsColorButton, QgsColorRampButton, QgsSymbolButton, QgsFontButton {
background-color: @darkgradient;
color:@itembackground;
border: 1px solid #1e1e1e;
}
QgsColorButton:hover, QgsColorRampButton:hover, QgsSymbolButton:hover, QgsFontButton:hover {
......
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg:svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xml:space="preserve"
viewBox="0 0 16 16"
height="16"
width="16"
y="0"
x="0"
id="Layer_1"
version="1.1"><svg:metadata
id="metadata9"><rdf:RDF><cc:Work><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></svg:metadata><svg:defs
id="defs7" /><script /><svg:rect
style="opacity:1;fill:#0f6e00;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
stroke-miterlimit="4"
y="0"
x="0"
height="16"
width="16"
id="rect819" /></svg:svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><metadata><rdf:RDF><cc:Work><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><script/><path d="m3.0847 8.9153 2.9153 3.0847 6.5961-9" fill="none" stroke="#dddddf" stroke-linecap="round" stroke-width="2"/></svg>
<svg:svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xml:space="preserve" viewBox="0 0 16 16" height="16" width="16" y="0" x="0" id="Layer_1" version="1.1" sodipodi:docname="qcheckbox-intermediary.svg" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"><sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1866" inkscape:window-height="1016" id="namedview6" showgrid="false" inkscape:zoom="5.215" inkscape:cx="58.067" inkscape:cy="-28.707" inkscape:window-x="54" inkscape:window-y="27" inkscape:window-maximized="1" inkscape:current-layer="Layer_1"/><svg:metadata id="metadata9"><rdf:RDF><cc:Work><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></svg:metadata><svg:defs id="defs7"/><script/><svg:rect stroke-miterlimit="4" y="0" x="0" height="16" width="16" id="rect819" opacity="1" fill="#0f6e00" fill-opacity="1" stroke="none" stroke-width="1" stroke-linecap="round" stroke-linejoin="miter" stroke-dasharray="none" stroke-dashoffset="0" stroke-opacity="1"/><svg:path d="M 16,0 V 16 H 0 Z" id="rect819-3" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc" opacity="1" fill="#535353" fill-opacity="1" stroke="none" stroke-width="1" stroke-linecap="round" stroke-linejoin="miter" stroke-miterlimit="4" stroke-dasharray="none" stroke-dashoffset="0" stroke-opacity="1"/></svg:svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><metadata><rdf:RDF><cc:Work><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><script/><path d="m3 8h10" fill="none" stroke="#ddd" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg:svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0"
y="0"
width="16"
height="16"
viewBox="0 0 16 16"
xml:space="preserve"
sodipodi:docname="qradiobox-checked.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)"><svg:metadata
id="metadata9"><rdf:RDF><cc:Work><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></svg:metadata><svg:defs
id="defs7" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1869"
inkscape:window-height="1053"
id="namedview5"
showgrid="true"
inkscape:zoom="41.724957"
inkscape:cx="8.4660539"
inkscape:cy="7.83762"
inkscape:window-x="51"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_1"><inkscape:grid
type="xygrid"
id="grid823" /></sodipodi:namedview><script /><svg:circle
style="opacity:1;vector-effect:none;fill:#0f6e00;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path814"
cx="8"
cy="8"
stroke-miterlimit="4"
r="8" /></svg:svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><metadata><rdf:RDF><cc:Work><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><script/><circle cx="8" cy="8" r="3.5" fill="#ddd" stroke="#ddd" stroke-linecap="round"/></svg>
0:#535353
0:#aaa
2:#323232
3:#ddd
5:#535353
6:#111111
9:#222222
6:#ddd
9:#202020
10:#535353
12:#d7801a
13:#323232
......
......@@ -57,41 +57,46 @@ QMenuBar::item:pressed
color: @text;
}
/* ==================================================================================== */
/* SPIN BOX */
/* ==================================================================================== */
QAbstractSpinBox {
padding: 0.12em 0em 0.12em 0.12em;
border: 1px solid #222;
border-radius:0px;
background-color: @darkgradient;
color:@text;
padding: 0.12em;
border: 1px solid @itemdarkbackground;
background-color: @itembackground;
selection-background-color: @selection;
selection-color: @text;
color: @textlight;
}
QAbstractSpinBox::up-button {
subcontrol-origin: border;
subcontrol-position: top right;
padding-top:0em;
padding-right:0.05em;
margin-top:2px;
margin-right:2px;
margin-bottom:-1px;
width: 0.8em;
height: 0.8em;
image: url(@theme_path/icons/arrow-up.svg);
background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 1 #4e4e4e);
border: 0;
}
QAbstractSpinBox::down-button {
subcontrol-origin: border;
subcontrol-position: bottom right;
padding-top:0.2em;
padding-right:0.05em;
margin-bottom:2px;
margin-right:2px;
margin-top:-1px;
width: 0.8em;
height: 0.8em;
image: url(@theme_path/icons/arrow-down.svg);
background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646);
border: 0;
}
QAbstractSpinBox::drop-down {
subcontrol-origin: border;
subcontrol-position: top right;
width: 0.8em;
border: 0px;
QAbstractSpinBox::up-arrow
{
image: url(@theme_path/icons/arrow-up.svg);
width: 0.8em;
height: 1.2em;
}
QAbstractSpinBox::down-arrow
......@@ -101,6 +106,30 @@ QAbstractSpinBox::down-arrow
height: 1.2em;
}
QAbstractSpinBox::up-button:hover, QAbstractSpinBox::down-button:hover {
background-color: @darkalternativegradient;
}
QAbstractSpinBox::up-button:disabled, QAbstractSpinBox::down-button:disabled {
background-color: transparent !important;
}
QAbstractSpinBox::drop-down {
subcontrol-origin: border;
subcontrol-position: top right;
margin-top:1px;
margin-right:1px;
margin-bottom:1px;
width: 0.8em;
background-color: @darkgradient;
color:@itembackground;
border: 1px solid #888;
}
QAbstractSpinBox::drop-down:hover {
background-color: @darkalternativegradient;
}
QAbstractSpinBox::drop-down:disabled {
background-color: transparent !important;
}
/* ==================================================================================== */
/* CALENDAR
/* ==================================================================================== */
......@@ -191,8 +220,8 @@ QWidget:disabled, QWidget:editable:disabled
QLineEdit
{
padding: 0.12em;
border: 1px solid #111;
background-color: #888;
border: 1px solid @itemdarkbackground;
background-color: @itembackground;
selection-background-color: @selection;
selection-color: @text;
}
......@@ -243,9 +272,7 @@ QToolButton[popupMode="1"]
}
QToolButton::menu-button {
width: 0.8em;
border-width: 1px;
border-color: none;
border-radius: 0px;
border: 1px solid rgba(0,0,0,0);
background:@itemdarkbackground;
}
QToolButton::hover, QToolButton::menu-button::hover
......@@ -316,13 +343,16 @@ QComboBox {
background-color: @darkgradient;
color:@text;
border-style: solid;
border: 1px solid #1e1e1e;
border: 1px solid @itembackground;
border-radius: 0px;
padding: 0.12em 1.2em 0.12em 0.2em;
}
QComboBox:disabled {
border-color: @itemdarkbackground;
}
QComboBox:hover,QAbstractSpinBox:hover {
QComboBox:hover {
background-color: @darkalternativegradient;
}
......@@ -353,18 +383,25 @@ QComboBox QAbstractItemView, QComboBox QListView {
selection-color: @text;
}
QComboBox::drop-down {
subcontrol-origin: padding;
subcontrol-origin: border;
subcontrol-position: top right;
margin-right: 2px;
width: 0.8em;
border: 0px;
}
QComboBox::drop-down:editable {
subcontrol-origin: padding;
subcontrol-origin: border;
subcontrol-position: top right;
margin-top:1px;
margin-right:1px;
margin-bottom:1px;
width: 0.8em;
background-color: @darkgradient;
color:@itembackground;
border: 1px solid #888;
border: 1px solid @itembackground;
}
QComboBox::drop-down:editable:hover {
background-color: @darkalternativegradient;
}
QComboBox::drop-down:editable:disabled {
background-color: transparent !important;
......@@ -400,11 +437,11 @@ QComboBox::indicator {
QComboBox:editable {
padding: 0.12em;
border: 1px solid #111;
background-color: #888;
border: 1px solid @itemdarkbackground;
background-color: @itembackground;
selection-background-color: @selection;
selection-color: @text;
color: #111;
color: @textlight;
}
/* ==================================================================================== */
......@@ -653,25 +690,29 @@ QGroupBox::title:disabled {
}
QGroupBox::indicator {
width: 0.9em;
height: 0.9em;
border:1px solid @itembackground;
background-color: @toggleoff;
width: 0.8em;
height: 0.8em;
}
QGroupBox::indicator:unchecked {
border: 1px solid @background;
image: url(@theme_path/icons/qcheckbox-unchecked.svg);
background-color: @toggleoff;
}
QGroupBox::indicator:unchecked:disabled {
image: url(@theme_path/icons/qcheckbox-unchecked-disabled.svg);
border-color: @itemdarkbackground;
background-color: rgba(0, 0, 0, 0);
}
QGroupBox::indicator:checked {
border: 1px solid @background;
background-color: @toggleon;
image: url(@theme_path/icons/qcheckbox-checked.svg);
}
QGroupBox::indicator:checked:disabled {
border-color: @itemdarkbackground;
background-color: rgba(0, 0, 0, 0);
image: url(@theme_path/icons/qcheckbox-checked-disabled.svg);
}
......@@ -683,29 +724,32 @@ QFrame, QFrame:disabled {
/* RADIO BUTTON */
/* ==================================================================================== */
QRadioButton::indicator
{
border: 1px solid @background;
QRadioButton::indicator {
border: 1px solid @itembackground;
border-radius:0.4em;
background-color: @toggleoff;
width:0.8em;
height:0.8em;
}
QRadioButton::indicator:unchecked
{
image: url(@theme_path/icons/qradiobox-unchecked.svg);
QRadioButton::indicator:unchecked {
background-color: @toggleoff;
}
QRadioButton::indicator:unchecked:disabled
{
image: url(@theme_path/icons/qradiobox-unchecked-disabled.svg);
QRadioButton::indicator:unchecked:disabled {
border-color: @itemdarkbackground;
background-color: rgba(0, 0, 0, 0);
}
QRadioButton::indicator:checked {
image: url(@theme_path/icons/qradiobox-checked.svg);
background-color: @toggleon;
}
QRadioButton::indicator:checked:disabled {
image: url(@theme_path/icons/qradiobox-checked-disabled.svg);
border-color: @itemdarkbackground;
background-color: rgba(0, 0, 0, 0);
}
QRadioButton:disabled {
......@@ -716,27 +760,31 @@ QRadioButton:disabled {
/* CHECKBOX */
/* ==================================================================================== */
QCheckBox::indicator
{
border: 1px solid @background;
QCheckBox::indicator {
border: 1px solid @itembackground;
background-color: @toggleoff;
width:0.8em;
height:0.8em;
}
QCheckBox::indicator:unchecked {
image: url(@theme_path/icons/qcheckbox-unchecked.svg);
background-color: @toggleoff;
}
QCheckBox::indicator:unchecked:disabled {
image: url(@theme_path/icons/qcheckbox-unchecked-disabled.svg);
border-color: @itemdarkbackground;
background-color: rgba(0, 0, 0, 0);
}
QCheckBox::indicator:checked {
image: url(@theme_path/icons/qcheckbox-checked.svg);
background-color: @toggleon;
}
QCheckBox::indicator:checked:disabled {
image: url(@theme_path/icons/qcheckbox-checked-disabled.svg);
image: url(@theme_path/icons/qcheckbox-checked.svg);
border-color: @itemdarkbackground;
background-color: rgba(0, 0, 0, 0);
}
QCheckBox:disabled {
......@@ -875,19 +923,21 @@ QTreeView::branch:open:has-children:has-siblings {
}
QTreeView::indicator {
border: 1px solid @itembackground;
background-color: @toggleoff;
width:0.8em;
height:0.8em;
}
QTreeView::indicator:intermediary {
border: 1px solid @background;
background-color: @toggleoff;
image: url(@theme_path/icons/qcheckbox-intermediary.svg);
}
QTreeView::indicator:checked {
border: 1px solid @background;
background-color: @toggleon;
image: url(@theme_path/icons/qcheckbox-checked.svg) !important;
}
QTreeView::indicator:unchecked {
border: 1px solid @background;
background-color: @toggleoff;
image: url(@theme_path/icons/qcheckbox-unchecked.svg);
}
......@@ -925,6 +975,7 @@ QTreeView#viewCategories::indicator:unchecked,
QTreeView#viewRules::indicator:unchecked
{
border: none;
background-color: transparent;
image: url(@theme_path/icons/eye-blocked.svg);
}
......@@ -934,6 +985,7 @@ QTreeView#viewCategories::indicator:checked,
QTreeView#viewRules::indicator:checked
{
border: none;
background-color: transparent;
image: url(@theme_path/icons/eye.svg);
}
......@@ -954,19 +1006,21 @@ QTableView:disabled {
}
QTableView::indicator {
border: 1px solid @itembackground;
background-color: @toggleoff;
width:0.8em;
height:0.8em;
}
QTableView::indicator:intermediary {
border: 1px solid @background;
background-color: @toggleoff;
image: url(@theme_path/icons/qcheckbox-intermediary.svg);
}
QTableView::indicator:checked {
border: 1px solid @background;
background-color: @toggleon;
image: url(@theme_path/icons/qcheckbox-checked.svg) !important;
}
QTableView::indicator:unchecked {
border: 1px solid @background;
background-color: @toggleoff;
image: url(@theme_path/icons/qcheckbox-unchecked.svg);
}
......@@ -1060,6 +1114,7 @@ QVideoWidget QWidget {
QgsColorButton, QgsColorRampButton, QgsSymbolButton, QgsFontButton {
background-color: @darkgradient;
color:@text;
border: 1px solid @itembackground;
}
QgsColorButton:hover, QgsColorRampButton:hover, QgsSymbolButton:hover, QgsFontButton:hover {
......@@ -1154,3 +1209,7 @@ QWidget#QgsRasterCalcDialogBase QWidget#mOperatorsGroupBox QPushButton {
QFrame#mUserInputContainer {
background-color: @background;
}
QgsLayoutRuler {
color: @textlight;
}
@background: #323232
@itembackground: #222
@itembackground: #202020
@itemalternativebackground: #9a9a9a
@itemdarkbackground: #535353
@darkgradient: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646)
......
......@@ -1025,6 +1025,13 @@ void QgsPluginManager::showPluginDetails( QStandardItem *item )
ver );
}
// use a localized date/time short format string
QString dateTimeFormat = QLocale().dateTimeFormat( QLocale::FormatType::ShortFormat );
if ( !dateTimeFormat.contains( "yyyy" ) )
{
// enforce year with 4 digits
dateTimeFormat.replace( "yy", "yyyy" );
}
// if we allow experimental, we show both stable and experimental versions
if ( ! metadata->value( QStringLiteral( "version_available_stable" ) ).isEmpty() )
{
......@@ -1040,7 +1047,7 @@ void QgsPluginManager::showPluginDetails( QStandardItem *item )
{
const QDateTime dateUpdated = QDateTime::fromString( metadata->value( QStringLiteral( "update_date_stable" ) ).trimmed(), Qt::ISODate );
if ( dateUpdated.isValid() )
dateUpdatedStr += tr( "updated at %1" ).arg( dateUpdated.toString() );
dateUpdatedStr += tr( "updated at %1" ).arg( QLocale().toString( dateUpdated, dateTimeFormat ) );
}
html += QStringLiteral( "<tr><td class='key'>%1 </td><td title='%2'><a href='%2'>%3</a> %4</td></tr>"
......@@ -1064,7 +1071,7 @@ void QgsPluginManager::showPluginDetails( QStandardItem *item )
{
const QDateTime dateUpdated = QDateTime::fromString( metadata->value( QStringLiteral( "update_date_experimental" ) ).trimmed(), Qt::ISODate );
if ( dateUpdated.isValid() )
dateUpdatedStr += tr( "updated at %1" ).arg( dateUpdated.toString() );
dateUpdatedStr += tr( "updated at %1" ).arg( QLocale().toString( dateUpdated, dateTimeFormat ) );
}
html += QStringLiteral( "<tr><td class='key'>%1 </td><td title='%2'><a href='%2'>%3</a> %4</td></tr>"
......
......@@ -1217,6 +1217,7 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipBadLayers
QgsGui::mapToolShapeRegistry()->addMapTool( new QgsMapToolShapeRegularPolygonCenterPointMetadata() );
QgsGui::mapToolShapeRegistry()->addMapTool( new QgsMapToolShapeRegularPolygonCenterCornerMetadata() );
functionProfile( &QgisApp::readSettings, this, QStringLiteral( "Read settings" ) );
functionProfile( &QgisApp::createToolBars, this, QStringLiteral( "Toolbars" ) );
functionProfile( &QgisApp::createStatusBar, this, QStringLiteral( "Status bar" ) );
functionProfile( &QgisApp::setupCanvasTools, this, QStringLiteral( "Create canvas tools" ) );
......@@ -1227,7 +1228,6 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipBadLayers
functionProfile( &QgisApp::createOverview, this, QStringLiteral( "Create overview" ) );
functionProfile( &QgisApp::createMapTips, this, QStringLiteral( "Create map tips" ) );
functionProfile( &QgisApp::createDecorations, this, QStringLiteral( "Create decorations" ) );
functionProfile( &QgisApp::readSettings, this, QStringLiteral( "Read settings" ) );
functionProfile( &QgisApp::updateProjectFromTemplates, this, QStringLiteral( "Update project from templates" ) );
functionProfile( &QgisApp::legendLayerSelectionChanged, this, QStringLiteral( "Legend layer selection changed" ) );
functionProfile( &QgisApp::init3D, this, QStringLiteral( "Initialize 3D support" ) );
......
......@@ -1366,14 +1366,19 @@ QPair<Qgis::WkbType, QString> QgsGeometryUtils::wktReadBlock( const QString &wkt
{
QString wktParsed = wkt;
QString contents;
if ( wkt.contains( QLatin1String( "EMPTY" ), Qt::CaseInsensitive ) )
const QLatin1String empty { "EMPTY" };
if ( wkt.contains( empty, Qt::CaseInsensitive ) )
{
const thread_local QRegularExpression sWktRegEx( QStringLiteral( "^\\s*(\\w+)\\s+(\\w+)\\s*$" ), QRegularExpression::DotMatchesEverythingOption );
const QRegularExpressionMatch match = sWktRegEx.match( wkt );
if ( match.hasMatch() )
const thread_local QRegularExpression whiteSpaces( "\\s" );
wktParsed.remove( whiteSpaces );
const int index = wktParsed.indexOf( empty, 0, Qt::CaseInsensitive );
if ( index == wktParsed.length() - empty.size() )
{
wktParsed = match.captured( 1 );
contents = match.captured( 2 ).toUpper();
// "EMPTY" found at the end of the QString
// Extract the part of the QString to the left of "EMPTY"
wktParsed = wktParsed.left( index );
contents = empty;
}
}
else
......
......@@ -13,6 +13,7 @@
* *
***************************************************************************/
#include "qgsapplication.h"
#include "qgscolorramplegendnode.h"
#include "qgscolorrampimpl.h"
#include "qgslegendsettings.h"
......@@ -23,6 +24,8 @@
#include "qgstextrenderer.h"
#include "qgsnumericformat.h"
#include <QPalette>
QgsColorRampLegendNode::QgsColorRampLegendNode( QgsLayerTreeLayer *nodeLayer, QgsColorRamp *ramp, const QString &minimumLabel, const QString &maximumLabel, QObject *parent )
: QgsLayerTreeModelLegendNode( nodeLayer, parent )
, mRamp( ramp )
......@@ -151,6 +154,7 @@ QVariant QgsColorRampLegendNode::data( int role ) const
QPainter p( &mPixmap );
p.drawPixmap( 0, 0, pix );
p.setFont( font );
p.setPen( qApp->palette().color( QPalette::Text ) );
switch ( mSettings.orientation() )
{
......
......@@ -239,7 +239,6 @@ void QgsLayoutItemAttributeTable::setMap( QgsLayoutItemMap *map )
//listen out for extent changes in linked map
connect( mMap, &QgsLayoutItemMap::extentChanged, this, &QgsLayoutTable::refreshAttributes );
connect( mMap, &QgsLayoutItemMap::mapRotationChanged, this, &QgsLayoutTable::refreshAttributes );
connect( mMap, &QObject::destroyed, this, &QgsLayoutItemAttributeTable::disconnectCurrentMap );
}
refreshAttributes();
emit changed();
......
......@@ -20,10 +20,10 @@
#include "qgis_core.h"
#include "qgis_sip.h"
#include "qgslayoutitemmap.h"
#include "qgslayouttable.h"
#include "qgsvectorlayerref.h"
class QgsLayoutItemMap;
class QgsVectorLayer;
/**
......@@ -331,7 +331,7 @@ class CORE_EXPORT QgsLayoutItemAttributeTable: public QgsLayoutTable
QgsVectorLayer *mCurrentAtlasLayer = nullptr;
//! Associated map (used to display the visible features)
QgsLayoutItemMap *mMap = nullptr;
QPointer< QgsLayoutItemMap > mMap = nullptr;
QString mMapUuid;
//! Maximum number of features that is displayed
......
......@@ -422,7 +422,7 @@ QVariantMap QgsProcessingModelAlgorithm::processAlgorithm( const QVariantMap &pa
QVariantMap results;
try
{
if ( childAlg->flags() & QgsProcessingAlgorithm::FlagNoThreading )
if ( ( childAlg->flags() & QgsProcessingAlgorithm::FlagNoThreading ) && ( QThread::currentThread() != qApp->thread() ) )
{
// child algorithm run step must be called on main thread
auto runOnMainThread = [modelThread, &context, &modelFeedback, &results, &childAlg, &childParams]
......
......@@ -13,6 +13,7 @@
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgsdatasourceuri.h"
#include "qgsprojectbadlayerhandler.h"
#include "qgslogger.h"
#include "qgsmessagelog.h"
......@@ -27,7 +28,7 @@ void QgsProjectBadLayerHandler::handleBadLayers( const QList<QDomNode> &layers )
for ( const QDomNode &layer : layers )
{
QgsMessageLog::logMessage( QObject::tr( " * %1" ).arg( dataSource( layer ) ) );
QgsMessageLog::logMessage( QObject::tr( " * %1" ).arg( QgsDataSourceUri::removePassword( dataSource( layer ) ) ) );
}
}
......
......@@ -85,8 +85,8 @@ QgsOwsConnection::QgsOwsConnection( const QString &service, const QString &connN
mUri.setParam( QStringLiteral( "url" ), url );
// Check for credentials and prepend to the connection info
const QString username = settingsUsername->value( {mService, mConnName} );
const QString password = settingsPassword->value( {mService, mConnName} );
const QString username = settingsUsername->value( {mService.toLower(), mConnName} );
const QString password = settingsPassword->value( {mService.toLower(), mConnName} );
if ( !username.isEmpty() )
{
// check for a password, if none prompt to get it
......@@ -94,7 +94,7 @@ QgsOwsConnection::QgsOwsConnection( const QString &service, const QString &connN
mUri.setPassword( password );
}
const QString authcfg = settingsAuthCfg->value( {mService, mConnName} );
const QString authcfg = settingsAuthCfg->value( {mService.toLower(), mConnName} );
if ( !authcfg.isEmpty() )
{
mUri.setAuthConfigId( authcfg );
......
......@@ -1226,6 +1226,9 @@ QList<QPolygonF> offsetLine( QPolygonF polyline, double dist, Qgis::GeometryType
QgsSymbol *QgsSymbolLayerUtils::loadSymbol( const QDomElement &element, const QgsReadWriteContext &context )
{
if ( element.isNull() )
return nullptr;
QgsSymbolLayerList layers;
QDomNode layerNode = element.firstChild();
......
......@@ -16,6 +16,7 @@
* *
***************************************************************************/
#include "qgsapplication.h"
#include "qgselevationprofilecanvas.h"
#include "qgsmaplayerlistutils_p.h"
#include "qgsplotcanvasitem.h"
......@@ -37,6 +38,7 @@
#include <QWheelEvent>
#include <QTimer>
#include <QPalette>
///@cond PRIVATE
class QgsElevationProfilePlotItem : public Qgs2DPlot, public QgsPlotCanvasItem
......@@ -372,6 +374,11 @@ QgsElevationProfileCanvas::QgsElevationProfileCanvas( QWidget *parent )
mScreenHelper = new QgsScreenHelper( this );
mPlotItem = new QgsElevationProfilePlotItem( this );
QgsTextFormat textFormat = mPlotItem->xAxis().textFormat();
textFormat.setColor( qApp->palette().color( QPalette::Text ) );
mPlotItem->xAxis().setTextFormat( textFormat );
mPlotItem->yAxis().setTextFormat( textFormat );
mCrossHairsItem = new QgsElevationProfileCrossHairsItem( this, mPlotItem );
mCrossHairsItem->setZValue( 100 );
mCrossHairsItem->hide();
......
......@@ -330,16 +330,16 @@ void QgsLayoutScaleBarWidget::setGuiElements()
if ( mScalebar->segmentSizeMode() == QgsScaleBarSettings::SegmentSizeFixed )
{
mFixedSizeRadio->setChecked( true );
mSegmentSizeSpinBox->setEnabled( true );
mMinWidthSpinBox->setEnabled( false );
mMaxWidthSpinBox->setEnabled( false );
mSegmentSizeWidget->setEnabled( true );
mMinWidthWidget->setEnabled( false );
mMaxWidthWidget->setEnabled( false );
}
else /*if(mComposerScaleBar->segmentSizeMode() == QgsComposerScaleBar::SegmentSizeFitWidth)*/
{
mFitWidthRadio->setChecked( true );
mSegmentSizeSpinBox->setEnabled( false );
mMinWidthSpinBox->setEnabled( true );
mMaxWidthSpinBox->setEnabled( true );
mSegmentSizeWidget->setEnabled( false );
mMinWidthWidget->setEnabled( true );
mMaxWidthWidget->setEnabled( true );
}
mMinWidthSpinBox->setValue( mScalebar->minimumBarWidth() );
mMaxWidthSpinBox->setValue( mScalebar->maximumBarWidth() );
......@@ -730,9 +730,9 @@ void QgsLayoutScaleBarWidget::disconnectUpdateSignal()
void QgsLayoutScaleBarWidget::segmentSizeRadioChanged( QAbstractButton *radio )
{
const bool fixedSizeMode = radio == mFixedSizeRadio;
mMinWidthSpinBox->setEnabled( !fixedSizeMode );
mMaxWidthSpinBox->setEnabled( !fixedSizeMode );
mSegmentSizeSpinBox->setEnabled( fixedSizeMode );
mMinWidthWidget->setEnabled( !fixedSizeMode );
mMaxWidthWidget->setEnabled( !fixedSizeMode );
mSegmentSizeWidget->setEnabled( fixedSizeMode );
if ( !mScalebar )
{
......
......@@ -42,7 +42,7 @@ QgsModelArrowItem::QgsModelArrowItem( QgsModelComponentGraphicItem *startItem, Q
{
setCacheMode( QGraphicsItem::DeviceCoordinateCache );
setFlag( QGraphicsItem::ItemIsSelectable, false );
mColor = QApplication::palette().color( QPalette::WindowText );
mColor = QApplication::palette().color( QPalette::Text );
mColor.setAlpha( 150 );
setPen( QPen( mColor, 8, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin ) );
setZValue( QgsModelGraphicsScene::ArrowLink );
......
......@@ -378,7 +378,7 @@ void QgsModelComponentGraphicItem::paint( QPainter *painter, const QStyleOptionG
painter->drawText( labelRect, Qt::TextWordWrap | Qt::AlignVCenter, text );
}
painter->setPen( QPen( QApplication::palette().color( QPalette::WindowText ) ) );
painter->setPen( QPen( QApplication::palette().color( QPalette::Text ) ) );
if ( linkPointCount( Qt::TopEdge ) || linkPointCount( Qt::BottomEdge ) )
{
......
......@@ -830,30 +830,7 @@ double QgsAdvancedDigitizingDockWidget::parseUserInput( const QString &inputValu
double value = qgsPermissiveToDouble( cleanedInputValue, ok );
if ( ok )
{
// Note: only distance is formatted for now, but it would be nice to
// handle other constraints in the future, this is the reason
// for the switch.
switch ( type )
{
case Qgis::CadConstraintType::Distance:
{
// Convert distance to meters
const double factorUnits = QgsUnitTypes::fromUnitToUnitFactor( distanceUnit, Qgis::DistanceUnit::Meters );
value *= factorUnits;
break;
}
case Qgis::CadConstraintType::Generic:
case Qgis::CadConstraintType::Angle:
case Qgis::CadConstraintType::ZValue:
case Qgis::CadConstraintType::MValue:
case Qgis::CadConstraintType::XCoordinate:
case Qgis::CadConstraintType::YCoordinate:
break;
}
}
else
if ( ! ok )
{
// try to evaluate expression
QgsExpression expr( inputValue );
......@@ -2033,11 +2010,8 @@ QString QgsAdvancedDigitizingDockWidget::CadConstraint::displayValue() const
}
case Qgis::CadConstraintType::Distance:
{
// Value is always in meters (cartesian) #spellok
const Qgis::DistanceUnit units { QgsProject::instance()->distanceUnits() };
const double factorUnits = QgsUnitTypes::fromUnitToUnitFactor( Qgis::DistanceUnit::Meters, units );
const double convertedValue { mValue * factorUnits };
return QgsDistanceArea::formatDistance( convertedValue, mPrecision, units, true );
return QgsDistanceArea::formatDistance( mValue, mPrecision, units, true );
}
case Qgis::CadConstraintType::Generic:
case Qgis::CadConstraintType::ZValue:
......
......@@ -97,7 +97,7 @@ void QgsMapCanvasAnnotationItem::updateBoundingRect()
const double fillSymbolBleed = mAnnotation && mAnnotation->fillSymbol() ?
QgsSymbolLayerUtils::estimateMaxSymbolBleed( mAnnotation->fillSymbol(), rc ) : 0;
const double mmToPixelScale = mMapCanvas->logicalDpiX() / 25.4;
const double mmToPixelScale = mMapCanvas->physicalDpiX() / 25.4;
if ( mAnnotation && !mAnnotation->hasFixedMapPosition() )
{
......
......@@ -48,6 +48,7 @@ QgsMapOverviewCanvas::QgsMapOverviewCanvas( QWidget *parent, QgsMapCanvas *mapCa
connect( mMapCanvas, &QgsMapCanvas::extentsChanged, this, &QgsMapOverviewCanvas::drawExtentRect );
connect( mMapCanvas, &QgsMapCanvas::destinationCrsChanged, this, &QgsMapOverviewCanvas::destinationCrsChanged );
connect( mMapCanvas, &QgsMapCanvas::transformContextChanged, this, &QgsMapOverviewCanvas::transformContextChanged );
connect( mMapCanvas, &QgsMapCanvas::canvasColorChanged, this, &QgsMapOverviewCanvas::refresh );
connect( QgsProject::instance()->viewSettings(), &QgsProjectViewSettings::presetFullExtentChanged, this, &QgsMapOverviewCanvas::refresh );
}
......@@ -73,11 +74,15 @@ void QgsMapOverviewCanvas::showEvent( QShowEvent *e )
void QgsMapOverviewCanvas::paintEvent( QPaintEvent *pe )
{
QPainter paint( this );
if ( !mPixmap.isNull() )
{
QPainter paint( this );
paint.drawPixmap( pe->rect().topLeft(), mPixmap, pe->rect() );
}
else
{
paint.fillRect( pe->rect(), QBrush( mSettings.backgroundColor() ) );
}
}
......
......@@ -41,6 +41,9 @@ QgsMetadataWidget::QgsMetadataWidget( QWidget *parent, QgsMapLayer *layer )
// Disable the encoding
encodingFrame->setHidden( true );
spinBoxZMinimum->setClearValue( 0 );
spinBoxZMaximum->setClearValue( 0 );
// Default categories, we want them translated, so we are not using a CSV.
mDefaultCategories << tr( "Farming" ) << tr( "Climatology Meteorology Atmosphere" ) << tr( "Location" ) << tr( "Intelligence Military" ) << tr( "Transportation" ) << tr( "Structure" ) << tr( "Boundaries" );
mDefaultCategories << tr( "Inland Waters" ) << tr( "Planning Cadastre" ) << tr( "Geoscientific Information" ) << tr( "Elevation" ) << tr( "Health" ) << tr( "Biota" ) << tr( "Oceans" ) << tr( "Environment" );
......
......@@ -34,10 +34,10 @@ QgsStatusBar::QgsStatusBar( QWidget *parent )
mLineEdit->setDisabled( true );
mLineEdit->setFrame( false );
mLineEdit->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum );
QPalette palette = mLineEdit->palette();
palette.setColor( QPalette::Disabled, QPalette::Text, QPalette::WindowText );
mLineEdit->setPalette( palette );
mLineEdit->setStyleSheet( QStringLiteral( "* { border: 0; background-color: rgba(0, 0, 0, 0); }" ) );
QPalette pal = mLineEdit->palette();
pal.setColor( QPalette::Disabled, QPalette::Text, palette().color( QPalette::WindowText ) );
mLineEdit->setPalette( pal );
mLineEdit->setStyleSheet( QStringLiteral( "* { border: 0; background-color: rgba(0, 0, 0, 0); color: %1; }" ).arg( palette().color( QPalette::WindowText ).name() ) );
mLayout->addWidget( mLineEdit, 10 );
setLayout( mLayout );
}
......
......@@ -224,7 +224,7 @@ void QgsSourceFieldsProperties::setRow( int row, int idx, const QgsField &field
expressionWidget->layout()->setContentsMargins( 0, 0, 0, 0 );
expressionWidget->layout()->addWidget( editExpressionButton );
expressionWidget->layout()->addWidget( new QLabel( mLayer->expressionField( idx ) ) );
expressionWidget->setStyleSheet( "background-color: rgb( 200, 200, 255 )" );
expressionWidget->setStyleSheet( "*[class~=\"QWidget\"] { background-color: rgba( 103, 0, 243, 0.12 ); } QToolButton { background-color: rgba( 203, 100, 243, 0.6 ); }" );
mFieldsList->setCellWidget( row, AttrCommentCol, expressionWidget );
}
else
......
......@@ -408,11 +408,7 @@ bool QgsGrass::init( void )
}
#endif
//QString p = getenv( "PATH" );
//path.append( sep + p );
QgsDebugMsgLevel( QStringLiteral( "sGrassModulesPaths = " ) + sGrassModulesPaths.join( ',' ), 2 );
//putEnv( "PATH", path );
// TODO: move where it is required for QProcess
// Set GRASS_PAGER if not set, it is necessary for some
......@@ -425,6 +421,12 @@ bool QgsGrass::init( void )
// MSYS terminal and built in shell.
if ( !getenv( "GRASS_PAGER" ) )
{
#ifdef Q_OS_WIN
// avoid finding pager in current directory
bool skipCurrentDirectory = getenv( "NoDefaultCurrentDirectoryInExePath" ) != nullptr;
if ( !skipCurrentDirectory )
putEnv( QStringLiteral( "NoDefaultCurrentDirectoryInExePath" ), "1" );
#endif
QString pager;
QStringList pagers;
//pagers << "more" << "less" << "cat"; // se notes above
......@@ -454,6 +456,11 @@ bool QgsGrass::init( void )
{
putEnv( QStringLiteral( "GRASS_PAGER" ), pager );
}
#ifdef Q_OS_WIN
if ( !skipCurrentDirectory )
putEnv( QStringLiteral( "NoDefaultCurrentDirectoryInExePath" ), "" );
#endif
}
sInitialized = 1;
}
......
......@@ -60,9 +60,9 @@
<property name="geometry">
<rect>
<x>0</x>
<y>-287</y>
<y>0</y>
<width>566</width>
<height>1061</height>
<height>1018</height>
</rect>
</property>
<layout class="QVBoxLayout" name="mainLayout">
......@@ -171,7 +171,7 @@
<property name="maximum">
<double>9999999999999.000000000000000</double>
</property>
<property name="showClearButton" stdset="0">
<property name="showClearButton">
<bool>false</bool>
</property>
</widget>
......@@ -276,36 +276,6 @@
</item>
</layout>
</item>
<item row="2" column="2">
<layout class="QHBoxLayout" name="horizontalLayout3">
<item>
<widget class="QgsDoubleSpinBox" name="mSegmentSizeSpinBox">
<property name="toolTip">
<string>Number of scalebar units per scalebar segment</string>
</property>
<property name="suffix">
<string> units</string>
</property>
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>9999999999999.000000000000000</double>
</property>
<property name="showClearButton" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QgsPropertyOverrideButton" name="mSegmentSizeDDBtn">
<property name="text">
<string></string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="2">
<layout class="QHBoxLayout" name="horizontalLayout1">
<item>
......@@ -358,54 +328,6 @@
</item>
</layout>
</item>
<item row="4" column="2">
<layout class="QHBoxLayout" name="horizontalLayout5">
<item>
<widget class="QgsDoubleSpinBox" name="mMaxWidthSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="suffix">
<string> mm</string>
</property>
<property name="maximum">
<double>999.990000000000009</double>
</property>
</widget>
</item>
<item>
<widget class="QgsPropertyOverrideButton" name="mMaxWidthDDBtn">
<property name="text">
<string></string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="2">
<layout class="QHBoxLayout" name="horizontalLayout4">
<item>
<widget class="QgsDoubleSpinBox" name="mMinWidthSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="suffix">
<string> mm</string>
</property>
<property name="maximum">
<double>999.990000000000009</double>
</property>
</widget>
</item>
<item>
<widget class="QgsPropertyOverrideButton" name="mMinWidthDDBtn">
<property name="text">
<string></string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="2">
<layout class="QHBoxLayout" name="horizontalLayout2">
<item>
......@@ -478,6 +400,126 @@
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QWidget" name="mMinWidthWidget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout4">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QgsDoubleSpinBox" name="mMinWidthSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="suffix">
<string> mm</string>
</property>
<property name="maximum">
<double>999.990000000000009</double>
</property>
</widget>
</item>
<item>
<widget class="QgsPropertyOverrideButton" name="mMinWidthDDBtn">
<property name="text">
<string></string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="4" column="2">
<widget class="QWidget" name="mMaxWidthWidget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout5">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QgsDoubleSpinBox" name="mMaxWidthSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="suffix">
<string> mm</string>
</property>
<property name="maximum">
<double>999.990000000000009</double>
</property>
</widget>
</item>
<item>
<widget class="QgsPropertyOverrideButton" name="mMaxWidthDDBtn">
<property name="text">
<string></string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="2">
<widget class="QWidget" name="mSegmentSizeWidget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QgsDoubleSpinBox" name="mSegmentSizeSpinBox">
<property name="toolTip">
<string>Number of scalebar units per scalebar segment</string>
</property>
<property name="suffix">
<string> units</string>
</property>
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>9999999999999.000000000000000</double>
</property>
<property name="showClearButton">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QgsPropertyOverrideButton" name="mSegmentSizeDDBtn">
<property name="text">
<string></string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
......@@ -691,11 +733,6 @@
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
<customwidget>
<class>QgsSpinBox</class>
<extends>QSpinBox</extends>
<header>qgsspinbox.h</header>
</customwidget>
<customwidget>
<class>QgsDoubleSpinBox</class>
<extends>QDoubleSpinBox</extends>
......@@ -711,6 +748,16 @@
<extends>QToolButton</extends>
<header>qgspropertyoverridebutton.h</header>
</customwidget>
<customwidget>
<class>QgsSpinBox</class>
<extends>QSpinBox</extends>
<header>qgsspinbox.h</header>
</customwidget>
<customwidget>
<class>QgsSymbolButton</class>
<extends>QToolButton</extends>
<header>qgssymbolbutton.h</header>
</customwidget>
<customwidget>
<class>QgsScrollArea</class>
<extends>QScrollArea</extends>
......@@ -734,11 +781,6 @@
<extends>QComboBox</extends>
<header>qgsalignmentcombobox.h</header>
</customwidget>
<customwidget>
<class>QgsSymbolButton</class>
<extends>QToolButton</extends>
<header>qgssymbolbutton.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>scrollArea</tabstop>
......
......@@ -976,7 +976,14 @@
</widget>
</item>
<item>
<widget class="QgsSpinBox" name="spinBoxZMaximum"/>
<widget class="QgsDoubleSpinBox" name="spinBoxZMaximum">
<property name="minimum">
<double>-9999999999.000000000000000</double>
</property>
<property name="maximum">
<double>9999999999.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
......@@ -990,7 +997,14 @@
</widget>
</item>
<item>
<widget class="QgsSpinBox" name="spinBoxZMinimum"/>
<widget class="QgsDoubleSpinBox" name="spinBoxZMinimum">
<property name="minimum">
<double>-9999999999.000000000000000</double>
</property>
<property name="maximum">
<double>9999999999.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
......@@ -1574,17 +1588,17 @@
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsDoubleSpinBox</class>
<extends>QDoubleSpinBox</extends>
<header>qgsdoublespinbox.h</header>
</customwidget>
<customwidget>
<class>QgsScrollArea</class>
<extends>QScrollArea</extends>
<header>qgsscrollarea.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsSpinBox</class>
<extends>QSpinBox</extends>
<header>qgsspinbox.h</header>
</customwidget>
<customwidget>
<class>QgsCollapsibleGroupBox</class>
<extends>QGroupBox</extends>
......
......@@ -984,6 +984,7 @@ namespace
inline void testCreateEmptyWithSameType()
{
std::unique_ptr<QgsAbstractGeometry> geom { new T() };
std::unique_ptr<QgsAbstractGeometry> geomResult { new T() };
std::unique_ptr<QgsAbstractGeometry> created { TestQgsGeometry::createEmpty( geom.get() ) };
QVERIFY( created->isEmpty() );
#if defined(__clang__) || defined(__GNUG__)
......@@ -997,7 +998,7 @@ namespace
// remove Qgs prefix
type = type.right( type.count() - 3 );
QStringList extensionZM;
extensionZM << QString() << QString( "Z" ) << QString( "M" ) << QString( "ZM" );
extensionZM << QString() << QString( "Z" ) << QString( "M" ) << QString( "ZM" ) << QString( " Z" ) << QString( " M" ) << QString( " ZM" ) << QString( "Z M" ) << QString( " Z M" );
for ( const QString &ext : extensionZM )
{
QString wkt = type + ext;
......@@ -1015,10 +1016,10 @@ namespace
QString generatedWkt = spacesBefore + wkt + spacesMiddle + emptyStringList.at( j ) + spacesAfter;
QgsGeometry gWkt = QgsGeometry::fromWkt( generatedWkt );
QVERIFY( gWkt.asWkt().compare( result, Qt::CaseInsensitive ) == 0 );
QVERIFY( geom->fromWkt( generatedWkt ) );
QVERIFY( geom->asWkt().compare( result, Qt::CaseInsensitive ) == 0 );
QVERIFY( geomResult->fromWkt( result ) );
QCOMPARE( geom->asWkt(), geomResult->asWkt() );
}
}
}
......
......@@ -119,15 +119,15 @@ void TestQgsAdvancedDigitizingDockWidget::parseUserInput()
QgsProject::instance()->setDistanceUnits( Qgis::DistanceUnit::NauticalMiles );
result = widget.parseUserInput( QStringLiteral( "120.123" ), Qgis::CadConstraintType::Distance, ok );
QCOMPARE( result, 222467.796 );
QCOMPARE( result, 120.123 );
QVERIFY( ok );
result = widget.parseUserInput( QStringLiteral( "120.123 NM" ), Qgis::CadConstraintType::Distance, ok );
QCOMPARE( result, 222467.796 );
QCOMPARE( result, 120.123 );
QVERIFY( ok );
result = widget.parseUserInput( QStringLiteral( "120.123NM" ), Qgis::CadConstraintType::Distance, ok );
QCOMPARE( result, 222467.796 );
QCOMPARE( result, 120.123 );
QVERIFY( ok );
}
......
......@@ -34,7 +34,7 @@ class TestPyQgsExternalStorageAwsS3(TestPyQgsExternalStorageBase, unittest.TestC
super().setUpClass()
unittest.TestCase.setUpClass()
bucket_name = "test_bucket"
bucket_name = "test-bucket"
cls.auth_config = QgsAuthMethodConfig("AWSS3")
cls.auth_config.setConfig("username", "minioadmin")
......