Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (18)
Showing
with 719 additions and 132 deletions
......@@ -848,15 +848,16 @@ libqt_plugin_la_QML = \
gui/qt/menus/qml/Menubar.qml \
gui/qt/menus/qml/ShortcutExt.qml \
gui/qt/network/qml/AddressbarButton.qml \
gui/qt/network/qml/BrowseDeviceHeader.qml \
gui/qt/network/qml/BrowseDeviceView.qml \
gui/qt/network/qml/BrowseDisplay.qml \
gui/qt/network/qml/BrowseHomeDisplay.qml \
gui/qt/network/qml/BrowseTreeDisplay.qml \
gui/qt/network/qml/DiscoverDisplay.qml \
gui/qt/network/qml/DiscoverUrlDisplay.qml \
gui/qt/network/qml/NetworkAddressbar.qml \
gui/qt/network/qml/NetworkBrowseDisplay.qml \
gui/qt/network/qml/NetworkCustomCover.qml \
gui/qt/network/qml/NetworkDisplay.qml \
gui/qt/network/qml/NetworkGridItem.qml \
gui/qt/network/qml/NetworkHomeDisplay.qml \
gui/qt/network/qml/NetworkHomeDeviceListView.qml \
gui/qt/network/qml/NetworkListItem.qml \
gui/qt/network/qml/NetworkThumbnailItem.qml \
gui/qt/network/qml/ServicesHomeDisplay.qml \
......
......@@ -161,7 +161,7 @@ FocusScope {
displayText: I18n.qtr("Browse"),
icon: VLCIcons.topbar_network,
name: "network",
url: "qrc:///network/NetworkDisplay.qml"
url: "qrc:///network/BrowseDisplay.qml"
}, {
listed: true,
displayText: I18n.qtr("Discover"),
......
/*****************************************************************************
* Copyright (C) 2020 VLC authors and VideoLAN
*
* Authors: Benjamin Arnaud <bunjee@omega.gg>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
......@@ -15,108 +17,73 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
import QtQuick 2.11
import QtQuick.Controls 2.4
import QtQml.Models 2.2
import QtQuick.Layouts 1.11
import org.videolan.vlc 0.1
import "qrc:///widgets/" as Widgets
import "qrc:///util/" as Util
import "qrc:///style/"
import "qrc:///widgets/" as Widgets
FocusScope {
id: root
height: deviceListView.implicitHeight
// Properties
property alias ctx: deviceModel.ctx
property alias sd_source: deviceModel.sd_source
property alias model: deviceModel
property int leftPadding: VLCStyle.margin_xlarge
/* required */ property var view
property int _currentIndex: -1
// Aliases
signal browse(var tree, int reason)
property alias text: label.text
on_CurrentIndexChanged: {
deviceListView.currentIndex = _currentIndex
}
property alias label: label
property alias button: button
function setCurrentItemFocus(reason) {
deviceListView.setCurrentItemFocus(reason);
}
// Signals
function _actionAtIndex(index, model, selectionModel) {
var data = model.getDataAt(index);
signal clicked(int reason)
if (data.type === NetworkMediaModel.TYPE_DIRECTORY
||
data.type === NetworkMediaModel.TYPE_NODE)
browse(data.tree, Qt.TabFocusReason);
else
model.addAndPlay( selectionModel.selectedIndexes);
}
// Settings
onFocusChanged: {
if (activeFocus && root._currentIndex === -1 && deviceModel.count > 0)
root._currentIndex = 0
}
width: view.width
height: label.height
NetworkDeviceModel {
id: deviceModel
Navigation.navigable: button.visible
source_name: "*"
}
// Children
Util.SelectableDelegateModel {
id: deviceSelection
model: deviceModel
}
RowLayout {
id: row
Widgets.KeyNavigableListView {
id: deviceListView
anchors.fill: parent
focus: true
anchors.leftMargin: root.view.contentMargin
anchors.rightMargin: anchors.leftMargin
currentIndex: root._currentIndex
Widgets.SubtitleLabel {
id: label
implicitHeight: VLCStyle.gridItem_network_height + VLCStyle.gridItemSelectedBorder + VLCStyle.margin_large
orientation: ListView.Horizontal
anchors.fill: parent
spacing: VLCStyle.column_margin_width
Layout.fillWidth: true
header: Item {
width: root.leftPadding
topPadding: VLCStyle.margin_large
bottomPadding: VLCStyle.margin_normal
}
model: deviceModel
delegate: NetworkGridItem {
Widgets.TextToolButton {
id: button
Layout.preferredWidth: implicitWidth
focus: true
x: selectedBorderWidth
y: selectedBorderWidth
onItemClicked : {
deviceSelection.updateSelection( modifier , deviceSelection.currentIndex, index)
root._currentIndex = index
forceActiveFocus()
}
onPlayClicked: deviceModel.addAndPlay( index )
onItemDoubleClicked: {
if (model.type === NetworkMediaModel.TYPE_NODE
||
model.type === NetworkMediaModel.TYPE_DIRECTORY)
browse(model.tree, Qt.MouseFocusReason);
else
deviceModel.addAndPlay(index);
}
}
onActionAtIndex: {
_actionAtIndex(index, deviceModel, deviceSelection)
text: I18n.qtr("See All")
font.pixelSize: VLCStyle.fontSize_large
Navigation.parentItem: root
onClicked: root.clicked(focusReason)
}
Navigation.parentItem: root
}
}
/*****************************************************************************
* Copyright (C) 2020 VLC authors and VideoLAN
*
* Authors: Benjamin Arnaud <bunjee@omega.gg>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* ( at your option ) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
import QtQuick 2.11
import org.videolan.vlc 0.1
import "qrc:///style/"
import "qrc:///main/" as MainInterface
import "qrc:///widgets/" as Widgets
import "qrc:///util/" as Util
FocusScope {
id: root
// Properties
/* required */ property var model
property var parentFilter: null
readonly property int rowHeight: (_currentView) ? _currentView.rowHeight : 0
readonly property int contentHeight: (_currentView) ? _currentView.contentHeight : 0
readonly property int contentMargin: (_currentView) ? _currentView.contentMargin : 0
property int displayMarginEnd: 0
readonly property int currentIndex: (_currentView) ? _currentView.currentIndex : -1
property int maximumRows: -1
readonly property int maximumCount: (_currentView) ? _currentView.maximumCount : -1
readonly property int nbItemPerRow: (_currentView) ? _currentView.nbItemPerRow : 1
property Component header: BrowseDeviceHeader {
view: root
text: root.title
button.visible: root.sourceModel.hasMoreItems
Navigation.parentItem: root
Navigation.downAction: function() {
view.setCurrentItemFocus(Qt.TabFocusReason)
}
onClicked: root.seeAll(reason)
}
property string title
// Aliases
property alias modelFilter: modelFilter
property alias sourceModel: modelFilter.sourceModel
// Private
property alias _currentView: view.currentItem
// Signals
signal browse(var tree, int reason)
signal seeAll(int reason)
// Events
onFocusChanged: {
if (activeFocus === false || model.count === 0 || model.currentIndex !== -1)
return
model.currentIndex = 0
}
onParentFilterChanged: {
if (parentFilter === null || sourceModel === null)
return
sourceModel.searchRole = parentFilter.searchRole
sourceModel.searchPattern = parentFilter.searchPattern
sourceModel.sortCriteria = parentFilter.sortCriteria
sourceModel.sortOrder = parentFilter.sortOrder
}
// Connections
Connections {
target: MainCtx
onGridViewChanged: {
if (MainCtx.gridView) view.replace(grid)
else view.replace(list)
}
}
// NOTE: If it exists, we're applying 'parentFilter' properties to fit the sorting options.
Connections {
target: parentFilter
onSearchRoleChanged: sourceModel.searchRole = parentFilter.searchRole
onSearchPatternChanged: sourceModel.searchPattern = parentFilter.searchPattern
onSortCriteriaChanged: sourceModel.sortCriteria = parentFilter.sortCriteria
onSortOrderChanged: sourceModel.sortOrder = parentFilter.sortOrder
}
// Functions
function playAt(index) {
model.addAndPlay(modelFilter.mapIndexToSource(index))
}
function setCurrentItemFocus(reason) {
_currentView.setCurrentItemFocus(reason)
}
function getItemY(index) {
if (_currentView === null)
return 0
return _currentView.getItemY(index)
}
// Events
function onAction(index) {
var indexes = modelSelect.selectedIndexes
if (indexes.length > 1) {
model.addAndPlay(modelFilter.mapIndexesToSource(indexes))
return
}
var data = modelFilter.getDataAt(index)
if (data.type === NetworkMediaModel.TYPE_DIRECTORY
||
data.type === NetworkMediaModel.TYPE_NODE)
browse(data.tree, Qt.TabFocusReason);
else
playAt(index);
}
function onClicked(model, index, modifier) {
modelSelect.updateSelection(modifier, model.currentIndex, index)
model.currentIndex = index
forceActiveFocus()
}
function onDoubleClicked(model, index) {
if (model.type === NetworkMediaModel.TYPE_NODE
||
model.type === NetworkMediaModel.TYPE_DIRECTORY)
browse(model.tree, Qt.MouseFocusReason);
else
playAt(index);
}
// Children
Util.SelectableDelegateModel {
id: modelSelect
model: modelFilter
}
SortFilterProxyModel {
id: modelFilter
sourceModel: root.model
searchRole: "name"
// TODO: Handle the searchPattern on a partial list.
searchPattern: (sourceModel && maximumRows === -1) ? sourceModel.searchPattern : ""
}
Widgets.StackViewExt {
id: view
anchors.fill: parent
focus: (model.count !== 0)
initialItem: (MainCtx.gridView) ? grid : list
}
Component {
id: grid
Widgets.ExpandGridView {
id: gridView
readonly property int maximumCount: (root.maximumRows === -1)
? -1
: root.maximumRows * nbItemPerRow
cellWidth: VLCStyle.gridItem_network_width
cellHeight: VLCStyle.gridItem_network_height
displayMarginEnd: root.displayMarginEnd
model: modelFilter
headerDelegate: root.header
selectionDelegateModel: modelSelect
Navigation.parentItem: root
Navigation.upItem: headerItem
onActionAtIndex: root.onAction(index)
delegate: NetworkGridItem {
onItemClicked: root.onClicked(model, index, modifier)
onItemDoubleClicked: root.onDoubleClicked(model, index)
onPlayClicked: root.playAt(index)
}
}
}
Component {
id: list
Widgets.KeyNavigableTableView {
id: listView
readonly property real contentMargin: VLCStyle.margin_normal
readonly property int maximumCount: root.maximumRows
readonly property int nbItemPerRow: 1
readonly property int _nbCols: VLCStyle.gridColumnsForWidth(listView.availableRowWidth)
readonly property int _nameColSpan: Math.max((_nbCols - 1) / 2, 1)
rowHeight: VLCStyle.tableCoverRow_height
displayMarginEnd: root.displayMarginEnd
model: modelFilter
sortModel: [{
criteria: "artwork",
width: VLCStyle.colWidth(1),
headerDelegate: artworkHeader,
colDelegate : artworkColumn
}, {
isPrimary: true,
criteria: "name",
width: VLCStyle.colWidth(listView._nameColSpan),
text: I18n.qtr("Name")
}, {
criteria: "mrl",
width: VLCStyle.colWidth(Math.max(listView._nbCols - listView._nameColSpan - 1), 1),
text: I18n.qtr("Url"),
colDelegate: mrlColumn
}]
header: root.header
headerColor: VLCStyle.colors.bg
selectionDelegateModel: modelSelect
Navigation.parentItem: root
Navigation.upItem: headerItem
onActionForSelection: root.onAction(selection[0].row)
onItemDoubleClicked: root.onDoubleClicked(model, index)
Component {
id: artworkHeader
Item {
Widgets.IconLabel {
width: VLCStyle.listAlbumCover_width
height: VLCStyle.listAlbumCover_height
horizontalAlignment: Text.AlignHCenter
color: VLCStyle.colors.caption
}
}
}
Component {
id: artworkColumn
NetworkThumbnailItem { onPlayClicked: root.playAt(index) }
}
Component {
id: mrlColumn
Widgets.ScrollingText {
id: itemText
property var rowModel: parent.rowModel
property var colModel: parent.colModel
property color foregroundColor: parent.foregroundColor
width: parent.width
clip: scrolling
label: itemLabel
forceScroll: parent.currentlyFocused
Widgets.ListLabel {
id: itemLabel
anchors.verticalCenter: parent.verticalCenter
text: {
if (itemText.rowModel === null)
return ""
var text = itemText.rowModel[itemText.colModel.criteria]
if (text.toString() === "vlc://nop")
return ""
else
return text
}
color: itemText.foregroundColor
}
}
}
}
}
}
......@@ -40,7 +40,10 @@ Widgets.PageLoader {
pageModel: [{
name: "home",
url: "qrc:///network/NetworkHomeDisplay.qml"
url: "qrc:///network/BrowseHomeDisplay.qml"
}, {
name: "device",
component: browseDevice,
}, {
name: "browse",
component: browseComponent,
......@@ -61,29 +64,66 @@ Widgets.PageLoader {
||
currentItem.isViewMultiView);
if (view.name === "browse")
localMenuDelegate = componentBar
else
if (view.name === "home")
localMenuDelegate = null
else
localMenuDelegate = componentBar
}
// Connections
Connections {
target: (stackView.currentItem instanceof BrowseHomeDisplay) ? stackView.currentItem
: null
onSeeAll: {
History.push(["mc", "network", "device", { title: title, sd_source: sd_source }])
stackView.currentItem.setCurrentItemFocus(reason)
}
}
Connections {
target: stackView.currentItem
onBrowse: {
History.push(["mc", "network", "browse", { tree: tree }]);
stackView.currentItem.setCurrentItemFocus(reason);
History.push(["mc", "network", "browse", { tree: tree }])
stackView.currentItem.setCurrentItemFocus(reason)
}
}
// Children
Component {
id: browseDevice
BrowseDeviceView {
id: viewDevice
property var sd_source
property var sortModel: [
{ text: I18n.qtr("Alphabetic"), criteria: "name" },
{ text: I18n.qtr("Url"), criteria: "mrl" }
]
displayMarginEnd: g_mainDisplay.displayMargin
model: modelFilter
sourceModel: NetworkDeviceModel {
ctx: MainCtx
sd_source: viewDevice.sd_source
source_name: "*"
}
}
}
Component {
id: browseComponent
NetworkBrowseDisplay {
BrowseTreeDisplay {
providerModel: NetworkMediaModel {
ctx: MainCtx
}
......@@ -91,6 +131,12 @@ Widgets.PageLoader {
contextMenu: NetworkMediaContextMenu {
model: providerModel
}
Navigation.cancelAction: function() {
History.previous()
stackView.currentItem.setCurrentItemFocus(Qt.BacktabFocusReason)
}
}
}
......
......@@ -29,10 +29,20 @@ import "qrc:///util/" as Util
import "qrc:///style/"
FocusScope {
id: topFocusScope
id: root
property int maximumRows: (MainCtx.gridView) ? 2 : 5
property var sortModel: [
{ text: I18n.qtr("Alphabetic"), criteria: "name"},
{ text: I18n.qtr("Url"), criteria: "mrl" }
]
property alias model: deviceSection.model
focus: true
readonly property bool isViewMultiView: false
signal seeAll(var title, var sd_source, int reason)
signal browse(var tree, int reason)
......@@ -43,7 +53,27 @@ FocusScope {
deviceSection.setCurrentItemFocus(reason);
}
function _centerFlickableOnItem(minY, maxY) {
function _centerFlickableOnItem(item) {
if (item.activeFocus === false)
return
var minY
var maxY
var index = item.currentIndex
// NOTE: We want to include the header when we're on the first row.
if ((MainCtx.gridView && index < item.nbItemPerRow) || index < 1) {
minY = item.y
maxY = minY + item.getItemY(index) + item.rowHeight
} else {
minY = item.y + item.getItemY(index)
maxY = minY + item.rowHeight
}
// TODO: We could implement a scrolling animation like in ExpandGridView.
if (maxY > flickable.contentItem.contentY + flickable.height) {
flickable.contentItem.contentY = maxY - flickable.height
} else if (minY < flickable.contentItem.contentY) {
......@@ -56,7 +86,7 @@ FocusScope {
anchors.centerIn: parent
visible: (deviceSection.model.count === 0 && lanSection.model.count === 0 )
font.pixelSize: VLCStyle.fontHeight_xxlarge
color: topFocusScope.activeFocus ? VLCStyle.colors.accent : VLCStyle.colors.text
color: root.activeFocus ? VLCStyle.colors.accent : VLCStyle.colors.text
text: I18n.qtr("No network shares found")
}
......@@ -69,79 +99,86 @@ FocusScope {
width: parent.width
height: implicitHeight
topPadding: VLCStyle.margin_large
spacing: VLCStyle.margin_small
Widgets.SubtitleLabel {
id: deviceLabel
text: I18n.qtr("My Machine")
width: flickable.width
visible: deviceSection.model.count !== 0
leftPadding: VLCStyle.margin_xlarge
}
NetworkHomeDeviceListView {
BrowseDeviceView {
id: deviceSection
ctx: MainCtx
sd_source: NetworkDeviceModel.CAT_DEVICES
width: flickable.width
visible: deviceSection.model.count !== 0
onVisibleChanged: topFocusScope.resetFocus()
height: contentHeight
onBrowse: topFocusScope.browse(tree, reason)
maximumRows: root.maximumRows
Navigation.parentItem: topFocusScope
visible: (model.count !== 0)
Navigation.downAction: function() {
if (lanSection.visible == false)
return;
model: NetworkDeviceModel {
ctx: MainCtx
lanSection.setCurrentItemFocus(Qt.TabFocusReason);
sd_source: NetworkDeviceModel.CAT_DEVICES
source_name: "*"
maximumCount: deviceSection.maximumCount
}
onActiveFocusChanged: {
if (activeFocus)
_centerFlickableOnItem(deviceLabel.y, deviceSection.y + deviceSection.height)
title: I18n.qtr("My Machine")
Navigation.parentItem: root
Navigation.downAction: function() {
if (lanSection.visible)
lanSection.setCurrentItemFocus(Qt.TabFocusReason)
else
root.Navigation.defaultNavigationDown()
}
}
Widgets.SubtitleLabel {
id: lanLabel
text: I18n.qtr("My LAN")
width: flickable.width
visible: lanSection.model.count !== 0
leftPadding: VLCStyle.margin_xlarge
topPadding: deviceLabel.visible ? VLCStyle.margin_small : 0
onBrowse: root.browse(tree, reason)
onSeeAll: root.seeAll(title, model.sd_source, reason)
onActiveFocusChanged: _centerFlickableOnItem(deviceSection)
onCurrentIndexChanged: _centerFlickableOnItem(deviceSection)
}
NetworkHomeDeviceListView {
BrowseDeviceView {
id: lanSection
ctx: MainCtx
sd_source: NetworkDeviceModel.CAT_LAN
width: flickable.width
visible: lanSection.model.count !== 0
onVisibleChanged: topFocusScope.resetFocus()
height: contentHeight
onBrowse: topFocusScope.browse(tree, reason)
maximumRows: root.maximumRows
Navigation.parentItem: topFocusScope
visible: (model.count !== 0)
Navigation.upAction: function() {
if (deviceSection.visible == false)
return;
model: NetworkDeviceModel {
ctx: MainCtx
sd_source: NetworkDeviceModel.CAT_LAN
source_name: "*"
deviceSection.setCurrentItemFocus(Qt.TabFocusReason);
maximumCount: lanSection.maximumCount
}
onActiveFocusChanged: {
if (activeFocus)
_centerFlickableOnItem(lanLabel.y, lanSection.y + lanSection.height)
title: I18n.qtr("My LAN")
parentFilter: deviceSection.modelFilter
Navigation.parentItem: root
Navigation.upAction: function() {
if (deviceSection.visible)
deviceSection.setCurrentItemFocus(Qt.TabFocusReason)
else
root.Navigation.defaultNavigationUp()
}
onBrowse: root.browse(tree, reason)
onSeeAll: root.seeAll(title, model.sd_source, reason)
onActiveFocusChanged: _centerFlickableOnItem(lanSection)
onCurrentIndexChanged: _centerFlickableOnItem(lanSection)
}
}
}
function resetFocus() {
......
......@@ -51,6 +51,10 @@ FocusScope {
signal browse(var tree, int reason)
Navigation.cancelAction: function() {
History.previous()
}
onTreeChanged: providerModel.tree = tree
function playSelected() {
......@@ -198,9 +202,6 @@ FocusScope {
delegate: NetworkGridItem {
id: delegateGrid
property var model: ({})
property int index: -1
subtitle: ""
height: VLCStyle.gridCover_network_height + VLCStyle.margin_xsmall + VLCStyle.fontHeight_normal
dragItem: networkDragItem
......@@ -225,9 +226,6 @@ FocusScope {
Navigation.parentItem: root
Navigation.upItem: gridView.headerItem
Navigation.cancelAction: function() {
History.previous()
}
}
}
......@@ -262,9 +260,6 @@ FocusScope {
headerColor: VLCStyle.colors.bg
Navigation.parentItem: root
Navigation.upItem: tableView.headerItem
Navigation.cancelAction: function() {
History.previous()
}
rowHeight: VLCStyle.tableCoverRow_height
......
......@@ -32,6 +32,9 @@ Widgets.ScaledImage {
sourceSize: Qt.size(width, height)
source: {
if (networkModel === null)
return ""
if (!!networkModel.artwork && networkModel.artwork.length > 0)
return networkModel.artwork
......
......@@ -28,6 +28,9 @@ import "qrc:///style/"
Widgets.GridItem {
id: root
property var model: ({})
property int index: -1
width: VLCStyle.gridItem_network_width
height: VLCStyle.gridItem_network_height
......
......@@ -69,7 +69,7 @@ Widgets.PageLoader {
Component {
id: sourceRootComponent
NetworkBrowseDisplay {
BrowseTreeDisplay {
property alias source_name: deviceModel.source_name
property Component addressBar: NetworkAddressbar {
......@@ -111,7 +111,7 @@ Widgets.PageLoader {
Component {
id: sourceBrowseComponent
NetworkBrowseDisplay {
BrowseTreeDisplay {
property string root_name
property string source_name
......
......@@ -71,7 +71,6 @@ private slots:
private:
QByteArray m_searchRole;
QString m_sortCriteria;
Qt::SortOrder m_sortOrder;
};
#endif // SORT_FILTER_PROXY_MODEL
......@@ -219,13 +219,14 @@
</qresource>
<qresource prefix="/network">
<file alias="AddressbarButton.qml">network/qml/AddressbarButton.qml</file>
<file alias="BrowseDeviceHeader.qml">network/qml/BrowseDeviceHeader.qml</file>
<file alias="BrowseDeviceView.qml">network/qml/BrowseDeviceView.qml</file>
<file alias="BrowseDisplay.qml">network/qml/BrowseDisplay.qml</file>
<file alias="BrowseHomeDisplay.qml">network/qml/BrowseHomeDisplay.qml</file>
<file alias="BrowseTreeDisplay.qml">network/qml/BrowseTreeDisplay.qml</file>
<file alias="DiscoverDisplay.qml">network/qml/DiscoverDisplay.qml</file>
<file alias="DiscoverUrlDisplay.qml">network/qml/DiscoverUrlDisplay.qml</file>
<file alias="NetworkCustomCover.qml">network/qml/NetworkCustomCover.qml</file>
<file alias="NetworkDisplay.qml">network/qml/NetworkDisplay.qml</file>
<file alias="NetworkHomeDeviceListView.qml">network/qml/NetworkHomeDeviceListView.qml</file>
<file alias="NetworkHomeDisplay.qml">network/qml/NetworkHomeDisplay.qml</file>
<file alias="NetworkBrowseDisplay.qml">network/qml/NetworkBrowseDisplay.qml</file>
<file alias="NetworkGridItem.qml">network/qml/NetworkGridItem.qml</file>
<file alias="NetworkListItem.qml">network/qml/NetworkListItem.qml</file>
<file alias="NetworkThumbnailItem.qml">network/qml/NetworkThumbnailItem.qml</file>
......
......@@ -42,25 +42,26 @@ FocusScope {
property int rightMargin: VLCStyle.margin_normal
// NOTE: The grid margin for the item(s) horizontal positioning.
readonly property int contentMargin: (_contentWidth - _nbItemPerRow * _effectiveCellWidth
readonly property int contentMargin: (_contentWidth - nbItemPerRow * _effectiveCellWidth
+
horizontalSpacing) / 2
readonly property int rowHeight: cellHeight + verticalSpacing
property int rowX: 0
property int horizontalSpacing: VLCStyle.column_margin_width
property int verticalSpacing: VLCStyle.column_margin_width
property int displayMarginEnd: 0
readonly property int nbItemPerRow: Math.max(Math.floor((_contentWidth + horizontalSpacing)
/
_effectiveCellWidth), 1)
readonly property int _effectiveCellWidth: cellWidth + horizontalSpacing
readonly property int _effectiveCellHeight: cellHeight + verticalSpacing
readonly property int _contentWidth: width - rightMargin - leftMargin
readonly property int _nbItemPerRow: Math.max(Math.floor((_contentWidth + horizontalSpacing)
/
_effectiveCellWidth), 1)
property Util.SelectableDelegateModel selectionDelegateModel
property QtAbstractItemModel model
......@@ -150,26 +151,29 @@ FocusScope {
Keys.onPressed: {
var newIndex = -1
if (KeyHelper.matchRight(event)) {
if ((currentIndex + 1) % _nbItemPerRow !== 0) {//are we not at the end of line
if ((currentIndex + 1) % nbItemPerRow !== 0) {//are we not at the end of line
newIndex = Math.min(_count - 1, currentIndex + 1)
}
} else if (KeyHelper.matchLeft(event)) {
if (currentIndex % _nbItemPerRow !== 0) {//are we not at the beginning of line
if (currentIndex % nbItemPerRow !== 0) {//are we not at the beginning of line
newIndex = Math.max(0, currentIndex - 1)
}
} else if (KeyHelper.matchDown(event)) {
var lastIndex = _count - 1
// we are not on the last line
if (Math.floor(currentIndex / _nbItemPerRow) !== Math.floor(_count / _nbItemPerRow)) {
newIndex = Math.min(_count - 1, currentIndex + _nbItemPerRow)
if (Math.floor(currentIndex / nbItemPerRow)
!==
Math.floor(lastIndex / nbItemPerRow)) {
newIndex = Math.min(lastIndex, currentIndex + nbItemPerRow)
}
} else if (KeyHelper.matchPageDown(event)) {
newIndex = Math.min(_count - 1, currentIndex + _nbItemPerRow * 5)
newIndex = Math.min(_count - 1, currentIndex + nbItemPerRow * 5)
} else if (KeyHelper.matchUp(event)) {
if (Math.floor(currentIndex / _nbItemPerRow) !== 0) { //we are not on the first line
newIndex = Math.max(0, currentIndex - _nbItemPerRow)
if (Math.floor(currentIndex / nbItemPerRow) !== 0) { //we are not on the first line
newIndex = Math.max(0, currentIndex - nbItemPerRow)
}
} else if (KeyHelper.matchPageUp(event)) {
newIndex = Math.max(0, currentIndex - _nbItemPerRow * 5)
newIndex = Math.max(0, currentIndex - nbItemPerRow * 5)
} else if (KeyHelper.matchOk(event) || event.matches(StandardKey.SelectAll) ) {
//these events are matched on release
event.accepted = true
......@@ -324,9 +328,13 @@ FocusScope {
flickable.retract()
}
function getItemY(index) {
return Math.floor(index / nbItemPerRow) * rowHeight + headerHeight + topMargin
}
function getItemRowCol(id) {
var rowId = Math.floor(id / _nbItemPerRow)
var colId = id % _nbItemPerRow
var rowId = Math.floor(id / nbItemPerRow)
var colId = id % nbItemPerRow
return [colId, rowId]
}
......@@ -335,7 +343,7 @@ FocusScope {
var x = rowCol[0] * _effectiveCellWidth + contentMargin + leftMargin;
var y = rowCol[1] * _effectiveCellHeight + headerHeight + topMargin;
var y = rowCol[1] * rowHeight + headerHeight + topMargin;
// NOTE: Position needs to be integer based if we want to avoid visual artifacts like
// wrong alignments or blurry texture rendering.
......@@ -351,7 +359,7 @@ FocusScope {
return
var itemTopY = getItemPos(index)[1]
var itemBottomY = itemTopY + _effectiveCellHeight
var itemBottomY = itemTopY + rowHeight
var viewTopY = flickable.contentY
var viewBottomY = viewTopY + flickable.height
......@@ -431,11 +439,11 @@ FocusScope {
}
var onlyGridContentY = contentYWithoutExpand - headerHeight - topMargin
var rowId = Math.floor(onlyGridContentY / _effectiveCellHeight)
var firstId = Math.max(rowId * _nbItemPerRow, 0)
var rowId = Math.floor(onlyGridContentY / rowHeight)
var firstId = Math.max(rowId * nbItemPerRow, 0)
rowId = Math.ceil((onlyGridContentY + heightWithoutExpand) / _effectiveCellHeight)
var lastId = Math.min(rowId * _nbItemPerRow, _count)
rowId = Math.ceil((onlyGridContentY + heightWithoutExpand) / rowHeight)
var lastId = Math.min(rowId * nbItemPerRow, _count)
return [firstId, lastId]
}
......@@ -590,7 +598,7 @@ FocusScope {
}
}
}
Util.FlickableScrollHandler { }
Loader {
......@@ -600,7 +608,7 @@ FocusScope {
y: root.topMargin
//load the header early (when the first row is visible)
visible: flickable.contentY < (root.headerHeight + root._effectiveCellHeight + root.topMargin)
visible: flickable.contentY < (root.headerHeight + root.rowHeight + root.topMargin)
focus: (status === Loader.Ready) ? item.focus : false
}
......@@ -610,7 +618,7 @@ FocusScope {
focus: (status === Loader.Ready) ? item.focus : false
y: root.topMargin + root.headerHeight + (root._effectiveCellHeight * (Math.ceil(model.count / root._nbItemPerRow))) +
y: root.topMargin + root.headerHeight + (root.rowHeight * (Math.ceil(model.count / root.nbItemPerRow))) +
root._expandItemVerticalSpace
}
......@@ -669,7 +677,7 @@ FocusScope {
if (root.expandIndex !== -1) {
var rowCol = root.getItemRowCol(root.expandIndex)
var rowId = rowCol[1] + 1
ret = rowId * root._nbItemPerRow
ret = rowId * root.nbItemPerRow
} else {
ret = root._count
}
......@@ -758,10 +766,10 @@ FocusScope {
_setupIndexes(forceRelayout, [topGridEndId, lastId], root._expandItemVerticalSpace)
// update contentWidth and contentHeight
var gridContentWidth = root._effectiveCellWidth * root._nbItemPerRow - root.horizontalSpacing
var gridContentWidth = root._effectiveCellWidth * root.nbItemPerRow - root.horizontalSpacing
contentWidth = root.leftMargin + gridContentWidth + root.rightMargin
var gridContentHeight = root.getItemPos(root._count - 1)[1] + root._effectiveCellHeight + root._expandItemVerticalSpace
var gridContentHeight = root.getItemPos(root._count - 1)[1] + root.rowHeight + root._expandItemVerticalSpace
contentHeight = gridContentHeight
+ (footerItemLoader.item ? footerItemLoader.item.height : 0)
+ root.bottomMargin // topMargin and headerHeight is included in root.getItemPos
......@@ -804,7 +812,7 @@ FocusScope {
// Sliding animation
var currentItemYPos = root.getItemPos(root.expandIndex)[1]
currentItemYPos += root._effectiveCellHeight / 2
currentItemYPos += root.rowHeight / 2
animateFlickableContentY(currentItemYPos)
}
......
......@@ -35,7 +35,7 @@ FadingEdgeListView {
readonly property int scrollBarWidth: scroll_id.visible ? scroll_id.width : 0
property bool keyNavigationWraps : false
property bool keyNavigationWraps: false
// Private
......@@ -69,13 +69,38 @@ FadingEdgeListView {
property int _currentFocusReason: Qt.OtherFocusReason
// Settings
focus: true
//key navigation is reimplemented for item selection
keyNavigationEnabled: false
ScrollBar.vertical: ScrollBar { id: scroll_id; visible: root.contentHeight > root.height }
ScrollBar.horizontal: ScrollBar { visible: root.contentWidth > root.width }
highlightMoveDuration: 300 //ms
highlightMoveVelocity: 1000 //px/s
section.property: ""
section.criteria: ViewSection.FullString
section.delegate: sectionHeading
disableBeginningFade: (dragAutoScrollHandler.scrollingDirection
===
Util.ViewDragAutoScrollHandler.Backward)
disableEndFade: (dragAutoScrollHandler.scrollingDirection
===
Util.ViewDragAutoScrollHandler.Forward)
Accessible.role: Accessible.List
// Events
// NOTE: We always want a valid 'currentIndex' by default.
onCountChanged: if (count && currentIndex === -1) currentIndex = 0
onCurrentItemChanged: {
if (_currentFocusReason === Qt.OtherFocusReason)
return;
......@@ -116,27 +141,6 @@ FadingEdgeListView {
root.contentX -= Math.min(root.width,root.contentX - root.originX)
}
focus: true
//key navigation is reimplemented for item selection
keyNavigationEnabled: false
ScrollBar.vertical: ScrollBar { id: scroll_id; visible: root.contentHeight > root.height }
ScrollBar.horizontal: ScrollBar { visible: root.contentWidth > root.width }
highlightMoveDuration: 300 //ms
highlightMoveVelocity: 1000 //px/s
section.property: ""
section.criteria: ViewSection.FullString
section.delegate: sectionHeading
// NOTE: We always want a valid 'currentIndex' by default.
onCountChanged: if (count && currentIndex === -1) currentIndex = 0
disableBeginningFade: (dragAutoScrollHandler.scrollingDirection === Util.ViewDragAutoScrollHandler.Backward)
disableEndFade: (dragAutoScrollHandler.scrollingDirection === Util.ViewDragAutoScrollHandler.Forward)
Keys.onPressed: {
var newIndex = -1
......
......@@ -146,6 +146,17 @@ FocusScope {
view.positionViewAtBeginning()
}
function getItemY(index) {
var size = index * rowHeight + topMargin
if (tableHeaderItem)
size += tableHeaderItem.height
return size
}
// Private
function _qtAvoidSectionUpdate() {
// Qt SEG. FAULT WORKAROUND
......
......@@ -18,6 +18,8 @@
import QtQuick 2.11
import QtQuick.Templates 2.4 as T
import org.videolan.vlc 0.1
import "qrc:///style/"
T.ToolButton {
......@@ -30,6 +32,12 @@ T.ToolButton {
padding: VLCStyle.margin_xxsmall
// Keys
Keys.priority: Keys.AfterItem
Keys.onPressed: Navigation.defaultKeyAction(event)
contentItem: T.Label {
text: control.text
font: control.font
......
......@@ -830,11 +830,14 @@ modules/gui/qt/menus/menus.hpp
modules/gui/qt/menus/qml/Menubar.qml
modules/gui/qt/menus/qml_menu_wrapper.cpp
modules/gui/qt/menus/qml_menu_wrapper.hpp
modules/gui/qt/network/qml/BrowseDeviceHeader.qml
modules/gui/qt/network/qml/BrowseDeviceView.qml
modules/gui/qt/network/qml/BrowseDisplay.qml
modules/gui/qt/network/qml/BrowseHomeDisplay.qml
modules/gui/qt/network/qml/BrowseTreeDisplay.qml
modules/gui/qt/network/qml/DiscoverDisplay.qml
modules/gui/qt/network/qml/DiscoverUrlDisplay.qml
modules/gui/qt/network/qml/NetworkBrowseDisplay.qml
modules/gui/qt/network/qml/NetworkGridItem.qml
modules/gui/qt/network/qml/NetworkHomeDisplay.qml
modules/gui/qt/network/qml/NetworkListItem.qml
modules/gui/qt/network/qml/ServicesHomeDisplay.qml
modules/gui/qt/player/control_list_filter.cpp
......