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 (5)
......@@ -690,6 +690,7 @@ libqt_plugin_la_QML = \
gui/qt/medialibrary/qml/MusicAlbumsGridExpandDelegate.qml \
gui/qt/medialibrary/qml/MusicArtist.qml \
gui/qt/medialibrary/qml/MusicArtistsAlbums.qml \
gui/qt/medialibrary/qml/MusicAllArtists.qml \
gui/qt/medialibrary/qml/MusicArtistsDisplay.qml \
gui/qt/medialibrary/qml/MusicDisplay.qml \
gui/qt/medialibrary/qml/MusicGenres.qml \
......
/*****************************************************************************
* Copyright (C) 2021 VLC authors and VideoLAN
*
* 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.Controls 2.4
import QtQuick 2.11
import QtQml.Models 2.2
import QtQuick.Layouts 1.3
import org.videolan.medialib 0.1
import org.videolan.vlc 0.1
import "qrc:///util/" as Util
import "qrc:///widgets/" as Widgets
import "qrc:///main/" as MainInterface
import "qrc:///style/"
FocusScope {
id: root
readonly property int currentIndex: view.currentItem.currentIndex
property int initialIndex: 0
property alias model: artistModel
onInitialIndexChanged: resetFocus()
function requestArtistAlbumView() {
console.assert(false, "must be reimplemented")
}
function resetFocus() {
if (artistModel.count === 0)
return
var initialIndex = root.initialIndex
if (initialIndex >= artistModel.count)
initialIndex = 0
selectionModel.select(artistModel.index(initialIndex, 0), ItemSelectionModel.ClearAndSelect)
if (view.currentItem) {
view.currentItem.currentIndex = initialIndex
view.currentItem.positionViewAtIndex(initialIndex, ItemView.Contain)
}
}
function _onNavigationCancel() {
if (view.currentItem.currentIndex <= 0) {
root.Navigation.defaultNavigationCancel()
} else {
view.currentItem.currentIndex = 0;
view.currentItem.positionViewAtIndex(0, ItemView.Contain);
}
}
MLArtistModel {
id: artistModel
ml: medialib
onCountChanged: {
if (artistModel.count > 0 && !selectionModel.hasSelection) {
root.resetFocus()
}
}
}
Util.SelectableDelegateModel {
id: selectionModel
model: artistModel
}
ArtistContextMenu {
id: contextMenu
model: artistModel
}
Widgets.DragItem {
id: artistsDragItem
function updateComponents(maxCovers) {
var items = selectionModel.selectedIndexes.slice(0, maxCovers).map(function (x){
return artistModel.getDataAt(x.row)
})
var title = items.map(function (item){ return item.name}).join(", ")
var covers = items.map(function (item) { return {artwork: item.cover || VLCStyle.noArtArtistSmall}})
return {
covers: covers,
title: title,
count: selectionModel.selectedIndexes.length
}
}
function getSelectedInputItem() {
return artistModel.getItemsForIndexes(selectionModel.selectedIndexes);
}
}
Component {
id: gridComponent
MainInterface.MainGridView {
id: artistGrid
anchors.fill: parent
topMargin: VLCStyle.margin_large
delegateModel: selectionModel
model: artistModel
focus: true
cellWidth: VLCStyle.colWidth(1)
cellHeight: VLCStyle.gridItem_music_height
Navigation.parentItem: root
Navigation.cancelAction: root._onNavigationCancel
onSelectAll: selectionModel.selectAll()
onSelectionUpdated: selectionModel.updateSelection( keyModifiers, oldIndex, newIndex )
onActionAtIndex: {
if (selectionModel.selectedIndexes.length > 1) {
medialib.addAndPlay( artistModel.getIdsForIndexes( selectionModel.selectedIndexes ) )
} else {
view.currentItem.currentIndex = index
requestArtistAlbumView()
medialib.addAndPlay( artistModel.getIdForIndex(index) )
}
}
Widgets.GridShadows {
id: shadows
leftPadding: (VLCStyle.colWidth(1) - shadows.coverWidth) / 2 // GridItem's rect is horizontally centered
coverWidth: VLCStyle.artistGridCover_radius
coverHeight: VLCStyle.artistGridCover_radius
coverRadius: VLCStyle.artistGridCover_radius
}
delegate: AudioGridItem {
id: gridItem
title: model.name || i18n.qtr("Unknown artist")
subtitle: model.nb_tracks > 1 ? i18n.qtr("%1 songs").arg(model.nb_tracks) : i18n.qtr("%1 song").arg(model.nb_tracks)
pictureRadius: VLCStyle.artistGridCover_radius
pictureHeight: VLCStyle.artistGridCover_radius
pictureWidth: VLCStyle.artistGridCover_radius
playCoverBorderWidth: VLCStyle.dp(3, VLCStyle.scale)
titleMargin: VLCStyle.margin_xlarge
playIconSize: VLCStyle.play_cover_small
textAlignHCenter: true
width: VLCStyle.colWidth(1)
dragItem: artistsDragItem
unselectedUnderlay: shadows.unselected
selectedUnderlay: shadows.selected
onItemClicked: artistGrid.leftClickOnItem(modifier, index)
onItemDoubleClicked: root.requestArtistAlbumView(model)
onContextMenuButtonClicked: {
artistGrid.rightClickOnItem(index)
contextMenu.popup(selectionModel.selectedIndexes, globalMousePos)
}
}
}
}
Component {
id: tableComponent
MainInterface.MainTableView {
id: artistTable
readonly property int _nbCols: VLCStyle.gridColumnsForWidth(artistTable.availableRowWidth)
anchors.fill: parent
selectionDelegateModel: selectionModel
model: artistModel
focus: true
headerColor: VLCStyle.colors.bg
dragItem: artistsDragItem
rowHeight: VLCStyle.tableCoverRow_height
headerTopPadding: VLCStyle.margin_normal
Navigation.parentItem: root
Navigation.cancelAction: root._onNavigationCancel
onActionForSelection: {
if (selection.length > 1) {
medialib.addAndPlay( artistModel.getIdsForIndexes( selection ) )
} else if ( selection.length === 1) {
requestArtistAlbumView()
medialib.addAndPlay( artistModel.getIdForIndex( selection[0] ) )
}
}
sortModel: [
{ isPrimary: true, criteria: "name", width: VLCStyle.colWidth(Math.max(artistTable._nbCols - 1, 1)), text: i18n.qtr("Name"), headerDelegate: tableColumns.titleHeaderDelegate, colDelegate: tableColumns.titleDelegate },
{ criteria: "nb_tracks", width: VLCStyle.colWidth(1), text: i18n.qtr("Tracks") }
]
onItemDoubleClicked: {
root.requestArtistAlbumView(model)
}
onContextMenuButtonClicked: contextMenu.popup(selectionModel.selectedIndexes, menuParent.mapToGlobal(0,0))
onRightClick: contextMenu.popup(selectionModel.selectedIndexes, globalMousePos)
Widgets.TableColumns {
id: tableColumns
}
}
}
Widgets.StackViewExt {
id: view
anchors.fill: parent
visible: artistModel.count > 0
focus: artistModel.count > 0
initialItem: mainInterface.gridView ? gridComponent : tableComponent
}
Connections {
target: mainInterface
onGridViewChanged: {
if (mainInterface.gridView) {
view.replace(gridComponent)
} else {
view.replace(tableComponent)
}
}
}
EmptyLabel {
anchors.fill: parent
visible: artistModel.count === 0
focus: artistModel.count === 0
text: i18n.qtr("No artists found\nPlease try adding sources, by going to the Network tab")
Navigation.parentItem: root
cover: VLCStyle.noArtArtistCover
}
}
......@@ -97,151 +97,185 @@ FocusScope {
focus: visible
anchors.fill: parent
Rectangle {
width: artistList.width
height: artistList.height
color: VLCStyle.colors.bgAlt
opacity: .8
}
Rectangle {
width: artistList.width
height: artistList.height
color: VLCStyle.colors.bgAlt
opacity: .8
}
Row {
anchors.fill: parent
Row {
anchors.fill: parent
Widgets.KeyNavigableListView {
id: artistList
spacing: 4
model: artistModel
currentIndex: -1
z: 1
height: parent.height
width: Helpers.clamp(root.width / resizeHandle.widthFactor,
VLCStyle.colWidth(1) + VLCStyle.column_margin_width,
root.width * .5)
focus: true
displayMarginEnd: miniPlayer.height // to get blur effect while scrolling in mainview
Navigation.parentItem: root
Navigation.rightItem: albumSubView
Navigation.cancelAction: function() {
if (artistList.currentIndex <= 0)
root.Navigation.defaultNavigationCancel()
else
artistList.currentIndex = 0;
}
Widgets.KeyNavigableListView {
id: artistList
spacing: 4
model: artistModel
currentIndex: -1
z: 1
height: parent.height
width: Helpers.clamp(root.width / resizeHandle.widthFactor,
VLCStyle.colWidth(1) + VLCStyle.column_margin_width,
root.width * .5)
focus: true
displayMarginEnd: miniPlayer.height // to get blur effect while scrolling in mainview
Navigation.parentItem: root
Navigation.rightItem: albumSubView
Navigation.cancelAction: function() {
if (artistList.currentIndex <= 0)
root.Navigation.defaultNavigationCancel()
else
artistList.currentIndex = 0;
}
header: Widgets.SubtitleLabel {
text: i18n.qtr("Artists")
font.pixelSize: VLCStyle.fontSize_large
leftPadding: VLCStyle.margin_normal
bottomPadding: VLCStyle.margin_small
topPadding: VLCStyle.margin_xlarge
}
header: Widgets.SubtitleLabel {
text: i18n.qtr("Artists")
font.pixelSize: VLCStyle.fontSize_large
leftPadding: VLCStyle.margin_normal
bottomPadding: VLCStyle.margin_small
topPadding: VLCStyle.margin_xlarge
}
delegate: Widgets.AnimatedBackground {
id: item
delegate: Rectangle {
id: item
property bool _highlighted: mouseArea.containsMouse || this.activeFocus
property bool _highlighted: mouseArea.containsMouse || this.activeFocus
height: VLCStyle.play_cover_small + (VLCStyle.margin_xsmall * 2)
width: artistList.width
active: false
backgroundColor: _highlighted ? VLCStyle.colors.bgHover : "transparent"
foregroundColor: _highlighted ? VLCStyle.colors.bgHoverText : VLCStyle.colors.text
height: VLCStyle.play_cover_small + (VLCStyle.margin_xsmall * 2)
width: artistList.width
color: _highlighted ? VLCStyle.colors.bgHover : "transparent"
Widgets.CurrentIndicator {
visible: item.ListView.isCurrentItem
}
Widgets.CurrentIndicator {
visible: item.ListView.isCurrentItem
}
RowLayout {
spacing: VLCStyle.margin_xsmall
anchors {
fill: parent
leftMargin: VLCStyle.margin_normal
rightMargin: VLCStyle.margin_normal
topMargin: VLCStyle.margin_xsmall
bottomMargin: VLCStyle.margin_xsmall
}
RowLayout {
spacing: VLCStyle.margin_xsmall
anchors {
fill: parent
leftMargin: VLCStyle.margin_normal
rightMargin: VLCStyle.margin_normal
topMargin: VLCStyle.margin_xsmall
bottomMargin: VLCStyle.margin_xsmall
}
RoundImage {
source: model.cover || VLCStyle.noArtArtistSmall
height: VLCStyle.play_cover_small
width: VLCStyle.play_cover_small
radius: VLCStyle.play_cover_small
RoundImage {
source: model.cover || VLCStyle.noArtArtistSmall
height: VLCStyle.play_cover_small
width: VLCStyle.play_cover_small
radius: VLCStyle.play_cover_small
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
Rectangle {
anchors.fill: parent
color: "transparent"
radius: VLCStyle.play_cover_small
border.width: VLCStyle.dp(1, VLCStyle.scale)
border.color: !_highlighted ? VLCStyle.colors.roundPlayCoverBorder : VLCStyle.colors.accent
}
}
Rectangle {
anchors.fill: parent
color: "transparent"
radius: VLCStyle.play_cover_small
border.width: VLCStyle.dp(1, VLCStyle.scale)
border.color: !_highlighted ? VLCStyle.colors.roundPlayCoverBorder : VLCStyle.colors.accent
Widgets.ListLabel {
text: model.name || i18n.qtr("Unknown artist")
color: item.foregroundColor
Layout.fillWidth: true
Layout.fillHeight: true
}
}
Widgets.ListLabel {
text: model.name || i18n.qtr("Unknown artist")
color: _highlighted ? VLCStyle.colors.bgHoverText : VLCStyle.colors.text
MouseArea {
id: mouseArea
Layout.fillWidth: true
Layout.fillHeight: true
}
}
anchors.fill: parent
hoverEnabled: true
MouseArea {
id: mouseArea
onClicked: {
selectionModel.updateSelection( mouse.modifiers , artistList.currentIndex, index)
artistList.currentIndex = index
artistList.forceActiveFocus()
}
anchors.fill: parent
hoverEnabled: true
onDoubleClicked: {
if (mouse.buttons === Qt.LeftButton)
medialib.addAndPlay( model.id )
else
albumSubView.forceActiveFocus()
}
onClicked: {
selectionModel.updateSelection( mouse.modifiers , artistList.currentIndex, index)
artistList.currentIndex = index
artistList.forceActiveFocus()
}
drag.axis: Drag.XAndYAxis
drag.target: Widgets.DragItem {
function updateComponents(maxCovers) {
return {
covers: [{artwork: model.cover || VLCStyle.noArtArtistSmall}],
title: model.name || i18n.qtr("Unknown artist"),
count: 1
}
}
function getSelectedInputItem() {
return artistModel.getItemsForIndexes([artistModel.index(index, 0)])
}
}
drag.onActiveChanged: {
var dragItem = drag.target
onDoubleClicked: {
if (mouse.buttons === Qt.LeftButton)
medialib.addAndPlay( model.id )
else
albumSubView.forceActiveFocus()
if (!drag.active)
dragItem.Drag.drop()
dragItem.Drag.active = drag.active
}
onPositionChanged: {
if (drag.active) {
var pos = drag.target.parent.mapFromItem(item, mouseX, mouseY)
drag.target.x = pos.x + 12
drag.target.y = pos.y + 12
}
}
}
}
}
Behavior on width {
SmoothedAnimation {
easing.type: Easing.InSine
duration: VLCStyle.ms10
Behavior on width {
SmoothedAnimation {
easing.type: Easing.InSine
duration: VLCStyle.ms10
}
}
}
Widgets.HorizontalResizeHandle {
id: resizeHandle
Widgets.HorizontalResizeHandle {
id: resizeHandle
anchors {
top: parent.top
bottom: parent.bottom
right: parent.right
anchors {
top: parent.top
bottom: parent.bottom
right: parent.right
rightMargin: -(width / 2)
rightMargin: -(width / 2)
}
sourceWidth: root.width
targetWidth: artistList.width
}
sourceWidth: root.width
targetWidth: artistList.width
}
}
MusicArtist {
id: albumSubView
MusicArtist {
id: albumSubView
height: parent.height
width: root.width - artistList.width
focus: true
initialIndex: root.initialAlbumIndex
Navigation.parentItem: root
Navigation.leftItem: artistList
height: parent.height
width: root.width - artistList.width
focus: true
initialIndex: root.initialAlbumIndex
Navigation.parentItem: root
Navigation.leftItem: artistList
}
}
}
}
EmptyLabel {
anchors.fill: parent
......
......@@ -37,7 +37,7 @@ Widgets.PageLoader {
defaultPage: "all"
pageModel: [{
name: "all",
component: artistGridComponent
component: allArtistsComponent
}, {
name: "albums",
component: artistAlbumsComponent
......@@ -59,240 +59,20 @@ Widgets.PageLoader {
}
Component {
id: artistGridComponent
id: allArtistsComponent
FocusScope {
id: artistAllView
MusicAllArtists {
onCurrentIndexChanged: _updateArtistsAllHistory(currentIndex)
readonly property int currentIndex: view.currentItem.currentIndex
property int initialIndex: 0
property alias model: artistModel
onCurrentIndexChanged: {
_updateArtistsAllHistory(currentIndex)
}
onInitialIndexChanged: resetFocus()
function showAlbumView() {
history.push([ "mc", "music", "artists", "albums", { initialIndex: artistAllView.currentIndex } ])
}
function resetFocus() {
if (artistModel.count === 0) {
return
}
var initialIndex = artistAllView.initialIndex
if (initialIndex >= artistModel.count)
initialIndex = 0
selectionModel.select(artistModel.index(initialIndex, 0), ItemSelectionModel.ClearAndSelect)
if (view.currentItem) {
view.currentItem.currentIndex = initialIndex
view.currentItem.positionViewAtIndex(initialIndex, ItemView.Contain)
}
}
function _onNavigationCancel() {
if (view.currentItem.currentIndex <= 0) {
artistAllView.Navigation.defaultNavigationCancel()
} else {
view.currentItem.currentIndex = 0;
view.currentItem.positionViewAtIndex(0, ItemView.Contain);
}
}
MLArtistModel {
id: artistModel
ml: medialib
onCountChanged: {
if (artistModel.count > 0 && !selectionModel.hasSelection) {
artistAllView.resetFocus()
}
}
}
Util.SelectableDelegateModel {
id: selectionModel
model: artistModel
}
Widgets.DragItem {
id: artistsDragItem
function updateComponents(maxCovers) {
var items = selectionModel.selectedIndexes.slice(0, maxCovers).map(function (x){
return artistModel.getDataAt(x.row)
})
var title = items.map(function (item){ return item.name}).join(", ")
var covers = items.map(function (item) { return {artwork: item.cover || VLCStyle.noArtArtistSmall}})
return {
covers: covers,
title: title,
count: selectionModel.selectedIndexes.length
}
}
function getSelectedInputItem() {
return artistModel.getItemsForIndexes(selectionModel.selectedIndexes);
}
}
ArtistContextMenu {
id: contextMenu
model: artistModel
}
Component {
id: gridComponent
MainInterface.MainGridView {
id: artistGrid
anchors.fill: parent
topMargin: VLCStyle.margin_large
delegateModel: selectionModel
model: artistModel
focus: true
cellWidth: VLCStyle.colWidth(1)
cellHeight: VLCStyle.gridItem_music_height
Navigation.parentItem: root
Navigation.cancelAction: artistAllView._onNavigationCancel
onSelectAll: selectionModel.selectAll()
onSelectionUpdated: selectionModel.updateSelection( keyModifiers, oldIndex, newIndex )
onActionAtIndex: {
if (selectionModel.selectedIndexes.length > 1) {
medialib.addAndPlay( artistModel.getIdsForIndexes( selectionModel.selectedIndexes ) )
} else {
view.currentItem.currentIndex = index
showAlbumView()
medialib.addAndPlay( artistModel.getIdForIndex(index) )
}
}
Widgets.GridShadows {
id: shadows
leftPadding: (VLCStyle.colWidth(1) - shadows.coverWidth) / 2 // GridItem's rect is horizontally centered
coverWidth: VLCStyle.artistGridCover_radius
coverHeight: VLCStyle.artistGridCover_radius
coverRadius: VLCStyle.artistGridCover_radius
}
delegate: AudioGridItem {
id: gridItem
title: model.name || i18n.qtr("Unknown artist")
subtitle: model.nb_tracks > 1 ? i18n.qtr("%1 songs").arg(model.nb_tracks) : i18n.qtr("%1 song").arg(model.nb_tracks)
pictureRadius: VLCStyle.artistGridCover_radius
pictureHeight: VLCStyle.artistGridCover_radius
pictureWidth: VLCStyle.artistGridCover_radius
playCoverBorderWidth: VLCStyle.dp(3, VLCStyle.scale)
titleMargin: VLCStyle.margin_xlarge
playIconSize: VLCStyle.play_cover_small
textAlignHCenter: true
width: VLCStyle.colWidth(1)
dragItem: artistsDragItem
unselectedUnderlay: shadows.unselected
selectedUnderlay: shadows.selected
onItemClicked: artistGrid.leftClickOnItem(modifier, index)
onItemDoubleClicked: artistAllView.showAlbumView(model)
onContextMenuButtonClicked: {
artistGrid.rightClickOnItem(index)
contextMenu.popup(selectionModel.selectedIndexes, globalMousePos)
}
}
}
}
Component {
id: tableComponent
MainInterface.MainTableView {
id: artistTable
readonly property int _nbCols: VLCStyle.gridColumnsForWidth(artistTable.availableRowWidth)
anchors.fill: parent
selectionDelegateModel: selectionModel
model: artistModel
focus: true
headerColor: VLCStyle.colors.bg
dragItem: artistsDragItem
rowHeight: VLCStyle.tableCoverRow_height
headerTopPadding: VLCStyle.margin_normal
Navigation.parentItem: root
Navigation.cancelAction: artistAllView._onNavigationCancel
onActionForSelection: {
if (selection.length > 1) {
medialib.addAndPlay( artistModel.getIdsForIndexes( selection ) )
} else {
showAlbumView()
medialib.addAndPlay( artistModel.getIdForIndex(index) )
}
}
sortModel: [
{ isPrimary: true, criteria: "name", width: VLCStyle.colWidth(Math.max(artistTable._nbCols - 1, 1)), text: i18n.qtr("Name"), headerDelegate: tableColumns.titleHeaderDelegate, colDelegate: tableColumns.titleDelegate },
{ criteria: "nb_tracks", width: VLCStyle.colWidth(1), text: i18n.qtr("Tracks") }
]
onItemDoubleClicked: {
artistAllView.showAlbumView(model)
}
onContextMenuButtonClicked: contextMenu.popup(selectionModel.selectedIndexes, menuParent.mapToGlobal(0,0))
onRightClick: contextMenu.popup(selectionModel.selectedIndexes, globalMousePos)
Widgets.TableColumns {
id: tableColumns
}
}
}
Widgets.StackViewExt {
id: view
anchors.fill: parent
visible: artistModel.count > 0
focus: artistModel.count > 0
initialItem: mainInterface.gridView ? gridComponent : tableComponent
}
Connections {
target: mainInterface
onGridViewChanged: {
if (mainInterface.gridView) {
view.replace(gridComponent)
} else {
view.replace(tableComponent)
}
}
}
EmptyLabel {
anchors.fill: parent
visible: artistModel.count === 0
focus: artistModel.count === 0
text: i18n.qtr("No artists found\nPlease try adding sources, by going to the Network tab")
Navigation.parentItem: root
cover: VLCStyle.noArtArtistCover
function requestArtistAlbumView() /* override */ {
history.push([ "mc", "music", "artists", "albums", { initialIndex: currentIndex } ])
}
}
}
Component {
id: artistAlbumsComponent
/* List View */
MusicArtistsAlbums {
Navigation.parentItem: root
......
......@@ -71,6 +71,26 @@ Widgets.KeyNavigableTableView {
onContextMenuButtonClicked: contextMenu.popup(selectionModel.selectedIndexes, menuParent.mapToGlobal(0,0))
onRightClick: contextMenu.popup(selectionModel.selectedIndexes, globalMousePos)
dragItem: Widgets.DragItem {
function updateComponents(maxCovers) {
var items = selectionModel.selectedIndexes.slice(0, maxCovers).map(function (x){
return model.getDataAt(x.row)
})
var title = items.map(function (item){ return item.title}).join(", ")
var covers = items.map(function (item) { return {artwork: item.cover || VLCStyle.noArtCover}})
return {
covers: covers,
title: title,
count: selectionModel.selectedIndexes.length
}
}
function getSelectedInputItem() {
return model.getItemsForIndexes(selectionModel.selectedIndexes);
}
}
Widgets.TableColumns {
id: tableColumns
......
......@@ -26,38 +26,18 @@ import "qrc:///main/" as MainInterface
FocusScope {
id: root
property alias sortModel: tracklistdisplay_id.sortModel
property alias model: tracklistdisplay_id.model
property alias selectionModel: tracklistdisplay_id.selectionDelegateModel
readonly property bool isViewMultiView: false
Widgets.DragItem {
id: trackDragItem
function updateComponents(maxCovers) {
var items = selectionModel.selectedIndexes.slice(0, maxCovers).map(function (x){
return model.getDataAt(x.row)
})
var title = items.map(function (item){ return item.title}).join(", ")
var covers = items.map(function (item) { return {artwork: item.cover || VLCStyle.noArtCover}})
return {
covers: covers,
title: title,
count: selectionModel.selectedIndexes.length
}
}
function getSelectedInputItem() {
return model.getItemsForIndexes(selectionModel.selectedIndexes);
}
}
MusicTrackListDisplay {
id: tracklistdisplay_id
anchors.fill: parent
visible: model.count > 0
focus: model.count > 0
dragItem: trackDragItem
headerTopPadding: VLCStyle.margin_normal
Navigation.parentItem: root
Navigation.cancelAction: function() {
......
......@@ -290,6 +290,7 @@
<file alias="MusicAlbumsGridExpandDelegate.qml">medialibrary/qml/MusicAlbumsGridExpandDelegate.qml</file>
<file alias="MusicArtist.qml">medialibrary/qml/MusicArtist.qml</file>
<file alias="MusicArtistsAlbums.qml">medialibrary/qml/MusicArtistsAlbums.qml</file>
<file alias="MusicAllArtists.qml">medialibrary/qml/MusicAllArtists.qml</file>
<file alias="MusicArtistsDisplay.qml">medialibrary/qml/MusicArtistsDisplay.qml</file>
<file alias="MusicGenresDisplay.qml">medialibrary/qml/MusicGenresDisplay.qml</file>
<file alias="MusicPlaylistsDisplay.qml">medialibrary/qml/MusicPlaylistsDisplay.qml</file>
......
......@@ -828,6 +828,7 @@ modules/gui/qt/medialibrary/qml/MusicAlbums.qml
modules/gui/qt/medialibrary/qml/MusicAlbumsDisplay.qml
modules/gui/qt/medialibrary/qml/MusicAlbumsGridExpandDelegate.qml
modules/gui/qt/medialibrary/qml/MusicArtist.qml
modules/gui/qt/medialibrary/qml/MusicAllArtists.qml
modules/gui/qt/medialibrary/qml/MusicArtistsAlbums.qml
modules/gui/qt/medialibrary/qml/MusicArtistsDisplay.qml
modules/gui/qt/medialibrary/qml/MusicDisplay.qml
......