You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Controls above camera view — Start/stop button, camera dropdown, and exposure/gain/gamma controls were moved from below the live view to above it, for both label cameras and the barcode camera, so they're visible without scrolling.
Removed redundant labels — the "Label camera" / "Barcode camera" captions above each Start live view button were removed since the section header already states this.
Redundant "Select camera" labels removed, then re-added as invisible space-holders (QLabel(" ")) so the Start button and dropdown stay vertically aligned with the FLIR exposure/gain/gamma controls, which retain real labels.
New Features
Institution field — new text field added below "Creator" in the right panel. Feeds into EXIF Copyright tag and the CSV rights_owner column (falls back to "Manaaki Whenua Landcare Research" if left blank), and is saved/loaded via the YAML config file.
Camera conflict prevention — selecting the same physical camera in two different slots (or between a label slot and the barcode camera) could freeze the live feed, and for FLIR devices required deselecting/reselecting to recover. Fixed by:
Adding a "— Select camera —" placeholder option to every camera dropdown.
Greying out (italic, muted colour) any camera already claimed elsewhere.
Actively reverting the dropdown selection if a user manages to pick an already-claimed camera (since Qt item-flag disabling isn't reliably honoured under the qt_material theme).
Availability is re-synced after every camera selection change, slot add/remove, and live-view start/stop, across both label slots and the barcode camera.
Bug Fixes
Crash after "Discovering cameras" — root cause was infinite recursion in AspectRatioLabel.resizeEvent (setFixedHeight re-triggering resizeEvent), causing a silent C-stack overflow with no Python traceback. Fixed with a recursion guard flag.
QLayout double-layout crash — replacing the label camera grid layout via QWidget().setLayout(old) caused PyQt5 to destroy the layout while the widget still referenced it. Fixed by replacing the entire scroll area widget (QScrollArea.setWidget(...)) with a fresh container that owns the grid from creation.
Build & Deployment
cx_Freeze missing native DLL — pylibdmtx's bundled libdmtx-64.dll wasn't picked up automatically (it's loaded via ctypes, not a normal import) causing FileNotFoundError on end-user machines. setup.py now explicitly discovers and includes all .dll files from the pylibdmtx package directory.
Switched installer tooling from cx_Freeze's bdist_msi to Inno Setup, giving a proper install wizard with:
A dialog letting the user choose per-user vs. all-users installation (PrivilegesRequiredOverridesAllowed=dialog).
Correct 64-bit Program Files targeting ({autopf64}, ArchitecturesInstallIn64BitMode=x64) — the default {autopf} had been resolving to Program Files (x86).
Automatic uninstall of the previous version on upgrade, via a stable AppId GUID.
Desktop and Start Menu shortcuts, with the app icon properly embedded.
Documentation
Added a full README.md covering features, installation (MSI/installer-first, with source build instructions for developers), requirements, workflow, output file formats, FLIR camera settings, config file format, architecture notes, known limitations, and acknowledgements.
Updated README with an "Installation" section distinguishing the pre-built Windows installer (recommended) from building from source (for development).