From 09f02a1185af123ca4094cb0a6c6cd97beca2c89 Mon Sep 17 00:00:00 2001 From: Alex Huszagh Date: Wed, 27 Apr 2022 17:32:20 -0500 Subject: [PATCH] Compile resource files during configuration. Added `--compiled-resource` flag, which can be used to invoke `pyrcc5`. The `pyrcc5` executable can be controlled via the `PYRCC5` environment variable or the `--pyrcc5` flag. Updated the documentation to reflect this, including the default build scripts. --- README.md | 26 ++++++++++++++++++-------- configure.py | 28 +++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index a49b311..19568d4 100644 --- a/README.md +++ b/README.md @@ -177,13 +177,14 @@ Here are detailed instructions on how to install Breeze Style Sheets for a varie ## Configuring -By default, BreezeStyleSheets comes with the `dark` and `light` themes pre-built. In order to build all pre-packaged themes, run: +By default, BreezeStyleSheets comes with the `dark` and `light` themes pre-built. In order to build all pre-packaged themes including PyQt5 and PyQt6 support, run: ```bash -python configure.py --styles=all --extensions=all --resource breeze.qrc +python configure.py --styles=all --extensions=all --pyqt6 \ + --resource breeze.qrc --compiled-resource breeze_resources.py ``` -All generated themes will be in the [dist](/dist) subdirectory. +All generated themes will be in the [dist](/dist) subdirectory, and the compiled Python resource will be in `breeze_resouces.py`. Note that using the `--compiled-resource` flag requires `pyrcc5` to be installed. ## CMake Installation @@ -308,11 +309,15 @@ int main(int argc, char *argv[]) ## PyQt5 Installation -To compile the stylesheet for use with PyQt5, compile with the following command `pyrcc5 dist/qrc/breeze.qrc -o breeze_resources.py`. `breeze_resources.py` now contains all the stylesheet data. To load and set the stylesheet in a PyQt5 application, import `breeze_resources`, load the file using QFile and read the data. For example, to load BreezeDark, run: +To compile the stylesheet for use with PyQt5, ensure you configure with the `--compiled-resource` flag (which requires `pyrcc5` installed). The compiled resource Python file now contains all the stylesheet data. To load and set the stylesheet in a PyQt5 application, import that file, load the contents using QFile and read the data. For example, to load BreezeDark, first configure using: +```bash +python configure.py --compiled-resource breeze_resources.py +``` + +Then load the stylesheet and run the application using: ```python - from PyQt5 import QtWidgets from PyQt5.QtCore import QFile, QTextStream import breeze_resources @@ -416,7 +421,11 @@ Have an issue with the styles? Here's a few suggestions, prior to filing a bug r ## Configuring -To configure the assets and the stylesheets, run `configure.py`. To compile the assets and stylesheets for Python, run `pyrcc5 dist/qrc/breeze.qrc -o breeze_resources.py`. +To configure the assets and the stylesheets, run `python configure.py`. To compile the assets and stylesheets for PyQt5, ensure `pyrcc5` is installed and run: + +```bash +python configure.py --compiled-resource breeze_resources.py +``` ## Testing @@ -424,10 +433,11 @@ In order to test your changes, first run the tests using the appropriate widget ## Distribution Files -When pushing changes, only the `light` and `dark` themes should be configured, without any extensions. To reset the built resource files to the defaults, run: +When pushing changes, only the `light` and `dark` themes should be configured, without any extensions. To reset the built resource files to the defaults (this requires `pyrcc5` to be installed), run: ```bash -python configure.py --clean --pyqt6 +python configure.py --clean --pyqt6 \ + --compiled-resource breeze_resources.py ``` If no changes are being made to the icons or stylesheets, you may want to ensure that the `dist` directory is assumed to be unchanged in git, no longer tracking changes to these files. You can turn tracking distribution files off with: diff --git a/configure.py b/configure.py index 304220f..31565ce 100644 --- a/configure.py +++ b/configure.py @@ -13,6 +13,7 @@ import json import os import re import shutil +import subprocess import sys home = os.path.dirname(os.path.realpath(__file__)) @@ -63,6 +64,15 @@ def parse_args(argv=None): help='clean dist directory prior to configuring themes.', action='store_true' ) + parser.add_argument( + '--pyrcc5', + help='name of the pyrcc5 executable. Overridden by the `PYRCC5` envvar.', + default='pyrcc5', + ) + parser.add_argument( + '--compiled-resource', + help='output compiled python resource file.', + ) args = parser.parse_args(argv) parse_styles(args) parse_extensions(args) @@ -322,9 +332,25 @@ def configure(args): for style in config['themes'].keys(): configure_style(config, style) + # Create and compile our resource files. + # resource files aren't used in PyQt6: no rcc6 anyway. if not args.no_qrc: - # resource files aren't used in PyQt6: no rcc6 anyway. write_qrc(config) + if not args.no_qrc and args.compiled_resource is not None: + pyrcc5 = os.environ.get('PYRCC5', args.pyrcc5) + command = [ + pyrcc5, + f'{qrc_dist}/{args.resource}', + '-o', + f'{home}/{args.compiled_resource}' + ] + subprocess.check_call( + command, + stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + shell=False, + ) def main(argv=None): '''Configuration entry point'''