diff options
Diffstat (limited to 'src/widgets/styles')
115 files changed, 2255 insertions, 1626 deletions
diff --git a/src/widgets/styles/images/cleartext-128.png b/src/widgets/styles/images/cleartext-128.png Binary files differnew file mode 100644 index 0000000000..b5a2ceb233 --- /dev/null +++ b/src/widgets/styles/images/cleartext-128.png diff --git a/src/widgets/styles/images/cleartext-16.png b/src/widgets/styles/images/cleartext-16.png Binary files differindex 74133bafff..53c42929cb 100644 --- a/src/widgets/styles/images/cleartext-16.png +++ b/src/widgets/styles/images/cleartext-16.png diff --git a/src/widgets/styles/images/cleartext-32.png b/src/widgets/styles/images/cleartext-32.png Binary files differindex ff5a2b5ec1..e7ecf70d6d 100644 --- a/src/widgets/styles/images/cleartext-32.png +++ b/src/widgets/styles/images/cleartext-32.png diff --git a/src/widgets/styles/images/cleartext.svg b/src/widgets/styles/images/cleartext.svg new file mode 100644 index 0000000000..d93c0c6b96 --- /dev/null +++ b/src/widgets/styles/images/cleartext.svg @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<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="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="0px" + y="0px" + viewBox="0 0 16 16" + style="enable-background:new 0 0 16 16;" + xml:space="preserve" + sodipodi:docname="cleartext.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata + id="metadata15"><rdf:RDF><cc:Work + rdf:about=""><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></metadata><defs + id="defs13" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="918" + id="namedview11" + showgrid="false" + inkscape:zoom="33.14563" + inkscape:cx="1.0250743" + inkscape:cy="9.2813006" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" /> +<style + type="text/css" + id="style2"> + .st0{fill:none;} +</style> + +<circle + style="fill:#4d4d4d;fill-opacity:1;stroke:none;stroke-width:0.0875;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path873" + cx="8" + cy="8" + r="7" + inkscape:label="circle" /><rect + id="rect19" + width="2.0723703" + height="9.2413387" + x="10.277523" + y="-4.6206694" + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.101216;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + transform="rotate(44.999999)" + inkscape:label="rect2" /><rect + id="rect19-6" + width="2.0723705" + height="9.2413378" + x="-1.0361853" + y="6.6930394" + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.101217;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + transform="rotate(-45)" + inkscape:label="rect1" + sodipodi:insensitive="true" /></svg> diff --git a/src/widgets/styles/images/critical-128.png b/src/widgets/styles/images/critical-128.png Binary files differnew file mode 100644 index 0000000000..329963cb38 --- /dev/null +++ b/src/widgets/styles/images/critical-128.png diff --git a/src/widgets/styles/images/critical-16.png b/src/widgets/styles/images/critical-16.png Binary files differnew file mode 100644 index 0000000000..d9da98beee --- /dev/null +++ b/src/widgets/styles/images/critical-16.png diff --git a/src/widgets/styles/images/critical-32.png b/src/widgets/styles/images/critical-32.png Binary files differnew file mode 100644 index 0000000000..04d52591c3 --- /dev/null +++ b/src/widgets/styles/images/critical-32.png diff --git a/src/widgets/styles/images/filedialog_end-128.png b/src/widgets/styles/images/filedialog_end-128.png Binary files differnew file mode 100644 index 0000000000..f634792d2a --- /dev/null +++ b/src/widgets/styles/images/filedialog_end-128.png diff --git a/src/widgets/styles/images/filedialog_end-16.png b/src/widgets/styles/images/filedialog_end-16.png Binary files differnew file mode 100644 index 0000000000..51fe8d1559 --- /dev/null +++ b/src/widgets/styles/images/filedialog_end-16.png diff --git a/src/widgets/styles/images/filedialog_end-32.png b/src/widgets/styles/images/filedialog_end-32.png Binary files differnew file mode 100644 index 0000000000..faa3a10293 --- /dev/null +++ b/src/widgets/styles/images/filedialog_end-32.png diff --git a/src/widgets/styles/images/filedialog_start-128.png b/src/widgets/styles/images/filedialog_start-128.png Binary files differnew file mode 100644 index 0000000000..f1272bd169 --- /dev/null +++ b/src/widgets/styles/images/filedialog_start-128.png diff --git a/src/widgets/styles/images/filedialog_start-16.png b/src/widgets/styles/images/filedialog_start-16.png Binary files differnew file mode 100644 index 0000000000..04430f53c9 --- /dev/null +++ b/src/widgets/styles/images/filedialog_start-16.png diff --git a/src/widgets/styles/images/filedialog_start-32.png b/src/widgets/styles/images/filedialog_start-32.png Binary files differnew file mode 100644 index 0000000000..c8b81a5ec7 --- /dev/null +++ b/src/widgets/styles/images/filedialog_start-32.png diff --git a/src/widgets/styles/images/fusion_closedock-10.png b/src/widgets/styles/images/fusion_closedock-10.png Binary files differnew file mode 100644 index 0000000000..d0c34d618b --- /dev/null +++ b/src/widgets/styles/images/fusion_closedock-10.png diff --git a/src/widgets/styles/images/fusion_closedock-16.png b/src/widgets/styles/images/fusion_closedock-16.png Binary files differnew file mode 100644 index 0000000000..889c91e43f --- /dev/null +++ b/src/widgets/styles/images/fusion_closedock-16.png diff --git a/src/widgets/styles/images/fusion_closedock-20.png b/src/widgets/styles/images/fusion_closedock-20.png Binary files differnew file mode 100644 index 0000000000..9076683d11 --- /dev/null +++ b/src/widgets/styles/images/fusion_closedock-20.png diff --git a/src/widgets/styles/images/fusion_closedock-32.png b/src/widgets/styles/images/fusion_closedock-32.png Binary files differnew file mode 100644 index 0000000000..a2a3328a50 --- /dev/null +++ b/src/widgets/styles/images/fusion_closedock-32.png diff --git a/src/widgets/styles/images/fusion_closedock-48.png b/src/widgets/styles/images/fusion_closedock-48.png Binary files differnew file mode 100644 index 0000000000..e915a1098b --- /dev/null +++ b/src/widgets/styles/images/fusion_closedock-48.png diff --git a/src/widgets/styles/images/fusion_closedock-64.png b/src/widgets/styles/images/fusion_closedock-64.png Binary files differnew file mode 100644 index 0000000000..73c60feb6a --- /dev/null +++ b/src/widgets/styles/images/fusion_closedock-64.png diff --git a/src/widgets/styles/images/fusion_closedock.svg b/src/widgets/styles/images/fusion_closedock.svg new file mode 100644 index 0000000000..eb5e472ce2 --- /dev/null +++ b/src/widgets/styles/images/fusion_closedock.svg @@ -0,0 +1,87 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<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="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="0px" + y="0px" + width="8px" + height="8px" + viewBox="0 0 8 8" + style="enable-background:new 0 0 8 8;" + xml:space="preserve" + sodipodi:docname="fusion_closedock.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + inkscape:export-filename="/home/chehrlic/kde/qt.src/qtbase/src/widgets/styles/images/fusion_closedock-64.png" + inkscape:export-xdpi="768" + inkscape:export-ydpi="768"><metadata + id="metadata120"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs118"> + + + + + + </defs><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="917" + id="namedview116" + showgrid="false" + inkscape:zoom="63.727999" + inkscape:cx="5.1718865" + inkscape:cy="4.7238684" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" + inkscape:document-rotation="0" /> +<style + type="text/css" + id="style101"> + .st0{fill:none;} + .st1{fill:#353637;} +</style> +<g + id="g105"> + + </g> +<g + id="g981"><rect + x="5.1188383" + y="-2.9975181" + transform="rotate(45.000001)" + class="st1" + width="1.0760319" + height="5.9950356" + id="rect107" + style="fill:#6c6a67;fill-opacity:1;stroke-width:0.768594" /><rect + x="-0.53801638" + y="-8.6545134" + transform="rotate(135)" + class="st1" + width="1.0760319" + height="5.9950356" + id="rect109" + style="fill:#6c6a67;fill-opacity:1;stroke-width:0.768594" /><rect + style="fill:none;stroke:#6c6a67;stroke-width:0.469731;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect151" + width="6.5302691" + height="6.5302691" + x="0.73486549" + y="0.73486549" /></g></svg> diff --git a/src/widgets/styles/images/fusion_normalizedockup-16.png b/src/widgets/styles/images/fusion_normalizedockup-16.png Binary files differnew file mode 100644 index 0000000000..9e8d1f4716 --- /dev/null +++ b/src/widgets/styles/images/fusion_normalizedockup-16.png diff --git a/src/widgets/styles/images/fusion_normalizedockup-32.png b/src/widgets/styles/images/fusion_normalizedockup-32.png Binary files differnew file mode 100644 index 0000000000..453449cc7d --- /dev/null +++ b/src/widgets/styles/images/fusion_normalizedockup-32.png diff --git a/src/widgets/styles/images/fusion_normalizedockup.svg b/src/widgets/styles/images/fusion_normalizedockup.svg new file mode 100644 index 0000000000..0d7068b563 --- /dev/null +++ b/src/widgets/styles/images/fusion_normalizedockup.svg @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<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="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="0px" + y="0px" + width="8px" + height="8px" + viewBox="0 0 8 8" + style="enable-background:new 0 0 8 8;" + xml:space="preserve" + sodipodi:docname="fusion_normalizedockup.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + inkscape:export-filename="/home/chehrlic/kde/qt.src/qtbase/src/widgets/styles/images/fusion_normalizedockup_64.png" + inkscape:export-xdpi="768" + inkscape:export-ydpi="768"><metadata + id="metadata120"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs118"> + + + + + + </defs><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="917" + id="namedview116" + showgrid="false" + inkscape:zoom="63.727999" + inkscape:cx="3.979318" + inkscape:cy="4.7238684" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="g1123" + inkscape:document-rotation="0" /> +<style + type="text/css" + id="style101"> + .st0{fill:none;} + .st1{fill:#353637;} +</style> + +<rect + style="fill:none;stroke:#6c6a67;stroke-width:0.469731;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect151" + width="6.5302691" + height="6.5302691" + x="0.73486549" + y="0.73486549" /><g + id="g1123" + transform="matrix(0.85891433,0,0,0.86643038,0.5610817,0.55019701)"><path + id="rect151-3-6" + style="fill:none;stroke:#6c6a67;stroke-width:0.5;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 2.6347656,1.6347656 v 1 h 2.7304688 v 2.7304688 h 1 V 1.6347656 Z" /><path + style="fill:none;fill-opacity:1;stroke:#6c6a67;stroke-width:0.5;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 1.634209,2.6342089 H 5.3657907 V 6.3657906 H 1.634209 Z" + id="rect151-3" /></g></svg> diff --git a/src/widgets/styles/images/fusion_normalizedockup_10.png b/src/widgets/styles/images/fusion_normalizedockup_10.png Binary files differnew file mode 100644 index 0000000000..7516e4ee4f --- /dev/null +++ b/src/widgets/styles/images/fusion_normalizedockup_10.png diff --git a/src/widgets/styles/images/fusion_normalizedockup_20.png b/src/widgets/styles/images/fusion_normalizedockup_20.png Binary files differnew file mode 100644 index 0000000000..2bc9421d5a --- /dev/null +++ b/src/widgets/styles/images/fusion_normalizedockup_20.png diff --git a/src/widgets/styles/images/fusion_normalizedockup_48.png b/src/widgets/styles/images/fusion_normalizedockup_48.png Binary files differnew file mode 100644 index 0000000000..6c497abdde --- /dev/null +++ b/src/widgets/styles/images/fusion_normalizedockup_48.png diff --git a/src/widgets/styles/images/fusion_normalizedockup_64.png b/src/widgets/styles/images/fusion_normalizedockup_64.png Binary files differnew file mode 100644 index 0000000000..5ec620e5a0 --- /dev/null +++ b/src/widgets/styles/images/fusion_normalizedockup_64.png diff --git a/src/widgets/styles/images/fusion_titlebar-min-10.png b/src/widgets/styles/images/fusion_titlebar-min-10.png Binary files differnew file mode 100644 index 0000000000..97b1ab88c3 --- /dev/null +++ b/src/widgets/styles/images/fusion_titlebar-min-10.png diff --git a/src/widgets/styles/images/fusion_titlebar-min-16.png b/src/widgets/styles/images/fusion_titlebar-min-16.png Binary files differnew file mode 100644 index 0000000000..b318a232b3 --- /dev/null +++ b/src/widgets/styles/images/fusion_titlebar-min-16.png diff --git a/src/widgets/styles/images/fusion_titlebar-min-20.png b/src/widgets/styles/images/fusion_titlebar-min-20.png Binary files differnew file mode 100644 index 0000000000..4a6012bd2b --- /dev/null +++ b/src/widgets/styles/images/fusion_titlebar-min-20.png diff --git a/src/widgets/styles/images/fusion_titlebar-min-32.png b/src/widgets/styles/images/fusion_titlebar-min-32.png Binary files differnew file mode 100644 index 0000000000..6e1c94827e --- /dev/null +++ b/src/widgets/styles/images/fusion_titlebar-min-32.png diff --git a/src/widgets/styles/images/fusion_titlebar-min-48.png b/src/widgets/styles/images/fusion_titlebar-min-48.png Binary files differnew file mode 100644 index 0000000000..a79724f3ea --- /dev/null +++ b/src/widgets/styles/images/fusion_titlebar-min-48.png diff --git a/src/widgets/styles/images/fusion_titlebar-min-64.png b/src/widgets/styles/images/fusion_titlebar-min-64.png Binary files differnew file mode 100644 index 0000000000..5dba9a0979 --- /dev/null +++ b/src/widgets/styles/images/fusion_titlebar-min-64.png diff --git a/src/widgets/styles/images/fusion_titlebar-min.svg b/src/widgets/styles/images/fusion_titlebar-min.svg new file mode 100644 index 0000000000..9f6350c8bf --- /dev/null +++ b/src/widgets/styles/images/fusion_titlebar-min.svg @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<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="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="0px" + y="0px" + width="8px" + height="8px" + viewBox="0 0 8 8" + style="enable-background:new 0 0 8 8;" + xml:space="preserve" + sodipodi:docname="fusion_titlebar-min.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + inkscape:export-filename="/home/chehrlic/kde/qt.src/qtbase/src/widgets/styles/images/fusion_titlebar-min-64.png" + inkscape:export-xdpi="768" + inkscape:export-ydpi="768"><metadata + id="metadata120"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs118"> + + + + + + </defs><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="917" + id="namedview116" + showgrid="false" + inkscape:zoom="45.0625" + inkscape:cx="-0.80217757" + inkscape:cy="6.6858335" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" + inkscape:document-rotation="0" /> +<style + type="text/css" + id="style101"> + .st0{fill:none;} + .st1{fill:#353637;} +</style> + +<rect + style="fill:#6c6a67;fill-opacity:1;stroke:none;stroke-width:0.529435;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect1157" + width="5.5" + height="1.5" + x="1" + y="5.5" /></svg> diff --git a/src/widgets/styles/images/information-128.png b/src/widgets/styles/images/information-128.png Binary files differnew file mode 100644 index 0000000000..2feebc4598 --- /dev/null +++ b/src/widgets/styles/images/information-128.png diff --git a/src/widgets/styles/images/information-16.png b/src/widgets/styles/images/information-16.png Binary files differnew file mode 100644 index 0000000000..deb24c71ab --- /dev/null +++ b/src/widgets/styles/images/information-16.png diff --git a/src/widgets/styles/images/information-32.png b/src/widgets/styles/images/information-32.png Binary files differnew file mode 100644 index 0000000000..83b32b737a --- /dev/null +++ b/src/widgets/styles/images/information-32.png diff --git a/src/widgets/styles/images/media-pause-128.png b/src/widgets/styles/images/media-pause-128.png Binary files differnew file mode 100644 index 0000000000..897ad3c80f --- /dev/null +++ b/src/widgets/styles/images/media-pause-128.png diff --git a/src/widgets/styles/images/media-pause-16.png b/src/widgets/styles/images/media-pause-16.png Binary files differindex 6cb1fd7f63..862fd49746 100644 --- a/src/widgets/styles/images/media-pause-16.png +++ b/src/widgets/styles/images/media-pause-16.png diff --git a/src/widgets/styles/images/media-pause-32.png b/src/widgets/styles/images/media-pause-32.png Binary files differindex 3f172a04d6..ce9b706674 100644 --- a/src/widgets/styles/images/media-pause-32.png +++ b/src/widgets/styles/images/media-pause-32.png diff --git a/src/widgets/styles/images/media-pause.svg b/src/widgets/styles/images/media-pause.svg new file mode 100644 index 0000000000..c13a4ef400 --- /dev/null +++ b/src/widgets/styles/images/media-pause.svg @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<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="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="0px" + y="0px" + viewBox="0 0 16 16" + style="enable-background:new 0 0 16 16;" + xml:space="preserve" + sodipodi:docname="media-pause.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + inkscape:export-filename="/home/chehrlic/kde/qt.src/qtbase/src/widgets/styles/images/media-pause-128.png" + inkscape:export-xdpi="768" + inkscape:export-ydpi="768"><metadata + id="metadata15"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs13" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="918" + id="namedview11" + showgrid="true" + inkscape:zoom="16.572815" + inkscape:cx="13.411945" + inkscape:cy="7.5009653" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" + inkscape:document-rotation="0"><inkscape:grid + type="xygrid" + id="grid925" /></sodipodi:namedview> +<style + type="text/css" + id="style2"> + .st0{fill:none;} +</style> + +<g + id="g1774"><rect + style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.0575" + id="rect1755" + width="3" + height="10" + x="3.5" + y="3" /><rect + style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.0575" + id="rect1755-3" + width="3" + height="10" + x="9.5" + y="3" /></g></svg> diff --git a/src/widgets/styles/images/media-play-128.png b/src/widgets/styles/images/media-play-128.png Binary files differnew file mode 100644 index 0000000000..22b260891f --- /dev/null +++ b/src/widgets/styles/images/media-play-128.png diff --git a/src/widgets/styles/images/media-play-16.png b/src/widgets/styles/images/media-play-16.png Binary files differindex d7ee3ccbe3..60e86d7fe8 100644 --- a/src/widgets/styles/images/media-play-16.png +++ b/src/widgets/styles/images/media-play-16.png diff --git a/src/widgets/styles/images/media-play-32.png b/src/widgets/styles/images/media-play-32.png Binary files differindex af8d2f7ba5..d51e130fec 100644 --- a/src/widgets/styles/images/media-play-32.png +++ b/src/widgets/styles/images/media-play-32.png diff --git a/src/widgets/styles/images/media-play.svg b/src/widgets/styles/images/media-play.svg new file mode 100644 index 0000000000..b0130735f1 --- /dev/null +++ b/src/widgets/styles/images/media-play.svg @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<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="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="0px" + y="0px" + viewBox="0 0 16 16" + style="enable-background:new 0 0 16 16;" + xml:space="preserve" + sodipodi:docname="media-play.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + inkscape:export-filename="/home/chehrlic/kde/qt.src/qtbase/src/widgets/styles/images/media-play-128.png" + inkscape:export-xdpi="768" + inkscape:export-ydpi="768"><metadata + id="metadata15"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs13" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="918" + id="namedview11" + showgrid="true" + inkscape:zoom="33.14563" + inkscape:cx="11.425943" + inkscape:cy="9.1913339" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" + inkscape:document-rotation="0"><inkscape:grid + type="xygrid" + id="grid925" /></sodipodi:namedview> +<style + type="text/css" + id="style2"> + .st0{fill:none;} +</style> + +<path + id="rect873" + style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.93347" + d="M 3 3 L 3 13 L 12.896484 8 L 3 3 z " /></svg> diff --git a/src/widgets/styles/images/media-seek-backward-128.png b/src/widgets/styles/images/media-seek-backward-128.png Binary files differnew file mode 100644 index 0000000000..3d4470bd5c --- /dev/null +++ b/src/widgets/styles/images/media-seek-backward-128.png diff --git a/src/widgets/styles/images/media-seek-backward-16.png b/src/widgets/styles/images/media-seek-backward-16.png Binary files differindex b8a8ea42d1..8bfba869e0 100644 --- a/src/widgets/styles/images/media-seek-backward-16.png +++ b/src/widgets/styles/images/media-seek-backward-16.png diff --git a/src/widgets/styles/images/media-seek-backward-32.png b/src/widgets/styles/images/media-seek-backward-32.png Binary files differindex a21d1372fe..9148f8a0c6 100644 --- a/src/widgets/styles/images/media-seek-backward-32.png +++ b/src/widgets/styles/images/media-seek-backward-32.png diff --git a/src/widgets/styles/images/media-seek-backward.svg b/src/widgets/styles/images/media-seek-backward.svg new file mode 100644 index 0000000000..13e1e67e6b --- /dev/null +++ b/src/widgets/styles/images/media-seek-backward.svg @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<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="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="0px" + y="0px" + viewBox="0 0 16 16" + style="enable-background:new 0 0 16 16;" + xml:space="preserve" + sodipodi:docname="media-seek-backward.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + inkscape:export-filename="/home/chehrlic/kde/qt.src/qtbase/src/widgets/styles/images/media-seek-backward-128.png" + inkscape:export-xdpi="768" + inkscape:export-ydpi="768"><metadata + id="metadata15"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs13" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="918" + id="namedview11" + showgrid="true" + inkscape:zoom="33.14563" + inkscape:cx="12.532344" + inkscape:cy="7.584329" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" + inkscape:document-rotation="0"><inkscape:grid + type="xygrid" + id="grid925" /></sodipodi:namedview> +<style + type="text/css" + id="style2"> + .st0{fill:none;} +</style> + +<g + id="g1560" + transform="rotate(180,8,7.9999997)"><path + id="rect873" + style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.45442" + d="m 2,4 v 8 L 9,7.9999998 Z" /><path + id="rect873-5" + style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.45442" + d="m 7,4 v 8 l 7,-4.0000002 z" /></g></svg> diff --git a/src/widgets/styles/images/media-seek-forward-128.png b/src/widgets/styles/images/media-seek-forward-128.png Binary files differnew file mode 100644 index 0000000000..786136b014 --- /dev/null +++ b/src/widgets/styles/images/media-seek-forward-128.png diff --git a/src/widgets/styles/images/media-seek-forward-16.png b/src/widgets/styles/images/media-seek-forward-16.png Binary files differindex 3c900dcb62..1ddd379adc 100644 --- a/src/widgets/styles/images/media-seek-forward-16.png +++ b/src/widgets/styles/images/media-seek-forward-16.png diff --git a/src/widgets/styles/images/media-seek-forward-32.png b/src/widgets/styles/images/media-seek-forward-32.png Binary files differindex 4f8d370fa1..aa0e4b36bd 100644 --- a/src/widgets/styles/images/media-seek-forward-32.png +++ b/src/widgets/styles/images/media-seek-forward-32.png diff --git a/src/widgets/styles/images/media-seek-forward.svg b/src/widgets/styles/images/media-seek-forward.svg new file mode 100644 index 0000000000..f3753b49a6 --- /dev/null +++ b/src/widgets/styles/images/media-seek-forward.svg @@ -0,0 +1,61 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<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="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="0px" + y="0px" + viewBox="0 0 16 16" + style="enable-background:new 0 0 16 16;" + xml:space="preserve" + sodipodi:docname="media-seek-forward.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + inkscape:export-filename="/home/chehrlic/kde/qt.src/qtbase/src/widgets/styles/images/media-seek-forward-128.png" + inkscape:export-xdpi="768" + inkscape:export-ydpi="768"><metadata + id="metadata15"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs13" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="918" + id="namedview11" + showgrid="true" + inkscape:zoom="33.14563" + inkscape:cx="12.532344" + inkscape:cy="7.584329" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" + inkscape:document-rotation="0"><inkscape:grid + type="xygrid" + id="grid925" /></sodipodi:namedview> +<style + type="text/css" + id="style2"> + .st0{fill:none;} +</style> + +<g + id="g1560"><path + id="rect873" + style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.45442" + d="m 2,4 v 8 L 9,7.9999998 Z" /><path + id="rect873-5" + style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.45442" + d="m 7,4 v 8 l 7,-4.0000002 z" /></g></svg> diff --git a/src/widgets/styles/images/media-skip-backward-128.png b/src/widgets/styles/images/media-skip-backward-128.png Binary files differnew file mode 100644 index 0000000000..f286da7769 --- /dev/null +++ b/src/widgets/styles/images/media-skip-backward-128.png diff --git a/src/widgets/styles/images/media-skip-backward-16.png b/src/widgets/styles/images/media-skip-backward-16.png Binary files differindex f5b3f4f56d..644dc4cc01 100644 --- a/src/widgets/styles/images/media-skip-backward-16.png +++ b/src/widgets/styles/images/media-skip-backward-16.png diff --git a/src/widgets/styles/images/media-skip-backward-32.png b/src/widgets/styles/images/media-skip-backward-32.png Binary files differindex 1d338035ef..ca405e3c01 100644 --- a/src/widgets/styles/images/media-skip-backward-32.png +++ b/src/widgets/styles/images/media-skip-backward-32.png diff --git a/src/widgets/styles/images/media-skip-backward.svg b/src/widgets/styles/images/media-skip-backward.svg new file mode 100644 index 0000000000..083a0a477e --- /dev/null +++ b/src/widgets/styles/images/media-skip-backward.svg @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<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="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="0px" + y="0px" + viewBox="0 0 16 16" + style="enable-background:new 0 0 16 16;" + xml:space="preserve" + sodipodi:docname="media-skip-backward.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + inkscape:export-filename="/home/chehrlic/kde/qt.src/qtbase/src/widgets/styles/images/media-skip-backward-128.png" + inkscape:export-xdpi="768" + inkscape:export-ydpi="768"><metadata + id="metadata15"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs13" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="918" + id="namedview11" + showgrid="true" + inkscape:zoom="33.14563" + inkscape:cx="5.5133468" + inkscape:cy="10.107665" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" + inkscape:document-rotation="0"><inkscape:grid + type="xygrid" + id="grid925" /></sodipodi:namedview> +<style + type="text/css" + id="style2"> + .st0{fill:none;} +</style> + +<g + id="g1687"><path + id="rect873" + style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.45442" + d="M 14,11.999999 V 3.9999994 L 7,7.9999996 Z" /><path + id="rect873-5" + style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.45442" + d="M 9,11.999999 V 3.9999994 L 2,7.9999996 Z" /><rect + style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.13809" + id="rect1594" + width="1" + height="8" + x="2" + y="4" /></g></svg> diff --git a/src/widgets/styles/images/media-skip-forward-128.png b/src/widgets/styles/images/media-skip-forward-128.png Binary files differnew file mode 100644 index 0000000000..d28fbc1708 --- /dev/null +++ b/src/widgets/styles/images/media-skip-forward-128.png diff --git a/src/widgets/styles/images/media-skip-forward-16.png b/src/widgets/styles/images/media-skip-forward-16.png Binary files differindex 27e205b02f..7e921f9a06 100644 --- a/src/widgets/styles/images/media-skip-forward-16.png +++ b/src/widgets/styles/images/media-skip-forward-16.png diff --git a/src/widgets/styles/images/media-skip-forward-32.png b/src/widgets/styles/images/media-skip-forward-32.png Binary files differindex a583fa1b11..19b22a5420 100644 --- a/src/widgets/styles/images/media-skip-forward-32.png +++ b/src/widgets/styles/images/media-skip-forward-32.png diff --git a/src/widgets/styles/images/media-skip-forward.svg b/src/widgets/styles/images/media-skip-forward.svg new file mode 100644 index 0000000000..f2f3c56a8e --- /dev/null +++ b/src/widgets/styles/images/media-skip-forward.svg @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<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="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="0px" + y="0px" + viewBox="0 0 16 16" + style="enable-background:new 0 0 16 16;" + xml:space="preserve" + sodipodi:docname="media-skip-forward.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + inkscape:export-filename="/home/chehrlic/kde/qt.src/qtbase/src/widgets/styles/images/media-skip-forward-128.png" + inkscape:export-xdpi="768" + inkscape:export-ydpi="768"><metadata + id="metadata15"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs13" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="918" + id="namedview11" + showgrid="true" + inkscape:zoom="33.14563" + inkscape:cx="12.532344" + inkscape:cy="7.584329" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" + inkscape:document-rotation="0"><inkscape:grid + type="xygrid" + id="grid925" /></sodipodi:namedview> +<style + type="text/css" + id="style2"> + .st0{fill:none;} +</style> + +<g + id="g1659"><path + id="rect873" + style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.45442" + d="m 2,4 v 8 L 9,7.9999998 Z" /><path + id="rect873-5" + style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.45442" + d="m 7,4 v 8 l 7,-4.0000002 z" /><rect + style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2" + id="rect1633" + width="1" + height="8" + x="13" + y="4" /></g></svg> diff --git a/src/widgets/styles/images/media-stop-128.png b/src/widgets/styles/images/media-stop-128.png Binary files differnew file mode 100644 index 0000000000..680d40697c --- /dev/null +++ b/src/widgets/styles/images/media-stop-128.png diff --git a/src/widgets/styles/images/media-stop-16.png b/src/widgets/styles/images/media-stop-16.png Binary files differindex 9ce035d696..e047c2bf6b 100644 --- a/src/widgets/styles/images/media-stop-16.png +++ b/src/widgets/styles/images/media-stop-16.png diff --git a/src/widgets/styles/images/media-stop-32.png b/src/widgets/styles/images/media-stop-32.png Binary files differindex aae24ba925..6ba9d25d4b 100644 --- a/src/widgets/styles/images/media-stop-32.png +++ b/src/widgets/styles/images/media-stop-32.png diff --git a/src/widgets/styles/images/media-stop.svg b/src/widgets/styles/images/media-stop.svg new file mode 100644 index 0000000000..755755ab9a --- /dev/null +++ b/src/widgets/styles/images/media-stop.svg @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<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="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="0px" + y="0px" + viewBox="0 0 16 16" + style="enable-background:new 0 0 16 16;" + xml:space="preserve" + sodipodi:docname="media-stop.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + inkscape:export-filename="/home/chehrlic/kde/qt.src/qtbase/src/widgets/styles/images/media-stop-128.png" + inkscape:export-xdpi="768" + inkscape:export-ydpi="768"><metadata + id="metadata15"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs13" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="918" + id="namedview11" + showgrid="true" + inkscape:zoom="33.14563" + inkscape:cx="5.5133468" + inkscape:cy="10.107665" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" + inkscape:document-rotation="0"><inkscape:grid + type="xygrid" + id="grid925" /></sodipodi:namedview> +<style + type="text/css" + id="style2"> + .st0{fill:none;} +</style> + +<rect + style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.06992" + id="rect1703" + width="12" + height="12" + x="2" + y="2" /></svg> diff --git a/src/widgets/styles/images/question-128.png b/src/widgets/styles/images/question-128.png Binary files differnew file mode 100644 index 0000000000..67748522ad --- /dev/null +++ b/src/widgets/styles/images/question-128.png diff --git a/src/widgets/styles/images/question-16.png b/src/widgets/styles/images/question-16.png Binary files differnew file mode 100644 index 0000000000..a907b3c485 --- /dev/null +++ b/src/widgets/styles/images/question-16.png diff --git a/src/widgets/styles/images/question-32.png b/src/widgets/styles/images/question-32.png Binary files differnew file mode 100644 index 0000000000..96c53c7ce0 --- /dev/null +++ b/src/widgets/styles/images/question-32.png diff --git a/src/widgets/styles/images/standardbutton-apply-128.png b/src/widgets/styles/images/standardbutton-apply-128.png Binary files differindex 85f07a57ef..35eb54bfd0 100644 --- a/src/widgets/styles/images/standardbutton-apply-128.png +++ b/src/widgets/styles/images/standardbutton-apply-128.png diff --git a/src/widgets/styles/images/standardbutton-apply-16.png b/src/widgets/styles/images/standardbutton-apply-16.png Binary files differindex 8f11ce6504..1f97b52566 100644 --- a/src/widgets/styles/images/standardbutton-apply-16.png +++ b/src/widgets/styles/images/standardbutton-apply-16.png diff --git a/src/widgets/styles/images/standardbutton-apply-32.png b/src/widgets/styles/images/standardbutton-apply-32.png Binary files differindex e8f7853a1e..0837fae244 100644 --- a/src/widgets/styles/images/standardbutton-apply-32.png +++ b/src/widgets/styles/images/standardbutton-apply-32.png diff --git a/src/widgets/styles/images/standardbutton-closetab-128.png b/src/widgets/styles/images/standardbutton-closetab-128.png Binary files differnew file mode 100644 index 0000000000..aca55c8424 --- /dev/null +++ b/src/widgets/styles/images/standardbutton-closetab-128.png diff --git a/src/widgets/styles/images/standardbutton-closetab-16.png b/src/widgets/styles/images/standardbutton-closetab-16.png Binary files differindex 540694eae3..26908feb2a 100644 --- a/src/widgets/styles/images/standardbutton-closetab-16.png +++ b/src/widgets/styles/images/standardbutton-closetab-16.png diff --git a/src/widgets/styles/images/standardbutton-closetab-32.png b/src/widgets/styles/images/standardbutton-closetab-32.png Binary files differindex 93e1246b47..effcc89eed 100644 --- a/src/widgets/styles/images/standardbutton-closetab-32.png +++ b/src/widgets/styles/images/standardbutton-closetab-32.png diff --git a/src/widgets/styles/images/standardbutton-closetab-down-128.png b/src/widgets/styles/images/standardbutton-closetab-down-128.png Binary files differnew file mode 100644 index 0000000000..2efdfd053f --- /dev/null +++ b/src/widgets/styles/images/standardbutton-closetab-down-128.png diff --git a/src/widgets/styles/images/standardbutton-closetab-down-16.png b/src/widgets/styles/images/standardbutton-closetab-down-16.png Binary files differindex ccec241652..5228c1573b 100644 --- a/src/widgets/styles/images/standardbutton-closetab-down-16.png +++ b/src/widgets/styles/images/standardbutton-closetab-down-16.png diff --git a/src/widgets/styles/images/standardbutton-closetab-down-32.png b/src/widgets/styles/images/standardbutton-closetab-down-32.png Binary files differindex 343b72586e..dfd88920ab 100644 --- a/src/widgets/styles/images/standardbutton-closetab-down-32.png +++ b/src/widgets/styles/images/standardbutton-closetab-down-32.png diff --git a/src/widgets/styles/images/standardbutton-closetab-down.svg b/src/widgets/styles/images/standardbutton-closetab-down.svg new file mode 100644 index 0000000000..12aa6b21f7 --- /dev/null +++ b/src/widgets/styles/images/standardbutton-closetab-down.svg @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<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="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="0px" + y="0px" + width="32px" + height="32px" + viewBox="0 0 32 32" + style="enable-background:new 0 0 32 32;" + xml:space="preserve" + sodipodi:docname="standardbutton-closetab-down.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata + id="metadata15"><rdf:RDF><cc:Work + rdf:about=""><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></metadata><defs + id="defs13" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="918" + id="namedview11" + showgrid="false" + inkscape:zoom="16.572815" + inkscape:cx="28.732573" + inkscape:cy="14.492458" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="g8" /> +<style + type="text/css" + id="style2"> + .st0{fill:#46A2DA;} + .st1{fill:none;} +</style> +<g + id="g8"> + + +<rect + style="fill:#b17153;stroke:#b17153;stroke-width:1.99804;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1" + id="rect17-3" + width="22.001965" + height="22.001963" + x="4.9990177" + y="4.9990177" + rx="0" + ry="0" /><rect + style="fill:none;stroke:#ab493f;stroke-width:1.99992;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect17" + width="26.000072" + height="26.000076" + x="2.9999642" + y="2.9999642" + rx="1.792347" + ry="1.7923476" /><rect + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.76951;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect1031" + width="3" + height="16" + x="21.127417" + y="-8" + transform="rotate(45)" /><rect + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.76951;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect1031-6" + width="3" + height="16" + x="-1.5" + y="14.627417" + transform="rotate(-45)" /></g> +</svg> diff --git a/src/widgets/styles/images/standardbutton-closetab-hover-128.png b/src/widgets/styles/images/standardbutton-closetab-hover-128.png Binary files differnew file mode 100644 index 0000000000..4f6b1bfde4 --- /dev/null +++ b/src/widgets/styles/images/standardbutton-closetab-hover-128.png diff --git a/src/widgets/styles/images/standardbutton-closetab-hover-16.png b/src/widgets/styles/images/standardbutton-closetab-hover-16.png Binary files differindex b22a0ffaf0..460411deeb 100644 --- a/src/widgets/styles/images/standardbutton-closetab-hover-16.png +++ b/src/widgets/styles/images/standardbutton-closetab-hover-16.png diff --git a/src/widgets/styles/images/standardbutton-closetab-hover-32.png b/src/widgets/styles/images/standardbutton-closetab-hover-32.png Binary files differindex 41ce0265c7..aa6afd72b2 100644 --- a/src/widgets/styles/images/standardbutton-closetab-hover-32.png +++ b/src/widgets/styles/images/standardbutton-closetab-hover-32.png diff --git a/src/widgets/styles/images/standardbutton-closetab-hover.svg b/src/widgets/styles/images/standardbutton-closetab-hover.svg new file mode 100644 index 0000000000..45dc8b8c46 --- /dev/null +++ b/src/widgets/styles/images/standardbutton-closetab-hover.svg @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<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="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="0px" + y="0px" + width="32px" + height="32px" + viewBox="0 0 32 32" + style="enable-background:new 0 0 32 32;" + xml:space="preserve" + sodipodi:docname="standardbutton-closetab-hover.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata + id="metadata15"><rdf:RDF><cc:Work + rdf:about=""><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></metadata><defs + id="defs13" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="918" + id="namedview11" + showgrid="false" + inkscape:zoom="16.572815" + inkscape:cx="33.318396" + inkscape:cy="14.492458" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="g8" + inkscape:document-rotation="0" /> +<style + type="text/css" + id="style2"> + .st0{fill:#46A2DA;} + .st1{fill:none;} +</style> +<g + id="g8"> + + +<rect + style="fill:#ea8f60;stroke:#f2b7a7;stroke-width:1.99804;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1" + id="rect17-3" + width="22.001965" + height="22.001963" + x="4.9990177" + y="4.9990177" + rx="0" + ry="0" /><rect + style="fill:none;stroke:#d73727;stroke-width:1.99992;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect17" + width="26.000072" + height="26.000076" + x="2.9999642" + y="2.9999642" + rx="1.792347" + ry="1.7923476" /><rect + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.76951;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect1031" + width="3" + height="16" + x="21.127417" + y="-8" + transform="rotate(45)" /><rect + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.76951;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect1031-6" + width="3" + height="16" + x="-1.5" + y="14.627417" + transform="rotate(-45)" /></g> +</svg> diff --git a/src/widgets/styles/images/standardbutton-closetab.svg b/src/widgets/styles/images/standardbutton-closetab.svg new file mode 100644 index 0000000000..d3a9279538 --- /dev/null +++ b/src/widgets/styles/images/standardbutton-closetab.svg @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<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="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="0px" + y="0px" + width="32px" + height="32px" + viewBox="0 0 32 32" + style="enable-background:new 0 0 32 32;" + xml:space="preserve" + sodipodi:docname="standardbutton-closetab.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata + id="metadata15"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs13" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="918" + id="namedview11" + showgrid="false" + inkscape:zoom="16.572815" + inkscape:cx="33.318396" + inkscape:cy="14.492458" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="g8" + inkscape:document-rotation="0" /> +<style + type="text/css" + id="style2"> + .st0{fill:#46A2DA;} + .st1{fill:none;} +</style> +<g + id="g8"> + + +<rect + style="fill:#ea8f60;stroke:#ef9d8e;stroke-width:1.99804;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1" + id="rect17-3" + width="22.001965" + height="22.001963" + x="4.9990177" + y="4.9990177" + rx="0" + ry="0" /><rect + style="fill:none;stroke:#d73727;stroke-width:1.99992;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect17" + width="26.000072" + height="26.000076" + x="2.9999642" + y="2.9999642" + rx="1.792347" + ry="1.7923476" /><rect + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.76951;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect1031" + width="3" + height="16" + x="21.127417" + y="-8" + transform="rotate(45)" /><rect + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.76951;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect1031-6" + width="3" + height="16" + x="-1.5" + y="14.627417" + transform="rotate(-45)" /></g> +</svg> diff --git a/src/widgets/styles/images/standardbutton-no-128.png b/src/widgets/styles/images/standardbutton-no-128.png Binary files differindex 491c048ebd..4d9cdb1566 100644 --- a/src/widgets/styles/images/standardbutton-no-128.png +++ b/src/widgets/styles/images/standardbutton-no-128.png diff --git a/src/widgets/styles/images/standardbutton-no-16.png b/src/widgets/styles/images/standardbutton-no-16.png Binary files differindex 812d3f57dd..a04af9c37a 100644 --- a/src/widgets/styles/images/standardbutton-no-16.png +++ b/src/widgets/styles/images/standardbutton-no-16.png diff --git a/src/widgets/styles/images/standardbutton-no-32.png b/src/widgets/styles/images/standardbutton-no-32.png Binary files differindex 9548d59196..01d4401a2b 100644 --- a/src/widgets/styles/images/standardbutton-no-32.png +++ b/src/widgets/styles/images/standardbutton-no-32.png diff --git a/src/widgets/styles/images/standardbutton-ok-128.png b/src/widgets/styles/images/standardbutton-ok-128.png Binary files differindex 63cc5279ae..b204b6f272 100644 --- a/src/widgets/styles/images/standardbutton-ok-128.png +++ b/src/widgets/styles/images/standardbutton-ok-128.png diff --git a/src/widgets/styles/images/standardbutton-yes-128.png b/src/widgets/styles/images/standardbutton-yes-128.png Binary files differindex 79c8296016..6266e5bc6a 100644 --- a/src/widgets/styles/images/standardbutton-yes-128.png +++ b/src/widgets/styles/images/standardbutton-yes-128.png diff --git a/src/widgets/styles/images/standardbutton-yes-16.png b/src/widgets/styles/images/standardbutton-yes-16.png Binary files differindex cc16dbbec3..f66b5da6f2 100644 --- a/src/widgets/styles/images/standardbutton-yes-16.png +++ b/src/widgets/styles/images/standardbutton-yes-16.png diff --git a/src/widgets/styles/images/standardbutton-yes-32.png b/src/widgets/styles/images/standardbutton-yes-32.png Binary files differindex e3340c6453..6685d19e9f 100644 --- a/src/widgets/styles/images/standardbutton-yes-32.png +++ b/src/widgets/styles/images/standardbutton-yes-32.png diff --git a/src/widgets/styles/images/toolbar-ext-h-128.png b/src/widgets/styles/images/toolbar-ext-h-128.png Binary files differnew file mode 100644 index 0000000000..071c5b1353 --- /dev/null +++ b/src/widgets/styles/images/toolbar-ext-h-128.png diff --git a/src/widgets/styles/images/toolbar-ext-h-rtl-128.png b/src/widgets/styles/images/toolbar-ext-h-rtl-128.png Binary files differnew file mode 100644 index 0000000000..7aadfc2aea --- /dev/null +++ b/src/widgets/styles/images/toolbar-ext-h-rtl-128.png diff --git a/src/widgets/styles/images/toolbar-ext-v-80.png b/src/widgets/styles/images/toolbar-ext-v-80.png Binary files differnew file mode 100644 index 0000000000..84d15ff064 --- /dev/null +++ b/src/widgets/styles/images/toolbar-ext-v-80.png diff --git a/src/widgets/styles/images/warning-128.png b/src/widgets/styles/images/warning-128.png Binary files differnew file mode 100644 index 0000000000..07f0251b8a --- /dev/null +++ b/src/widgets/styles/images/warning-128.png diff --git a/src/widgets/styles/images/warning-16.png b/src/widgets/styles/images/warning-16.png Binary files differnew file mode 100644 index 0000000000..dce3ac9126 --- /dev/null +++ b/src/widgets/styles/images/warning-16.png diff --git a/src/widgets/styles/images/warning-32.png b/src/widgets/styles/images/warning-32.png Binary files differnew file mode 100644 index 0000000000..a7b822737d --- /dev/null +++ b/src/widgets/styles/images/warning-32.png diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp index 08c2224092..aab1192d50 100644 --- a/src/widgets/styles/qcommonstyle.cpp +++ b/src/widgets/styles/qcommonstyle.cpp @@ -96,6 +96,31 @@ static qreal qt_getDevicePixelRatio(const QWidget *widget) return widget ? widget->devicePixelRatio() : qApp->devicePixelRatio(); } +struct QPainterStateSaver +{ + QPainterStateSaver(QPainter *p, bool bSaveRestore = true) + : m_painter(p) + , m_bSaveRestore(bSaveRestore) + { + if (m_bSaveRestore) + m_painter->save(); + } + ~QPainterStateSaver() + { + restore(); + } + void restore() + { + if (m_bSaveRestore) { + m_bSaveRestore = false; + m_painter->restore(); + } + } +private: + QPainter *m_painter; + bool m_bSaveRestore; +}; + /*! \class QCommonStyle \brief The QCommonStyle class encapsulates the common Look and Feel of a GUI. @@ -189,20 +214,19 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q case PE_FrameFocusRect: if (const QStyleOptionFocusRect *fropt = qstyleoption_cast<const QStyleOptionFocusRect *>(opt)) { QColor bg = fropt->backgroundColor; - QPen oldPen = p->pen(); + QColor color; if (bg.isValid()) { int h, s, v; bg.getHsv(&h, &s, &v); if (v >= 128) - p->setPen(Qt::black); + color = Qt::black; else - p->setPen(Qt::white); + color = Qt::white; } else { - p->setPen(opt->palette.windowText().color()); + color = opt->palette.windowText().color(); } - QRect focusRect = opt->rect.adjusted(1, 1, -1, -1); - p->drawRect(focusRect.adjusted(0, 0, -1, -1)); //draw pen inclusive - p->setPen(oldPen); + const QRect focusRect = opt->rect.adjusted(1, 1, -1, -1); + qDrawPlainRect(p, focusRect, color, 1); } break; case PE_IndicatorMenuCheckMark: { @@ -229,11 +253,10 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q --yy; } if (!(opt->state & State_Enabled) && !(opt->state & State_On)) { - p->save(); + QPainterStateSaver pss(p); p->translate(1, 1); p->setPen(opt->palette.light().color()); p->drawLines(a); - p->restore(); } p->setPen((opt->state & State_On) ? opt->palette.highlightedText().color() : opt->palette.text().color()); p->drawLines(a); @@ -355,7 +378,7 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q case PE_FrameTabBarBase: if (const QStyleOptionTabBarBase *tbb = qstyleoption_cast<const QStyleOptionTabBarBase *>(opt)) { - p->save(); + QPainterStateSaver pss(p); switch (tbb->shape) { case QTabBar::RoundedNorth: case QTabBar::TriangularNorth: @@ -382,14 +405,13 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q p->drawLine(tbb->rect.topRight(), tbb->rect.bottomRight()); break; } - p->restore(); } break; case PE_IndicatorTabClose: { if (d->tabBarcloseButtonIcon.isNull()) d->tabBarcloseButtonIcon = proxy()->standardIcon(QStyle::SP_TabCloseButton, opt, widget); - const int size = proxy()->pixelMetric(QStyle::PM_SmallIconSize, opt); + const int size = proxy()->pixelMetric(QStyle::PM_SmallIconSize, opt, widget); QIcon::Mode mode = opt->state & State_Enabled ? (opt->state & State_Raised ? QIcon::Active : QIcon::Normal) : QIcon::Disabled; @@ -435,15 +457,15 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(opt)) { int lw = frame->lineWidth; if (lw <= 0) - lw = proxy()->pixelMetric(PM_DockWidgetFrameWidth, opt); + lw = proxy()->pixelMetric(PM_DockWidgetFrameWidth, opt, widget); qDrawShadePanel(p, frame->rect, frame->palette, false, lw); } break; #endif // QT_CONFIG(dockwidget) #if QT_CONFIG(toolbar) - case PE_IndicatorToolBarHandle: - p->save(); + case PE_IndicatorToolBarHandle: { + QPainterStateSaver pss(p); p->translate(opt->rect.x(), opt->rect.y()); if (opt->state & State_Horizontal) { int x = opt->rect.width() / 3; @@ -464,8 +486,8 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q opt->palette, false, 1, nullptr); } } - p->restore(); break; + } case PE_IndicatorToolBarSeparator: { QPoint p1, p2; @@ -490,7 +512,7 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q int y = br.y(); int w = br.width(); int h = br.height(); - p->save(); + QPainterStateSaver pss(p); const qreal devicePixelRatio = p->device()->devicePixelRatio(); if (!qFuzzyCompare(devicePixelRatio, qreal(1))) { const qreal inverseScale = qreal(1) / devicePixelRatio; @@ -510,14 +532,13 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q const int step2 = step / 2; QPoint center(x + w / 2, y + h / 2); if (opt->state & State_Sunken) { - center += QPoint(proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt), - proxy()->pixelMetric(PM_ButtonShiftVertical, opt)); + center += QPoint(proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt, widget), + proxy()->pixelMetric(PM_ButtonShiftVertical, opt, widget)); } p->translate(center); p->fillRect(-len / 2, -step2, len, step, opt->palette.buttonText()); if (pe == PE_IndicatorSpinPlus) p->fillRect(-step2, -len / 2, step, len, opt->palette.buttonText()); - p->restore(); break; } case PE_IndicatorSpinUp: case PE_IndicatorSpinDown: { @@ -528,7 +549,7 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q int y = r.y(); int w = r.width(); int h = r.height(); - p->save(); + QPainterStateSaver pss(p); const qreal devicePixelRatio = p->device()->devicePixelRatio(); if (!qFuzzyCompare(devicePixelRatio, qreal(1))) { const qreal inverseScale = qreal(1) / devicePixelRatio; @@ -556,8 +577,8 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q int bsx = 0; int bsy = 0; if (opt->state & State_Sunken) { - bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt); - bsy = proxy()->pixelMetric(PM_ButtonShiftVertical, opt); + bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt, widget); + bsy = proxy()->pixelMetric(PM_ButtonShiftVertical, opt, widget); } p->translate(sx + bsx, sy + bsy); p->setPen(opt->palette.buttonText().color()); @@ -569,7 +590,6 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q const QPoint points[] = { QPoint(0, sh-1), QPoint(sw-1, sh-1), QPoint(sh-2, 1) }; p->drawPolygon(points, sizeof points / sizeof *points); } - p->restore(); break; } #endif // QT_CONFIG(spinbox) case PE_PanelTipLabel: { @@ -627,7 +647,7 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q case PE_IndicatorColumnViewArrow: { if (const QStyleOptionViewItem *viewOpt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) { bool reverse = (viewOpt->direction == Qt::RightToLeft); - p->save(); + QPainterStateSaver pss(p); QPainterPath path; int x = viewOpt->rect.x() + 1; int offset = (viewOpt->rect.height() / 3); @@ -672,7 +692,6 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q p->setPen(color); p->drawPath(lines); } - p->restore(); } break; } #endif //QT_CONFIG(columnview) @@ -731,71 +750,75 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q case PE_IndicatorArrowRight: case PE_IndicatorArrowLeft: { - if (opt->rect.width() <= 1 || opt->rect.height() <= 1) + const QRect &r = opt->rect; + if (r.width() <= 1 || r.height() <= 1) break; - QRect r = opt->rect; int size = qMin(r.height(), r.width()); QPixmap pixmap; - QString pixmapName = - QStyleHelper::uniqueName("$qt_ia-"_L1 - % QLatin1StringView(metaObject()->className()), - opt, QSize(size, size)) - % HexString<uint>(pe); + const qreal dpr = p->device()->devicePixelRatio(); + const QString pixmapName = QStyleHelper::uniqueName("$qt_ia-"_L1 + % QLatin1StringView(metaObject()->className()) + % HexString<uint>(pe), + opt, QSize(size, size), dpr); if (!QPixmapCache::find(pixmapName, &pixmap)) { - qreal pixelRatio = p->device()->devicePixelRatio(); - int border = qRound(pixelRatio*(size/5)); - int sqsize = qRound(pixelRatio*(2*(size/2))); - QImage image(sqsize, sqsize, QImage::Format_ARGB32_Premultiplied); - image.fill(0); - QPainter imagePainter(&image); - - QPolygon a; + // dpr scaling does not work well on such small pixel sizes, do it on our own + const int border = 1 * dpr; + const int sizeDpr = size * dpr; + int width = sizeDpr - 2 * border - 1; + int height = width / 2; + const int add = ((width & 1) == 1); + if (pe == PE_IndicatorArrowRight || pe == PE_IndicatorArrowLeft) + std::swap(width, height); + pixmap = styleCachePixmap(QSize(sizeDpr, sizeDpr), 1); + + std::array<QPointF, 4> poly; switch (pe) { case PE_IndicatorArrowUp: - a.setPoints(3, border, sqsize/2, sqsize/2, border, sqsize - border, sqsize/2); + poly = {QPointF(0, height), QPointF(width, height), + QPointF(width / 2 + add, 0), QPointF(width / 2, 0)}; break; case PE_IndicatorArrowDown: - a.setPoints(3, border, sqsize/2, sqsize/2, sqsize - border, sqsize - border, sqsize/2); + poly = {QPointF(0, 0), QPointF(width, 0), + QPointF(width / 2 + add, height), QPointF(width / 2, height)}; break; case PE_IndicatorArrowRight: - a.setPoints(3, sqsize - border, sqsize/2, sqsize/2, border, sqsize/2, sqsize - border); + poly = {QPointF(0, 0), QPointF(0, height), + QPointF(width, height / 2 + add), QPointF(width, height / 2)}; break; case PE_IndicatorArrowLeft: - a.setPoints(3, border, sqsize/2, sqsize/2, border, sqsize/2, sqsize - border); + poly = {QPointF(width, 0), QPointF(width, height), + QPointF(0, height / 2 + add), QPointF(0, height / 2)}; break; default: break; } - int bsx = 0; - int bsy = 0; - + QPainter imagePainter(&pixmap); + imagePainter.translate((sizeDpr - width) / 2, (sizeDpr - height) / 2); if (opt->state & State_Sunken) { - bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt, widget); - bsy = proxy()->pixelMetric(PM_ButtonShiftVertical, opt, widget); + const auto bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt, widget); + const auto bsy = proxy()->pixelMetric(PM_ButtonShiftVertical, opt, widget); + imagePainter.translate(bsx, bsy); } - - QRect bounds = a.boundingRect(); - int sx = sqsize / 2 - bounds.center().x() - 1; - int sy = sqsize / 2 - bounds.center().y() - 1; - imagePainter.translate(sx + bsx, sy + bsy); imagePainter.setPen(opt->palette.buttonText().color()); imagePainter.setBrush(opt->palette.buttonText()); if (!(opt->state & State_Enabled)) { - imagePainter.translate(1, 1); + const int ofs = qRound(1 * dpr); + imagePainter.translate(ofs, ofs); imagePainter.setBrush(opt->palette.light().color()); imagePainter.setPen(opt->palette.light().color()); - imagePainter.drawPolygon(a); - imagePainter.translate(-1, -1); + imagePainter.drawPolygon(poly.data(), int(poly.size())); + imagePainter.drawPoints(poly.data(), int(poly.size())); + imagePainter.translate(-ofs, -ofs); imagePainter.setBrush(opt->palette.mid().color()); imagePainter.setPen(opt->palette.mid().color()); } - - imagePainter.drawPolygon(a); + imagePainter.drawPolygon(poly.data(), int(poly.size())); + // sometimes the corners are not drawn by drawPolygon for unknown reaons, so re-draw them again + imagePainter.drawPoints(poly.data(), int(poly.size())); imagePainter.end(); - pixmap = QPixmap::fromImage(image); - pixmap.setDevicePixelRatio(pixelRatio); + pixmap.setDevicePixelRatio(dpr); QPixmapCache::insert(pixmapName, pixmap); } int xOffset = r.x() + (r.width() - size)/2; @@ -995,7 +1018,7 @@ QSize QCommonStylePrivate::viewItemSize(const QStyleOptionViewItem *option, int } if (wrapText && option->features & QStyleOptionViewItem::HasCheckIndicator) - bounds.setWidth(bounds.width() - proxyStyle->pixelMetric(QStyle::PM_IndicatorWidth, option) - 2 * textMargin); + bounds.setWidth(bounds.width() - proxyStyle->pixelMetric(QStyle::PM_IndicatorWidth, option, widget) - 2 * textMargin); const int lineWidth = bounds.width(); const QSizeF size = viewItemTextLayout(textLayout, lineWidth); @@ -1161,12 +1184,8 @@ void QCommonStylePrivate::viewItemLayout(const QStyleOptionViewItem *opt, QRect checkRect->size(), check); *pixmapRect = QStyle::alignedRect(opt->direction, opt->decorationAlignment, pixmapRect->size(), decoration); - // the text takes up all available space, unless the decoration is not shown as selected - if (opt->showDecorationSelected) - *textRect = display; - else - *textRect = QStyle::alignedRect(opt->direction, opt->displayAlignment, - textRect->size().boundedTo(display.size()), display); + // the textRect takes up all remaining size + *textRect = display; } else { *checkRect = check; *pixmapRect = decoration; @@ -1241,7 +1260,7 @@ void QCommonStylePrivate::tabLayout(const QStyleOptionTab *opt, const QWidget *w if (!opt->icon.isNull()) { QSize iconSize = opt->iconSize; if (!iconSize.isValid()) { - int iconExtent = proxyStyle->pixelMetric(QStyle::PM_SmallIconSize, opt); + int iconExtent = proxyStyle->pixelMetric(QStyle::PM_SmallIconSize, opt, widget); iconSize = QSize(iconExtent, iconExtent); } QSize tabIconSize = opt->icon.actualSize(iconSize, @@ -1267,12 +1286,6 @@ void QCommonStylePrivate::tabLayout(const QStyleOptionTab *opt, const QWidget *w #if QT_CONFIG(animation) /*! \internal */ -QList<const QObject*> QCommonStylePrivate::animationTargets() const -{ - return animations.keys(); -} - -/*! \internal */ QStyleAnimation * QCommonStylePrivate::animation(const QObject *target) const { return animations.value(target); @@ -1282,9 +1295,11 @@ QStyleAnimation * QCommonStylePrivate::animation(const QObject *target) const void QCommonStylePrivate::startAnimation(QStyleAnimation *animation) const { Q_Q(const QCommonStyle); - stopAnimation(animation->target()); - q->connect(animation, SIGNAL(destroyed()), SLOT(_q_removeAnimation()), Qt::UniqueConnection); - animations.insert(animation->target(), animation); + const auto target = animation->target(); + stopAnimation(target); + QObject::connect(animation, &QStyleAnimation::destroyed, + q, [this, target]() { removeAnimation(target); }); + animations.insert(target, animation); animation->start(); } @@ -1299,12 +1314,9 @@ void QCommonStylePrivate::stopAnimation(const QObject *target) const } /*! \internal */ -void QCommonStylePrivate::_q_removeAnimation() +void QCommonStylePrivate::removeAnimation(const QObject *target) const { - Q_Q(QCommonStyle); - QObject *animation = q->sender(); - if (animation) - animations.remove(animation->parent()); + animations.remove(target); } #endif @@ -1397,13 +1409,16 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, iconRect = visualRect(button->direction, textRect, iconRect); - if (button->direction == Qt::RightToLeft) { - tf |= Qt::AlignRight; + if (button->direction == Qt::RightToLeft) textRect.setRight(iconRect.left() - iconSpacing / 2); - } else { - tf |= Qt::AlignLeft; //left align, we adjust the text-rect instead + else textRect.setLeft(iconRect.left() + iconRect.width() + iconSpacing / 2); - } + + // qt_format_text reverses again when painter->layoutDirection is also RightToLeft + if (p->layoutDirection() == button->direction) + tf |= Qt::AlignLeft; + else + tf |= Qt::AlignRight; if (button->state & (State_On | State_Sunken)) iconRect.translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt, widget), @@ -1492,7 +1507,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, | Qt::TextSingleLine; if (!proxy()->styleHint(SH_UnderlineShortcut, mbi, widget)) alignment |= Qt::TextHideMnemonic; - int iconExtent = proxy()->pixelMetric(PM_SmallIconSize, opt); + int iconExtent = proxy()->pixelMetric(PM_SmallIconSize, opt, widget); QPixmap pix = mbi->icon.pixmap(QSize(iconExtent, iconExtent), p->device()->devicePixelRatio(), (mbi->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled); if (!pix.isNull()) proxy()->drawItemPixmap(p,mbi->rect, alignment, pix); @@ -1648,7 +1663,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) { QRect rect = header->rect; if (!header->icon.isNull()) { - int iconExtent = proxy()->pixelMetric(PM_SmallIconSize, opt); + int iconExtent = proxy()->pixelMetric(PM_SmallIconSize, opt, widget); QPixmap pixmap = header->icon.pixmap(QSize(iconExtent, iconExtent), p->device()->devicePixelRatio(), (header->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled); int pixw = pixmap.width() / pixmap.devicePixelRatio(); @@ -1669,9 +1684,12 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, QFontMetrics fm(header->fontMetrics); if (header->state & QStyle::State_On) { QFont fnt = p->font(); - fnt.setBold(true); - p->setFont(fnt); - fm = QFontMetrics((p->font())); + // the font already has a weight set; don't override that + if (!(fnt.resolveMask() & QFont::WeightResolved)) { + fnt.setBold(true); + p->setFont(fnt); + fm = QFontMetrics((p->font())); + } } QString text = header->text; if (const QStyleOptionHeaderV2 *headerV2 = qstyleoption_cast<const QStyleOptionHeaderV2 *>(header)) { @@ -1828,8 +1846,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, break; case CE_TabBarTabShape: if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) { - p->save(); - + QPainterStateSaver pss(p); QRect rect(tab->rect); bool selected = tab->state & State_Selected; bool onlyOne = tab->position == QStyleOptionTab::OnlyOneTab; @@ -1930,7 +1947,6 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, default: break; } - p->restore(); } break; case CE_ToolBoxTabLabel: @@ -1991,8 +2007,8 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, if (!proxy()->styleHint(SH_UnderlineShortcut, opt, widget)) alignment |= Qt::TextHideMnemonic; + QPainterStateSaver pss(p, verticalTabs); if (verticalTabs) { - p->save(); int newX, newY, newRot; if (tab->shape == QTabBar::RoundedEast || tab->shape == QTabBar::TriangularEast) { newX = tr.width() + tr.x(); @@ -2025,11 +2041,10 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, proxy()->drawItemText(p, tr, alignment, tab->palette, tab->state & State_Enabled, tab->text, widget ? widget->foregroundRole() : QPalette::WindowText); - if (verticalTabs) - p->restore(); + pss.restore(); if (tab->state & State_HasFocus) { - const int OFFSET = 1 + pixelMetric(PM_DefaultFrameWidth); + const int OFFSET = 1 + pixelMetric(PM_DefaultFrameWidth, opt, widget); int x1, x2; x1 = tab->rect.left(); @@ -2046,7 +2061,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, #endif // QT_CONFIG(tabbar) #if QT_CONFIG(sizegrip) case CE_SizeGrip: { - p->save(); + QPainterStateSaver pss(p); int x, y, w, h; opt->rect.getRect(&x, &y, &w, &h); @@ -2115,7 +2130,6 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, sy += s; } } - p->restore(); break; } #endif // QT_CONFIG(sizegrip) #if QT_CONFIG(rubberband) @@ -2132,7 +2146,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, // ### workaround for borked XRENDER tiledPixmap = QPixmap::fromImage(tiledPixmap.toImage()); - p->save(); + QPainterStateSaver pss(p); QRect r = opt->rect; QStyleHintReturnMask mask; if (proxy()->styleHint(QStyle::SH_RubberBand_Mask, opt, widget, &mask)) @@ -2143,7 +2157,6 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, p->drawRect(r.adjusted(0, 0, -1, -1)); if (rbOpt->shape == QRubberBand::Rectangle) p->drawRect(r.adjusted(3, 3, -4, -4)); - p->restore(); } break; } #endif // QT_CONFIG(rubberband) @@ -2159,10 +2172,10 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, if (!dwOpt->title.isEmpty()) { const bool verticalTitleBar = dwOpt->verticalTitleBar; + QPainterStateSaver pss(p, verticalTitleBar); if (verticalTitleBar) { r = r.transposed(); - p->save(); p->translate(r.left(), r.top() + r.width()); p->rotate(-90); p->translate(-r.left(), -r.top()); @@ -2170,12 +2183,9 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, const int indent = p->fontMetrics().descent(); proxy()->drawItemText(p, r.adjusted(indent + 1, 1, -indent - 1, -1), - Qt::AlignLeft | Qt::AlignVCenter, dwOpt->palette, + Qt::AlignLeft | Qt::AlignVCenter | Qt::TextHideMnemonic, dwOpt->palette, dwOpt->state & State_Enabled, dwOpt->title, QPalette::WindowText); - - if (verticalTitleBar) - p->restore(); } } break; @@ -2217,7 +2227,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, case CE_ComboBoxLabel: if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) { QRect editRect = proxy()->subControlRect(CC_ComboBox, cb, SC_ComboBoxEditField, widget); - p->save(); + QPainterStateSaver pss(p); p->setClipRect(editRect); if (!cb->currentIcon.isNull()) { QIcon::Mode mode = cb->state & State_Enabled ? QIcon::Normal @@ -2242,7 +2252,6 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, visualAlignment(cb->direction, cb->textAlignment), cb->palette, cb->state & State_Enabled, cb->currentText); } - p->restore(); } break; #endif // QT_CONFIG(combobox) @@ -2288,7 +2297,7 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, #if QT_CONFIG(itemviews) case CE_ItemViewItem: if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(opt)) { - p->save(); + QPainterStateSaver pss(p); // the style calling this might want to clip, so respect any region already set const QRegion clipRegion = p->hasClipping() ? (p->clipRegion() & opt->rect) : opt->rect; p->setClipRegion(clipRegion); @@ -2362,8 +2371,6 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt, ? QPalette::Highlight : QPalette::Window); proxy()->drawPrimitive(QStyle::PE_FrameFocusRect, &o, p, widget); } - - p->restore(); } break; @@ -3285,7 +3292,7 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl int fudge = len / 2; int pos; // Since there is no subrect for tickmarks do a translation here. - p->save(); + QPainterStateSaver pss(p); p->translate(slider->rect.x(), slider->rect.y()); p->setPen(slider->palette.windowText().color()); int v = slider->minimum; @@ -3314,7 +3321,6 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl break; v = nextInterval; } - p->restore(); } } break; @@ -3580,12 +3586,11 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl tool.state = down ? State_Sunken : State_Raised; proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget); - p->save(); + QPainterStateSaver pss(p, down); if (down) p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb, widget), proxy()->pixelMetric(PM_ButtonShiftVertical, tb, widget)); proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm); - p->restore(); } if (tb->subControls & SC_TitleBarMaxButton @@ -3599,12 +3604,11 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl tool.state = down ? State_Sunken : State_Raised; proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget); - p->save(); + QPainterStateSaver pss(p, down); if (down) p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb, widget), proxy()->pixelMetric(PM_ButtonShiftVertical, tb, widget)); proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm); - p->restore(); } if (tb->subControls & SC_TitleBarMinButton @@ -3617,12 +3621,11 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl tool.state = down ? State_Sunken : State_Raised; proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget); - p->save(); + QPainterStateSaver pss(p, down); if (down) p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb, widget), proxy()->pixelMetric(PM_ButtonShiftVertical, tb, widget)); proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm); - p->restore(); } bool drawNormalButton = (tb->subControls & SC_TitleBarNormalButton) @@ -3639,12 +3642,11 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl tool.state = down ? State_Sunken : State_Raised; proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget); - p->save(); + QPainterStateSaver pss(p, down); if (down) p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb, widget), proxy()->pixelMetric(PM_ButtonShiftVertical, tb, widget)); proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm); - p->restore(); } if (tb->subControls & SC_TitleBarShadeButton @@ -3656,12 +3658,11 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl tool.rect = ir; tool.state = down ? State_Sunken : State_Raised; proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget); - p->save(); + QPainterStateSaver pss(p, down); if (down) p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb, widget), proxy()->pixelMetric(PM_ButtonShiftVertical, tb, widget)); proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm); - p->restore(); } if (tb->subControls & SC_TitleBarUnshadeButton @@ -3674,12 +3675,11 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl tool.rect = ir; tool.state = down ? State_Sunken : State_Raised; proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget); - p->save(); + QPainterStateSaver pss(p, down); if (down) p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb, widget), proxy()->pixelMetric(PM_ButtonShiftVertical, tb, widget)); proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm); - p->restore(); } if (tb->subControls & SC_TitleBarContextHelpButton && tb->titleBarFlags & Qt::WindowContextHelpButtonHint) { @@ -3690,12 +3690,11 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl tool.rect = ir; tool.state = down ? State_Sunken : State_Raised; proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget); - p->save(); + QPainterStateSaver pss(p, down); if (down) p->translate(proxy()->pixelMetric(PM_ButtonShiftHorizontal, tb, widget), proxy()->pixelMetric(PM_ButtonShiftVertical, tb, widget)); proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm); - p->restore(); } if (tb->subControls & SC_TitleBarSysMenu && tb->titleBarFlags & Qt::WindowSystemMenuHint) { ir = proxy()->subControlRect(CC_TitleBar, tb, SC_TitleBarSysMenu, widget); @@ -3705,9 +3704,8 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl int iconSize = proxy()->pixelMetric(PM_SmallIconSize, tb, widget); pm = proxy()->standardIcon(SP_TitleBarMenuButton, &tool, widget).pixmap(QSize(iconSize, iconSize), p->device()->devicePixelRatio()); tool.rect = ir; - p->save(); + QPainterStateSaver pss(p); proxy()->drawItemPixmap(p, ir, Qt::AlignCenter, pm); - p->restore(); } } } @@ -3716,7 +3714,7 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl case CC_Dial: if (const QStyleOptionSlider *dial = qstyleoption_cast<const QStyleOptionSlider *>(opt)) { // OK, this is more a port of things over - p->save(); + QPainterStateSaver pss(p); // avoid dithering if (p->paintEngine()->hasFeature(QPaintEngine::Antialiasing)) @@ -3801,7 +3799,6 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl fropt.rect = br.adjusted(-2, -2, 2, 2); proxy()->drawPrimitive(QStyle::PE_FrameFocusRect, &fropt, p, widget); } - p->restore(); } break; #endif // QT_CONFIG(dial) @@ -3818,7 +3815,7 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl frame.lineWidth = groupBox->lineWidth; frame.midLineWidth = groupBox->midLineWidth; frame.rect = proxy()->subControlRect(CC_GroupBox, opt, SC_GroupBoxFrame, widget); - p->save(); + QPainterStateSaver pss(p); QRegion region(groupBox->rect); if (!groupBox->text.isEmpty()) { bool ltr = groupBox->direction == Qt::LeftToRight; @@ -3833,7 +3830,6 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl } p->setClipRegion(region); proxy()->drawPrimitive(PE_FrameGroupBox, &frame, p, widget); - p->restore(); } // Draw title @@ -3881,8 +3877,8 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl if (opt->activeSubControls & QStyle::SC_MdiCloseButton && (opt->state & State_Sunken)) { btnOpt.state |= State_Sunken; btnOpt.state &= ~State_Raised; - bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt); - bsy = proxy()->pixelMetric(PM_ButtonShiftVertical, opt); + bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt, widget); + bsy = proxy()->pixelMetric(PM_ButtonShiftVertical, opt, widget); } else { btnOpt.state |= State_Raised; btnOpt.state &= ~State_Sunken; @@ -3898,8 +3894,8 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl if (opt->activeSubControls & QStyle::SC_MdiNormalButton && (opt->state & State_Sunken)) { btnOpt.state |= State_Sunken; btnOpt.state &= ~State_Raised; - bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt); - bsy = proxy()->pixelMetric(PM_ButtonShiftVertical, opt); + bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt, widget); + bsy = proxy()->pixelMetric(PM_ButtonShiftVertical, opt, widget); } else { btnOpt.state |= State_Raised; btnOpt.state &= ~State_Sunken; @@ -3915,8 +3911,8 @@ void QCommonStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl if (opt->activeSubControls & QStyle::SC_MdiMinButton && (opt->state & State_Sunken)) { btnOpt.state |= State_Sunken; btnOpt.state &= ~State_Raised; - bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt); - bsy = proxy()->pixelMetric(PM_ButtonShiftVertical, opt); + bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal, opt, widget); + bsy = proxy()->pixelMetric(PM_ButtonShiftVertical, opt, widget); } else { btnOpt.state |= State_Raised; btnOpt.state &= ~State_Sunken; @@ -4236,6 +4232,7 @@ QRect QCommonStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex break; case SC_SpinBoxFrame: ret = spinbox->rect; + break; default: break; } @@ -4396,7 +4393,7 @@ QRect QCommonStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex if (verticalAlignment & Qt::AlignVCenter) topMargin = topHeight / 2; else if (verticalAlignment & Qt::AlignTop) - topMargin = topHeight; + topMargin = topHeight + proxy()->pixelMetric(PM_FocusFrameVMargin, groupBox, widget); } QRect frameRect = groupBox->rect; @@ -4529,15 +4526,6 @@ int QCommonStyle::pixelMetric(PixelMetric m, const QStyleOption *opt, const QWid case PM_MenuBarHMargin: ret = 0; break; - case PM_DialogButtonsSeparator: - ret = int(QStyleHelper::dpiScaled(5, opt)); - break; - case PM_DialogButtonsButtonWidth: - ret = int(QStyleHelper::dpiScaled(70, opt)); - break; - case PM_DialogButtonsButtonHeight: - ret = int(QStyleHelper::dpiScaled(30, opt)); - break; case PM_TitleBarHeight: { if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) { @@ -4955,7 +4943,7 @@ QSize QCommonStyle::sizeFromContents(ContentsType contentsType, const QStyleOpti } else { height = menuItemOpt->fontMetrics.height() + 8; if (!menuItemOpt->icon.isNull()) { - int iconExtent = proxy()->pixelMetric(PM_SmallIconSize, opt); + int iconExtent = proxy()->pixelMetric(PM_SmallIconSize, opt, widget); height = qMax(height, menuItemOpt->icon.actualSize(QSize(iconExtent, iconExtent)).height() + 4); @@ -4985,7 +4973,7 @@ QSize QCommonStyle::sizeFromContents(ContentsType contentsType, const QStyleOpti const int frameWidth = comboBoxOpt->frame ? proxy()->pixelMetric(PM_ComboBoxFrameWidth, opt, widget) * 2 : 0; - const int textMargins = 2*(proxy()->pixelMetric(PM_FocusFrameHMargin, opt) + 1); + const int textMargins = 2 * (proxy()->pixelMetric(PM_FocusFrameHMargin, opt, widget) + 1); // QItemDelegate::sizeHint expands the textMargins two times, thus the 2*textMargins... const int other = qMax(23, 2 * textMargins @@ -5247,8 +5235,8 @@ int QCommonStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget if (widget) { if (QStyleHintReturnMask *mask = qstyleoption_cast<QStyleHintReturnMask*>(hret)) { mask->region = widget->rect(); - const int vmargin = proxy()->pixelMetric(QStyle::PM_FocusFrameVMargin, opt); - const int hmargin = proxy()->pixelMetric(QStyle::PM_FocusFrameHMargin, opt); + const int vmargin = proxy()->pixelMetric(QStyle::PM_FocusFrameVMargin, opt, widget); + const int hmargin = proxy()->pixelMetric(QStyle::PM_FocusFrameHMargin, opt, widget); mask->region -= QRect(widget->rect().adjusted(hmargin, vmargin, -hmargin, -vmargin)); } } @@ -5261,7 +5249,7 @@ int QCommonStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget ret = true; if (QStyleHintReturnMask *mask = qstyleoption_cast<QStyleHintReturnMask*>(hret)) { mask->region = opt->rect; - const int margin = proxy()->pixelMetric(PM_DefaultFrameWidth, opt) * 2; + const int margin = proxy()->pixelMetric(PM_DefaultFrameWidth, opt, widget) * 2; mask->region -= opt->rect.adjusted(margin, margin, -margin, -margin); } } @@ -5511,647 +5499,313 @@ static QPixmap cachedPixmapFromXPM(const char * const *xpm) static inline QPixmap titleBarMenuCachedPixmapFromXPM() { return cachedPixmapFromXPM(qt_menu_xpm); } #endif // QT_CONFIG(imageformat_xpm) -#ifndef QT_NO_IMAGEFORMAT_PNG -static inline QString clearText16IconPath() -{ - return QStringLiteral(":/qt-project.org/styles/commonstyle/images/cleartext-16.png"); -} -#endif // !QT_NO_IMAGEFORMAT_PNG +#if QT_CONFIG(imageformat_png) +static constexpr QLatin1StringView iconResourcePrefix() noexcept { return ":/qt-project.org/styles/commonstyle/images/"_L1; } +static constexpr QLatin1StringView iconPngSuffix() noexcept { return ".png"_L1; } -#if defined(Q_OS_WIN) || QT_CONFIG(imageformat_png) -static QIcon clearTextIcon(bool rtl) +template <typename T> +static void addIconFiles(QStringView prefix, std::initializer_list<T> sizes, QIcon &icon, + QIcon::Mode mode = QIcon::Normal, QIcon::State state = QIcon::Off) { - const QString directionalThemeName = rtl - ? QStringLiteral("edit-clear-locationbar-ltr") : QStringLiteral("edit-clear-locationbar-rtl"); - if (QIcon::hasThemeIcon(directionalThemeName)) - return QIcon::fromTheme(directionalThemeName); - const QString themeName = QStringLiteral("edit-clear"); - if (QIcon::hasThemeIcon(themeName)) - return QIcon::fromTheme(themeName); - - QIcon icon; -#ifndef QT_NO_IMAGEFORMAT_PNG - QPixmap clearText16(clearText16IconPath()); - Q_ASSERT(!clearText16.size().isEmpty()); - icon.addPixmap(clearText16); - QPixmap clearText32(QStringLiteral(":/qt-project.org/styles/commonstyle/images/cleartext-32.png")); - Q_ASSERT(!clearText32.size().isEmpty()); - icon.addPixmap(clearText32); - clearText32.setDevicePixelRatio(2); // The 32x32 pixmap can also be used for 16x16/devicePixelRatio=2 - icon.addPixmap(clearText32); -#endif // !QT_NO_IMAGEFORMAT_PNG - return icon; + const auto fullPrefix = iconResourcePrefix() + prefix; + for (int size : sizes) + icon.addFile(fullPrefix + QString::number(size) + iconPngSuffix(), + QSize(size, size), mode, state); } -#endif + +static constexpr auto dockTitleIconSizes = {10, 16, 20, 32, 48, 64}; +static constexpr auto titleBarSizes = {16, 32, 48}; +static constexpr auto toolBarExtHSizes = {8, 16, 32, 128}; +static constexpr auto toolBarExtVSizes = {5, 10, 20, 80}; +static constexpr auto pngIconSizes = {16, 32, 128}; +#endif // imageformat_png /*! \reimp */ QPixmap QCommonStyle::standardPixmap(StandardPixmap sp, const QStyleOption *option, const QWidget *widget) const { - const bool rtl = (option && option->direction == Qt::RightToLeft) || (!option && QGuiApplication::isRightToLeft()); -#ifdef QT_NO_IMAGEFORMAT_PNG - Q_UNUSED(widget); - Q_UNUSED(sp); -#else - QPixmap pixmap; + Q_D(const QCommonStyle); + QIcon icon; - if (QGuiApplication::desktopSettingsAware() && !QIcon::themeName().isEmpty()) { - switch (sp) { - case SP_DialogYesButton: - case SP_DialogOkButton: - pixmap = QIcon::fromTheme("dialog-ok"_L1).pixmap(16); - break; - case SP_DialogApplyButton: - pixmap = QIcon::fromTheme("dialog-ok-apply"_L1).pixmap(16); - break; - case SP_DialogDiscardButton: - pixmap = QIcon::fromTheme("edit-delete"_L1).pixmap(16); - break; - case SP_DialogCloseButton: - pixmap = QIcon::fromTheme("dialog-close"_L1).pixmap(16); - break; - case SP_DirHomeIcon: - pixmap = QIcon::fromTheme("user-home"_L1).pixmap(16); - break; - case SP_MessageBoxInformation: - pixmap = QIcon::fromTheme("messagebox_info"_L1).pixmap(16); - break; - case SP_MessageBoxWarning: - pixmap = QIcon::fromTheme("messagebox_warning"_L1).pixmap(16); - break; - case SP_MessageBoxCritical: - pixmap = QIcon::fromTheme("messagebox_critical"_L1).pixmap(16); - break; - case SP_MessageBoxQuestion: - pixmap = QIcon::fromTheme("help"_L1).pixmap(16); - break; - case SP_DialogOpenButton: - case SP_DirOpenIcon: - pixmap = QIcon::fromTheme("folder-open"_L1).pixmap(16); - break; - case SP_FileIcon: - pixmap = QIcon::fromTheme("text-x-generic"_L1, QIcon::fromTheme("empty"_L1)).pixmap(16); - break; - case SP_DirClosedIcon: - case SP_DirIcon: - pixmap = QIcon::fromTheme("folder"_L1).pixmap(16); - break; - case SP_DriveFDIcon: - pixmap = QIcon::fromTheme("media-floppy"_L1, - QIcon::fromTheme("3floppy_unmount"_L1)).pixmap(16); - break; - case SP_ComputerIcon: - pixmap = QIcon::fromTheme("computer"_L1, QIcon::fromTheme("system"_L1)).pixmap(16); - break; - case SP_DesktopIcon: - pixmap = QIcon::fromTheme("user-desktop"_L1, - QIcon::fromTheme("desktop"_L1)).pixmap(16); - break; - case SP_TrashIcon: - pixmap = QIcon::fromTheme("user-trash"_L1, - QIcon::fromTheme("trashcan_empty"_L1)).pixmap(16); - break; - case SP_DriveCDIcon: - case SP_DriveDVDIcon: - pixmap = QIcon::fromTheme("media-optical"_L1, - QIcon::fromTheme("cdrom_unmount"_L1)).pixmap(16); - break; - case SP_DriveHDIcon: - pixmap = QIcon::fromTheme("drive-harddisk"_L1, - QIcon::fromTheme("hdd_unmount"_L1)).pixmap(16); - break; - case SP_FileDialogToParent: - pixmap = QIcon::fromTheme("go-up"_L1, QIcon::fromTheme("up"_L1)).pixmap(16); - break; - case SP_FileDialogNewFolder: - pixmap = QIcon::fromTheme("folder_new"_L1).pixmap(16); - break; - case SP_ArrowUp: - pixmap = QIcon::fromTheme("go-up"_L1, - QIcon::fromTheme("up"_L1)).pixmap(16); - break; - case SP_ArrowDown: - pixmap = QIcon::fromTheme("go-down"_L1, QIcon::fromTheme("down"_L1)).pixmap(16); - break; - case SP_ArrowRight: - pixmap = QIcon::fromTheme("go-next"_L1, QIcon::fromTheme("forward"_L1)).pixmap(16); - break; - case SP_ArrowLeft: - pixmap = QIcon::fromTheme("go-previous"_L1, QIcon::fromTheme("back"_L1)).pixmap(16); - break; - case SP_FileDialogDetailedView: - pixmap = QIcon::fromTheme("view_detailed"_L1).pixmap(16); - break; - case SP_FileDialogListView: - pixmap = QIcon::fromTheme("view_icon"_L1).pixmap(16); - break; - case SP_BrowserReload: - pixmap = QIcon::fromTheme("reload"_L1).pixmap(16); - break; - case SP_BrowserStop: - pixmap = QIcon::fromTheme("process-stop"_L1).pixmap(16); - break; - case SP_MediaPlay: - pixmap = QIcon::fromTheme("media-playback-start"_L1).pixmap(16); - break; - case SP_MediaPause: - pixmap = QIcon::fromTheme("media-playback-pause"_L1).pixmap(16); - break; - case SP_MediaStop: - pixmap = QIcon::fromTheme("media-playback-stop"_L1).pixmap(16); - break; - case SP_MediaSeekForward: - pixmap = QIcon::fromTheme("media-seek-forward"_L1).pixmap(16); - break; - case SP_MediaSeekBackward: - pixmap = QIcon::fromTheme("media-seek-backward"_L1).pixmap(16); - break; - case SP_MediaSkipForward: - pixmap = QIcon::fromTheme("media-skip-forward"_L1).pixmap(16); - break; - case SP_MediaSkipBackward: - pixmap = QIcon::fromTheme("media-skip-backward"_L1).pixmap(16); - break; - case SP_DialogResetButton: - pixmap = QIcon::fromTheme("edit-clear"_L1).pixmap(24); - break; - case SP_DialogHelpButton: - pixmap = QIcon::fromTheme("help-contents"_L1).pixmap(24); - break; - case SP_DialogNoButton: - case SP_DialogCancelButton: - pixmap = QIcon::fromTheme("dialog-cancel"_L1, - QIcon::fromTheme("process-stop"_L1)).pixmap(24); - break; - case SP_DialogSaveButton: - pixmap = QIcon::fromTheme("document-save"_L1).pixmap(24); - break; - case SP_FileLinkIcon: - pixmap = QIcon::fromTheme("emblem-symbolic-link"_L1).pixmap(16); - if (!pixmap.isNull()) { - QPixmap fileIcon = QIcon::fromTheme("text-x-generic"_L1).pixmap(16); - if (fileIcon.isNull()) - fileIcon = QIcon::fromTheme("empty"_L1).pixmap(16); - if (!fileIcon.isNull()) { - QPainter painter(&fileIcon); - painter.drawPixmap(0, 0, 16, 16, pixmap); - return fileIcon; - } - } - break; - case SP_DirLinkIcon: - pixmap = QIcon::fromTheme("emblem-symbolic-link"_L1).pixmap(16); - if (!pixmap.isNull()) { - QPixmap dirIcon = QIcon::fromTheme("folder"_L1).pixmap(16); - if (!dirIcon.isNull()) { - QPainter painter(&dirIcon); - painter.drawPixmap(0, 0, 16, 16, pixmap); - return dirIcon; - } - } - break; - case SP_LineEditClearButton: - pixmap = clearTextIcon(rtl).pixmap(16); - break; - default: - break; - } - } + icon = d->iconFromWindowsTheme(sp, option, widget); + if (!icon.isNull()) + return icon.pixmap(QSize(16, 16), qt_getDevicePixelRatio(widget)); + + icon = d->iconFromApplicationTheme(sp, option, widget); + if (!icon.isNull()) + return icon.pixmap(QSize(16, 16), qt_getDevicePixelRatio(widget)); + + icon = d->iconFromMacTheme(sp, option, widget); + if (!icon.isNull()) + return icon.pixmap(QSize(16, 16), qt_getDevicePixelRatio(widget)); + + icon = d->iconFromResourceTheme(sp, option, widget); + if (!icon.isNull()) + return icon.pixmap(QSize(16, 16), qt_getDevicePixelRatio(widget)); - if (!pixmap.isNull()) - return pixmap; -#endif //QT_NO_IMAGEFORMAT_PNG - switch (sp) { #ifndef QT_NO_IMAGEFORMAT_XPM - case SP_ToolBarHorizontalExtensionButton: - if (rtl) { - QImage im(tb_extension_arrow_h_xpm); - im = im.convertToFormat(QImage::Format_ARGB32).mirrored(true, false); - return QPixmap::fromImage(im); + switch (sp) { + case QStyle::SP_ToolBarHorizontalExtensionButton: + if (d->rtl(option)) { + auto im = QImage(tb_extension_arrow_h_xpm).convertToFormat(QImage::Format_ARGB32).mirrored(true, false); + return QPixmap::fromImage(std::move(im)); } return cachedPixmapFromXPM(tb_extension_arrow_h_xpm); - case SP_ToolBarVerticalExtensionButton: + case QStyle::SP_ToolBarVerticalExtensionButton: return cachedPixmapFromXPM(tb_extension_arrow_v_xpm); - case SP_FileDialogStart: + case QStyle::SP_FileDialogStart: return cachedPixmapFromXPM(filedialog_start_xpm); - case SP_FileDialogEnd: + case QStyle::SP_FileDialogEnd: return cachedPixmapFromXPM(filedialog_end_xpm); -#endif -#ifndef QT_NO_IMAGEFORMAT_PNG - case SP_CommandLink: - case SP_ArrowForward: - if (rtl) - return proxy()->standardPixmap(SP_ArrowLeft, option, widget); - return proxy()->standardPixmap(SP_ArrowRight, option, widget); - case SP_ArrowBack: - if (rtl) - return proxy()->standardPixmap(SP_ArrowRight, option, widget); - return proxy()->standardPixmap(SP_ArrowLeft, option, widget); - case SP_ArrowLeft: - return QPixmap(":/qt-project.org/styles/commonstyle/images/left-16.png"_L1); - case SP_ArrowRight: - return QPixmap(":/qt-project.org/styles/commonstyle/images/right-16.png"_L1); - case SP_ArrowUp: - return QPixmap(":/qt-project.org/styles/commonstyle/images/up-16.png"_L1); - case SP_ArrowDown: - return QPixmap(":/qt-project.org/styles/commonstyle/images/down-16.png"_L1); - case SP_FileDialogToParent: - return proxy()->standardPixmap(SP_ArrowUp, option, widget); - case SP_FileDialogNewFolder: - return QPixmap(":/qt-project.org/styles/commonstyle/images/newdirectory-16.png"_L1); - case SP_FileDialogDetailedView: - return QPixmap(":/qt-project.org/styles/commonstyle/images/viewdetailed-16.png"_L1); - case SP_FileDialogInfoView: - return QPixmap(":/qt-project.org/styles/commonstyle/images/fileinfo-16.png"_L1); - case SP_FileDialogContentsView: - return QPixmap(":/qt-project.org/styles/commonstyle/images/filecontents-16.png"_L1); - case SP_FileDialogListView: - return QPixmap(":/qt-project.org/styles/commonstyle/images/viewlist-16.png"_L1); - case SP_FileDialogBack: - return proxy()->standardPixmap(SP_ArrowBack, option, widget); - case SP_DriveHDIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/harddrive-16.png"_L1); - case SP_TrashIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/trash-16.png"_L1); - case SP_DriveFDIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/floppy-16.png"_L1); - case SP_DriveNetIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/networkdrive-16.png"_L1); - case SP_DesktopIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/desktop-16.png"_L1); - case SP_ComputerIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/computer-16.png"_L1); - case SP_DriveCDIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/cdr-16.png"_L1); - case SP_DriveDVDIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/dvd-16.png"_L1); - case SP_DirHomeIcon: - case SP_DirOpenIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/diropen-16.png"_L1); - case SP_DirIcon: - case SP_DirClosedIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/dirclosed-16.png"_L1); - case SP_DirLinkIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/dirlink-16.png"_L1); - case SP_FileIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/file-16.png"_L1); - case SP_FileLinkIcon: - return QPixmap(":/qt-project.org/styles/commonstyle/images/filelink-16.png"_L1); - case SP_DialogOkButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-ok-16.png"_L1); - case SP_DialogCancelButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-cancel-16.png"_L1); - case SP_DialogHelpButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-help-16.png"_L1); - case SP_DialogOpenButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-open-16.png"_L1); - case SP_DialogSaveButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-save-16.png"_L1); - case SP_DialogCloseButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-close-16.png"_L1); - case SP_DialogApplyButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-apply-16.png"_L1); - case SP_DialogResetButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-clear-16.png"_L1); - case SP_DialogDiscardButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-delete-16.png"_L1); - case SP_DialogYesButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-yes-16.png"_L1); - case SP_DialogNoButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-no-16.png"_L1); - case SP_BrowserReload: - return QPixmap(":/qt-project.org/styles/commonstyle/images/refresh-24.png"_L1); - case SP_BrowserStop: - return QPixmap(":/qt-project.org/styles/commonstyle/images/stop-24.png"_L1); - case SP_MediaPlay: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-play-32.png"_L1); - case SP_MediaPause: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-pause-32.png"_L1); - case SP_MediaStop: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-stop-32.png"_L1); - case SP_MediaSeekForward: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-seek-forward-32.png"_L1); - case SP_MediaSeekBackward: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-seek-backward-32.png"_L1); - case SP_MediaSkipForward: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-skip-forward-32.png"_L1); - case SP_MediaSkipBackward: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-skip-backward-32.png"_L1); - case SP_MediaVolume: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-volume-16.png"_L1); - case SP_MediaVolumeMuted: - return QPixmap(":/qt-project.org/styles/commonstyle/images/media-volume-muted-16.png"_L1); - case SP_LineEditClearButton: - return QPixmap(clearText16IconPath()); - case SP_TabCloseButton: - return QPixmap(":/qt-project.org/styles/commonstyle/images/standardbutton-closetab-16.png"_L1); -#endif // QT_NO_IMAGEFORMAT_PNG - default: - break; - } - -#ifndef QT_NO_IMAGEFORMAT_XPM - switch (sp) { - case SP_TitleBarMenuButton: + case QStyle::SP_TitleBarMenuButton: return titleBarMenuCachedPixmapFromXPM(); - case SP_TitleBarShadeButton: + case QStyle::SP_TitleBarShadeButton: return cachedPixmapFromXPM(qt_shade_xpm); - case SP_TitleBarUnshadeButton: + case QStyle::SP_TitleBarUnshadeButton: return cachedPixmapFromXPM(qt_unshade_xpm); - case SP_TitleBarNormalButton: + case QStyle::SP_TitleBarNormalButton: return cachedPixmapFromXPM(qt_normalizeup_xpm); - case SP_TitleBarMinButton: + case QStyle::SP_TitleBarMinButton: return cachedPixmapFromXPM(qt_minimize_xpm); - case SP_TitleBarMaxButton: + case QStyle::SP_TitleBarMaxButton: return cachedPixmapFromXPM(qt_maximize_xpm); - case SP_TitleBarCloseButton: + case QStyle::SP_TitleBarCloseButton: return cachedPixmapFromXPM(qt_close_xpm); - case SP_TitleBarContextHelpButton: + case QStyle::SP_TitleBarContextHelpButton: return cachedPixmapFromXPM(qt_help_xpm); - case SP_DockWidgetCloseButton: + case QStyle::SP_DockWidgetCloseButton: return cachedPixmapFromXPM(dock_widget_close_xpm); - case SP_MessageBoxInformation: + case QStyle::SP_MessageBoxInformation: return cachedPixmapFromXPM(information_xpm); - case SP_MessageBoxWarning: + case QStyle::SP_MessageBoxWarning: return cachedPixmapFromXPM(warning_xpm); - case SP_MessageBoxCritical: + case QStyle::SP_MessageBoxCritical: return cachedPixmapFromXPM(critical_xpm); - case SP_MessageBoxQuestion: + case QStyle::SP_MessageBoxQuestion: return cachedPixmapFromXPM(question_xpm); default: break; } #endif //QT_NO_IMAGEFORMAT_XPM -#if !QT_CONFIG(imageformat_png) && !QT_CONFIG(imageformat_xpm) && !QT_CONFIG(imageformat_png) - Q_UNUSED(rtl); -#endif - return QPixmap(); } -#if QT_CONFIG(imageformat_png) -static inline QString iconResourcePrefix() { return QStringLiteral(":/qt-project.org/styles/commonstyle/images/"); } -static inline QString iconPngSuffix() { return QStringLiteral(".png"); } - -static void addIconFiles(const QString &prefix, const int sizes[], size_t count, QIcon &icon) -{ - for (size_t i = 0; i < count; ++i) - icon.addFile(prefix + QString::number(sizes[i]) + iconPngSuffix()); -} - -static const int dockTitleIconSizes[] = {10, 16, 20, 32, 48, 64}; -static const int titleBarSizes[] = {16, 32, 48}; -static const int toolBarExtHSizes[] = {8, 16, 32}; -static const int toolBarExtVSizes[] = {5, 10, 20}; -#endif // imageformat_png - -/*! - \internal -*/ -QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption *option, - const QWidget *widget) const +QIcon QCommonStylePrivate::iconFromWindowsTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const { + Q_UNUSED(option); + Q_UNUSED(widget); QIcon icon; - const bool rtl = (option && option->direction == Qt::RightToLeft) || (!option && QGuiApplication::isRightToLeft()); - #ifdef Q_OS_WIN switch (standardIcon) { - case SP_DriveCDIcon: - case SP_DriveDVDIcon: - case SP_DriveNetIcon: - case SP_DriveHDIcon: - case SP_DriveFDIcon: - case SP_FileIcon: - case SP_FileLinkIcon: - case SP_DesktopIcon: - case SP_ComputerIcon: - case SP_VistaShield: - case SP_MessageBoxInformation: - case SP_MessageBoxWarning: - case SP_MessageBoxCritical: - case SP_MessageBoxQuestion: + case QStyle::SP_DriveCDIcon: + case QStyle::SP_DriveDVDIcon: + case QStyle::SP_DriveNetIcon: + case QStyle::SP_DriveHDIcon: + case QStyle::SP_DriveFDIcon: + case QStyle::SP_FileIcon: + case QStyle::SP_FileLinkIcon: + case QStyle::SP_DesktopIcon: + case QStyle::SP_ComputerIcon: + case QStyle::SP_VistaShield: + case QStyle::SP_MessageBoxInformation: + case QStyle::SP_MessageBoxWarning: + case QStyle::SP_MessageBoxCritical: + case QStyle::SP_MessageBoxQuestion: if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) { QPlatformTheme::StandardPixmap sp = static_cast<QPlatformTheme::StandardPixmap>(standardIcon); - for (int size = 16 ; size <= 32 ; size += 16) { - QPixmap pixmap = theme->standardPixmap(sp, QSizeF(size, size)); + const auto dpr = qt_getDevicePixelRatio(widget); + const QList<QSize> sizes = theme->themeHint(QPlatformTheme::IconPixmapSizes).value<QList<QSize>>(); + for (const QSize &size : sizes) { + QPixmap pixmap = theme->standardPixmap(sp, size * dpr); + pixmap.setDevicePixelRatio(dpr); icon.addPixmap(pixmap, QIcon::Normal); } } break; - case SP_DirIcon: - case SP_DirLinkIcon: + case QStyle::SP_DirIcon: + case QStyle::SP_DirLinkIcon: if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) { QPlatformTheme::StandardPixmap spOff = static_cast<QPlatformTheme::StandardPixmap>(standardIcon); - QPlatformTheme::StandardPixmap spOn = standardIcon == SP_DirIcon ? QPlatformTheme::DirOpenIcon : - QPlatformTheme::DirLinkOpenIcon; - for (int size = 16 ; size <= 32 ; size += 16) { - QSizeF pixSize(size, size); + QPlatformTheme::StandardPixmap spOn = standardIcon == QStyle::SP_DirIcon ? QPlatformTheme::DirOpenIcon + : QPlatformTheme::DirLinkOpenIcon; + const auto dpr = qt_getDevicePixelRatio(widget); + const QList<QSize> sizes = theme->themeHint(QPlatformTheme::IconPixmapSizes).value<QList<QSize>>(); + for (const QSize &size : sizes) { + const QSizeF pixSize = size * dpr; QPixmap pixmap = theme->standardPixmap(spOff, pixSize); + pixmap.setDevicePixelRatio(dpr); icon.addPixmap(pixmap, QIcon::Normal, QIcon::Off); pixmap = theme->standardPixmap(spOn, pixSize); + pixmap.setDevicePixelRatio(dpr); icon.addPixmap(pixmap, QIcon::Normal, QIcon::On); } } break; - case SP_LineEditClearButton: - icon = clearTextIcon(rtl); - break; default: break; } - if (!icon.isNull()) - return icon; - +#else + Q_UNUSED(standardIcon) #endif + return icon; +} +QIcon QCommonStylePrivate::iconFromApplicationTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const +{ if (QGuiApplication::desktopSettingsAware() && !QIcon::themeName().isEmpty()) { switch (standardIcon) { - case SP_DirHomeIcon: - icon = QIcon::fromTheme("user-home"_L1); - break; - case SP_MessageBoxInformation: - icon = QIcon::fromTheme("dialog-information"_L1); - break; - case SP_MessageBoxWarning: - icon = QIcon::fromTheme("dialog-warning"_L1); - break; - case SP_MessageBoxCritical: - icon = QIcon::fromTheme("dialog-error"_L1); - break; - case SP_MessageBoxQuestion: - icon = QIcon::fromTheme("dialog-question"_L1); - break; - case SP_DialogOpenButton: - case SP_DirOpenIcon: - icon = QIcon::fromTheme("folder-open"_L1); - break; - case SP_DialogSaveButton: - icon = QIcon::fromTheme("document-save"_L1); - break; - case SP_DialogApplyButton: - icon = QIcon::fromTheme("dialog-ok-apply"_L1); - break; - case SP_DialogYesButton: - case SP_DialogOkButton: - icon = QIcon::fromTheme("dialog-ok"_L1); - break; - case SP_DialogDiscardButton: - icon = QIcon::fromTheme("edit-delete"_L1); - break; - case SP_DialogResetButton: - icon = QIcon::fromTheme("edit-clear"_L1); - break; - case SP_DialogHelpButton: - icon = QIcon::fromTheme("help-contents"_L1); - break; - case SP_FileIcon: - icon = QIcon::fromTheme("text-x-generic"_L1); - break; - case SP_DirClosedIcon: - case SP_DirIcon: - icon = QIcon::fromTheme("folder"_L1); - break; - case SP_DriveFDIcon: - icon = QIcon::fromTheme("floppy_unmount"_L1); - break; - case SP_ComputerIcon: - icon = QIcon::fromTheme("computer"_L1, QIcon::fromTheme("system"_L1)); - break; - case SP_DesktopIcon: - icon = QIcon::fromTheme("user-desktop"_L1); - break; - case SP_TrashIcon: - icon = QIcon::fromTheme("user-trash"_L1); - break; - case SP_DriveCDIcon: - case SP_DriveDVDIcon: - icon = QIcon::fromTheme("media-optical"_L1); - break; - case SP_DriveHDIcon: - icon = QIcon::fromTheme("drive-harddisk"_L1); - break; - case SP_FileDialogToParent: - icon = QIcon::fromTheme("go-up"_L1); - break; - case SP_FileDialogNewFolder: - icon = QIcon::fromTheme("folder-new"_L1); - break; - case SP_ArrowUp: - icon = QIcon::fromTheme("go-up"_L1); - break; - case SP_ArrowDown: - icon = QIcon::fromTheme("go-down"_L1); - break; - case SP_ArrowRight: - icon = QIcon::fromTheme("go-next"_L1); - break; - case SP_ArrowLeft: - icon = QIcon::fromTheme("go-previous"_L1); - break; - case SP_DialogNoButton: - case SP_DialogCancelButton: - icon = QIcon::fromTheme("dialog-cancel"_L1, QIcon::fromTheme("process-stop"_L1)); - break; - case SP_DialogCloseButton: - icon = QIcon::fromTheme("window-close"_L1); - break; - case SP_FileDialogDetailedView: - icon = QIcon::fromTheme("view-list-details"_L1); - break; - case SP_FileDialogListView: - icon = QIcon::fromTheme("view-list-icons"_L1); - break; - case SP_BrowserReload: - icon = QIcon::fromTheme("view-refresh"_L1); - break; - case SP_BrowserStop: - icon = QIcon::fromTheme("process-stop"_L1); - break; - case SP_MediaPlay: - icon = QIcon::fromTheme("media-playback-start"_L1); - break; - case SP_MediaPause: - icon = QIcon::fromTheme("media-playback-pause"_L1); - break; - case SP_MediaStop: - icon = QIcon::fromTheme("media-playback-stop"_L1); - break; - case SP_MediaSeekForward: - icon = QIcon::fromTheme("media-seek-forward"_L1); - break; - case SP_MediaSeekBackward: - icon = QIcon::fromTheme("media-seek-backward"_L1); - break; - case SP_MediaSkipForward: - icon = QIcon::fromTheme("media-skip-forward"_L1); - break; - case SP_MediaSkipBackward: - icon = QIcon::fromTheme("media-skip-backward"_L1); - break; - case SP_MediaVolume: - icon = QIcon::fromTheme("audio-volume-medium"_L1); - break; - case SP_MediaVolumeMuted: - icon = QIcon::fromTheme("audio-volume-muted"_L1); - break; - case SP_ArrowForward: - if (rtl) - return QCommonStyle::standardIcon(SP_ArrowLeft, option, widget); - return QCommonStyle::standardIcon(SP_ArrowRight, option, widget); - case SP_ArrowBack: - if (rtl) - return QCommonStyle::standardIcon(SP_ArrowRight, option, widget); - return QCommonStyle::standardIcon(SP_ArrowLeft, option, widget); - case SP_FileLinkIcon: - { - QIcon linkIcon = QIcon::fromTheme("emblem-symbolic-link"_L1); - if (!linkIcon.isNull()) { - QIcon baseIcon = QCommonStyle::standardIcon(SP_FileIcon, option, widget); - const QList<QSize> sizes = baseIcon.availableSizes(QIcon::Normal, QIcon::Off); - for (int i = 0 ; i < sizes.size() ; ++i) { - int size = sizes[i].width(); - QPixmap basePixmap = baseIcon.pixmap(QSize(size, size), qt_getDevicePixelRatio(widget)); - QPixmap linkPixmap = linkIcon.pixmap(QSize(size / 2, size / 2), qt_getDevicePixelRatio(widget)); + case QStyle::SP_DirHomeIcon: + return QIcon::fromTheme("user-home"_L1); + case QStyle::SP_MessageBoxInformation: + return QIcon::fromTheme("dialog-information"_L1); + case QStyle::SP_MessageBoxWarning: + return QIcon::fromTheme("dialog-warning"_L1); + case QStyle::SP_MessageBoxCritical: + return QIcon::fromTheme("dialog-error"_L1); + case QStyle::SP_MessageBoxQuestion: + return QIcon::fromTheme("dialog-question"_L1); + case QStyle::SP_DialogOpenButton: + case QStyle::SP_DirOpenIcon: + return QIcon::fromTheme("folder-open"_L1); + case QStyle::SP_DialogSaveButton: + return QIcon::fromTheme("document-save"_L1); + case QStyle::SP_DialogApplyButton: + return QIcon::fromTheme("dialog-ok-apply"_L1); + case QStyle::SP_DialogYesButton: + case QStyle::SP_DialogOkButton: + return QIcon::fromTheme("dialog-ok"_L1); + case QStyle::SP_DialogDiscardButton: + return QIcon::fromTheme("edit-delete"_L1); + case QStyle::SP_DialogResetButton: + return QIcon::fromTheme("edit-clear"_L1); + case QStyle::SP_DialogHelpButton: + return QIcon::fromTheme("help-contents"_L1); + case QStyle::SP_FileIcon: + return QIcon::fromTheme("text-x-generic"_L1); + case QStyle::SP_DirClosedIcon: + case QStyle::SP_DirIcon: + return QIcon::fromTheme("folder"_L1); + case QStyle::SP_DriveFDIcon: + return QIcon::fromTheme("floppy_unmount"_L1); + case QStyle::SP_ComputerIcon: + return QIcon::fromTheme("computer"_L1, QIcon::fromTheme("system"_L1)); + case QStyle::SP_DesktopIcon: + return QIcon::fromTheme("user-desktop"_L1); + case QStyle::SP_TrashIcon: + return QIcon::fromTheme("user-trash"_L1); + case QStyle::SP_DriveCDIcon: + case QStyle::SP_DriveDVDIcon: + return QIcon::fromTheme("media-optical"_L1); + case QStyle::SP_DriveHDIcon: + return QIcon::fromTheme("drive-harddisk"_L1); + case QStyle::SP_FileDialogToParent: + return QIcon::fromTheme("go-up"_L1); + case QStyle::SP_FileDialogNewFolder: + return QIcon::fromTheme("folder-new"_L1); + case QStyle::SP_ArrowUp: + return QIcon::fromTheme("go-up"_L1); + case QStyle::SP_ArrowDown: + return QIcon::fromTheme("go-down"_L1); + case QStyle::SP_ArrowRight: + return QIcon::fromTheme("go-next"_L1); + case QStyle::SP_ArrowLeft: + return QIcon::fromTheme("go-previous"_L1); + case QStyle::SP_DialogNoButton: + case QStyle::SP_DialogCancelButton: + return QIcon::fromTheme("dialog-cancel"_L1, QIcon::fromTheme("process-stop"_L1)); + case QStyle::SP_DialogCloseButton: + return QIcon::fromTheme("window-close"_L1); + case QStyle::SP_FileDialogDetailedView: + return QIcon::fromTheme("view-list-details"_L1); + case QStyle::SP_FileDialogListView: + return QIcon::fromTheme("view-list-icons"_L1); + case QStyle::SP_BrowserReload: + return QIcon::fromTheme("view-refresh"_L1); + case QStyle::SP_BrowserStop: + return QIcon::fromTheme("process-stop"_L1); + case QStyle::SP_MediaPlay: + return QIcon::fromTheme("media-playback-start"_L1); + case QStyle::SP_MediaPause: + return QIcon::fromTheme("media-playback-pause"_L1); + case QStyle::SP_MediaStop: + return QIcon::fromTheme("media-playback-stop"_L1); + case QStyle::SP_MediaSeekForward: + return QIcon::fromTheme("media-seek-forward"_L1); + case QStyle::SP_MediaSeekBackward: + return QIcon::fromTheme("media-seek-backward"_L1); + case QStyle::SP_MediaSkipForward: + return QIcon::fromTheme("media-skip-forward"_L1); + case QStyle::SP_MediaSkipBackward: + return QIcon::fromTheme("media-skip-backward"_L1); + case QStyle::SP_MediaVolume: + return QIcon::fromTheme("audio-volume-medium"_L1); + case QStyle::SP_MediaVolumeMuted: + return QIcon::fromTheme("audio-volume-muted"_L1); + case QStyle::SP_ArrowForward: + return iconFromApplicationTheme(rtl(option) ? QStyle::SP_ArrowLeft + : QStyle::SP_ArrowRight, + option, widget); + case QStyle::SP_ArrowBack: + return iconFromApplicationTheme(rtl(option) ? QStyle::SP_ArrowRight + : QStyle::SP_ArrowLeft, + option, widget); + case QStyle::SP_DirLinkIcon: + case QStyle::SP_FileLinkIcon: { + const auto si = (standardIcon == QStyle::SP_DirLinkIcon) + ? QStyle::SP_DirIcon : QStyle::SP_FileIcon; + QIcon icon; + const QIcon linkIcon = QIcon::fromTheme("emblem-symbolic-link"_L1); + const QIcon baseIcon = iconFromApplicationTheme(si, option, widget); + if (!linkIcon.isNull() || !baseIcon.isNull()) { + const auto sizes = baseIcon.availableSizes(QIcon::Normal, QIcon::Off); + const auto dpr = qt_getDevicePixelRatio(widget); + for (const auto size : sizes) { + QPixmap basePixmap = baseIcon.pixmap(size, dpr); + QPixmap linkPixmap = linkIcon.pixmap(size / 2, dpr); QPainter painter(&basePixmap); - painter.drawPixmap(size/2, size/2, linkPixmap); + const auto w = size.width() / 2; + painter.drawPixmap(w, w, linkPixmap); icon.addPixmap(basePixmap); } } + return icon; } break; - case SP_DirLinkIcon: - { - QIcon linkIcon = QIcon::fromTheme("emblem-symbolic-link"_L1); - if (!linkIcon.isNull()) { - QIcon baseIcon = QCommonStyle::standardIcon(SP_DirIcon, option, widget); - const QList<QSize> sizes = baseIcon.availableSizes(QIcon::Normal, QIcon::Off); - for (int i = 0 ; i < sizes.size() ; ++i) { - int size = sizes[i].width(); - QPixmap basePixmap = baseIcon.pixmap(QSize(size, size), qt_getDevicePixelRatio(widget)); - QPixmap linkPixmap = linkIcon.pixmap(QSize(size / 2, size / 2), qt_getDevicePixelRatio(widget)); - QPainter painter(&basePixmap); - painter.drawPixmap(size/2, size/2, linkPixmap); - icon.addPixmap(basePixmap); - } - } + case QStyle::SP_LineEditClearButton: { + const QString directionalThemeName = rtl(option) + ? QStringLiteral("edit-clear-locationbar-ltr") : QStringLiteral("edit-clear-locationbar-rtl"); + if (QIcon::hasThemeIcon(directionalThemeName)) + return QIcon::fromTheme(directionalThemeName); + const QString themeName = QStringLiteral("edit-clear"); + if (QIcon::hasThemeIcon(themeName)) + return QIcon::fromTheme(themeName); + break; } - break; default: break; } } // if (QGuiApplication::desktopSettingsAware() && !QIcon::themeName().isEmpty()) - if (!icon.isNull()) - return icon; + return {}; +} -#if defined(Q_OS_MAC) +QIcon QCommonStylePrivate::iconFromMacTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const +{ +#ifdef Q_OS_DARWIN + Q_Q(const QCommonStyle); if (QGuiApplication::desktopSettingsAware()) { switch (standardIcon) { - case SP_DirIcon: { + case QStyle::SP_DirIcon: { // A rather special case - QIcon closeIcon = QCommonStyle::standardIcon(SP_DirClosedIcon, option, widget); - QIcon openIcon = QCommonStyle::standardIcon(SP_DirOpenIcon, option, widget); + QIcon closeIcon = q->standardIcon(QStyle::SP_DirClosedIcon, option, widget); + QIcon openIcon = q->standardIcon(QStyle::SP_DirOpenIcon, option, widget); closeIcon.addPixmap(openIcon.pixmap(16, 16), QIcon::Normal, QIcon::On); closeIcon.addPixmap(openIcon.pixmap(32, 32), QIcon::Normal, QIcon::On); closeIcon.addPixmap(openIcon.pixmap(64, 64), QIcon::Normal, QIcon::On); @@ -6159,38 +5813,39 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption return closeIcon; } - case SP_TitleBarNormalButton: - case SP_TitleBarCloseButton: { + case QStyle::SP_TitleBarNormalButton: + case QStyle::SP_TitleBarCloseButton: { QIcon titleBarIcon; - QString prefix = standardIcon == SP_TitleBarCloseButton - ? QStringLiteral(":/qt-project.org/styles/macstyle/images/closedock-") - : QStringLiteral(":/qt-project.org/styles/macstyle/images/dockdock-"); + constexpr auto imagesPrefix = ":/qt-project.org/styles/macstyle/images/"_L1; + const auto namePrefix = standardIcon == QStyle::SP_TitleBarCloseButton + ? "closedock-"_L1 + : "dockdock-"_L1; for (const auto size : dockTitleIconSizes) { - titleBarIcon.addFile(prefix + QStringLiteral("macstyle-") + QString::number(size) + iconPngSuffix(), - QSize(size, size), QIcon::Normal, QIcon::Off); - titleBarIcon.addFile(prefix + QStringLiteral("down-macstyle-") + QString::number(size) + iconPngSuffix(), - QSize(size, size), QIcon::Normal, QIcon::On); + titleBarIcon.addFile(imagesPrefix + namePrefix + "macstyle-"_L1 + QString::number(size) + + iconPngSuffix(), QSize(size, size), QIcon::Normal, QIcon::Off); + titleBarIcon.addFile(imagesPrefix + namePrefix + "down-macstyle-"_L1 + QString::number(size) + + iconPngSuffix(), QSize(size, size), QIcon::Normal, QIcon::On); } return titleBarIcon; } - case SP_MessageBoxQuestion: - case SP_MessageBoxInformation: - case SP_MessageBoxWarning: - case SP_MessageBoxCritical: - case SP_DesktopIcon: - case SP_TrashIcon: - case SP_ComputerIcon: - case SP_DriveFDIcon: - case SP_DriveHDIcon: - case SP_DriveCDIcon: - case SP_DriveDVDIcon: - case SP_DriveNetIcon: - case SP_DirOpenIcon: - case SP_DirClosedIcon: - case SP_DirLinkIcon: - case SP_FileLinkIcon: - case SP_FileIcon: + case QStyle::SP_MessageBoxQuestion: + case QStyle::SP_MessageBoxInformation: + case QStyle::SP_MessageBoxWarning: + case QStyle::SP_MessageBoxCritical: + case QStyle::SP_DesktopIcon: + case QStyle::SP_TrashIcon: + case QStyle::SP_ComputerIcon: + case QStyle::SP_DriveFDIcon: + case QStyle::SP_DriveHDIcon: + case QStyle::SP_DriveCDIcon: + case QStyle::SP_DriveDVDIcon: + case QStyle::SP_DriveNetIcon: + case QStyle::SP_DirOpenIcon: + case QStyle::SP_DirClosedIcon: + case QStyle::SP_DirLinkIcon: + case QStyle::SP_FileLinkIcon: + case QStyle::SP_FileIcon: if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) { QPlatformTheme::StandardPixmap sp = static_cast<QPlatformTheme::StandardPixmap>(standardIcon); QIcon retIcon; @@ -6207,277 +5862,288 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption retIcon.addPixmap(mainIcon); } - if (!retIcon.isNull()) - return retIcon; + return retIcon; } default: break; } } // if (QGuiApplication::desktopSettingsAware()) -#endif // Q_OS_MAC +#else // Q_OS_DARWIN + Q_UNUSED(standardIcon); + Q_UNUSED(option); + Q_UNUSED(widget); +#endif // Q_OS_DARWIN + return {}; +} - switch (standardIcon) { +QIcon QCommonStylePrivate::iconFromResourceTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const +{ + Q_Q(const QCommonStyle); + QIcon icon; #ifndef QT_NO_IMAGEFORMAT_PNG - case SP_TitleBarMinButton: - addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-min-"), - titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon); - break; - case SP_TitleBarMaxButton: - addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-max-"), - titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon); - break; - case SP_TitleBarShadeButton: - addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-shade-"), - titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon); - - break; - case SP_TitleBarUnshadeButton: - addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-unshade-"), - titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon); - break; - case SP_TitleBarContextHelpButton: - addIconFiles(iconResourcePrefix() + QStringLiteral("titlebar-contexthelp-"), - titleBarSizes, sizeof(titleBarSizes)/sizeof(titleBarSizes[0]), icon); - break; - case SP_FileDialogNewFolder: - icon.addFile(":/qt-project.org/styles/commonstyle/images/newdirectory-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/newdirectory-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/newdirectory-128.png"_L1, QSize(128, 128)); - break; - case SP_FileDialogBack: - return QCommonStyle::standardIcon(SP_ArrowBack, option, widget); - case SP_FileDialogToParent: - return QCommonStyle::standardIcon(SP_ArrowUp, option, widget); - case SP_FileDialogDetailedView: - icon.addFile(":/qt-project.org/styles/commonstyle/images/viewdetailed-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/viewdetailed-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/viewdetailed-128.png"_L1, QSize(128, 128)); - break; - case SP_FileDialogInfoView: - icon.addFile(":/qt-project.org/styles/commonstyle/images/fileinfo-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/fileinfo-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/fileinfo-128.png"_L1, QSize(128, 128)); - break; - case SP_FileDialogContentsView: - icon.addFile(":/qt-project.org/styles/commonstyle/images/filecontents-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/filecontents-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/filecontents-128.png"_L1, QSize(128, 128)); - break; - case SP_FileDialogListView: - icon.addFile(":/qt-project.org/styles/commonstyle/images/viewlist-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/viewlist-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/viewlist-128.png"_L1, QSize(128, 128)); - break; - case SP_DialogOkButton: - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-ok-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-ok-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-ok-128.png"_L1, QSize(128, 128)); - break; - case SP_DialogCancelButton: - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-cancel-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-cancel-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-cancel-128.png"_L1, QSize(128, 128)); - break; - case SP_DialogHelpButton: - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-help-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-help-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-help-128.png"_L1, QSize(128, 128)); - break; - case SP_DialogOpenButton: - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-open-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-open-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-open-128.png"_L1, QSize(128, 128)); - break; - case SP_DialogSaveButton: - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-save-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-save-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-save-128.png"_L1, QSize(128, 128)); - break; - case SP_DialogCloseButton: - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-close-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-close-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-close-128.png"_L1, QSize(128, 128)); - break; - case SP_DialogApplyButton: - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-apply-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-apply-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-apply-128.png"_L1, QSize(128, 128)); - break; - case SP_DialogResetButton: - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-clear-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-clear-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-clear-128.png"_L1, QSize(128, 128)); - break; - case SP_DialogDiscardButton: - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-delete-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-delete-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-delete-128.png"_L1, QSize(128, 128)); - break; - case SP_DialogYesButton: - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-yes-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-yes-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-yes-128.png"_L1, QSize(128, 128)); - break; - case SP_DialogNoButton: - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-no-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-no-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/standardbutton-no-128.png"_L1, QSize(128, 128)); - break; - case SP_ArrowForward: - if (rtl) - return QCommonStyle::standardIcon(SP_ArrowLeft, option, widget); - return QCommonStyle::standardIcon(SP_ArrowRight, option, widget); - case SP_ArrowBack: - if (rtl) - return QCommonStyle::standardIcon(SP_ArrowRight, option, widget); - return QCommonStyle::standardIcon(SP_ArrowLeft, option, widget); - case SP_ArrowLeft: - icon.addFile(":/qt-project.org/styles/commonstyle/images/left-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/left-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/left-128.png"_L1, QSize(128, 128)); - break; - case SP_ArrowRight: - icon.addFile(":/qt-project.org/styles/commonstyle/images/right-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/right-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/right-128.png"_L1, QSize(128, 128)); - break; - case SP_ArrowUp: - icon.addFile(":/qt-project.org/styles/commonstyle/images/up-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/up-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/up-128.png"_L1, QSize(128, 128)); - break; - case SP_ArrowDown: - icon.addFile(":/qt-project.org/styles/commonstyle/images/down-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/down-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/down-128.png"_L1, QSize(128, 128)); - break; - case SP_DirHomeIcon: - case SP_DirIcon: - icon.addFile(":/qt-project.org/styles/commonstyle/images/dirclosed-16.png"_L1, - QSize(), QIcon::Normal, QIcon::Off); - icon.addFile(":/qt-project.org/styles/commonstyle/images/diropen-16.png"_L1, - QSize(), QIcon::Normal, QIcon::On); - icon.addFile(":/qt-project.org/styles/commonstyle/images/dirclosed-32.png"_L1, - QSize(32, 32), QIcon::Normal, QIcon::Off); - icon.addFile(":/qt-project.org/styles/commonstyle/images/diropen-32.png"_L1, - QSize(32, 32), QIcon::Normal, QIcon::On); - icon.addFile(":/qt-project.org/styles/commonstyle/images/dirclosed-128.png"_L1, - QSize(128, 128), QIcon::Normal, QIcon::Off); - icon.addFile(":/qt-project.org/styles/commonstyle/images/diropen-128.png"_L1, - QSize(128, 128), QIcon::Normal, QIcon::On); - break; - case SP_DriveCDIcon: - icon.addFile(":/qt-project.org/styles/commonstyle/images/cdr-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/cdr-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/cdr-128.png"_L1, QSize(128, 128)); - break; - case SP_DriveDVDIcon: - icon.addFile(":/qt-project.org/styles/commonstyle/images/dvd-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/dvd-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/dvd-128.png"_L1, QSize(128, 128)); - break; - case SP_FileIcon: - icon.addFile(":/qt-project.org/styles/commonstyle/images/file-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/file-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/file-128.png"_L1, QSize(128, 128)); - break; - case SP_FileLinkIcon: - icon.addFile(":/qt-project.org/styles/commonstyle/images/filelink-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/filelink-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/filelink-128.png"_L1, QSize(128, 128)); - break; - case SP_TrashIcon: - icon.addFile(":/qt-project.org/styles/commonstyle/images/trash-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/trash-32.png"_L1, QSize(32, 32)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/trash-128.png"_L1, QSize(128, 128)); - break; - case SP_BrowserReload: - icon.addFile(":/qt-project.org/styles/commonstyle/images/refresh-24.png"_L1, QSize(24, 24)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/refresh-32.png"_L1, QSize(32, 32)); - break; - case SP_BrowserStop: - icon.addFile(":/qt-project.org/styles/commonstyle/images/stop-24.png"_L1, QSize(24, 24)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/stop-32.png"_L1, QSize(32, 32)); - break; - case SP_MediaPlay: - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-play-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-play-32.png"_L1, QSize(32, 32)); - break; - case SP_MediaPause: - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-pause-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-pause-32.png"_L1, QSize(32, 32)); - break; - case SP_MediaStop: - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-stop-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-stop-32.png"_L1, QSize(32, 32)); - break; - case SP_MediaSeekForward: - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-seek-forward-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-seek-forward-32.png"_L1, QSize(32, 32)); - break; - case SP_MediaSeekBackward: - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-seek-backward-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-seek-backward-32.png"_L1, QSize(32, 32)); - break; - case SP_MediaSkipForward: - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-skip-forward-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-skip-forward-32.png"_L1, QSize(32, 32)); - break; - case SP_MediaSkipBackward: - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-skip-backward-16.png"_L1, QSize(16, 16)); - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-skip-backward-32.png"_L1, QSize(32, 32)); - break; - case SP_MediaVolume: - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-volume-16.png"_L1, QSize(16, 16)); - break; - case SP_MediaVolumeMuted: - icon.addFile(":/qt-project.org/styles/commonstyle/images/media-volume-muted-16.png"_L1, QSize(16, 16)); - break; - case SP_TitleBarCloseButton: - addIconFiles(iconResourcePrefix() + QStringLiteral("closedock-"), - dockTitleIconSizes, sizeof(dockTitleIconSizes)/sizeof(dockTitleIconSizes[0]), icon); - break; - case SP_TitleBarMenuButton: + switch (standardIcon) { + case QStyle::SP_MessageBoxInformation: + addIconFiles(u"information-", pngIconSizes, icon); + break; + case QStyle::SP_MessageBoxWarning: + addIconFiles(u"warning-", pngIconSizes, icon); + break; + case QStyle::SP_MessageBoxCritical: + addIconFiles(u"critical-", pngIconSizes, icon); + break; + case QStyle::SP_MessageBoxQuestion: + addIconFiles(u"question-", pngIconSizes, icon); + break; + case QStyle::SP_FileDialogStart: + addIconFiles(u"filedialog_start-", pngIconSizes, icon); + break; + case QStyle::SP_FileDialogEnd: + addIconFiles(u"filedialog_end-", pngIconSizes, icon); + break; + case QStyle::SP_TitleBarMinButton: + addIconFiles(u"titlebar-min-", titleBarSizes, icon); + break; + case QStyle::SP_TitleBarMaxButton: + addIconFiles(u"titlebar-max-", titleBarSizes, icon); + break; + case QStyle::SP_TitleBarShadeButton: + addIconFiles(u"titlebar-shade-", titleBarSizes, icon); + break; + case QStyle::SP_TitleBarUnshadeButton: + addIconFiles(u"titlebar-unshade-", titleBarSizes, icon); + break; + case QStyle::SP_TitleBarContextHelpButton: + addIconFiles(u"titlebar-contexthelp-", titleBarSizes, icon); + break; + case QStyle::SP_FileDialogNewFolder: + addIconFiles(u"newdirectory-", pngIconSizes, icon); + break; + case QStyle::SP_FileDialogBack: + return q->proxy()->standardIcon(QStyle::SP_ArrowBack, option, widget); + case QStyle::SP_FileDialogToParent: + return q->proxy()->standardIcon(QStyle::SP_ArrowUp, option, widget); + case QStyle::SP_FileDialogDetailedView: + addIconFiles(u"viewdetailed-", pngIconSizes, icon); + break; + case QStyle::SP_FileDialogInfoView: + addIconFiles(u"fileinfo-", pngIconSizes, icon); + break; + case QStyle::SP_FileDialogContentsView: + addIconFiles(u"filecontents-", pngIconSizes, icon); + break; + case QStyle::SP_FileDialogListView: + addIconFiles(u"viewlist-", pngIconSizes, icon); + break; + case QStyle::SP_DialogOkButton: + addIconFiles(u"standardbutton-ok-", pngIconSizes, icon); + break; + case QStyle::SP_DialogCancelButton: + addIconFiles(u"standardbutton-cancel-", pngIconSizes, icon); + break; + case QStyle::SP_DialogHelpButton: + addIconFiles(u"standardbutton-help-", pngIconSizes, icon); + break; + case QStyle::SP_DialogOpenButton: + addIconFiles(u"standardbutton-open-", pngIconSizes, icon); + break; + case QStyle::SP_DialogSaveButton: + addIconFiles(u"standardbutton-save-", pngIconSizes, icon); + break; + case QStyle::SP_DialogCloseButton: + addIconFiles(u"standardbutton-close-", pngIconSizes, icon); + break; + case QStyle::SP_DialogApplyButton: + addIconFiles(u"standardbutton-apply-", pngIconSizes, icon); + break; + case QStyle::SP_DialogResetButton: + addIconFiles(u"standardbutton-clear-", pngIconSizes, icon); + break; + case QStyle::SP_DialogDiscardButton: + addIconFiles(u"standardbutton-delete-", pngIconSizes, icon); + break; + case QStyle::SP_DialogYesButton: + addIconFiles(u"standardbutton-yes-", pngIconSizes, icon); + break; + case QStyle::SP_DialogNoButton: + addIconFiles(u"standardbutton-no-", pngIconSizes, icon); + break; + case QStyle::SP_CommandLink: + case QStyle::SP_ArrowForward: + return q->proxy()->standardIcon(rtl(option) ? QStyle::SP_ArrowLeft + : QStyle::SP_ArrowRight, + option, widget); + case QStyle::SP_ArrowBack: + return q->proxy()->standardIcon(rtl(option) ? QStyle::SP_ArrowRight + : QStyle::SP_ArrowLeft, + option, widget); + case QStyle::SP_ArrowLeft: + addIconFiles(u"left-", pngIconSizes, icon); + break; + case QStyle::SP_ArrowRight: + addIconFiles(u"right-", pngIconSizes, icon); + break; + case QStyle::SP_ArrowUp: + addIconFiles(u"up-", pngIconSizes, icon); + break; + case QStyle::SP_ArrowDown: + addIconFiles(u"down-", pngIconSizes, icon); + break; + case QStyle::SP_DirHomeIcon: + case QStyle::SP_DirIcon: + addIconFiles(u"dirclosed-", pngIconSizes, icon, QIcon::Normal, QIcon::Off); + addIconFiles(u"diropen-", pngIconSizes, icon, QIcon::Normal, QIcon::On); + break; + case QStyle::SP_DirOpenIcon: + addIconFiles(u"diropen-", pngIconSizes, icon); + break; + case QStyle::SP_DirClosedIcon: + addIconFiles(u"dirclosed-", pngIconSizes, icon); + break; + case QStyle::SP_DirLinkIcon: + addIconFiles(u"dirlink-", pngIconSizes, icon); + break; + case QStyle::SP_DriveCDIcon: + addIconFiles(u"cdr-", pngIconSizes, icon); + break; + case QStyle::SP_DriveFDIcon: + addIconFiles(u"floppy-", pngIconSizes, icon); + break; + case QStyle::SP_DriveHDIcon: + addIconFiles(u"harddrive-", pngIconSizes, icon); + break; + case QStyle::SP_DriveDVDIcon: + addIconFiles(u"dvd-", pngIconSizes, icon); + break; + case QStyle::SP_DriveNetIcon: + addIconFiles(u"networkdrive-", pngIconSizes, icon); + break; + case QStyle::SP_FileIcon: + addIconFiles(u"file-", pngIconSizes, icon); + break; + case QStyle::SP_FileLinkIcon: + addIconFiles(u"filelink-", pngIconSizes, icon); + break; + case QStyle::SP_DesktopIcon: + addIconFiles(u"desktop-", {16, 32}, icon); + break; + case QStyle::SP_TrashIcon: + addIconFiles(u"trash-", pngIconSizes, icon); + break; + case QStyle::SP_ComputerIcon: + addIconFiles(u"computer-", {16, 32}, icon); + break; + case QStyle::SP_BrowserReload: + addIconFiles(u"refresh-", {24, 32}, icon); + break; + case QStyle::SP_BrowserStop: + addIconFiles(u"stop-", {24, 32}, icon); + break; + case QStyle::SP_MediaPlay: + addIconFiles(u"media-play-", pngIconSizes, icon); + break; + case QStyle::SP_MediaPause: + addIconFiles(u"media-pause-", pngIconSizes, icon); + break; + case QStyle::SP_MediaStop: + addIconFiles(u"media-stop-", pngIconSizes, icon); + break; + case QStyle::SP_MediaSeekForward: + addIconFiles(u"media-seek-forward-", pngIconSizes, icon); + break; + case QStyle::SP_MediaSeekBackward: + addIconFiles(u"media-seek-backward-", pngIconSizes, icon); + break; + case QStyle::SP_MediaSkipForward: + addIconFiles(u"media-skip-forward-", pngIconSizes, icon); + break; + case QStyle::SP_MediaSkipBackward: + addIconFiles(u"media-skip-backward-", pngIconSizes, icon); + break; + case QStyle::SP_MediaVolume: + addIconFiles(u"media-volume-", {16}, icon); + break; + case QStyle::SP_MediaVolumeMuted: + addIconFiles(u"media-volume-muted-", {16}, icon); + break; + case QStyle::SP_TitleBarCloseButton: + case QStyle::SP_DockWidgetCloseButton: + addIconFiles(u"closedock-", dockTitleIconSizes, icon); + break; + case QStyle::SP_TitleBarMenuButton: # ifndef QT_NO_IMAGEFORMAT_XPM icon.addPixmap(titleBarMenuCachedPixmapFromXPM()); # endif icon.addFile(":/qt-project.org/qmessagebox/images/qtlogo-64.png"_L1); break; - case SP_TitleBarNormalButton: - addIconFiles(iconResourcePrefix() + QStringLiteral("normalizedockup-"), - dockTitleIconSizes, sizeof(dockTitleIconSizes)/sizeof(dockTitleIconSizes[0]), icon); + case QStyle::SP_TitleBarNormalButton: + addIconFiles(u"normalizedockup-", dockTitleIconSizes, icon); break; - case SP_ToolBarHorizontalExtensionButton: { - QString prefix = iconResourcePrefix() + QStringLiteral("toolbar-ext-h-"); - if (rtl) - prefix += QStringLiteral("rtl-"); - addIconFiles(prefix, toolBarExtHSizes, sizeof(toolBarExtHSizes)/sizeof(toolBarExtHSizes[0]), icon); - } + case QStyle::SP_ToolBarHorizontalExtensionButton: + addIconFiles(rtl(option) ? u"toolbar-ext-h-rtl-" : u"toolbar-ext-h-", toolBarExtHSizes, icon); break; - case SP_ToolBarVerticalExtensionButton: - addIconFiles(iconResourcePrefix() + QStringLiteral("toolbar-ext-v-"), - toolBarExtVSizes, sizeof(toolBarExtVSizes)/sizeof(toolBarExtVSizes[0]), icon); - break; - case SP_TabCloseButton: - icon.addFile(iconResourcePrefix() + u"standardbutton-closetab-16.png", QSize(16, 16), - QIcon::Normal, QIcon::Off); - icon.addFile(iconResourcePrefix() + u"standardbutton-closetab-32.png", QSize(32, 32), - QIcon::Normal, QIcon::Off); - icon.addFile(iconResourcePrefix() + u"standardbutton-closetab-down-16.png", QSize(16, 16), - QIcon::Normal, QIcon::On); - icon.addFile(iconResourcePrefix() + u"standardbutton-closetab-down-32.png", QSize(32, 32), - QIcon::Normal, QIcon::On); - icon.addFile(iconResourcePrefix() + u"standardbutton-closetab-hover-16.png", QSize(16, 16), - QIcon::Active, QIcon::Off); - icon.addFile(iconResourcePrefix() + u"standardbutton-closetab-hover-32.png", QSize(32, 32), - QIcon::Active, QIcon::Off); + case QStyle::SP_ToolBarVerticalExtensionButton: + addIconFiles(u"toolbar-ext-v-", toolBarExtVSizes, icon); break; + case QStyle::SP_TabCloseButton: + addIconFiles(u"standardbutton-closetab-", pngIconSizes, icon, QIcon::Normal, QIcon::Off); + addIconFiles(u"standardbutton-closetab-down-", pngIconSizes, icon, QIcon::Normal, QIcon::On); + addIconFiles(u"standardbutton-closetab-hover-", pngIconSizes, icon, QIcon::Active, QIcon::Off); + break; + case QStyle::SP_LineEditClearButton: + addIconFiles(u"cleartext-", pngIconSizes, icon); + break; + default: + break; + } +#else // QT_NO_IMAGEFORMAT_PNG + Q_UNUSED(standardIcon); + Q_UNUSED(option); + Q_UNUSED(widget); #endif // QT_NO_IMAGEFORMAT_PNG + return icon; +} + + +/*! + \internal +*/ +QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption *option, + const QWidget *widget) const +{ + Q_D(const QCommonStyle); + QIcon icon; + + icon = d->iconFromWindowsTheme(standardIcon, option, widget); + if (!icon.isNull()) + return icon; + + icon = d->iconFromApplicationTheme(standardIcon, option, widget); + if (!icon.isNull()) + return icon; + + icon = d->iconFromMacTheme(standardIcon, option, widget); + if (!icon.isNull()) + return icon; + + icon = d->iconFromResourceTheme(standardIcon, option, widget); + if (!icon.isNull()) + return icon; + +#ifndef QT_NO_IMAGEFORMAT_XPM + switch (standardIcon) { + case QStyle::SP_TitleBarMenuButton: + icon.addPixmap(titleBarMenuCachedPixmapFromXPM()); + break; default: - icon.addPixmap(proxy()->standardPixmap(standardIcon, option, widget)); break; } + if (!icon.isNull()) + return icon; +#endif + icon = proxy()->standardPixmap(standardIcon, option, widget); return icon; } @@ -6537,7 +6203,7 @@ QPixmap QCommonStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &p } } - return QPixmap::fromImage(im); + return QPixmap::fromImage(std::move(im)); } case QIcon::Selected: { QImage img = pixmap.toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied); @@ -6547,7 +6213,7 @@ QPixmap QCommonStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &p painter.setCompositionMode(QPainter::CompositionMode_SourceAtop); painter.fillRect(0, 0, img.width(), img.height(), color); painter.end(); - return QPixmap::fromImage(img); } + return QPixmap::fromImage(std::move(img)); } case QIcon::Active: return pixmap; default: diff --git a/src/widgets/styles/qcommonstyle.h b/src/widgets/styles/qcommonstyle.h index d6485c6015..40ed13d453 100644 --- a/src/widgets/styles/qcommonstyle.h +++ b/src/widgets/styles/qcommonstyle.h @@ -61,9 +61,6 @@ protected: private: Q_DECLARE_PRIVATE(QCommonStyle) Q_DISABLE_COPY(QCommonStyle) -#if QT_CONFIG(animation) - Q_PRIVATE_SLOT(d_func(), void _q_removeAnimation()) -#endif }; QT_END_NAMESPACE diff --git a/src/widgets/styles/qcommonstyle_p.h b/src/widgets/styles/qcommonstyle_p.h index bd35dd4cfc..2fa90a8949 100644 --- a/src/widgets/styles/qcommonstyle_p.h +++ b/src/widgets/styles/qcommonstyle_p.h @@ -92,13 +92,29 @@ public: int animationFps; #if QT_CONFIG(animation) - void _q_removeAnimation(); - - QList<const QObject*> animationTargets() const; QStyleAnimation* animation(const QObject *target) const; void startAnimation(QStyleAnimation *animation) const; void stopAnimation(const QObject *target) const; + void removeAnimation(const QObject *target) const; +#endif + QIcon iconFromWindowsTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const; + QIcon iconFromMacTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const; + QIcon iconFromApplicationTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const; + QIcon iconFromResourceTheme(QCommonStyle::StandardPixmap standardIcon, + const QStyleOption *option, + const QWidget *widget) const; + static bool inline rtl(const QStyleOption *option) { + return (option && option->direction == Qt::RightToLeft) || + (!option && QGuiApplication::isRightToLeft()); + } +#if QT_CONFIG(animation) private: mutable QHash<const QObject*, QStyleAnimation*> animations; #endif // animation diff --git a/src/widgets/styles/qdrawutil.cpp b/src/widgets/styles/qdrawutil.cpp index d04ed74dd0..5bdbdb1139 100644 --- a/src/widgets/styles/qdrawutil.cpp +++ b/src/widgets/styles/qdrawutil.cpp @@ -297,7 +297,6 @@ void qDrawShadeRect(QPainter *p, int x, int y, int w, int h, p->setPen(oldPen); // restore pen } - /*! \fn void qDrawShadePanel(QPainter *painter, int x, int y, int width, int height, const QPalette &palette, bool sunken, @@ -409,7 +408,6 @@ void qDrawShadePanel(QPainter *p, int x, int y, int w, int h, p->setPen(oldPen); // restore pen } - /*! \internal This function draws a rectangle with two pixel line width. @@ -611,6 +609,74 @@ void qDrawPlainRect(QPainter *p, int x, int y, int w, int h, const QColor &c, p->setBrush(oldBrush); } +/*! + \fn void qDrawPlainRoundedRect(QPainter *painter, int x, int y, + int width, int height, qreal rx, qreal ry, + const QColor &lineColor, int lineWidth, + const QBrush *fill) + \since 6.7 + \relates <qdrawutil.h> + + Draws the plain rounded rectangle beginning at (\a x, \a y) + with the given \a width and \a height, + using the horizontal \a rx and vertical radius \a ry, + specified \a painter, \a lineColor and \a lineWidth. + The rectangle's interior is filled with the \a + fill brush unless \a fill is \nullptr. + + \warning This function does not look at QWidget::style() or + QApplication::style(). Use the drawing functions in QStyle to make + widgets that follow the current GUI style. + + Alternatively you can use a QFrame widget and apply the + QFrame::setFrameStyle() function to display a plain rectangle: + + \snippet code/src_gui_painting_qdrawutil.cpp 4 + + \sa qDrawShadeRect(), QStyle +*/ + +// ### Qt7: Pass QPen instead of QColor for frame drawing +void qDrawPlainRoundedRect(QPainter *p, int x, int y, int w, int h, + qreal rx, qreal ry, const QColor &c, + int lineWidth, const QBrush *fill) +{ + if (w == 0 || h == 0) + return; + if (Q_UNLIKELY(w < 0 || h < 0 || lineWidth < 0)) { + qWarning("qDrawPlainRect: Invalid parameters"); + } + + PainterStateGuard painterGuard(p); + const qreal devicePixelRatio = p->device()->devicePixelRatio(); + if (!qFuzzyCompare(devicePixelRatio, qreal(1))) { + painterGuard.save(); + const qreal inverseScale = qreal(1) / devicePixelRatio; + p->scale(inverseScale, inverseScale); + x = qRound(devicePixelRatio * x); + y = qRound(devicePixelRatio * y); + w = devicePixelRatio * w; + h = devicePixelRatio * h; + lineWidth = qRound(devicePixelRatio * lineWidth); + p->translate(0.5, 0.5); + } + + p->save(); + p->setPen(c); + p->setBrush(Qt::NoBrush); + for (int i=0; i<lineWidth; i++) { + QRectF rect(x+i, y+i, w-i*2 - 1, h-i*2 - 1); + rect.marginsRemoved(QMarginsF(0.5,0.5,0.5,0.5)); + p->drawRoundedRect(rect, rx, ry); + } + if (fill) { // fill with fill color + p->setPen(Qt::NoPen); + p->setBrush(*fill); + p->drawRoundedRect(x+lineWidth, y+lineWidth, w-lineWidth*2, h-lineWidth*2, rx, ry); + } + p->restore(); +} + /***************************************************************************** Overloaded functions. *****************************************************************************/ @@ -819,6 +885,32 @@ void qDrawPlainRect(QPainter *p, const QRect &r, const QColor &c, lineWidth, fill); } +/*! + \fn void qDrawPlainRoundedRect(QPainter *painter, const QRect &rect, + qreal rx, qreal ry, + const QColor &lineColor, int lineWidth, + const QBrush *fill) + \since 6.7 + \relates <qdrawutil.h> + \overload + + Draws the plain rectangle specified by \a rect using + the horizontal \a rx and vertical radius \a ry, + the given \a painter, \a lineColor and \a lineWidth. + The rectangle's interior is filled with the + \a fill brush unless \a fill is \nullptr. + + \warning This function does not look at QWidget::style() or + QApplication::style(). Use the drawing functions in QStyle to make + widgets that follow the current GUI style. + + Alternatively you can use a QFrame widget and apply the + QFrame::setFrameStyle() function to display a plain rectangle: + + \snippet code/src_gui_painting_qdrawutil.cpp 9 + + \sa qDrawShadeRect(), QStyle +*/ /*! \class QTileRules diff --git a/src/widgets/styles/qdrawutil.h b/src/widgets/styles/qdrawutil.h index 2fc957d493..26d8d5075f 100644 --- a/src/widgets/styles/qdrawutil.h +++ b/src/widgets/styles/qdrawutil.h @@ -71,6 +71,17 @@ Q_WIDGETS_EXPORT void qDrawPlainRect(QPainter *p, int x, int y, int w, int h, co Q_WIDGETS_EXPORT void qDrawPlainRect(QPainter *p, const QRect &r, const QColor &, int lineWidth = 1, const QBrush *fill = nullptr); +Q_WIDGETS_EXPORT void qDrawPlainRoundedRect(QPainter *p, int x, int y, int w, int h, + qreal rx, qreal ry, const QColor &, int lineWidth = 1, + const QBrush *fill = nullptr); + +inline void qDrawPlainRoundedRect(QPainter *painter, const QRect& rect, qreal rx, qreal ry, + const QColor &lineColor, int lineWidth = 1, + const QBrush *fill = nullptr) +{ + qDrawPlainRoundedRect(painter, rect.x(), rect.y(), rect.width(), rect.height(), + rx, ry, lineColor, lineWidth, fill); +} struct QTileRules diff --git a/src/widgets/styles/qfusionstyle.cpp b/src/widgets/styles/qfusionstyle.cpp index 64a0b3c721..6b8fd979a9 100644 --- a/src/widgets/styles/qfusionstyle.cpp +++ b/src/widgets/styles/qfusionstyle.cpp @@ -75,77 +75,6 @@ static const int groupBoxBottomMargin = 0; // space below the groupbox static const int groupBoxTopMargin = 3; #if QT_CONFIG(imageformat_xpm) -/* XPM */ -static const char * const dock_widget_close_xpm[] = { - "11 13 7 1", - " c None", - ". c #D5CFCB", - "+ c #8F8B88", - "@ c #6C6A67", - "# c #ABA6A3", - "$ c #B5B0AC", - "% c #A4A09D", - " ", - " +@@@@@@@+ ", - "+# #+", - "@ $@ @$ @", - "@ @@@ @@@ @", - "@ @@@@@ @", - "@ @@@ @", - "@ @@@@@ @", - "@ @@@ @@@ @", - "@ $@ @$ @", - "+% #+", - " +@@@@@@@+ ", - " "}; - -static const char * const dock_widget_restore_xpm[] = { - "11 13 7 1", - " c None", - ". c #D5CFCB", - "+ c #8F8B88", - "@ c #6C6A67", - "# c #ABA6A3", - "$ c #B5B0AC", - "% c #A4A09D", - " ", - " +@@@@@@@+ ", - "+# #+", - "@ #@@@# @", - "@ @ @ @", - "@ #@@@# @ @", - "@ @ @ @ @", - "@ @ @@@ @", - "@ @ @ @", - "@ #@@@# @", - "+% #+", - " +@@@@@@@+ ", - " "}; - -static const char * const workspace_minimize[] = { - "11 13 7 1", - " c None", - ". c #D5CFCB", - "+ c #8F8B88", - "@ c #6C6A67", - "# c #ABA6A3", - "$ c #B5B0AC", - "% c #A4A09D", - " ", - " +@@@@@@@+ ", - "+# #+", - "@ @", - "@ @", - "@ @", - "@ @@@@@@@ @", - "@ @@@@@@@ @", - "@ @", - "@ @", - "+% #+", - " +@@@@@@@+ ", - " "}; - - static const char * const qt_titlebar_context_help[] = { "10 10 3 1", " c None", @@ -216,6 +145,7 @@ static void qt_fusion_draw_arrow(Qt::ArrowType type, QPainter *painter, const QS return; const qreal dpi = QStyleHelper::dpi(option); + const qreal dpr = painter->device()->devicePixelRatio(); const int arrowWidth = int(QStyleHelper::dpiScaled(14, dpi)); const int arrowHeight = int(QStyleHelper::dpiScaled(8, dpi)); @@ -227,10 +157,9 @@ static void qt_fusion_draw_arrow(Qt::ArrowType type, QPainter *painter, const QS const QString cacheKey = QStyleHelper::uniqueName("fusion-arrow"_L1 % HexString<uint>(type) % HexString<uint>(color.rgba()), - option, rect.size()); + option, rect.size(), dpr); if (!QPixmapCache::find(cacheKey, &cachePixmap)) { - cachePixmap = styleCachePixmap(rect.size()); - cachePixmap.fill(Qt::transparent); + cachePixmap = styleCachePixmap(rect.size(), dpr); QPainter cachePainter(&cachePixmap); QRectF arrowRect; @@ -241,19 +170,19 @@ static void qt_fusion_draw_arrow(Qt::ArrowType type, QPainter *painter, const QS arrowRect.moveTo((rect.width() - arrowRect.width()) / 2.0, (rect.height() - arrowRect.height()) / 2.0); - QVarLengthArray<QPointF, 3> triangle; + std::array<QPointF, 3> triangle; switch (type) { case Qt::DownArrow: - triangle << arrowRect.topLeft() << arrowRect.topRight() << QPointF(arrowRect.center().x(), arrowRect.bottom()); + triangle = {arrowRect.topLeft(), arrowRect.topRight(), QPointF(arrowRect.center().x(), arrowRect.bottom())}; break; case Qt::RightArrow: - triangle << arrowRect.topLeft() << arrowRect.bottomLeft() << QPointF(arrowRect.right(), arrowRect.center().y()); + triangle = {arrowRect.topLeft(), arrowRect.bottomLeft(), QPointF(arrowRect.right(), arrowRect.center().y())}; break; case Qt::LeftArrow: - triangle << arrowRect.topRight() << arrowRect.bottomRight() << QPointF(arrowRect.left(), arrowRect.center().y()); + triangle = {arrowRect.topRight(), arrowRect.bottomRight(), QPointF(arrowRect.left(), arrowRect.center().y())}; break; default: - triangle << arrowRect.bottomLeft() << arrowRect.bottomRight() << QPointF(arrowRect.center().x(), arrowRect.top()); + triangle = {arrowRect.bottomLeft(), arrowRect.bottomRight(), QPointF(arrowRect.center().x(), arrowRect.top())}; break; } @@ -375,37 +304,18 @@ QFusionStyle::~QFusionStyle() } /*! - \fn void QFusionStyle::drawItemText(QPainter *painter, const QRect &rectangle, int alignment, const QPalette &palette, - bool enabled, const QString& text, QPalette::ColorRole textRole) const - - Draws the given \a text in the specified \a rectangle using the - provided \a painter and \a palette. - - Text is drawn using the painter's pen. If an explicit \a textRole - is specified, then the text is drawn using the \a palette's color - for the specified role. The \a enabled value indicates whether or - not the item is enabled; when reimplementing, this value should - influence how the item is drawn. - - The text is aligned and wrapped according to the specified \a - alignment. - - \sa Qt::Alignment + \reimp */ void QFusionStyle::drawItemText(QPainter *painter, const QRect &rect, int alignment, const QPalette &pal, bool enabled, const QString& text, QPalette::ColorRole textRole) const { + Q_UNUSED(enabled); if (text.isEmpty()) return; QPen savedPen = painter->pen(); - if (textRole != QPalette::NoRole) { + if (textRole != QPalette::NoRole) painter->setPen(QPen(pal.brush(textRole), savedPen.widthF())); - } - if (!enabled) { - QPen pen = painter->pen(); - painter->setPen(pen); - } painter->drawText(rect, alignment, text); painter->setPen(savedPen); } @@ -424,10 +334,10 @@ void QFusionStyle::drawPrimitive(PrimitiveElement elem, QRect rect = option->rect; int state = option->state; - QColor outline = d->outline(option->palette); - QColor highlightedOutline = d->highlightedOutline(option->palette); + const QColor outline = d->outline(option->palette); + const QColor highlightedOutline = d->highlightedOutline(option->palette); - QColor tabFrameColor = d->tabFrameColor(option->palette); + const QColor tabFrameColor = d->tabFrameColor(option->palette); switch (elem) { @@ -436,16 +346,7 @@ void QFusionStyle::drawPrimitive(PrimitiveElement elem, case PE_FrameGroupBox: { QPixmap pixmap(":/qt-project.org/styles/commonstyle/images/fusion_groupbox.png"_L1); - int topMargin = 0; - auto control = qobject_cast<const QGroupBox *>(widget); - if (control && !control->isCheckable() && control->title().isEmpty()) { - // Shrinking the topMargin if Not checkable AND title is empty - topMargin = groupBoxTopMargin; - } else { - topMargin = qMax(pixelMetric(PM_ExclusiveIndicatorHeight), option->fontMetrics.height()) + groupBoxTopMargin; - } - QRect frame = option->rect.adjusted(0, topMargin, 0, 0); - qDrawBorderPixmap(painter, frame, QMargins(6, 6, 6, 6), pixmap); + qDrawBorderPixmap(painter, option->rect, QMargins(6, 6, 6, 6), pixmap); break; } #endif // QT_CONFIG(groupbox) @@ -899,7 +800,7 @@ void QFusionStyle::drawPrimitive(PrimitiveElement elem, if (isDefault) buttonColor = mergedColors(buttonColor, highlightedOutline.lighter(130), 90); - BEGIN_STYLE_PIXMAPCACHE(QStringLiteral("pushbutton-") + buttonColor.name(QColor::HexArgb)) + BEGIN_STYLE_PIXMAPCACHE(u"pushbutton-" + buttonColor.name(QColor::HexArgb)) r = rect.adjusted(0, 1, -1, 0); p->setRenderHint(QPainter::Antialiasing, true); @@ -1224,7 +1125,7 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio Qt::ElideRight, titleRect.width()); proxy()->drawItemText(painter, titleRect, - Qt::AlignLeft | Qt::AlignVCenter, dwOpt->palette, + Qt::AlignLeft | Qt::AlignVCenter | Qt::TextHideMnemonic, dwOpt->palette, dwOpt->state & State_Enabled, titleText, QPalette::WindowText); } @@ -1236,22 +1137,22 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio // Draws the header in tables. if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) { const QStyleOptionHeaderV2 *headerV2 = qstyleoption_cast<const QStyleOptionHeaderV2 *>(option); - QString pixmapName = QStyleHelper::uniqueName("headersection"_L1, option, option->rect.size()); - pixmapName += QString::number(- int(header->position)); - pixmapName += QString::number(- int(header->orientation)); - if (headerV2) - pixmapName += QString::number(- int(headerV2->isSectionDragTarget)); - + const bool isSectionDragTarget = headerV2 ? headerV2->isSectionDragTarget : false; + const qreal dpr = painter->device()->devicePixelRatio(); + const QString pixmapName = QStyleHelper::uniqueName("headersection-"_L1 + % HexString(header->position) + % HexString(header->orientation) + % QLatin1Char(isSectionDragTarget ? '1' : '0'), + option, option->rect.size(), dpr); QPixmap cache; if (!QPixmapCache::find(pixmapName, &cache)) { - cache = styleCachePixmap(rect.size()); - cache.fill(Qt::transparent); + cache = styleCachePixmap(rect.size(), dpr); QRect pixmapRect(0, 0, rect.width(), rect.height()); QPainter cachePainter(&cache); QColor buttonColor = d->buttonColor(option->palette); QColor gradientStartColor = buttonColor.lighter(104); QColor gradientStopColor = buttonColor.darker(102); - if (headerV2 && headerV2->isSectionDragTarget) { + if (isSectionDragTarget) { gradientStopColor = gradientStartColor.darker(130); gradientStartColor = gradientStartColor.darker(130); } @@ -1318,36 +1219,39 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio case CE_ProgressBarContents: painter->save(); painter->setRenderHint(QPainter::Antialiasing, true); - painter->translate(0.5, 0.5); if (const QStyleOptionProgressBar *bar = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) { - bool vertical = false; - bool inverted = false; - bool indeterminate = (bar->minimum == 0 && bar->maximum == 0); - bool complete = bar->progress == bar->maximum; - - vertical = !(bar->state & QStyle::State_Horizontal); - inverted = bar->invertedAppearance; + const auto indeterminate = (bar->minimum == 0 && bar->maximum == 0); + const auto complete = bar->progress == bar->maximum; + const auto vertical = !(bar->state & QStyle::State_Horizontal); + const auto inverted = bar->invertedAppearance; + const auto reverse = (bar->direction == Qt::RightToLeft) ^ inverted; // If the orientation is vertical, we use a transform to rotate - // the progress bar 90 degrees clockwise. This way we can use the + // the progress bar 90 degrees (counter)clockwise. This way we can use the // same rendering code for both orientations. if (vertical) { rect = QRect(rect.left(), rect.top(), rect.height(), rect.width()); // flip width and height - QTransform m = QTransform::fromTranslate(rect.height()-1, -1.0); - m.rotate(90.0); + QTransform m; + if (inverted) { + m.rotate(90); + m.translate(0, -rect.height()); + } else { + m.rotate(-90); + m.translate(-rect.width(), 0); + } + painter->setTransform(m, true); + } else if (reverse) { + QTransform m = QTransform::fromScale(-1, 1); + m.translate(-rect.width(), 0); painter->setTransform(m, true); } + painter->translate(0.5, 0.5); - int maxWidth = rect.width(); const auto progress = qMax(bar->progress, bar->minimum); // workaround for bug in QProgressBar const auto totalSteps = qMax(Q_INT64_C(1), qint64(bar->maximum) - bar->minimum); const auto progressSteps = qint64(progress) - bar->minimum; - const auto progressBarWidth = progressSteps * maxWidth / totalSteps; - int width = indeterminate ? maxWidth : progressBarWidth; - - bool reverse = (!vertical && (bar->direction == Qt::RightToLeft)) || vertical; - if (inverted) - reverse = !reverse; + const auto progressBarWidth = progressSteps * rect.width() / totalSteps; + int width = indeterminate ? rect.width() : progressBarWidth; int step = 0; QRect progressBar; @@ -1356,28 +1260,10 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio if (qGray(outline.rgb()) > qGray(highlightedoutline.rgb())) outline = highlightedoutline; - if (!indeterminate) { - QColor innerShadow(Qt::black); - innerShadow.setAlpha(35); - painter->setPen(innerShadow); - if (!reverse) { - progressBar.setRect(rect.left(), rect.top(), width - 1, rect.height() - 1); - if (!complete) { - painter->drawLine(progressBar.topRight() + QPoint(2, 1), progressBar.bottomRight() + QPoint(2, 0)); - painter->setPen(QPen(highlight.darker(140))); - painter->drawLine(progressBar.topRight() + QPoint(1, 1), progressBar.bottomRight() + QPoint(1, 0)); - } - } else { - progressBar.setRect(rect.right() - width - 1, rect.top(), width + 2, rect.height() - 1); - if (!complete) { - painter->drawLine(progressBar.topLeft() + QPoint(-2, 1), progressBar.bottomLeft() + QPoint(-2, 0)); - painter->setPen(QPen(highlight.darker(140))); - painter->drawLine(progressBar.topLeft() + QPoint(-1, 1), progressBar.bottomLeft() + QPoint(-1, 0)); - } - } - } else { + if (!indeterminate) + progressBar.setRect(rect.left(), rect.top(), width - 1, rect.height() - 1); + else progressBar.setRect(rect.left(), rect.top(), rect.width() - 1, rect.height() - 1); - } if (indeterminate || bar->progress > bar->minimum) { @@ -1392,10 +1278,13 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio painter->setBrush(gradient); painter->save(); + // 0.5 - half the width of a cosmetic pen (for vertical line below) if (!complete && !indeterminate) - painter->setClipRect(progressBar.adjusted(-1, -1, -1, 1)); - QRect fillRect = progressBar.adjusted( !indeterminate && !complete && reverse ? -2 : 0, 0, - indeterminate || complete || reverse ? 0 : 2, 0); + painter->setClipRect(QRectF(progressBar).adjusted(-1, -1, 0.5, 1)); + + QRect fillRect = progressBar; + if (!indeterminate && !complete) + fillRect.setWidth(std::min(fillRect.width() + 2, rect.width() - 1)); // avoid round borders at the right end painter->drawRoundedRect(fillRect, 2, 2); painter->restore(); @@ -1422,43 +1311,63 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio x + rect.height() + step, progressBar.top() - 2); } } + if (!indeterminate && !complete) { + QColor innerShadow(Qt::black); + innerShadow.setAlpha(35); + painter->setPen(innerShadow); + painter->drawLine(progressBar.topRight() + QPoint(2, 1), progressBar.bottomRight() + QPoint(2, 0)); + painter->setPen(QPen(highlight.darker(140))); + painter->drawLine(progressBar.topRight() + QPoint(1, 1), progressBar.bottomRight() + QPoint(1, 0)); + } } painter->restore(); break; case CE_ProgressBarLabel: if (const QStyleOptionProgressBar *bar = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) { - QRect leftRect; QRect rect = bar->rect; + QRect leftRect = rect; + QRect rightRect = rect; QColor textColor = option->palette.text().color(); QColor alternateTextColor = d->highlightedText(option->palette); painter->save(); - bool vertical = false, inverted = false; - vertical = !(bar->state & QStyle::State_Horizontal); - inverted = bar->invertedAppearance; - if (vertical) - rect = QRect(rect.left(), rect.top(), rect.height(), rect.width()); // flip width and height + const auto vertical = !(bar->state & QStyle::State_Horizontal); + const auto inverted = bar->invertedAppearance; + const auto reverse = (bar->direction == Qt::RightToLeft) ^ inverted; const auto totalSteps = qMax(Q_INT64_C(1), qint64(bar->maximum) - bar->minimum); const auto progressSteps = qint64(bar->progress) - bar->minimum; - const auto progressIndicatorPos = progressSteps * rect.width() / totalSteps; - if (progressIndicatorPos >= 0 && progressIndicatorPos <= rect.width()) - leftRect = QRect(rect.left(), rect.top(), progressIndicatorPos, rect.height()); - if (vertical) - leftRect.translate(rect.width() - progressIndicatorPos, 0); - - bool flip = (!vertical && (((bar->direction == Qt::RightToLeft) && !inverted) || - ((bar->direction == Qt::LeftToRight) && inverted))); - - QRegion rightRect = rect; - rightRect = rightRect.subtracted(leftRect); - painter->setClipRegion(rightRect); - painter->setPen(flip ? alternateTextColor : textColor); - painter->drawText(rect, bar->text, QTextOption(Qt::AlignAbsolute | Qt::AlignHCenter | Qt::AlignVCenter)); - if (!leftRect.isNull()) { - painter->setPen(flip ? textColor : alternateTextColor); - painter->setClipRect(leftRect); - painter->drawText(rect, bar->text, QTextOption(Qt::AlignAbsolute | Qt::AlignHCenter | Qt::AlignVCenter)); + const auto progressIndicatorPos = progressSteps * (vertical ? rect.height() : rect.width()) / totalSteps; + + if (vertical) { + if (progressIndicatorPos >= 0 && progressIndicatorPos <= rect.height()) { + if (inverted) { + leftRect.setHeight(progressIndicatorPos); + rightRect.setY(progressIndicatorPos); + } else { + leftRect.setHeight(rect.height() - progressIndicatorPos); + rightRect.setY(rect.height() - progressIndicatorPos); + } + } + } else { + if (progressIndicatorPos >= 0 && progressIndicatorPos <= rect.width()) { + if (reverse) { + leftRect.setWidth(rect.width() - progressIndicatorPos); + rightRect.setX(rect.width() - progressIndicatorPos); + } else { + leftRect.setWidth(progressIndicatorPos); + rightRect.setX(progressIndicatorPos); + } + } } + + const auto firstIsAlternateColor = (vertical && !inverted) || (!vertical && reverse); + painter->setClipRect(rightRect); + painter->setPen(firstIsAlternateColor ? alternateTextColor : textColor); + painter->drawText(rect, bar->text, QTextOption(Qt::AlignAbsolute | Qt::AlignHCenter | Qt::AlignVCenter)); + painter->setPen(firstIsAlternateColor ? textColor : alternateTextColor); + painter->setClipRect(leftRect); + painter->drawText(rect, bar->text, QTextOption(Qt::AlignAbsolute | Qt::AlignHCenter | Qt::AlignVCenter)); + painter->restore(); } break; @@ -1919,7 +1828,23 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption frame.lineWidth = groupBox->lineWidth; frame.midLineWidth = groupBox->midLineWidth; frame.rect = proxy()->subControlRect(CC_GroupBox, option, SC_GroupBoxFrame, widget); + painter->save(); + QRegion region(groupBox->rect); + if (!groupBox->text.isEmpty()) { + bool ltr = groupBox->direction == Qt::LeftToRight; + QRect finalRect; + if (groupBox->subControls & QStyle::SC_GroupBoxCheckBox) { + finalRect = checkBoxRect.united(textRect); + finalRect.adjust(ltr ? -4 : -2, 0, ltr ? 2 : 4, 0); + } else { + finalRect = textRect; + finalRect.adjust(-2, 0, 2, 0); + } + region -= finalRect.adjusted(0, 0, 0, 3 - textRect.height() / 2); + } + painter->setClipRegion(region); proxy()->drawPrimitive(PE_FrameGroupBox, &frame, painter, widget); + painter->restore(); } // Draw title @@ -1954,12 +1879,12 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption #if QT_CONFIG(spinbox) case CC_SpinBox: if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) { + const qreal dpr = painter->device()->devicePixelRatio(); QPixmap cache; - QString pixmapName = QStyleHelper::uniqueName("spinbox"_L1, spinBox, spinBox->rect.size()); + QString pixmapName = QStyleHelper::uniqueName("spinbox"_L1, spinBox, spinBox->rect.size(), dpr); if (!QPixmapCache::find(pixmapName, &cache)) { - cache = styleCachePixmap(spinBox->rect.size()); - cache.fill(Qt::transparent); + cache = styleCachePixmap(spinBox->rect.size(), dpr); QRect pixmapRect(0, 0, spinBox->rect.width(), spinBox->rect.height()); QRect rect = pixmapRect; @@ -2521,7 +2446,6 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption subtleEdge.setAlpha(40); painter->setPen(subtleEdge); painter->setBrush(Qt::NoBrush); - painter->setClipRect(scrollBarGroove.adjusted(1, 0, -1, -3)); painter->drawRect(scrollBarGroove.adjusted(1, 0, -1, -1)); painter->restore(); } @@ -2561,10 +2485,12 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption painter->setBrush(midColor2); else if (option->state & State_MouseOver && scrollBar->activeSubControls & SC_ScrollBarSlider) painter->setBrush(highlightedGradient); - else + else if (!isDarkBg) painter->setBrush(gradient); + else + painter->setBrush(midColor2); - painter->drawRect(pixmapRect.adjusted(horizontal ? -1 : 0, horizontal ? 0 : -1, horizontal ? 0 : 1, horizontal ? 1 : 0)); + painter->drawRect(pixmapRect.adjusted(horizontal ? -1 : 0, horizontal ? 0 : -1, horizontal ? 0 : -1, horizontal ? -1 : 0)); painter->setPen(d->innerContrastLine()); painter->drawRect(scrollBarSlider.adjusted(horizontal ? 0 : 1, horizontal ? 1 : 0, -1, -1)); @@ -2594,16 +2520,9 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption painter->drawRect(scrollBarSubLine.adjusted(horizontal ? 0 : 1, horizontal ? 1 : 0, 0, 0)); painter->setPen(QPen(alphaOutline)); if (option->state & State_Horizontal) { - if (option->direction == Qt::RightToLeft) { - pixmapRect.setLeft(scrollBarSubLine.left()); - painter->drawLine(pixmapRect.topLeft(), pixmapRect.bottomLeft()); - } else { - pixmapRect.setRight(scrollBarSubLine.right()); - painter->drawLine(pixmapRect.topRight(), pixmapRect.bottomRight()); - } + painter->drawRect(scrollBarSubLine.adjusted(horizontal ? 0 : 1, 0, horizontal ? 1 : 0, horizontal ? -1 : 0)); } else { - pixmapRect.setBottom(scrollBarSubLine.bottom()); - painter->drawLine(pixmapRect.bottomLeft(), pixmapRect.bottomRight()); + painter->drawRect(scrollBarSubLine.adjusted(0, 0, horizontal ? 0 : -1, 0)); } QRect upRect = scrollBarSubLine.adjusted(horizontal ? 0 : 1, horizontal ? 1 : 0, horizontal ? -2 : -1, horizontal ? -1 : -2); @@ -2631,16 +2550,9 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption painter->drawRect(scrollBarAddLine.adjusted(horizontal ? 0 : 1, horizontal ? 1 : 0, 0, 0)); painter->setPen(QPen(alphaOutline, 1)); if (option->state & State_Horizontal) { - if (option->direction == Qt::LeftToRight) { - pixmapRect.setLeft(scrollBarAddLine.left()); - painter->drawLine(pixmapRect.topLeft(), pixmapRect.bottomLeft()); - } else { - pixmapRect.setRight(scrollBarAddLine.right()); - painter->drawLine(pixmapRect.topRight(), pixmapRect.bottomRight()); - } + painter->drawRect(scrollBarAddLine.adjusted(horizontal ? -1 : 0, 0, horizontal ? -1 : 0, horizontal ? -1 : 0)); } else { - pixmapRect.setTop(scrollBarAddLine.top()); - painter->drawLine(pixmapRect.topLeft(), pixmapRect.topRight()); + painter->drawRect(scrollBarAddLine.adjusted(0, horizontal ? 0 : -1, horizontal ? 0 : -1, horizontal ? 0 : -1)); } QRect downRect = scrollBarAddLine.adjusted(1, 1, -1, -1); @@ -2656,7 +2568,7 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption } painter->restore(); - break;; + break; #endif // QT_CONFIG(slider) case CC_ComboBox: painter->save(); @@ -2664,20 +2576,16 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption bool hasFocus = option->state & State_HasFocus && option->state & State_KeyboardFocusChange; bool sunken = comboBox->state & State_On; // play dead, if combobox has no items bool isEnabled = (comboBox->state & State_Enabled); + const qreal dpr = painter->device()->devicePixelRatio(); QPixmap cache; - QString pixmapName = QStyleHelper::uniqueName("combobox"_L1, option, comboBox->rect.size()); - if (sunken) - pixmapName += "-sunken"_L1; - if (comboBox->editable) - pixmapName += "-editable"_L1; - if (isEnabled) - pixmapName += "-enabled"_L1; - if (!comboBox->frame) - pixmapName += "-frameless"_L1; - + const QString pixmapName = QStyleHelper::uniqueName("combobox"_L1 + % QLatin1StringView(sunken ? "-sunken" : "") + % QLatin1StringView(comboBox->editable ? "-editable" : "") + % QLatin1StringView(isEnabled ? "-enabled" : "") + % QLatin1StringView(!comboBox->frame ? "-frameless" : ""), + option, comboBox->rect.size(), dpr); if (!QPixmapCache::find(pixmapName, &cache)) { - cache = styleCachePixmap(comboBox->rect.size()); - cache.fill(Qt::transparent); + cache = styleCachePixmap(comboBox->rect.size(), dpr); QPainter cachePainter(&cache); QRect pixmapRect(0, 0, comboBox->rect.width(), comboBox->rect.height()); QStyleOptionComboBox comboBoxCopy = *comboBox; @@ -2765,6 +2673,7 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption #if QT_CONFIG(slider) case CC_Slider: if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) { + const qreal dpr = painter->device()->devicePixelRatio(); QRect groove = proxy()->subControlRect(CC_Slider, option, SC_SliderGroove, widget); QRect handle = proxy()->subControlRect(CC_Slider, option, SC_SliderHandle, widget); @@ -2786,13 +2695,13 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption grooveColor.setHsv(buttonColor.hue(), qMin(255, (int)(buttonColor.saturation())), qMin(255, (int)(buttonColor.value()*0.9))); - QString groovePixmapName = QStyleHelper::uniqueName("slider_groove"_L1, option, groove.size()); + QString groovePixmapName = QStyleHelper::uniqueName("slider_groove"_L1, option, + groove.size(), dpr); QRect pixmapRect(0, 0, groove.width(), groove.height()); // draw background groove if (!QPixmapCache::find(groovePixmapName, &cache)) { - cache = styleCachePixmap(pixmapRect.size()); - cache.fill(Qt::transparent); + cache = styleCachePixmap(pixmapRect.size(), dpr); QPainter groovePainter(&cache); groovePainter.setRenderHint(QPainter::Antialiasing, true); groovePainter.translate(0.5, 0.5); @@ -2817,10 +2726,10 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption // draw blue groove highlight QRect clipRect; - groovePixmapName += "_blue"_L1; + if (!groovePixmapName.isEmpty()) + groovePixmapName += "_blue"_L1; if (!QPixmapCache::find(groovePixmapName, &cache)) { - cache = styleCachePixmap(pixmapRect.size()); - cache.fill(Qt::transparent); + cache = styleCachePixmap(pixmapRect.size(), dpr); QPainter groovePainter(&cache); QLinearGradient gradient; if (horizontal) { @@ -2833,13 +2742,13 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption } QColor highlight = d->highlight(option->palette); QColor highlightedoutline = highlight.darker(140); - if (qGray(outline.rgb()) > qGray(highlightedoutline.rgb())) - outline = highlightedoutline; - + QColor grooveOutline = outline; + if (qGray(grooveOutline.rgb()) > qGray(highlightedoutline.rgb())) + grooveOutline = highlightedoutline; groovePainter.setRenderHint(QPainter::Antialiasing, true); groovePainter.translate(0.5, 0.5); - groovePainter.setPen(QPen(outline)); + groovePainter.setPen(QPen(grooveOutline)); gradient.setColorAt(0, activeHighlight); gradient.setColorAt(1, activeHighlight.lighter(130)); groovePainter.setBrush(gradient); @@ -2854,10 +2763,11 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption if (slider->upsideDown) clipRect = QRect(handle.right(), groove.top(), groove.right() - handle.right(), groove.height()); else - clipRect = QRect(groove.left(), groove.top(), handle.left(), groove.height()); + clipRect = QRect(groove.left(), groove.top(), + handle.left() - slider->rect.left(), groove.height()); } else { if (slider->upsideDown) - clipRect = QRect(groove.left(), handle.bottom(), groove.width(), groove.height() - handle.bottom()); + clipRect = QRect(groove.left(), handle.bottom(), groove.width(), groove.height() - (handle.bottom() - slider->rect.top())); else clipRect = QRect(groove.left(), groove.top(), groove.width(), handle.top() - groove.top()); } @@ -2868,6 +2778,8 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption } if (option->subControls & SC_SliderTickmarks) { + painter->save(); + painter->translate(slider->rect.x(), slider->rect.y()); painter->setPen(outline); int tickSize = proxy()->pixelMetric(PM_SliderTickmarkOffset, option, widget); int available = proxy()->pixelMetric(PM_SliderSpaceAvailable, slider, widget); @@ -2885,6 +2797,7 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption int v = slider->minimum; int len = proxy()->pixelMetric(PM_SliderLength, slider, widget); + QVector<QLine> lines; while (v <= slider->maximum + 1) { if (v == slider->maximum + 1 && interval == 1) break; @@ -2898,21 +2811,21 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption if (horizontal) { if (ticksAbove) { - painter->drawLine(pos, slider->rect.top() + extra, - pos, slider->rect.top() + tickSize); + lines += QLine(pos, slider->rect.top() + extra, + pos, slider->rect.top() + tickSize); } if (ticksBelow) { - painter->drawLine(pos, slider->rect.bottom() - extra, - pos, slider->rect.bottom() - tickSize); + lines += QLine(pos, slider->rect.bottom() - extra, + pos, slider->rect.bottom() - tickSize); } } else { if (ticksAbove) { - painter->drawLine(slider->rect.left() + extra, pos, - slider->rect.left() + tickSize, pos); + lines += QLine(slider->rect.left() + extra, pos, + slider->rect.left() + tickSize, pos); } if (ticksBelow) { - painter->drawLine(slider->rect.right() - extra, pos, - slider->rect.right() - tickSize, pos); + lines += QLine(slider->rect.right() - extra, pos, + slider->rect.right() - tickSize, pos); } } // in the case where maximum is max int @@ -2921,13 +2834,15 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption break; v = nextInterval; } + painter->drawLines(lines); + painter->restore(); } // draw handle if ((option->subControls & SC_SliderHandle) ) { - QString handlePixmapName = QStyleHelper::uniqueName("slider_handle"_L1, option, handle.size()); + QString handlePixmapName = QStyleHelper::uniqueName("slider_handle"_L1, option, + handle.size(), dpr); if (!QPixmapCache::find(handlePixmapName, &cache)) { - cache = styleCachePixmap(handle.size()); - cache.fill(Qt::transparent); + cache = styleCachePixmap(handle.size(), dpr); QRect pixmapRect(0, 0, handle.width(), handle.height()); QPainter handlePainter(&cache); QRect gradRect = pixmapRect.adjusted(2, 2, -2, -2); @@ -2941,7 +2856,7 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption handlePainter.setPen(Qt::NoPen); handlePainter.setBrush(QColor(0, 0, 0, 40)); - handlePainter.drawRect(r.adjusted(-1, 2, 1, -2)); + handlePainter.drawRect(horizontal ? r.adjusted(-1, 2, 1, -2) : r.adjusted(2, -1, -2, 1)); handlePainter.setPen(QPen(d->outline(option->palette))); if (option->state & State_HasFocus && option->state & State_KeyboardFocusChange) @@ -3011,7 +2926,6 @@ int QFusionStyle::pixelMetric(PixelMetric metric, const QStyleOption *option, co case PM_ListViewIconSize: val = 24; break; - case PM_DialogButtonsSeparator: case PM_ScrollBarSliderMin: val = 26; break; @@ -3126,7 +3040,7 @@ QSize QFusionStyle::sizeFromContents(ContentsType type, const QStyleOption *opti break; case CT_GroupBox: if (option) { - int topMargin = qMax(pixelMetric(PM_ExclusiveIndicatorHeight), option->fontMetrics.height()) + groupBoxTopMargin; + int topMargin = qMax(pixelMetric(PM_IndicatorHeight, option, widget), option->fontMetrics.height()) + groupBoxTopMargin; newSize += QSize(10, topMargin); // Add some space below the groupbox } break; @@ -3308,23 +3222,28 @@ QRect QFusionStyle::subControlRect(ComplexControl control, const QStyleOptionCom int tickSize = proxy()->pixelMetric(PM_SliderTickmarkOffset, option, widget); switch (subControl) { case SC_SliderHandle: { + const bool bothTicks = (slider->tickPosition & QSlider::TicksBothSides) == QSlider::TicksBothSides; if (slider->orientation == Qt::Horizontal) { - rect.setHeight(proxy()->pixelMetric(PM_SliderThickness, option)); - rect.setWidth(proxy()->pixelMetric(PM_SliderLength, option)); + rect.setHeight(proxy()->pixelMetric(PM_SliderThickness, option, widget)); + rect.setWidth(proxy()->pixelMetric(PM_SliderLength, option, widget)); int centerY = slider->rect.center().y() - rect.height() / 2; - if (slider->tickPosition & QSlider::TicksAbove) - centerY += tickSize; - if (slider->tickPosition & QSlider::TicksBelow) - centerY -= tickSize; + if (!bothTicks) { + if (slider->tickPosition & QSlider::TicksAbove) + centerY += tickSize; + if (slider->tickPosition & QSlider::TicksBelow) + centerY -= tickSize - 1; + } rect.moveTop(centerY); } else { - rect.setWidth(proxy()->pixelMetric(PM_SliderThickness, option)); - rect.setHeight(proxy()->pixelMetric(PM_SliderLength, option)); + rect.setWidth(proxy()->pixelMetric(PM_SliderThickness, option, widget)); + rect.setHeight(proxy()->pixelMetric(PM_SliderLength, option, widget)); int centerX = slider->rect.center().x() - rect.width() / 2; - if (slider->tickPosition & QSlider::TicksAbove) - centerX += tickSize; - if (slider->tickPosition & QSlider::TicksBelow) - centerX -= tickSize; + if (!bothTicks) { + if (slider->tickPosition & QSlider::TicksAbove) + centerX += tickSize; + if (slider->tickPosition & QSlider::TicksBelow) + centerX -= tickSize - 1; + } rect.moveLeft(centerX); } } @@ -3332,18 +3251,23 @@ QRect QFusionStyle::subControlRect(ComplexControl control, const QStyleOptionCom case SC_SliderGroove: { QPoint grooveCenter = slider->rect.center(); const int grooveThickness = QStyleHelper::dpiScaled(7, option); + const bool bothTicks = (slider->tickPosition & QSlider::TicksBothSides) == QSlider::TicksBothSides; if (slider->orientation == Qt::Horizontal) { rect.setHeight(grooveThickness); - if (slider->tickPosition & QSlider::TicksAbove) - grooveCenter.ry() += tickSize; - if (slider->tickPosition & QSlider::TicksBelow) - grooveCenter.ry() -= tickSize; + if (!bothTicks) { + if (slider->tickPosition & QSlider::TicksAbove) + grooveCenter.ry() += tickSize; + if (slider->tickPosition & QSlider::TicksBelow) + grooveCenter.ry() -= tickSize - 1; + } } else { rect.setWidth(grooveThickness); - if (slider->tickPosition & QSlider::TicksAbove) - grooveCenter.rx() += tickSize; - if (slider->tickPosition & QSlider::TicksBelow) - grooveCenter.rx() -= tickSize; + if (!bothTicks) { + if (slider->tickPosition & QSlider::TicksAbove) + grooveCenter.rx() += tickSize; + if (slider->tickPosition & QSlider::TicksBelow) + grooveCenter.rx() -= tickSize - 1; + } } rect.moveCenter(grooveCenter); break; @@ -3386,6 +3310,7 @@ QRect QFusionStyle::subControlRect(ComplexControl control, const QStyleOptionCom break; case SC_SpinBoxFrame: rect = spinbox->rect; + break; default: break; } @@ -3395,18 +3320,19 @@ QRect QFusionStyle::subControlRect(ComplexControl control, const QStyleOptionCom #endif // QT_CONFIG(spinbox) case CC_GroupBox: if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(option)) { - rect = option->rect; + const int groupBoxTextAlignment = groupBox->textAlignment; + const bool hasVerticalAlignment = (groupBoxTextAlignment & Qt::AlignVertical_Mask) == Qt::AlignVCenter; + const int fontMetricsHeight = groupBox->text.isEmpty() ? 0 : groupBox->fontMetrics.height(); + if (subControl == SC_GroupBoxFrame) - return rect.adjusted(0, 0, 0, 0); + return rect; else if (subControl == SC_GroupBoxContents) { QRect frameRect = option->rect.adjusted(0, 0, 0, -groupBoxBottomMargin); int margin = 3; int leftMarginExtension = 0; - const int exclusiveIndicatorHeight = option->subControls.testFlag(SC_GroupBoxCheckBox) ? - pixelMetric(PM_ExclusiveIndicatorHeight) : 0; - const int fontMetricsHeight = groupBox->text.isEmpty() ? 0 : - groupBox->fontMetrics.height(); - const int topMargin = qMax(exclusiveIndicatorHeight, fontMetricsHeight) + + const int indicatorHeight = option->subControls.testFlag(SC_GroupBoxCheckBox) ? + pixelMetric(PM_IndicatorHeight, option, widget) : 0; + const int topMargin = qMax(indicatorHeight, fontMetricsHeight) + groupBoxTopMargin; return frameRect.adjusted(leftMarginExtension + margin, margin + topMargin, -margin, -margin - groupBoxBottomMargin); } @@ -3421,12 +3347,17 @@ QRect QFusionStyle::subControlRect(ComplexControl control, const QStyleOptionCom rect = QRect(); if (option->rect.width() > width) { - switch (groupBox->textAlignment & Qt::AlignHorizontal_Mask) { + switch (groupBoxTextAlignment & Qt::AlignHorizontal_Mask) { case Qt::AlignHCenter: rect.moveLeft((option->rect.width() - width) / 2); break; case Qt::AlignRight: - rect.moveLeft(option->rect.width() - width); + rect.moveLeft(option->rect.width() - width + - (hasVerticalAlignment ? proxy()->pixelMetric(PM_LayoutRightMargin, groupBox, widget) : 0)); + break; + case Qt::AlignLeft: + if (hasVerticalAlignment) + rect.moveLeft(proxy()->pixelMetric(PM_LayoutLeftMargin, option, widget)); break; } } @@ -3678,6 +3609,17 @@ int QFusionStyle::styleHint(StyleHint hint, const QStyleOption *option, const QW mask->region -= QRect(option->rect.right() , option->rect.top() + 3, 1, 2); return 1; } + break; + case SH_GroupBox_TextLabelVerticalAlignment: { + if (const auto *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(option)) { + if (groupBox) { + const auto vAlign = groupBox->textAlignment & Qt::AlignVertical_Mask; + // default fusion style is AlignTop + return vAlign == 0 ? Qt::AlignTop : vAlign; + } + } + break; + } default: break; } @@ -3718,24 +3660,49 @@ QRect QFusionStyle::subElementRect(SubElement sr, const QStyleOption *opt, const } /*! - \reimp + \internal */ -QIcon QFusionStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption *option, - const QWidget *widget) const +QIcon QFusionStyle::iconFromTheme(StandardPixmap standardIcon) const { -#if QT_CONFIG(imageformat_xpm) + QIcon icon; +#if QT_CONFIG(imageformat_png) + auto addIconFiles = [](QStringView prefix, QIcon &icon) + { + const auto fullPrefix = QStringLiteral(":/qt-project.org/styles/fusionstyle/images/") + prefix; + static constexpr auto dockTitleIconSizes = {10, 16, 20, 32, 48, 64}; + for (int size : dockTitleIconSizes) + icon.addFile(fullPrefix + QString::number(size) + QStringLiteral(".png"), + QSize(size, size)); + }; switch (standardIcon) { case SP_TitleBarNormalButton: - return QIcon(QPixmap(dock_widget_restore_xpm)); + addIconFiles(u"fusion_normalizedockup-", icon); + break; case SP_TitleBarMinButton: - return QIcon(QPixmap(workspace_minimize)); + addIconFiles(u"fusion_titlebar-min-", icon); + break; case SP_TitleBarCloseButton: case SP_DockWidgetCloseButton: - return QIcon(QPixmap(dock_widget_close_xpm)); + addIconFiles(u"fusion_closedock-", icon); + break; default: break; } -#endif // imageformat_xpm +#else // imageformat_png + Q_UNUSED(standardIcon); +#endif // imageformat_png + return icon; +} + +/*! + \reimp +*/ +QIcon QFusionStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption *option, + const QWidget *widget) const +{ + const auto icon = iconFromTheme(standardIcon); + if (!icon.availableSizes().isEmpty()) + return icon; return QCommonStyle::standardIcon(standardIcon, option, widget); } @@ -3745,21 +3712,13 @@ QIcon QFusionStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption QPixmap QFusionStyle::standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt, const QWidget *widget) const { -#ifndef QT_NO_IMAGEFORMAT_XPM - switch (standardPixmap) { - case SP_TitleBarNormalButton: - return QPixmap(dock_widget_restore_xpm); - case SP_TitleBarMinButton: - return QPixmap(workspace_minimize); - case SP_TitleBarCloseButton: - case SP_DockWidgetCloseButton: - return QPixmap(dock_widget_close_xpm); - - default: - break; - } -#endif //QT_NO_IMAGEFORMAT_XPM - + auto getDevicePixelRatio = [](const QWidget *widget) + { + return widget ? widget->devicePixelRatio() : qApp->devicePixelRatio(); + }; + const auto icon = iconFromTheme(standardPixmap); + if (!icon.availableSizes().isEmpty()) + return icon.pixmap(QSize(16, 16), getDevicePixelRatio(widget)); return QCommonStyle::standardPixmap(standardPixmap, opt, widget); } diff --git a/src/widgets/styles/qfusionstyle_p.h b/src/widgets/styles/qfusionstyle_p.h index d2a2e16b12..7dfeb34d7c 100644 --- a/src/widgets/styles/qfusionstyle_p.h +++ b/src/widgets/styles/qfusionstyle_p.h @@ -54,6 +54,7 @@ public: int styleHint(StyleHint hint, const QStyleOption *option = nullptr, const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const override; QRect itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) const override; + QIcon iconFromTheme(StandardPixmap standardIcon) const; QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const override; QPixmap standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt, diff --git a/src/widgets/styles/qproxystyle_p.h b/src/widgets/styles/qproxystyle_p.h index 1b9466bb17..6b686023a5 100644 --- a/src/widgets/styles/qproxystyle_p.h +++ b/src/widgets/styles/qproxystyle_p.h @@ -20,6 +20,8 @@ #include "qcommonstyle_p.h" #include "qproxystyle.h" +#include <QtCore/qpointer.h> + #ifndef QT_NO_STYLE_PROXY QT_BEGIN_NAMESPACE diff --git a/src/widgets/styles/qstyle.cpp b/src/widgets/styles/qstyle.cpp index 7352452487..60b2f51e95 100644 --- a/src/widgets/styles/qstyle.cpp +++ b/src/widgets/styles/qstyle.cpp @@ -249,9 +249,6 @@ static int unpackControlTypes(QSizePolicy::ControlTypes controls, QSizePolicy::C widget is a QSpinBox just because the enum value is called PE_IndicatorSpinUp or PE_IndicatorSpinDown. - The documentation for the \l{widgets/styles}{Styles} example - covers this topic in more detail. - \warning Qt style sheets are currently not supported for custom QStyle subclasses. We plan to address this in some future release. @@ -352,7 +349,7 @@ static int unpackControlTypes(QSizePolicy::ControlTypes controls, QSizePolicy::C The drawing of item view headers is also done by the style, giving control over size of header items and row and column sizes. - \sa QStyleOption, QStylePainter, {Styles Example}, + \sa QStyleOption, QStylePainter, {Styles and Style Aware Widgets}, QStyledItemDelegate, {Styling} */ @@ -1497,8 +1494,7 @@ void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment, Returns the value of the given pixel \a metric. The specified \a option and \a widget can be used for calculating - the metric. In general, the \a widget argument is not used. The \a - option can be cast to the appropriate type using the + the metric. The \a option can be cast to the appropriate type using the qstyleoption_cast() function. Note that the \a option may be zero even for PixelMetrics that can make use of it. See the table below for the appropriate \a option casts: diff --git a/src/widgets/styles/qstyle.h b/src/widgets/styles/qstyle.h index 23a5bd5ac2..198aea9557 100644 --- a/src/widgets/styles/qstyle.h +++ b/src/widgets/styles/qstyle.h @@ -464,11 +464,13 @@ public: PM_ExclusiveIndicatorWidth, PM_ExclusiveIndicatorHeight, - PM_DialogButtonsSeparator, - PM_DialogButtonsButtonWidth, - PM_DialogButtonsButtonHeight, +#if QT_DEPRECATED_SINCE(6, 8) + PM_DialogButtonsSeparator Q_DECL_ENUMERATOR_DEPRECATED_X("Not used and no effect since Qt 4"), + PM_DialogButtonsButtonWidth Q_DECL_ENUMERATOR_DEPRECATED_X("Not used and no effect since Qt 4"), + PM_DialogButtonsButtonHeight Q_DECL_ENUMERATOR_DEPRECATED_X("Not used and no effect since Qt 4"), +#endif - PM_MdiSubWindowFrameWidth, + PM_MdiSubWindowFrameWidth = 44, PM_MdiSubWindowMinimizedWidth, PM_HeaderMargin, diff --git a/src/widgets/styles/qstyle_p.h b/src/widgets/styles/qstyle_p.h index 5c1fd17130..59e87810c5 100644 --- a/src/widgets/styles/qstyle_p.h +++ b/src/widgets/styles/qstyle_p.h @@ -29,49 +29,36 @@ class QStylePrivate: public QObjectPrivate { Q_DECLARE_PUBLIC(QStyle) public: - inline QStylePrivate() - : layoutSpacingIndex(-1), proxyStyle(nullptr) {} - static bool useFullScreenForPopup(); - mutable int layoutSpacingIndex; QStyle *proxyStyle; QString name; }; -inline QImage styleCacheImage(const QSize &size) -{ - const qreal pixelRatio = qApp->devicePixelRatio(); - QImage cacheImage = QImage(size * pixelRatio, QImage::Format_ARGB32_Premultiplied); - cacheImage.setDevicePixelRatio(pixelRatio); - return cacheImage; -} - -inline QPixmap styleCachePixmap(const QSize &size) +inline QPixmap styleCachePixmap(const QSize &size, qreal pixelRatio) { - const qreal pixelRatio = qApp->devicePixelRatio(); QPixmap cachePixmap = QPixmap(size * pixelRatio); cachePixmap.setDevicePixelRatio(pixelRatio); + cachePixmap.fill(Qt::transparent); return cachePixmap; } #define BEGIN_STYLE_PIXMAPCACHE(a) \ QRect rect = option->rect; \ QPixmap internalPixmapCache; \ - QImage imageCache; \ QPainter *p = painter; \ - QString unique = QStyleHelper::uniqueName((a), option, option->rect.size()); \ + const auto dpr = p->device()->devicePixelRatio(); \ + const QString unique = QStyleHelper::uniqueName((a), option, option->rect.size(), dpr); \ int txType = painter->deviceTransform().type() | painter->worldTransform().type(); \ - bool doPixmapCache = (!option->rect.isEmpty()) \ + const bool doPixmapCache = (!option->rect.isEmpty()) \ && ((txType <= QTransform::TxTranslate) || (painter->deviceTransform().type() == QTransform::TxScale)); \ if (doPixmapCache && QPixmapCache::find(unique, &internalPixmapCache)) { \ painter->drawPixmap(option->rect.topLeft(), internalPixmapCache); \ } else { \ if (doPixmapCache) { \ rect.setRect(0, 0, option->rect.width(), option->rect.height()); \ - imageCache = styleCacheImage(option->rect.size()); \ - imageCache.fill(0); \ - p = new QPainter(&imageCache); \ + internalPixmapCache = styleCachePixmap(option->rect.size(), dpr); \ + p = new QPainter(&internalPixmapCache); \ } @@ -80,7 +67,6 @@ inline QPixmap styleCachePixmap(const QSize &size) if (doPixmapCache) { \ p->end(); \ delete p; \ - internalPixmapCache = QPixmap::fromImage(imageCache); \ painter->drawPixmap(option->rect.topLeft(), internalPixmapCache); \ QPixmapCache::insert(unique, internalPixmapCache); \ } \ diff --git a/src/widgets/styles/qstyleanimation.cpp b/src/widgets/styles/qstyleanimation.cpp index 32b77f1b53..8e71bb4fae 100644 --- a/src/widgets/styles/qstyleanimation.cpp +++ b/src/widgets/styles/qstyleanimation.cpp @@ -256,6 +256,7 @@ static QImage blendedImage(const QImage &start, const QImage &end, float alpha) front_data += bpl; } } + break; default: break; } diff --git a/src/widgets/styles/qstylehelper.cpp b/src/widgets/styles/qstylehelper.cpp index f79e83be61..b4616b8c24 100644 --- a/src/widgets/styles/qstylehelper.cpp +++ b/src/widgets/styles/qstylehelper.cpp @@ -25,15 +25,26 @@ Q_GUI_EXPORT int qt_defaultDpiX(); namespace QStyleHelper { -QString uniqueName(const QString &key, const QStyleOption *option, const QSize &size) +static inline bool usePixmapCache(const QStyleOption *opt) { + if (QWidget *widget = qobject_cast<QWidget *>(opt->styleObject)) + return !widget->testAttribute(Qt::WA_StyleSheetTarget); + return true; +} + +QString uniqueName(const QString &key, const QStyleOption *option, const QSize &size, qreal dpr) +{ + if (!usePixmapCache(option)) + return {}; + const QStyleOptionComplex *complexOption = qstyleoption_cast<const QStyleOptionComplex *>(option); QString tmp = key % HexString<uint>(option->state) % HexString<uint>(option->direction) % HexString<uint>(complexOption ? uint(complexOption->activeSubControls) : 0u) % HexString<quint64>(option->palette.cacheKey()) % HexString<uint>(size.width()) - % HexString<uint>(size.height()); + % HexString<uint>(size.height()) + % HexString<qreal>(dpr); #if QT_CONFIG(spinbox) if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) { @@ -191,7 +202,7 @@ QPolygonF calcLines(const QStyleOptionSlider *dial) qreal xc = width / 2 + 0.5; qreal yc = height / 2 + 0.5; const int ns = dial->tickInterval; - if (!ns) // Invalid values may be set by Qt Designer. + if (!ns) // Invalid values may be set by Qt Widgets Designer. return poly; int notches = (dial->maximum + ns - 1 - dial->minimum) / ns; if (notches <= 0) diff --git a/src/widgets/styles/qstylehelper_p.h b/src/widgets/styles/qstylehelper_p.h index 524417e405..98470ad1ce 100644 --- a/src/widgets/styles/qstylehelper_p.h +++ b/src/widgets/styles/qstylehelper_p.h @@ -39,7 +39,7 @@ class QWindow; namespace QStyleHelper { - QString uniqueName(const QString &key, const QStyleOption *option, const QSize &size); + QString uniqueName(const QString &key, const QStyleOption *option, const QSize &size, qreal dpr); Q_WIDGETS_EXPORT qreal dpi(const QStyleOption *option); diff --git a/src/widgets/styles/qstyleoption.cpp b/src/widgets/styles/qstyleoption.cpp index 8afd3fe362..d3a395246c 100644 --- a/src/widgets/styles/qstyleoption.cpp +++ b/src/widgets/styles/qstyleoption.cpp @@ -50,9 +50,6 @@ QT_BEGIN_NAMESPACE The qstyleoption_cast() function will return 0 if the object to which \c option points is not of the correct type. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyle, QStylePainter */ @@ -329,9 +326,6 @@ QStyleOption &QStyleOption::operator=(const QStyleOption &other) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption */ @@ -428,9 +422,6 @@ QStyleOptionFocusRect::QStyleOptionFocusRect(int version) without breaking compatibility. If you use qstyleoption_cast(), you normally do not need to check it. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption */ @@ -555,9 +546,6 @@ QStyleOptionFrame::QStyleOptionFrame(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption, QStyleOptionComplex, QGroupBox */ @@ -688,9 +676,6 @@ QStyleOptionGroupBox::QStyleOptionGroupBox(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption */ @@ -915,9 +900,6 @@ QStyleOptionHeaderV2::QStyleOptionHeaderV2(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption, QStyleOptionToolButton */ @@ -1054,9 +1036,6 @@ QStyleOptionButton::QStyleOptionButton(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption */ @@ -1238,9 +1217,6 @@ QStyleOptionToolBar::QStyleOptionToolBar(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption */ @@ -1366,7 +1342,7 @@ QStyleOptionTab::QStyleOptionTab(int version) /*! \variable QStyleOptionTab::shape \brief the tab shape used to draw the tab; by default - QTabBar::RoundedNorth + QTabBar::RoundedNorth. \sa QTabBar::Shape */ @@ -1476,9 +1452,6 @@ QStyleOptionTab::QStyleOptionTab(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption */ @@ -1584,7 +1557,7 @@ QStyleOptionProgressBar::QStyleOptionProgressBar(int version) /*! \variable QStyleOptionProgressBar::textAlignment - \brief the text alignment for the text in the QProgressBar + \brief the text alignment for the text in the QProgressBar. This can be used as a guide on where the text should be in the progress bar. The default value is Qt::AlignLeft. @@ -1637,9 +1610,6 @@ QStyleOptionProgressBar::QStyleOptionProgressBar(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption */ @@ -1840,9 +1810,6 @@ QStyleOptionMenuItem::QStyleOptionMenuItem(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption */ @@ -1933,9 +1900,6 @@ QStyleOptionComplex::QStyleOptionComplex(int version, int type) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOptionComplex, QSlider, QScrollBar */ @@ -2130,9 +2094,6 @@ QStyleOptionSlider::QStyleOptionSlider(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption, QStyleOptionComplex */ @@ -2235,9 +2196,6 @@ QStyleOptionSpinBox::QStyleOptionSpinBox(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption */ @@ -2341,9 +2299,6 @@ QStyleOptionDockWidget::QStyleOptionDockWidget(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption, QStyleOptionComplex, QStyleOptionButton */ @@ -2505,9 +2460,6 @@ QStyleOptionToolButton::QStyleOptionToolButton(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption, QStyleOptionComplex, QComboBox */ @@ -2641,9 +2593,6 @@ QStyleOptionComboBox::QStyleOptionComboBox(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption, QToolBox */ @@ -2768,9 +2717,6 @@ QStyleOptionToolBox::QStyleOptionToolBox(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption, QRubberBand */ @@ -2860,9 +2806,6 @@ QStyleOptionRubberBand::QStyleOptionRubberBand(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption, QStyleOptionComplex, QMdiSubWindow */ @@ -2973,9 +2916,6 @@ QStyleOptionTitleBar::QStyleOptionTitleBar(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption, {model-view-programming.html}{Model/View Programming} */ @@ -3236,9 +3176,6 @@ QStyleOptionViewItem::QStyleOptionViewItem(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption, QTabWidget */ @@ -3378,9 +3315,6 @@ QStyleOptionTabWidgetFrame::QStyleOptionTabWidgetFrame(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption, QTabBar::drawBase() */ @@ -3488,9 +3422,6 @@ QStyleOptionTabBarBase::QStyleOptionTabBarBase(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption, QStyleOptionComplex, QSizeGrip */ @@ -3568,9 +3499,6 @@ QStyleOptionSizeGrip::QStyleOptionSizeGrip(int version) and emphasizes that these are simply parameters used by the style functions. - For an example demonstrating how style options can be used, see - the \l {widgets/styles}{Styles} example. - \sa QStyleOption, QGraphicsItem::paint() */ diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp index 5d0432d2e0..655b224617 100644 --- a/src/widgets/styles/qstylesheetstyle.cpp +++ b/src/widgets/styles/qstylesheetstyle.cpp @@ -59,7 +59,7 @@ #include <private/qstyleanimation_p.h> #endif #if QT_CONFIG(tabbar) -#include <qtabbar.h> +#include <private/qtabbar_p.h> #endif #include <QMetaProperty> #if QT_CONFIG(mainwindow) @@ -439,13 +439,13 @@ struct QStyleSheetPaletteData : public QSharedData const QBrush &selectedBackground, const QBrush &alternateBackground, const QBrush &placeHolderTextForeground, - const QBrush &accentColor) + const QBrush &accent) : foreground(foreground) , selectionForeground(selectedForeground) , selectionBackground(selectedBackground) , alternateBackground(alternateBackground) , placeholderForeground(placeHolderTextForeground) - , accentColor(accentColor) + , accent(accent) { } QBrush foreground; @@ -453,7 +453,7 @@ struct QStyleSheetPaletteData : public QSharedData QBrush selectionBackground; QBrush alternateBackground; QBrush placeholderForeground; - QBrush accentColor; + QBrush accent; }; struct QStyleSheetGeometryData : public QSharedData @@ -625,7 +625,7 @@ public: Q_DECLARE_TYPEINFO(QRenderRule, Q_RELOCATABLE_TYPE); /////////////////////////////////////////////////////////////////////////////////////////// -static const char knownStyleHints[][45] = { +static constexpr std::array<const char*, 90> knownStyleHints = { "activate-on-singleclick", "alignment", "arrow-keys-navigate-into-children", @@ -718,13 +718,10 @@ static const char knownStyleHints[][45] = { "widget-animation-duration" }; -static const int numKnownStyleHints = sizeof(knownStyleHints)/sizeof(knownStyleHints[0]); - -static QList<QVariant> subControlLayout(const QString& layout) +static QList<QVariant> subControlLayout(QByteArrayView layout) { QList<QVariant> buttons; - for (int i = 0; i < layout.size(); i++) { - int button = layout[i].toLatin1(); + for (int button : layout) { switch (button) { case 'm': buttons.append(PseudoElement_MdiMinButton); @@ -786,10 +783,9 @@ QHash<QStyle::SubControl, QRect> QStyleSheetStyle::titleBarLayout(const QWidget int offsets[3] = { 0, 0, 0 }; enum Where { Left, Right, Center, NoWhere } where = Left; QList<ButtonInfo> infos; - const int numLayouts = layout.size(); - infos.reserve(numLayouts); - for (int i = 0; i < numLayouts; i++) { - const int element = layout[i].toInt(); + infos.reserve(layout.size()); + for (const QVariant &val : std::as_const(layout)) { + const int element = val.toInt(); if (element == '(') { where = Center; } else if (element == ')') { @@ -848,8 +844,7 @@ QHash<QStyle::SubControl, QRect> QStyleSheetStyle::titleBarLayout(const QWidget } } - for (int i = 0; i < infos.size(); i++) { - const ButtonInfo &info = infos[i]; + for (const ButtonInfo &info : std::as_const(infos)) { QRect lr = cr; switch (info.where) { case Center: { @@ -970,11 +965,11 @@ QRenderRule::QRenderRule(const QList<Declaration> &declarations, const QObject * QBrush selectedBackground; QBrush alternateBackground; QBrush placeHolderTextForeground; - QBrush accentColor; + QBrush accent; if (v.extractPalette(&foreground, &selectedForeground, &selectedBackground, - &alternateBackground, &placeHolderTextForeground, &accentColor)) { + &alternateBackground, &placeHolderTextForeground, &accent)) { pal = new QStyleSheetPaletteData(foreground, selectedForeground, selectedBackground, - alternateBackground, placeHolderTextForeground, accentColor); + alternateBackground, placeHolderTextForeground, accent); } QIcon imgIcon; @@ -1030,8 +1025,8 @@ QRenderRule::QRenderRule(const QList<Declaration> &declarations, const QObject * // intentionally left blank... } else if (decl.d->propertyId == UnknownProperty) { bool knownStyleHint = false; - for (int i = 0; i < numKnownStyleHints; i++) { - QLatin1StringView styleHint(knownStyleHints[i]); + for (const auto sh : knownStyleHints) { + QLatin1StringView styleHint(sh); if (decl.d->property.compare(styleHint) == 0) { QString hintName = QString(styleHint); QVariant hintValue; @@ -1073,7 +1068,7 @@ QRenderRule::QRenderRule(const QList<Declaration> &declarations, const QObject * hintValue = decl.iconValue(); } else if (hintName == "button-layout"_L1 && decl.d->values.size() != 0 && decl.d->values.at(0).type == QCss::Value::String) { - hintValue = subControlLayout(decl.d->values.at(0).variant.toString()); + hintValue = subControlLayout(decl.d->values.at(0).variant.toString().toLatin1()); } else { int integer; decl.intValue(&integer); @@ -1465,6 +1460,16 @@ void QRenderRule::configurePalette(QPalette *p, QPalette::ColorRole fr, QPalette p->setBrush(QPalette::AlternateBase, pal->alternateBackground); } +void setDefault(QPalette *palette, QPalette::ColorGroup group, QPalette::ColorRole role, + const QBrush &defaultBrush, const QWidget *widget) +{ + const QPalette &widgetPalette = widget->palette(); + if (widgetPalette.isBrushSet(group, role)) + palette->setBrush(group, role, widgetPalette.brush(group, role)); + else + palette->setBrush(group, role, defaultBrush); +} + void QRenderRule::configurePalette(QPalette *p, QPalette::ColorGroup cg, const QWidget *w, bool embedded) { if (bg && bg->brush.style() != Qt::NoBrush) { @@ -1486,15 +1491,15 @@ void QRenderRule::configurePalette(QPalette *p, QPalette::ColorGroup cg, const Q return; if (pal->foreground.style() != Qt::NoBrush) { - p->setBrush(cg, QPalette::ButtonText, pal->foreground); - p->setBrush(cg, w->foregroundRole(), pal->foreground); - p->setBrush(cg, QPalette::WindowText, pal->foreground); - p->setBrush(cg, QPalette::Text, pal->foreground); + setDefault(p, cg, QPalette::ButtonText, pal->foreground, w); + setDefault(p, cg, w->foregroundRole(), pal->foreground, w); + setDefault(p, cg, QPalette::WindowText, pal->foreground, w); + setDefault(p, cg, QPalette::Text, pal->foreground, w); QColor phColor(pal->foreground.color()); phColor.setAlpha((phColor.alpha() + 1) / 2); QBrush placeholder = pal->foreground; placeholder.setColor(phColor); - p->setBrush(cg, QPalette::PlaceholderText, placeholder); + setDefault(p, cg, QPalette::PlaceholderText, placeholder, w); } if (pal->selectionBackground.style() != Qt::NoBrush) p->setBrush(cg, QPalette::Highlight, pal->selectionBackground); @@ -1504,8 +1509,8 @@ void QRenderRule::configurePalette(QPalette *p, QPalette::ColorGroup cg, const Q p->setBrush(cg, QPalette::AlternateBase, pal->alternateBackground); if (pal->placeholderForeground.style() != Qt::NoBrush) p->setBrush(cg, QPalette::PlaceholderText, pal->placeholderForeground); - if (pal->accentColor.style() != Qt::NoBrush) - p->setBrush(cg, QPalette::AccentColor, pal->accentColor); + if (pal->accent.style() != Qt::NoBrush) + p->setBrush(cg, QPalette::Accent, pal->accent); } bool QRenderRule::hasModification() const @@ -1671,7 +1676,8 @@ QList<QCss::StyleRule> QStyleSheetStyle::styleRules(const QObject *obj) const defaultSs = getDefaultStyleSheet(); QStyle *bs = baseStyle(); styleSheetCaches->styleSheetCache.insert(bs, defaultSs); - QObject::connect(bs, SIGNAL(destroyed(QObject*)), styleSheetCaches, SLOT(styleDestroyed(QObject*)), Qt::UniqueConnection); + QObject::connect(bs, &QStyle::destroyed, styleSheetCaches, + &QStyleSheetStyleCaches::styleDestroyed); } else { defaultSs = defaultCacheIt.value(); } @@ -2894,7 +2900,9 @@ bool QStyleSheetStyle::initObject(const QObject *obj) const const_cast<QWidget *>(w)->setAttribute(Qt::WA_StyleSheet, true); } - QObject::connect(obj, SIGNAL(destroyed(QObject*)), styleSheetCaches, SLOT(objectDestroyed(QObject*)), Qt::UniqueConnection); + connect(obj, &QObject::destroyed, + styleSheetCaches, &QStyleSheetStyleCaches::objectDestroyed, + Qt::UniqueConnection); return true; } @@ -2938,10 +2946,10 @@ void QStyleSheetStyle::polish(QWidget *w) QRenderRule rule = renderRule(sa, PseudoElement_None, PseudoClass_Enabled); if ((rule.hasBorder() && rule.border()->hasBorderImage()) || (rule.hasBackground() && !rule.background()->pixmap.isNull())) { - QObject::connect(sa->horizontalScrollBar(), SIGNAL(valueChanged(int)), - sa, SLOT(update()), Qt::UniqueConnection); - QObject::connect(sa->verticalScrollBar(), SIGNAL(valueChanged(int)), - sa, SLOT(update()), Qt::UniqueConnection); + connect(sa->horizontalScrollBar(), &QScrollBar::valueChanged, + sa, QOverload<>::of(&QAbstractScrollArea::update), Qt::UniqueConnection); + connect(sa->verticalScrollBar(), &QScrollBar::valueChanged, + sa, QOverload<>::of(&QAbstractScrollArea::update), Qt::UniqueConnection); } } #endif @@ -3044,13 +3052,13 @@ void QStyleSheetStyle::unpolish(QWidget *w) setGeometry(w); w->setAttribute(Qt::WA_StyleSheetTarget, false); w->setAttribute(Qt::WA_StyleSheet, false); - QObject::disconnect(w, nullptr, this, nullptr); + w->disconnect(this); #if QT_CONFIG(scrollarea) if (QAbstractScrollArea *sa = qobject_cast<QAbstractScrollArea *>(w)) { - QObject::disconnect(sa->horizontalScrollBar(), SIGNAL(valueChanged(int)), - sa, SLOT(update())); - QObject::disconnect(sa->verticalScrollBar(), SIGNAL(valueChanged(int)), - sa, SLOT(update())); + disconnect(sa->horizontalScrollBar(), &QScrollBar::valueChanged, + sa, QOverload<>::of(&QAbstractScrollArea::update)); + disconnect(sa->verticalScrollBar(), &QScrollBar::valueChanged, + sa, QOverload<>::of(&QAbstractScrollArea::update)); } #endif baseStyle()->unpolish(w); @@ -3066,16 +3074,6 @@ void QStyleSheetStyle::unpolish(QApplication *app) styleSheetCaches->styleSheetCache.remove(qApp); } -#if QT_CONFIG(tabbar) -inline static bool verticalTabs(QTabBar::Shape shape) -{ - return shape == QTabBar::RoundedWest - || shape == QTabBar::RoundedEast - || shape == QTabBar::TriangularWest - || shape == QTabBar::TriangularEast; -} -#endif // QT_CONFIG(tabbar) - void QStyleSheetStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p, const QWidget *w) const { @@ -3505,12 +3503,12 @@ void QStyleSheetStyle::drawComplexControl(ComplexControl cc, const QStyleOptionC || hasStyleRule(w, PseudoElement_MdiMinButton)) { QList<QVariant> layout = rule.styleHint("button-layout"_L1).toList(); if (layout.isEmpty()) - layout = subControlLayout("mNX"_L1); + layout = subControlLayout("mNX"); QStyleOptionComplex optCopy(*opt); optCopy.subControls = { }; - for (int i = 0; i < layout.size(); i++) { - int layoutButton = layout[i].toInt(); + for (const QVariant &val : std::as_const(layout)) { + int layoutButton = val.toInt(); if (layoutButton < PseudoElement_MdiCloseButton || layoutButton > PseudoElement_MdiNormalButton) continue; @@ -3541,6 +3539,7 @@ void QStyleSheetStyle::drawComplexControl(ComplexControl cc, const QStyleOptionC break; subRule.drawRule(p, opt->rect); QHash<QStyle::SubControl, QRect> layout = titleBarLayout(w, tb); + const auto paintDeviceDpr = p->device()->devicePixelRatio(); QRect ir; ir = layout[SC_TitleBarLabel]; @@ -3551,8 +3550,6 @@ void QStyleSheetStyle::drawComplexControl(ComplexControl cc, const QStyleOptionC p->drawText(ir.x(), ir.y(), ir.width(), ir.height(), Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine, tb->text); } - QPixmap pm; - ir = layout[SC_TitleBarSysMenu]; if (ir.isValid()) { QRenderRule subSubRule = renderRule(w, opt, PseudoElement_TitleBarSysMenu); @@ -3562,7 +3559,9 @@ void QStyleSheetStyle::drawComplexControl(ComplexControl cc, const QStyleOptionC tb->icon.paint(p, ir); } else { int iconSize = pixelMetric(PM_SmallIconSize, tb, w); - pm = standardIcon(SP_TitleBarMenuButton, nullptr, w).pixmap(iconSize, iconSize); + const QSize sz(iconSize, iconSize); + const auto pm = standardIcon(SP_TitleBarMenuButton, nullptr, w) + .pixmap(sz, paintDeviceDpr); drawItemPixmap(p, ir, Qt::AlignCenter, pm); } } @@ -3572,15 +3571,14 @@ void QStyleSheetStyle::drawComplexControl(ComplexControl cc, const QStyleOptionC QRenderRule subSubRule = renderRule(w, opt, PseudoElement_TitleBarCloseButton); subSubRule.drawRule(p, ir); - QSize sz = subSubRule.contentsRect(ir).size(); - if ((tb->titleBarFlags & Qt::WindowType_Mask) == Qt::Tool) - pm = standardIcon(SP_DockWidgetCloseButton, nullptr, w).pixmap(sz); - else - pm = standardIcon(SP_TitleBarCloseButton, nullptr, w).pixmap(sz); + const QSize sz = subSubRule.contentsRect(ir).size(); + const auto type = ((tb->titleBarFlags & Qt::WindowType_Mask) == Qt::Tool) + ? SP_DockWidgetCloseButton : SP_TitleBarCloseButton; + const auto pm = standardIcon(type, nullptr, w).pixmap(sz, paintDeviceDpr); drawItemPixmap(p, ir, Qt::AlignCenter, pm); } - int pes[] = { + constexpr std::array<int, 6> pes = { PseudoElement_TitleBarMaxButton, PseudoElement_TitleBarMinButton, PseudoElement_TitleBarNormalButton, @@ -3589,15 +3587,15 @@ void QStyleSheetStyle::drawComplexControl(ComplexControl cc, const QStyleOptionC PseudoElement_TitleBarContextHelpButton }; - for (unsigned int i = 0; i < sizeof(pes)/sizeof(int); i++) { - int pe = pes[i]; + for (int pe : pes) { QStyle::SubControl sc = knownPseudoElements[pe].subControl; ir = layout[sc]; if (!ir.isValid()) continue; QRenderRule subSubRule = renderRule(w, opt, pe); subSubRule.drawRule(p, ir); - pm = standardIcon(subControlIcon(pe), nullptr, w).pixmap(subSubRule.contentsRect(ir).size()); + const QSize sz = subSubRule.contentsRect(ir).size(); + const auto pm = standardIcon(subControlIcon(pe), nullptr, w).pixmap(sz, paintDeviceDpr); drawItemPixmap(p, ir, Qt::AlignCenter, pm); } @@ -3620,7 +3618,9 @@ void QStyleSheetStyle::renderMenuItemIcon(const QStyleOptionMenuItem *mi, QPaint ? (mi->state & QStyle::State_Selected ? QIcon::Active : QIcon::Normal) : QIcon::Disabled; const bool checked = mi->checkType != QStyleOptionMenuItem::NotCheckable && mi->checked; - const QPixmap pixmap(mi->icon.pixmap(pixelMetric(PM_SmallIconSize), mode, + const auto iconSize = pixelMetric(PM_SmallIconSize, mi, w); + const QSize sz(iconSize, iconSize); + const QPixmap pixmap(mi->icon.pixmap(sz, p->device()->devicePixelRatio(), mode, checked ? QIcon::On : QIcon::Off)); const int pixw = pixmap.width() / pixmap.devicePixelRatio(); const int pixh = pixmap.height() / pixmap.devicePixelRatio(); @@ -3755,7 +3755,8 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q if (button->state & State_On) state = QIcon::On; - QPixmap pixmap = icon.pixmap(button->iconSize, mode, state); + const auto paintDeviceDpr = p->device()->devicePixelRatio(); + QPixmap pixmap = icon.pixmap(button->iconSize, paintDeviceDpr, mode, state); int pixmapWidth = pixmap.width() / pixmap.devicePixelRatio(); int pixmapHeight = pixmap.height() / pixmap.devicePixelRatio(); int labelWidth = pixmapWidth; @@ -4057,7 +4058,8 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q if (spacing == -1) spacing = 6; QIcon::Mode mode = cb->state & State_Enabled ? QIcon::Normal : QIcon::Disabled; - QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, mode); + const auto paintDeviceDpr = p->device()->devicePixelRatio(); + QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, paintDeviceDpr, mode); QRect iconRect(editRect); iconRect.setWidth(cb->iconSize.width()); iconRect = alignedRect(cb->direction, @@ -4127,11 +4129,13 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q QRenderRule subRule = renderRule(w, opt, PseudoElement_HeaderViewSection); if (hasStyleRule(w, PseudoElement_HeaderViewUpArrow) || hasStyleRule(w, PseudoElement_HeaderViewDownArrow)) { - const QRect arrowRect = subElementRect(SE_HeaderArrow, opt, w); - if (hdr.orientation == Qt::Horizontal) - hdr.rect.setWidth(hdr.rect.width() - arrowRect.width()); - else - hdr.rect.setHeight(hdr.rect.height() - arrowRect.height()); + if (hdr.sortIndicator != QStyleOptionHeader::None) { + const QRect arrowRect = subElementRect(SE_HeaderArrow, opt, w); + if (hdr.orientation == Qt::Horizontal) + hdr.rect.setWidth(hdr.rect.width() - arrowRect.width()); + else + hdr.rect.setHeight(hdr.rect.height() - arrowRect.height()); + } } subRule.configurePalette(&hdr.palette, QPalette::ButtonText, QPalette::Button); if (subRule.hasFont) { @@ -4379,19 +4383,23 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q vopt->state & QStyle::State_Selected ? QPalette::Highlight : QPalette::Base); - // only draw the indicator; no text or background + // only draw the indicator; no text, icon or background optIndicator.backgroundBrush = Qt::NoBrush; // no background optIndicator.text.clear(); + optIndicator.icon = QIcon(); QWindowsStyle::drawControl(ce, &optIndicator, p, w); - // Now draw text, background, and highlight, but not the indicator with the - // base style. Since we can't turn off HasCheckIndicator to prevent the base + + // Now draw text, background,icon, and highlight, but not the indicator with + // the base style. Since we can't turn off HasCheckIndicator to prevent the base // style from drawing the check indicator again (it would change how the item // gets laid out) we have to clip the indicator that's already been painted. - const QRect checkRect = subElementRect(QStyle::SE_ItemViewItemCheckIndicator, - &optIndicator, w); + const QRect crStyle = subElementRect(QStyle::SE_ItemViewItemCheckIndicator, + &optIndicator, w); + const QRect crBase = baseStyle()->subElementRect(QStyle::SE_ItemViewItemCheckIndicator, + &optIndicator, w); const QRegion clipRegion = QRegion(p->hasClipping() ? p->clipRegion() : QRegion(optIndicator.rect)) - - checkRect; + - crStyle.united(crBase); p->setClipRegion(clipRegion); } subRule.configurePalette(&optCopy.palette, QPalette::Text, QPalette::NoRole); @@ -4480,7 +4488,7 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q QString titleText = p->fontMetrics().elidedText(dwOpt->title, Qt::ElideRight, r.width()); drawItemText(p, r, - alignment, dwOpt->palette, + alignment | Qt::TextHideMnemonic, dwOpt->palette, dwOpt->state & State_Enabled, titleText, QPalette::WindowText); @@ -4865,6 +4873,7 @@ void QStyleSheetStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *op w = w->parentWidget(); //match on the QTabBar instead of the CloseButton } pseudoElement = PseudoElement_TabBarTabCloseButton; + break; #endif default: @@ -5492,11 +5501,11 @@ QSize QStyleSheetStyle::sizeFromContents(ContentsType ct, const QStyleOption *op QList<QVariant> layout = rule.styleHint("button-layout"_L1).toList(); if (layout.isEmpty()) - layout = subControlLayout("mNX"_L1); + layout = subControlLayout("mNX"); int width = 0, height = 0; - for (int i = 0; i < layout.size(); i++) { - int layoutButton = layout[i].toInt(); + for (const QVariant &val : std::as_const(layout)) { + int layoutButton = val.toInt(); if (layoutButton < PseudoElement_MdiCloseButton || layoutButton > PseudoElement_MdiNormalButton) continue; @@ -5623,7 +5632,8 @@ QPixmap QStyleSheetStyle::standardPixmap(StandardPixmap standardPixmap, const QS QRenderRule rule = renderRule(w, opt); if (rule.hasStyleHint(s)) { QIcon icon = qvariant_cast<QIcon>(rule.styleHint(s)); - return icon.pixmap(16, 16); // ###: unhard-code this if someone complains + const auto dpr = w ? w->devicePixelRatio() : qApp->devicePixelRatio(); + return icon.pixmap(QSize(16, 16), dpr); } } return baseStyle()->standardPixmap(standardPixmap, opt, w); @@ -6058,12 +6068,12 @@ QRect QStyleSheetStyle::subControlRect(ComplexControl cc, const QStyleOptionComp || hasStyleRule(w, PseudoElement_MdiMinButton)) { QList<QVariant> layout = rule.styleHint("button-layout"_L1).toList(); if (layout.isEmpty()) - layout = subControlLayout("mNX"_L1); + layout = subControlLayout("mNX"); int x = 0, width = 0; QRenderRule subRule; - for (int i = 0; i < layout.size(); i++) { - int layoutButton = layout[i].toInt(); + for (const QVariant &val : std::as_const(layout)) { + int layoutButton = val.toInt(); if (layoutButton < PseudoElement_MdiCloseButton || layoutButton > PseudoElement_MdiNormalButton) continue; @@ -6219,8 +6229,22 @@ QRect QStyleSheetStyle::subElementRect(SubElement se, const QStyleOption *opt, c case SE_HeaderLabel: { QRenderRule subRule = renderRule(w, opt, PseudoElement_HeaderViewSection); - if (subRule.hasBox() || !subRule.hasNativeBorder()) - return subRule.contentsRect(opt->rect); + if (subRule.hasBox() || !subRule.hasNativeBorder()) { + auto r = subRule.contentsRect(opt->rect); + if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) { + // Subtract width needed for arrow, if there is one + if (header->sortIndicator != QStyleOptionHeader::None) { + const auto arrowRect = subElementRect(SE_HeaderArrow, opt, w); + if (arrowRect.isValid()) { + if (opt->state & State_Horizontal) + r.setWidth(r.width() - arrowRect.width()); + else + r.setHeight(r.height() - arrowRect.height()); + } + } + } + return r; + } } break; @@ -6488,6 +6512,9 @@ bool QStyleSheetStyle::isNaturalChild(const QObject *obj) QPixmap QStyleSheetStyle::loadPixmap(const QString &fileName, const QObject *context) { + if (fileName.isEmpty()) + return {}; + qreal ratio = -1.0; if (const QWidget *widget = qobject_cast<const QWidget *>(context)) { if (QScreen *screen = QApplication::screenAt(widget->mapToGlobal(QPoint(0, 0)))) diff --git a/src/widgets/styles/qstylesheetstyle_default.cpp b/src/widgets/styles/qstylesheetstyle_default.cpp index e50e18f291..6356835ff4 100644 --- a/src/widgets/styles/qstylesheetstyle_default.cpp +++ b/src/widgets/styles/qstylesheetstyle_default.cpp @@ -122,7 +122,8 @@ StyleSheet QStyleSheetStyle::getDefaultStyleSheet() const // pixmap based style doesn't support any features bool styleIsPixmapBased = baseStyle()->inherits("QMacStyle") - || baseStyle()->inherits("QWindowsVistaStyle"); + || (baseStyle()->inherits("QWindowsVistaStyle") + && !baseStyle()->inherits("QWindows11Style")); /*QLineEdit { diff --git a/src/widgets/styles/qwindowsstyle.cpp b/src/widgets/styles/qwindowsstyle.cpp index f79136757a..bae182b467 100644 --- a/src/widgets/styles/qwindowsstyle.cpp +++ b/src/widgets/styles/qwindowsstyle.cpp @@ -88,11 +88,6 @@ enum QSliderDirection { SlUp, SlDown, SlLeft, SlRight }; QWindowsStylePrivate::QWindowsStylePrivate() = default; -qreal QWindowsStylePrivate::appDevicePixelRatio() -{ - return qApp->devicePixelRatio(); -} - // Returns \c true if the toplevel parent of \a widget has seen the Alt-key bool QWindowsStylePrivate::hasSeenAlt(const QWidget *widget) const { @@ -117,19 +112,20 @@ bool QWindowsStyle::eventFilter(QObject *o, QEvent *e) widget = widget->window(); // Alt has been pressed - find all widgets that care - QList<QWidget *> l = widget->findChildren<QWidget *>(); + const QList<QWidget *> children = widget->findChildren<QWidget *>(); auto ignorable = [](QWidget *w) { return w->isWindow() || !w->isVisible() || w->style()->styleHint(SH_UnderlineShortcut, nullptr, w); }; - l.removeIf(ignorable); // Update states before repainting d->seenAlt.append(widget); d->alt_down = true; // Repaint all relevant widgets - for (int pos = 0; pos < l.size(); ++pos) - l.at(pos)->update(); + for (QWidget *w : children) { + if (!ignorable(w)) + w->update(); + } } break; case QEvent::KeyRelease: @@ -139,9 +135,9 @@ bool QWindowsStyle::eventFilter(QObject *o, QEvent *e) // Update state and repaint the menu bars. d->alt_down = false; #if QT_CONFIG(menubar) - QList<QMenuBar *> l = widget->findChildren<QMenuBar *>(); - for (int i = 0; i < l.size(); ++i) - l.at(i)->update(); + const QList<QMenuBar *> menuBars = widget->findChildren<QMenuBar *>(); + for (QWidget *w : menuBars) + w->update(); #endif } break; @@ -261,28 +257,33 @@ void QWindowsStyle::polish(QPalette &pal) int QWindowsStylePrivate::pixelMetricFromSystemDp(QStyle::PixelMetric pm, const QStyleOption *, const QWidget *widget) { #if defined(Q_OS_WIN) + // The pixel metrics are in device indepentent pixels; + // hardcode DPI to 1x 96 DPI. + const int dpi = 96; + switch (pm) { case QStyle::PM_DockWidgetFrameWidth: - return GetSystemMetrics(SM_CXFRAME); - - case QStyle::PM_TitleBarHeight: - if (widget && (widget->windowType() == Qt::Tool)) { - // MS always use one less than they say - return GetSystemMetrics(SM_CYSMCAPTION) - 1; - } - return GetSystemMetrics(SM_CYCAPTION) - 1; + return GetSystemMetricsForDpi(SM_CXFRAME, dpi); + + case QStyle::PM_TitleBarHeight: { + const int resizeBorderThickness = + GetSystemMetricsForDpi(SM_CXSIZEFRAME, dpi) + GetSystemMetricsForDpi(SM_CXPADDEDBORDER, dpi); + if (widget && (widget->windowType() == Qt::Tool)) + return GetSystemMetricsForDpi(SM_CYSMCAPTION, dpi) + resizeBorderThickness; + return GetSystemMetricsForDpi(SM_CYCAPTION, dpi) + resizeBorderThickness; + } case QStyle::PM_ScrollBarExtent: { NONCLIENTMETRICS ncm; - ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, lfMessageFont) + sizeof(LOGFONT); - if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0)) + ncm.cbSize = sizeof(NONCLIENTMETRICS); + if (SystemParametersInfoForDpi(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0, dpi)) return qMax(ncm.iScrollHeight, ncm.iScrollWidth); } break; case QStyle::PM_MdiSubWindowFrameWidth: - return GetSystemMetrics(SM_CYFRAME); + return GetSystemMetricsForDpi(SM_CYFRAME, dpi); default: break; @@ -354,22 +355,10 @@ static QScreen *screenOf(const QWidget *w) } // Calculate the overall scale factor to obtain Qt Device Independent -// Pixels from a native Windows size. Divide by devicePixelRatio -// and account for secondary screens with differing logical DPI. +// Pixels from a native Windows size. qreal QWindowsStylePrivate::nativeMetricScaleFactor(const QWidget *widget) { - qreal scale = QHighDpiScaling::factor(screenOf(widget)); - qreal result = qreal(1) / scale; - if (QGuiApplicationPrivate::screen_list.size() > 1) { - const QScreen *primaryScreen = QGuiApplication::primaryScreen(); - const QScreen *screen = screenOf(widget); - if (screen != primaryScreen) { - qreal primaryScale = QHighDpiScaling::factor(primaryScreen); - if (!qFuzzyCompare(scale, primaryScale)) - result *= scale / primaryScale; - } - } - return result; + return qreal(1) / QHighDpiScaling::factor(screenOf(widget)); } /*! @@ -379,7 +368,7 @@ int QWindowsStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt, const QW { int ret = QWindowsStylePrivate::pixelMetricFromSystemDp(pm, opt, widget); if (ret != QWindowsStylePrivate::InvalidMetric) - return qRound(qreal(ret) * QWindowsStylePrivate::nativeMetricScaleFactor(widget)); + return ret; ret = QWindowsStylePrivate::fixedPixelMetric(pm); if (ret != QWindowsStylePrivate::InvalidMetric) @@ -389,7 +378,7 @@ int QWindowsStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt, const QW switch (pm) { case PM_MaximumDragDistance: - ret = QCommonStyle::pixelMetric(PM_MaximumDragDistance); + ret = QCommonStyle::pixelMetric(PM_MaximumDragDistance, opt, widget); if (ret == -1) ret = 60; break; @@ -446,46 +435,6 @@ int QWindowsStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt, const QW QPixmap QWindowsStyle::standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt, const QWidget *widget) const { -#if defined(Q_OS_WIN) - QPixmap desktopIcon; - switch(standardPixmap) { - case SP_DriveCDIcon: - case SP_DriveDVDIcon: - case SP_DriveNetIcon: - case SP_DriveHDIcon: - case SP_DriveFDIcon: - case SP_FileIcon: - case SP_FileLinkIcon: - case SP_DirLinkIcon: - case SP_DirClosedIcon: - case SP_DesktopIcon: - case SP_ComputerIcon: - case SP_DirOpenIcon: - case SP_FileDialogNewFolder: - case SP_DirHomeIcon: - case SP_TrashIcon: - case SP_VistaShield: - if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) { - QPlatformTheme::StandardPixmap sp = static_cast<QPlatformTheme::StandardPixmap>(standardPixmap); - desktopIcon = theme->standardPixmap(sp, QSizeF(16, 16)); - } - break; - case SP_MessageBoxInformation: - case SP_MessageBoxWarning: - case SP_MessageBoxCritical: - case SP_MessageBoxQuestion: - if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) { - QPlatformTheme::StandardPixmap sp = static_cast<QPlatformTheme::StandardPixmap>(standardPixmap); - desktopIcon = theme->standardPixmap(sp, QSizeF()); - } - break; - default: - break; - } - if (!desktopIcon.isNull()) { - return desktopIcon; - } -#endif // Q_OS_WIN return QCommonStyle::standardPixmap(standardPixmap, opt, widget); } @@ -807,7 +756,7 @@ void QWindowsStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, } #endif // QT_CONFIG(itemviews) if (!(opt->state & State_Off)) { - QPointF points[6]; + std::array<QPointF, 6> points; qreal scaleh = opt->rect.width() / 12.0; qreal scalev = opt->rect.height() / 12.0; points[0] = { opt->rect.x() + qreal(3.5) * scaleh, opt->rect.y() + qreal(5.5) * scalev }; @@ -818,7 +767,7 @@ void QWindowsStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, points[5] = { points[4].x() - 4 * scaleh, points[4].y() + 4 * scalev }; p->setPen(QPen(opt->palette.text().color(), 0)); p->setBrush(opt->palette.text().color()); - p->drawPolygon(points, 6); + p->drawPolygon(points.data(), static_cast<int>(points.size())); } if (doRestore) p->restore(); @@ -1570,11 +1519,8 @@ void QWindowsStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPai default: break; } - if (opt->direction == Qt::RightToLeft){ //reverse layout changes the order of Beginning/end - bool tmp = paintLeftBorder; - paintRightBorder=paintLeftBorder; - paintLeftBorder=tmp; - } + if (opt->direction == Qt::RightToLeft) //reverse layout changes the order of Beginning/end + std::swap(paintLeftBorder, paintRightBorder); break; case Qt::RightToolBarArea : switch (toolbar->positionOfLine){ @@ -1786,7 +1732,7 @@ void QWindowsStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPai titleRect.height(), titleRect.width()); } proxy()->drawItemText(p, titleRect, - Qt::AlignLeft | Qt::AlignVCenter, palette, + Qt::AlignLeft | Qt::AlignVCenter | Qt::TextHideMnemonic, palette, dwOpt->state & State_Enabled, dwOpt->title, floating ? (active ? QPalette::BrightText : QPalette::Window) : QPalette::WindowText); p->setFont(oldFont); @@ -1949,39 +1895,36 @@ void QWindowsStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComp QSliderDirection dir; if (orient == Qt::Horizontal) - if (tickAbove) - dir = SlUp; - else - dir = SlDown; + dir = tickAbove ? SlUp : SlDown; else - if (tickAbove) - dir = SlLeft; - else - dir = SlRight; - - QPolygon a; + dir = tickAbove ? SlLeft : SlRight; + std::array<QPoint, 5> points; int d = 0; switch (dir) { case SlUp: - y1 = y1 + wi/2; + y1 = y1 + wi / 2; d = (wi + 1) / 2 - 1; - a.setPoints(5, x1,y1, x1,y2, x2,y2, x2,y1, x1+d,y1-d); + points = {QPoint(x1, y1), QPoint(x1, y2), QPoint(x2, y2), + QPoint(x2, y1), QPoint(x1 + d, y1 - d)}; break; case SlDown: - y2 = y2 - wi/2; + y2 = y2 - wi / 2; d = (wi + 1) / 2 - 1; - a.setPoints(5, x1,y1, x1,y2, x1+d,y2+d, x2,y2, x2,y1); + points = {QPoint(x1, y1), QPoint(x1, y2), QPoint(x1 + d, y2 + d), + QPoint(x2, y2), QPoint(x2, y1)}; break; case SlLeft: d = (he + 1) / 2 - 1; - x1 = x1 + he/2; - a.setPoints(5, x1,y1, x1-d,y1+d, x1,y2, x2,y2, x2,y1); + x1 = x1 + he / 2; + points = {QPoint(x1, y1), QPoint(x1 - d, y1 + d), QPoint(x1,y2), + QPoint(x2, y2), QPoint(x2, y1)}; break; case SlRight: d = (he + 1) / 2 - 1; - x2 = x2 - he/2; - a.setPoints(5, x1,y1, x1,y2, x2,y2, x2+d,y1+d, x2,y1); + x2 = x2 - he / 2; + points = {QPoint(x1, y1), QPoint(x1, y2), QPoint(x2, y2), + QPoint(x2 + d, y1 + d), QPoint(x2, y1)}; break; } @@ -1991,7 +1934,7 @@ void QWindowsStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComp Qt::BGMode oldMode = p->backgroundMode(); p->setBackgroundMode(Qt::OpaqueMode); p->drawRect(x1, y1, x2-x1+1, y2-y1+1); - p->drawPolygon(a); + p->drawPolygon(points.data(), static_cast<int>(points.size())); p->setBrush(oldBrush); p->setBackgroundMode(oldMode); diff --git a/src/widgets/styles/qwindowsstyle_p_p.h b/src/widgets/styles/qwindowsstyle_p_p.h index 0c0350c3d2..dce60cbf8d 100644 --- a/src/widgets/styles/qwindowsstyle_p_p.h +++ b/src/widgets/styles/qwindowsstyle_p_p.h @@ -24,8 +24,6 @@ QT_BEGIN_NAMESPACE -class QTime; - class Q_WIDGETS_EXPORT QWindowsStylePrivate : public QCommonStylePrivate { Q_DECLARE_PUBLIC(QWindowsStyle) @@ -35,15 +33,12 @@ public: QWindowsStylePrivate(); static int pixelMetricFromSystemDp(QStyle::PixelMetric pm, const QStyleOption *option = nullptr, const QWidget *widget = nullptr); static int fixedPixelMetric(QStyle::PixelMetric pm); - static qreal devicePixelRatio(const QWidget *widget = nullptr) - { return widget ? widget->devicePixelRatio() : QWindowsStylePrivate::appDevicePixelRatio(); } static qreal nativeMetricScaleFactor(const QWidget *widget = nullptr); bool hasSeenAlt(const QWidget *widget) const; bool altDown() const { return alt_down; } bool alt_down = false; QList<const QWidget *> seenAlt; - int menuBarTimer = 0; QColor inactiveCaptionText; QColor activeCaptionColor; @@ -60,9 +55,6 @@ public: windowsRightBorder = 15, // right border on windows windowsCheckMarkWidth = 12 // checkmarks width on windows }; - -private: - static qreal appDevicePixelRatio(); }; QT_END_NAMESPACE |