mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-05-01 17:24:57 +00:00
Add a large set of QML components (qml/Material, qml/MetaBuilder, qml/dbal) and a QmlComponents symlink for local development; migrate many frontends/qt6 files into qml/qt6. Replace the email client bootloader with a self-contained demo UI using FakeMUI primitives (MailboxLayout, ThreadList, EmailHeader, ComposeWindow), demo data, handlers, and new folder-navigation styles in globals.css. Update several QML component APIs to new signal/handler names (e.g. selectAllChanged→selectAllToggled, pageChanged→pageRequested, *Changed→*Edited) to standardize events. Add find_config_files() to frontends/qt6/generate_cmake.py to include config JS/JSON in QML/files and resources. Also add /frontends/qt6/_build to .gitignore.
54 lines
1.8 KiB
QML
54 lines
1.8 KiB
QML
import QtQuick
|
|
import QtQuick.Controls
|
|
import QtQuick.Layouts
|
|
import QmlComponents 1.0
|
|
|
|
ColumnLayout {
|
|
id: root
|
|
Layout.fillWidth: true
|
|
spacing: 12
|
|
|
|
property int selectedPattern: 0
|
|
property var patterns: ["read-through", "write-through", "cache-aside", "dual-write"]
|
|
|
|
property var descriptions: [
|
|
"Read-through: Reads check cache first. On miss, the cache fetches from the primary DB, stores the result, and returns it. Best for read-heavy workloads.",
|
|
"Write-through: Every write goes to both cache and primary DB synchronously. Guarantees consistency at the cost of write latency.",
|
|
"Cache-aside: Application manages cache explicitly. Reads check cache, fetch from DB on miss and populate cache. Writes go directly to DB and invalidate cache.",
|
|
"Dual-write: Writes are sent to two backends simultaneously (e.g., primary DB + search index). Requires conflict resolution strategy."
|
|
]
|
|
|
|
signal patternChanged(int index)
|
|
|
|
CText { variant: "subtitle1"; text: "Multi-Adapter Pattern" }
|
|
CText { variant: "body2"; text: "Select how the primary, cache, and search adapters coordinate data flow." }
|
|
|
|
FlexRow {
|
|
Layout.fillWidth: true
|
|
spacing: 8
|
|
|
|
Repeater {
|
|
model: root.patterns
|
|
delegate: CButton {
|
|
text: modelData
|
|
variant: index === root.selectedPattern ? "primary" : "ghost"
|
|
onClicked: root.patternChanged(index)
|
|
}
|
|
}
|
|
}
|
|
|
|
CPaper {
|
|
Layout.fillWidth: true
|
|
implicitHeight: patternDesc.implicitHeight + 24
|
|
|
|
CText {
|
|
id: patternDesc
|
|
anchors.fill: parent
|
|
anchors.margins: 12
|
|
variant: "body2"
|
|
wrapMode: Text.Wrap
|
|
text: root.descriptions[root.selectedPattern]
|
|
}
|
|
}
|
|
}
|