Two fronts of the modularization, both gated green before this commit. QML leaves the flat qml/ directory for seven modules: cards, controls, rows, settings, shell, theme, views. Only Main.qml and LoginScreen.qml stay at the root. build.rs matches the tree exactly (55 files), relative imports and asset paths were re-anchored for the new depth. The QbzBridge God-object starts breaking up: QbzSession, QbzShell, QbzPlayer, QbzQueue and QbzHome are now their own #[cxx_qt::bridge] singletons, each with its own OnceLock<CxxQtThread> and ui() hop, booted in order from Main.qml. Bridge files stay directly under src/ because cxx-qt-build only accepts rust_files from one directory (QTBUG-93443). bridge.rs keeps 5.5 domains (library, album/artist, settings, integrations, search, playlist) and dies once they are split out. cc
32 lines
1.5 KiB
QML
32 lines
1.5 KiB
QML
// Tinted SVG icon — the QML equivalent of Slint's QbzIcon (glyphs recolored
|
|
// to a theme tint).
|
|
//
|
|
// POC-NOTE (icon tinting): the QBZ icon set is Feather-style SVGs with a
|
|
// hardcoded `stroke="#ffffff"`; Slint recolors at render time, QML's Image
|
|
// cannot. A ColorOverlay (Qt5Compat.GraphicalEffects) was tried first and
|
|
// renders NOTHING on the offscreen/software path (verified with a probe —
|
|
// effects need the GL path), so tinting is done with PRE-BAKED SVG
|
|
// variants: assets/icons/<tint>/<name>.svg for tint in {primary,
|
|
// secondary, muted, accent, warning} (script-generated from the originals,
|
|
// also rewriting fill="currentColor"). `tintName` switches variants
|
|
// dynamically (hover = secondary -> primary), served from qrc.
|
|
|
|
import QtQuick
|
|
|
|
Image {
|
|
id: root
|
|
// Icon file name, e.g. "compass" (".svg" appended).
|
|
property string name: ""
|
|
// One of: "primary" | "secondary" | "muted" | "accent" | "warning" |
|
|
// "black" (for glyphs on white discs).
|
|
property string tintName: "secondary"
|
|
|
|
// Absolute qrc URL: relative URLs in a shared component resolve
|
|
// against the CONSUMER's document depth (phase-23 dir layout — root
|
|
// consumers underflowed one level).
|
|
source: name === "" ? "" : "qrc:/qt/qml/com/blitzfc/qbz/qml/assets/icons/" + tintName + "/" + name + ".svg"
|
|
sourceSize: Qt.size(Math.max(1, Math.round(width * 2)), Math.max(1, Math.round(height * 2)))
|
|
fillMode: Image.PreserveAspectFit
|
|
asynchronous: false
|
|
}
|