295 lines
11 KiB
QML
295 lines
11 KiB
QML
import QtQuick 2.13
|
|
import QtQuick.Dialogs 1.0
|
|
import QtQuick.Controls 2.0 as Controls
|
|
import QtQuick.Window 2.13
|
|
import QtQuick.Layouts 1.2
|
|
import QtQml.Models 2.12
|
|
import QtMultimedia 5.15
|
|
import QtAudioEngine 1.15
|
|
import org.kde.kirigami 2.13 as Kirigami
|
|
import "./" as Presenter
|
|
|
|
ColumnLayout {
|
|
id: root
|
|
|
|
property var selectedItem: serviceItemList.selected
|
|
|
|
Rectangle {
|
|
id: headerBackground
|
|
color: Kirigami.Theme.backgroundColor
|
|
height: 40
|
|
opacity: 1.0
|
|
Layout.fillWidth: true
|
|
|
|
Kirigami.Heading {
|
|
id: serviceTitle
|
|
text: "Service List"
|
|
anchors.centerIn: headerBackground
|
|
padding: 5
|
|
level: 3
|
|
}
|
|
}
|
|
|
|
DropArea {
|
|
id: serviceDropEnd
|
|
Layout.fillHeight: true
|
|
Layout.fillWidth: true
|
|
onDropped: {
|
|
print("DROPPED AT END");
|
|
appendItem(dragItemTitle,
|
|
dragItemType,
|
|
dragItemBackground,
|
|
dragItemBackgroundType,
|
|
dragItemText,
|
|
dragItemIndex);
|
|
}
|
|
keys: ["library"]
|
|
|
|
ListView {
|
|
id: serviceItemList
|
|
anchors.fill: parent
|
|
/* model: serviceItemModel */
|
|
/* delegate: Kirigami.DelegateRecycler { */
|
|
/* width: serviceItemList.width */
|
|
/* sourceComponent: itemDelegate */
|
|
/* } */
|
|
clip: true
|
|
spacing: 3
|
|
property int dragItemIndex
|
|
|
|
addDisplaced: Transition {
|
|
NumberAnimation {properties: "x, y"; duration: 100}
|
|
}
|
|
moveDisplaced: Transition {
|
|
NumberAnimation { properties: "x, y"; duration: 100 }
|
|
}
|
|
remove: Transition {
|
|
NumberAnimation { properties: "x, y"; duration: 100 }
|
|
NumberAnimation { properties: "opacity"; duration: 100 }
|
|
}
|
|
|
|
removeDisplaced: Transition {
|
|
NumberAnimation { properties: "x, y"; duration: 100 }
|
|
}
|
|
|
|
displaced: Transition {
|
|
NumberAnimation {properties: "x, y"; duration: 100}
|
|
}
|
|
|
|
model: DelegateModel {
|
|
id: visualModel
|
|
model: serviceItemModel
|
|
delegate: DropArea {
|
|
id: serviceDrop
|
|
implicitWidth: serviceItemList.width
|
|
height: 50
|
|
onEntered: (drag) => {
|
|
/* dropPlacement(drag); */
|
|
const from = (drag.source as visServiceItem)
|
|
visualModel.items.move(dragItemIndex, index);
|
|
}
|
|
onDropped: (drag) => {
|
|
print("DROPPED IN ITEM AREA: " + drag.keys);
|
|
print(dragItemIndex + " " + index);
|
|
const hlIndex = serviceItemList.currentIndex;
|
|
if (drag.keys === ["library"]) {
|
|
addItem(index,
|
|
dragItemTitle,
|
|
dragItemType,
|
|
dragItemBackground,
|
|
dragItemBackgroundType,
|
|
dragItemText,
|
|
dragItemIndex);
|
|
} else if (drag.keys === ["serviceitem"]) {
|
|
moveRequested(dragItemIndex, index);
|
|
if (hlIndex === dragItemIndex)
|
|
serviceItemList.currentIndex = index;
|
|
else if (hlIndex === index)
|
|
serviceItemList.currentIndex = index + 1;
|
|
}
|
|
}
|
|
keys: ["library","serviceitem"]
|
|
|
|
Kirigami.BasicListItem {
|
|
id: visServiceItem
|
|
width: serviceDrop.width
|
|
height: serviceDrop.height
|
|
anchors {
|
|
horizontalCenter: parent.horizontalCenter
|
|
verticalCenter: parent.verticalCenter
|
|
}
|
|
label: name
|
|
subtitle: type
|
|
hoverEnabled: false
|
|
supportsMouseEvents: false
|
|
backgroundColor: {
|
|
if (serviceItemList.currentIndex === index ||
|
|
mouseHandler.containsMouse)
|
|
Kirigami.Theme.highlightColor;
|
|
else
|
|
Kirigami.Theme.backgroundColor;
|
|
}
|
|
textColor: {
|
|
if (serviceItemList.currentIndex === index ||
|
|
mouseHandler.containsMouse)
|
|
activeTextColor;
|
|
else
|
|
Kirigami.Theme.textColor;
|
|
}
|
|
|
|
states: [
|
|
State {
|
|
when: mouseHandler.drag.active
|
|
ParentChange {
|
|
target: visServiceItem
|
|
parent: serviceItemList
|
|
}
|
|
|
|
PropertyChanges {
|
|
target: visServiceItem
|
|
backgroundColor: Kirigami.Theme.backgroundColor
|
|
textColor: Kirigami.Theme.textColor
|
|
anchors.verticalCenter: undefined
|
|
anchors.horizontalCenter: undefined
|
|
}
|
|
}
|
|
]
|
|
|
|
/* Drag.dragType: Drag.Automatic */
|
|
Drag.active: mouseHandler.drag.active
|
|
Drag.hotSpot.x: width / 2
|
|
Drag.hotSpot.y: height / 2
|
|
Drag.keys: ["serviceitem"]
|
|
|
|
MouseArea {
|
|
id: mouseHandler
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
|
preventStealing: true
|
|
|
|
drag {
|
|
target: visServiceItem
|
|
axis: Drag.YAxis
|
|
/* minimumY: root.y */
|
|
/* maximumY: serviceItemList.height - serviceDrop.height */
|
|
smoothed: false
|
|
}
|
|
|
|
drag.onActiveChanged: {
|
|
if (mouseHandler.drag.active) {
|
|
dragItemIndex = index;
|
|
}
|
|
}
|
|
|
|
/* onPositionChanged: { */
|
|
/* if (!pressed) { */
|
|
/* return; */
|
|
/* } */
|
|
/* mouseArea.arrangeItem(); */
|
|
/* } */
|
|
|
|
onPressed: {
|
|
serviceItemList.interactive = false;
|
|
}
|
|
|
|
onClicked: {
|
|
if (mouse.button === Qt.RightButton)
|
|
rightClickMenu.popup();
|
|
else {
|
|
serviceItemList.currentIndex = index;
|
|
currentServiceItem = index;
|
|
changeServiceItem(index);
|
|
}
|
|
}
|
|
|
|
onReleased: {
|
|
print("should drop");
|
|
visServiceItem.Drag.drop();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Presenter.DragHandle { */
|
|
/* id: mouseHandler */
|
|
/* anchors.fill: parent */
|
|
/* listItem: serviceItem */
|
|
/* listView: serviceItemList */
|
|
/* onMoveRequested: { */
|
|
/* print(oldIndex, newIndex); */
|
|
/* serviceItemModel.move(oldIndex, newIndex); */
|
|
/* } */
|
|
/* onDropped: { */
|
|
/* } */
|
|
/* onClicked: { */
|
|
/* serviceItemList.currentIndex = index; */
|
|
/* currentServiceItem = index; */
|
|
/* changeServiceItem(index); */
|
|
/* } */
|
|
/* onRightClicked: rightClickMenu.popup() */
|
|
/* } */
|
|
|
|
|
|
|
|
Controls.Menu {
|
|
id: rightClickMenu
|
|
x: mouseHandler.mouseX
|
|
y: mouseHandler.mouseY + 10
|
|
Kirigami.Action {
|
|
text: "delete"
|
|
onTriggered: serviceItemModel.removeItem(index)
|
|
}
|
|
}
|
|
|
|
function moveRequested(oldIndex, newIndex) {
|
|
serviceItemModel.move(oldIndex, newIndex);
|
|
}
|
|
|
|
function dropPlacement(drag) {
|
|
print(drag.y);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
Kirigami.WheelHandler {
|
|
id: wheelHandler
|
|
target: serviceItemList
|
|
filterMouseEvents: true
|
|
keyNavigationEnabled: true
|
|
}
|
|
|
|
Controls.ScrollBar.vertical: Controls.ScrollBar {
|
|
anchors.right: serviceItemList.right
|
|
anchors.rightMargin: 0
|
|
active: hovered || pressed
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function addItem(index, name, type,
|
|
background, backgroundType, text, itemID) {
|
|
const newtext = songsqlmodel.getLyricList(itemID);
|
|
print("adding: " + name + " of type " + type);
|
|
serviceItemModel.insertItem(index, name,
|
|
type, background,
|
|
backgroundType, newtext);
|
|
}
|
|
|
|
function appendItem(name, type, background, backgroundType, text, itemID) {
|
|
print("adding: " + name + " of type " + type);
|
|
let lyrics;
|
|
if (type === "song") {
|
|
print(itemID);
|
|
lyrics = songsqlmodel.getLyricList(itemID);
|
|
print(lyrics);
|
|
}
|
|
|
|
print(background);
|
|
print(backgroundType);
|
|
|
|
serviceItemModel.addItem(name, type, background,
|
|
backgroundType, lyrics);
|
|
}
|
|
}
|