Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3570,6 +3570,8 @@ if(QML)
src/qml/qmlmixxxcontrollerscreen.cpp
src/qml/qmlplayermanagerproxy.cpp
src/qml/qmlplayerproxy.cpp
src/qml/qmlplaylistproxy.cpp
src/qml/qmlcrateproxy.cpp
src/qml/qmlsidebarmodelproxy.cpp
src/qml/qmllibrarytracklistcolumn.cpp
src/qml/qmltrackproxy.cpp
Expand Down
64 changes: 63 additions & 1 deletion res/qml/Library/Browser.qml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,12 @@ Rectangle {

delegate: FocusScope {
required property string label
required property string itemName
required property var icon
required property var capabilities

readonly property bool canCreate: capabilities & Mixxx.LibrarySource.Capability.Create
readonly property bool canAddTrack: capabilities & Mixxx.LibrarySource.Capability.AddTrack

readonly property real indentation: 40
readonly property real padding: 5
Expand Down Expand Up @@ -151,7 +156,7 @@ Rectangle {
color: Theme.textColor
}
Item {
visible: rowMouseArea.containsMouse && isTreeNode && hasChildren
visible: (rowMouseArea.containsMouse || popup.opened) && isTreeNode && canCreate
id: newItem
height: parent.height
anchors {
Expand Down Expand Up @@ -211,6 +216,63 @@ Rectangle {
PathLine { y: 6; x: 8 }
}
}
MouseArea {
anchors.fill: parent
onPressed: {
popup.x = parent.width
popup.y = parent.height / 2 - popup.height / 2
popup.open()
popup.forceActiveFocus(Qt.PopupFocusReason)
}
cursorShape: Qt.PointingHandCursor
}
Skin.ActionPopup {
id: popup
padding: 6
focus: true
Text {
Layout.alignment: Qt.AlignHCenter
text: qsTr("New %1").arg(itemName)
font.weight: Font.Bold
font.pixelSize: 14
color: Theme.white
}
Skin.InputField {
Layout.fillWidth: true
Layout.preferredHeight: 36
Layout.margins: 4
focus: true
id: newItemName
input.onAccepted: {
if (input.text) {
create(input.text)
}
popup.close()
}
}
RowLayout {
Layout.fillWidth: true
Skin.ActionButton {
Layout.fillWidth: true
label.text: qsTr("Cancel")
onPressed: {
popup.close()
}
}
Skin.ActionButton {
Layout.fillWidth: true
opacity: newItemName.text || newItemName.input.text ? 1 : 0.4
category: Skin.ActionButton.Action
label.text: qsTr("Create")
onPressed: {
if (newItemName.text) {
create(input.text)
popup.close()
}
}
}
}
}
}
}
}
Expand Down
160 changes: 160 additions & 0 deletions res/qml/Library/SourceTree.qml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ Mixxx.LibrarySourceTree {
id: dragArea
anchors.fill: parent
capabilities: cell.caps
playlists: playlistSource
crates: crateSource

onPressed: {
if (pressedButtons == Qt.LeftButton) {
Expand Down Expand Up @@ -191,4 +193,162 @@ Mixxx.LibrarySourceTree {
label: qsTr("All...")
columns: root.defaultColumns
}
Mixxx.LibraryPlaylistSource {
id: playlistSource
label: qsTr("Playlist")
itemName: qsTr("playlist")
capabilities: Mixxx.LibrarySource.Capability.Create | Mixxx.LibrarySource.Capability.AddTrack
onRequestCreate: (name) => {
// TODO create a new item with given name
print("onRequestCreate", name)
}
onRequestAddTrack: (item, track) => {
// TODO add track to current item
print("onRequestAddTrack", item, track)
}
icon: "../images/library_playlist.png"

columns: root.defaultColumns
}
Mixxx.LibraryCrateSource {
id: crateSource
label: qsTr("Crate")
itemName: qsTr("crate")
capabilities: Mixxx.LibrarySource.Capability.Create | Mixxx.LibrarySource.Capability.AddTrack
onRequestCreate: (name) => {
// TODO create a new item with given name
print("onRequestCreate", name)
}
onRequestAddTrack: (item, track) => {
// TODO add track to current item
print("onRequestAddTrack", item, track)
}
icon: "../images/library_crates.png"

columns: root.defaultColumns
}
Mixxx.LibraryExplorerSource {
label: qsTr("Explorer")
icon: "../images/library_explorer.png"
columns: [
Mixxx.TrackListColumn {

label: qsTr("Preview")
delegate: Rectangle {
color: decoration
implicitHeight: 30

Image {
anchors.fill: parent
fillMode: Image.PreserveAspectCrop
source: cover_art
clip: true
asynchronous: true
}
}
},
Mixxx.TrackListColumn {
label: qsTr("Filename")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {
role: Mixxx.TrackListColumn.Role.Artist

label: qsTr("Artist")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {
role: Mixxx.TrackListColumn.Role.Title

label: qsTr("Title")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("Album")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("Track #")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("Year")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("Genre")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("Composer")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("Comment")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("Duration")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("BPM")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("Key")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("Type")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("Bitrate")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {
role: Mixxx.TrackListColumn.Role.Location

label: qsTr("Location")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("Album Artist")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("Grouping")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("File Modified")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("File Created")
delegate: DefaultDelegate {}
},
Mixxx.TrackListColumn {

label: qsTr("ReplayGain")
delegate: DefaultDelegate {}
}
]
}
}
Loading
Loading