qml: use nullish coalescence and optional chaining to simplify conditions

optional chaining was introduced in 6.2
nullish coalescence was introduced in 5.15

no functional changes
This commit is contained in:
Pierre Lamot 2024-04-10 11:30:41 +02:00 committed by Steve Lhomme
parent e50ca0c0b4
commit 04a49bff37
27 changed files with 60 additions and 76 deletions

View File

@ -70,8 +70,7 @@ Item {
text: {
const text = modelData.name
if (!!MainCtx.controlbarProfileModel.currentModel &&
MainCtx.controlbarProfileModel.currentModel.getModel(identifier).dirty)
if (MainCtx.controlbarProfileModel.currentModel?.getModel(identifier).dirty)
return _markDirty(text)
else
return text
@ -188,7 +187,7 @@ Item {
rightMetric.width) * 1.25
: 0
readonly property int count: !!item ? item.count : 0
readonly property int count: item?.count ?? 0
sourceComponent: Rectangle {
color: theme.bg.primary
@ -304,6 +303,6 @@ Item {
Util.ViewDragAutoScrollHandler {
id: dragAutoScrollHandler
view: _viewThatContainsDrag ? _viewThatContainsDrag : null
view: _viewThatContainsDrag ?? null
}
}

View File

@ -67,16 +67,13 @@ FocusScope {
const item = stackView.currentItem
sourcesBanner.localMenuDelegate = Qt.binding(function () {
return !!item.localMenuDelegate ? item.localMenuDelegate : null
return item.localMenuDelegate ?? null
})
// NOTE: sortMenu is declared with the SortMenu type, so when it's undefined we have to
// return null to avoid a QML warning.
sourcesBanner.sortMenu = Qt.binding(function () {
if (item.sortMenu)
return item.sortMenu
else
return null
return item.sortMenu ?? null
})
MainCtx.hasGridListMode = Qt.binding(() => item.hasGridListMode !== undefined && item.hasGridListMode)

View File

@ -56,7 +56,7 @@ Widgets.StackViewExt {
property Component loadingComponent: null
// NOTE: Sometimes the model has no 'loading' property.
readonly property bool isLoading: (model.loading) ? model.loading : false
readonly property bool isLoading: model.loading ?? false
readonly property int count: model.count

View File

@ -371,7 +371,7 @@ FocusScope {
anchors.fill: parent
Widgets.ListLabel {
text: !!rowModel && !!rowModel.track_number ? rowModel.track_number : ""
text: rowModel?.track_number ?? ""
color: theme.fg.primary
font.weight: Font.Normal
@ -381,7 +381,7 @@ FocusScope {
}
Widgets.ListLabel {
text: !!rowModel && !!rowModel.title ? rowModel.title : ""
text: rowModel?.title ?? ""
color: theme.fg.primary
Layout.fillHeight: true

View File

@ -50,15 +50,15 @@ VideoAll {
// Settings
model: !!_meta ? _meta.model : null
model: _meta?.model ?? null
contextMenu: Util.MLContextMenu { model: _meta ? _meta.model : null; showPlayAsAudioAction: true }
gridLabels: !!_meta ? _meta.gridLabels : root.getLabel
gridLabels: _meta?.gridLabels ?? root.getLabel
listLabels: !!_meta ? _meta.listLabels : root.getLabel
listLabels: _meta?.listLabels ?? root.getLabel
sectionProperty: !!_meta && !!_meta.sectionProperty ? _meta.sectionProperty : ""
sectionProperty: _meta?.sectionProperty ?? ""
headerPositioning: headerItem.model.count > 0 ? ListView.InlineHeader : ListView.OverlayHeader

View File

@ -42,7 +42,7 @@ Widgets.GridItem {
fallbackImage: VLCStyle.noArtVideoCover
title: model.title || qsTr("Unknown title")
subtitle: !!model && (typeof model.duration !== "undefined") ? model.duration.formatHMS() : ""
subtitle: model?.duration?.formatHMS() ?? ""
pictureWidth: VLCStyle.gridCover_video_width
pictureHeight: VLCStyle.gridCover_video_height
playCoverBorderWidth: VLCStyle.gridCover_video_border

View File

@ -34,22 +34,22 @@ FocusScope {
/* required */ property var model
readonly property int rowHeight: (_currentView) ? _currentView.rowHeight : 0
readonly property int rowHeight: _currentView?.rowHeight ?? 0
readonly property int contentHeight: (_currentView) ? _currentView.contentHeight : 0
readonly property int contentHeight: _currentView?.contentHeight ?? 0
readonly property int contentLeftMargin: (_currentView) ? _currentView.contentLeftMargin : 0
readonly property int contentRightMargin: (_currentView) ? _currentView.contentRightMargin : 0
readonly property int contentLeftMargin: _currentView?.contentLeftMargin ?? 0
readonly property int contentRightMargin: _currentView?.contentRightMargin ?? 0
property int displayMarginEnd: 0
readonly property int currentIndex: (_currentView) ? _currentView.currentIndex : -1
readonly property int currentIndex: _currentView?.currentIndex ?? -1
property int maximumRows: -1
readonly property int maximumCount: (_currentView) ? _currentView.maximumCount : -1
readonly property int maximumCount: _currentView?.maximumCount ?? -1
readonly property int nbItemPerRow: (_currentView) ? _currentView.nbItemPerRow : 1
readonly property int nbItemPerRow: _currentView?.nbItemPerRow ?? 1
property bool isSearchable: true

View File

@ -64,7 +64,7 @@ FocusScope {
focus: true
Navigation.parentItem: root
Navigation.downItem: (!!urlListDisplay.item) ? urlListDisplay.item : null
Navigation.downItem: urlListDisplay.item ?? null
Widgets.TextFieldExt {
id: searchField

View File

@ -107,7 +107,7 @@ Item {
verticalAlignment: root.verticalAlignment
source: {
if (!!networkModel && !!networkModel.artwork && networkModel.artwork.length > 0)
if (networkModel?.artwork && networkModel.artwork.length > 0)
return VLCAccessImage.uri(networkModel.artwork)
return ""

View File

@ -71,7 +71,7 @@ Repeater {
// Events
onActiveFocusChanged: {
if (activeFocus && (!!item && !item.focus)) {
if (activeFocus && !item?.focus) {
recoverFocus()
}
}
@ -209,7 +209,7 @@ Repeater {
// Private
function _focusIfFocusable(_loader) {
if (!!_loader && !!_loader.item && _loader.item.focus) {
if (_loader?.item?.focus) {
if (item.focusReason !== undefined)
_loader.item.forceActiveFocus(item.focusReason)
else {

View File

@ -176,7 +176,7 @@ FocusScope {
rightMargin: layoutSpacing - spacing
}
active: !!playerControlLayout.model && !!playerControlLayout.model.left && (playerControlLayout.model.left.count > 0) &&
active: !!playerControlLayout.model?.left && (playerControlLayout.model.left.count > 0) &&
!loaderLeftRight.active
focus: active

View File

@ -287,8 +287,8 @@ T.ProgressBar {
Item {
Rectangle {
id: seekpointsRect
readonly property real startPosition: model.startPosition === undefined ? 0.0 : model.startPosition
readonly property real endPosition: model.endPosition === undefined ? 1.0 : model.endPosition
readonly property real startPosition: model.startPosition ?? 0.0
readonly property real endPosition: model.endPosition ?? 1.0
readonly property int _currentChapter: {
if (control.visualPosition < seekpointsRect.startPosition)

View File

@ -91,8 +91,8 @@ FocusScope{
function _layoutLine(c1, c2, offset)
{
let c1Height = c1 !== undefined ? c1.implicitHeight : 0
let c2Height = c2 !== undefined ? c2.implicitHeight : 0
let c1Height = c1?.implicitHeight ?? 0
let c2Height = c2?.implicitHeight ?? 0
if (c2 === csdDecorations) {
//csdDecorations.implicitHeight gets overwritten when the height is set,

View File

@ -163,7 +163,7 @@ T.ItemDelegate {
anchors.fill: parent
fillMode: Image.PreserveAspectFit
source: (model.artwork && model.artwork.toString()) ? VLCAccessImage.uri(model.artwork) : VLCStyle.noArtAlbumCover
source: (model?.artwork.toString()) ? VLCAccessImage.uri(model.artwork) : VLCStyle.noArtAlbumCover
visible: !statusIcon.visible
asynchronous: true
@ -219,7 +219,7 @@ T.ItemDelegate {
Layout.fillHeight: true
Layout.fillWidth: true
text: (model.artist ? model.artist : qsTr("Unknown Artist"))
text: model?.artist ?? qsTr("Unknown Artist")
color: theme.fg.primary
verticalAlignment: Text.AlignBottom
}

View File

@ -34,7 +34,7 @@ T.Pane {
property var model: PlaylistListModel {
playlist: MainPlaylistController.playlist
}
readonly property ListSelectionModel selectionModel: listView ? listView.selectionModel : null
readonly property ListSelectionModel selectionModel: listView?.selectionModel ?? null
property bool useAcrylic: true

View File

@ -25,7 +25,7 @@ import "qrc:///style/"
StateGroup {
id: root
state: target ? target.state : ""
state: target?.state ?? ""
property Item target

View File

@ -28,7 +28,7 @@ QtObject {
// if 'dragItem' is null, user must override property 'dragging' and 'dragPosProvider'
property Item dragItem: null
property bool dragging: !!dragItem && dragItem.visible
property bool dragging: dragItem?.visible
property var dragPosProvider: function () {
return root.view.mapFromItem(root.dragItem.parent,

View File

@ -96,7 +96,7 @@ T.TabButton {
horizontalCenter: parent.horizontalCenter
}
width: control.contentItem ? control.contentItem.implicitWidth : 0
width: control.contentItem?.implicitWidth ?? 0
visible: (width > 0 && control.showCurrentIndicator && control.selected)
}

View File

@ -29,8 +29,8 @@ Item {
property bool anchorInside: true
//private
readonly property int _targetHeight: target ? target.height : 0
readonly property int _targetWidth: target ? target.width : 0
readonly property int _targetHeight: target?.height ?? 0
readonly property int _targetWidth: target?.width ?? 0
readonly property int _edgeVtHeight: target ? (target.height - root.csdSize * 2) : 0
readonly property int _edgeHzWidth: target ? (target.width - root.csdSize * 2) : 0

View File

@ -34,9 +34,9 @@ Rectangle {
return false
}
readonly property int _frameMarginLeft: VLCStyle.palette.csdMetrics ? VLCStyle.palette.csdMetrics.csdFrameMarginLeft : 0
readonly property int _frameMarginRight: VLCStyle.palette.csdMetrics ? VLCStyle.palette.csdMetrics.csdFrameMarginRight : 0
readonly property int _interNavButtonSpacing: VLCStyle.palette.csdMetrics ? VLCStyle.palette.csdMetrics.interNavButtonSpacing : 0
readonly property int _frameMarginLeft: VLCStyle.palette.csdMetrics?.csdFrameMarginLeft ?? 0
readonly property int _frameMarginRight: VLCStyle.palette.csdMetrics?.csdFrameMarginRight ?? 0
readonly property int _interNavButtonSpacing: VLCStyle.palette.csdMetrics?.interNavButtonSpacing ?? 0
implicitWidth: layout.implicitWidth + _frameMarginLeft + _frameMarginRight
implicitHeight: layout.implicitHeight

View File

@ -32,10 +32,10 @@ ScaledImage {
property real viewportWidth: rectWidth + (Math.max(Math.abs(primaryHorizontalOffset) + primaryBlurRadius, Math.abs(secondaryHorizontalOffset) + secondaryBlurRadius)) * 2
property real viewportHeight: rectHeight + (Math.max(Math.abs(primaryVerticalOffset) + primaryBlurRadius, Math.abs(secondaryVerticalOffset) + secondaryBlurRadius)) * 2
property real rectWidth: sourceItem ? sourceItem.width : 0
property real rectHeight: sourceItem ? sourceItem.height : 0
property real xRadius: (sourceItem && sourceItem.radius !== undefined ) ? sourceItem.radius : 0
property real yRadius: (sourceItem && sourceItem.radius !== undefined ) ? sourceItem.radius : 0
property real rectWidth: sourceItem?.width ?? 0
property real rectHeight: sourceItem?.height ?? 0
property real xRadius: sourceItem?.radius ?? 0
property real yRadius: sourceItem?.radius ?? 0
property color primaryColor: Qt.rgba(0, 0, 0, .18)
property real primaryVerticalOffset: 0

View File

@ -30,13 +30,13 @@ ScaledImage {
property real blurRadius: 0
property color color
property real rectWidth: sourceItem ? sourceItem.width : 0
property real rectHeight: sourceItem ? sourceItem.height : 0
property real rectWidth: sourceItem?.width ?? 0
property real rectHeight: sourceItem?.height ?? 0
property real xOffset: 0
property real yOffset: 0
property real xRadius: (sourceItem && sourceItem.radius !== undefined) ? sourceItem.radius : 0
property real yRadius: (sourceItem && sourceItem.radius !== undefined) ? sourceItem.radius : 0
property real xRadius: sourceItem?.radius ?? 0
property real yRadius: sourceItem?.radius ?? 0
sourceSize: Qt.size(viewportWidth, viewportHeight)

View File

@ -696,7 +696,7 @@ FocusScope {
}
function _onModelCountChanged() {
_count = model ? model.rowCount() : 0
_count = model?.rowCount() ?? 0
if (!_isInitialised)
return

View File

@ -38,11 +38,11 @@ FadingEdge {
: delegateItem.width) / 2
: (VLCStyle.margin_large * 2)
readonly property bool transitionsRunning: ((listView.add ? listView.add.running : false) ||
(listView.addDisplaced ? listView.addDisplaced.running : false) ||
(listView.populate ? listView.populate.running : false) ||
(listView.remove ? listView.remove.running : false) ||
(listView.removeDisplaced ? listView.removeDisplaced.running : false))
readonly property bool transitionsRunning: (listView.add?.running ||
listView.addDisplaced?.running ||
listView.populate?.running ||
listView.remove?.running ||
listView.removeDisplaced?.running)
// TODO: Use itemAtIndex(0) Qt >= 5.13
// FIXME: Delegate with variable size

View File

@ -70,7 +70,7 @@ FocusScope {
}
property Component header: null
property Item headerItem: view.headerItem ? view.headerItem.loadedHeader : null
property Item headerItem: view.headerItem?.loadedHeader ?? null
property color headerColor: colorContext.bg.primary
property int headerTopPadding: 0

View File

@ -35,20 +35,14 @@ StackViewExt {
property var pageModel: []
//indicates whether the subview support grid/list mode
readonly property bool hasGridListMode: (currentItem
&& currentItem.hasGridListMode !== undefined
&& currentItem.hasGridListMode)
readonly property bool hasGridListMode: currentItem?.hasGridListMode ?? false
readonly property bool isSearchable: (currentItem
&& currentItem.isSearchable !== undefined
&& currentItem.isSearchable)
readonly property bool isSearchable: currentItem?.isSearchable ?? false
readonly property var sortModel: (currentItem
&& currentItem.sortModel !== undefined) ? currentItem.sortModel : null
readonly property var sortModel: currentItem?.sortModel ?? null
//property is *not* readOnly, a PageLoader may define a localMenuDelegate common for its subviews (music, video)
property Component localMenuDelegate: (currentItem
&& currentItem.localMenuDelegate
property Component localMenuDelegate: (currentItem?.localMenuDelegate
&& (currentItem.localMenuDelegate instanceof Component)) ? currentItem.localMenuDelegate : null

View File

@ -102,13 +102,7 @@ Item {
Layout.preferredHeight: root.titleCover_height
Layout.preferredWidth: root.titleCover_width
source: {
let cover = null
if (!!titleDel.rowModel) {
cover = titleDel.rowModel[root.criteriaCover]
}
return cover || ""
}
source: titleDel.rowModel?.[root.criteriaCover] ?? ""
fallbackImageSource: titleDel.model.placeHolder || VLCStyle.noArtAlbumCover