Files
qbz/crates/qbz-qt/qml/settings/DeveloperSettings.qml
T
vicrodh a39ea8c12d feat(settings): Import / Export section with portable blacklist and account migration
A new top-level Settings section, Import / Export, gathers everything that
moves data in or out of this install:

- SETTINGS PORTABILITY: the settings bundle export moves here from
  Developer, with a note on what the bundle does not hold (favorites,
  playlists, blacklist, purchases).
- BLACKLIST: export the blocked artists and albums as a JSON one user can
  hand to another; import merges additively and never touches the enabled
  flag (qbz_app::settings::blacklist_portable, frontend-agnostic).
- ACCOUNT MIGRATION: create a snapshot while signed in with the old
  account, then migrate it into the account signed in now, with the local
  profile copy and its three opt-in toggles (media servers, scrobblers,
  listening history, all on). The disclaimer states that subscriptions and
  purchases do not move. Progress and results are status lines in the
  settings document; the favorites cache re-warms and the sidebar reloads
  after a run, the local half asks for a restart.

Also: the header shows a translated "Member" for accounts without a
subscription, and the login screen says what a member can and cannot do.
50 new strings in all eight catalogs.

cc
2026-09-02 08:24:02 -06:00

84 lines
3.1 KiB
QML

// Settings > Developer — the QML port of crates/qbz-ui/ui/settings/
// DeveloperSettings.slint.
//
// Shipped, in the Slint's order: QOBUZ CONNECT · LOGS. SETTINGS PORTABILITY
// moved to Settings > Import / Export (2026-09-02) with the rest of the
// data-moving rows (blacklist, account migration).
//
// Deltas vs the Slint (no dead rows):
// - LOGS offers TWO buttons where the Slint has one: "View logs" opens the
// in-app viewer (copy / redact / upload) and "Open log file" hands the
// on-disk sink to the desktop.
// - The inline DiagnosticsPanel is ported and mounted last, as in the
// reference — with the GTK/WebKit/GSK/GDK rows CUT, because in a Qt process
// they can only read "—" and their saved column would come from a file this
// binary never writes. The panel's own header explains the cut.
import QtQuick
import com.blitzfc.qbz
import "../controls"
import "../theme"
Column {
id: root
property var doc: ({})
readonly property var dev: doc.dev || ({})
QbzTheme { id: theme }
spacing: 4
// ========================== QOBUZ CONNECT ============================
GroupHeader { text: QbzSession.tr("QOBUZ CONNECT", QbzSession.trRev) }
SettingRow {
label: QbzSession.tr("Connect diagnostics", QbzSession.trRev)
description: QbzSession.tr("Live session topology and a rolling event log for debugging Qobuz Connect at runtime.", QbzSession.trRev)
SettingsButton {
text: QbzSession.tr("Open diagnostics", QbzSession.trRev)
onClicked: QbzQConnect.diagSetOpen(true)
}
}
SettingsSpacer { }
// ============================== LOGS =================================
GroupHeader { text: QbzSession.tr("LOGS", QbzSession.trRev) }
SettingRow {
label: QbzSession.tr("Application logs", QbzSession.trRev)
description: (root.dev.logPath || "") !== ""
? root.dev.logPath
: QbzSession.tr("View the in-app log, copy it (secrets redacted), or upload it to share in a GitHub issue.", QbzSession.trRev)
Row {
spacing: 8
// The description above has always promised "view the in-app log,
// copy it (secrets redacted), or upload it" — until the viewer
// landed, the only button here did none of those three.
SettingsButton {
text: QbzSession.tr("View logs", QbzSession.trRev)
onClicked: QbzShell.logOpen()
}
SettingsButton {
text: QbzSession.tr("Open log file", QbzSession.trRev)
enabled: (root.dev.logPath || "") !== ""
onClicked: QbzBridge.settingsString("open-log-file", "")
}
}
}
Text {
visible: (root.dev.status || "") !== ""
width: parent.width
text: root.dev.status || ""
color: theme.textMuted
font.pixelSize: theme.fontLegal
wrapMode: Text.WordWrap
}
SettingsSpacer { }
// ========================== DIAGNOSTICS ==============================
// Last child, 1:1 with DeveloperSettings.slint:92.
DiagnosticsPanel { }
}