fixing small ui things and making audio picking use portal

This commit is contained in:
Chris Cochrun 2023-09-28 06:31:29 -05:00
parent 4b6a079a4e
commit 9f4d426a8f
7 changed files with 189 additions and 151 deletions

View file

@ -276,7 +276,7 @@ Kirigami.ApplicationWindow {
} }
function load() { function load() {
const file = fileHelper.loadFile(); const file = fileHelper.loadFile("Load Presentation");
const loaded = mainPage.serviceItems.load(file); const loaded = mainPage.serviceItems.load(file);
loaded ? showPassiveNotification("Loaded: " + file) loaded ? showPassiveNotification("Loaded: " + file)
: showPassiveNotification("FAILED!"); : showPassiveNotification("FAILED!");

View file

@ -3,144 +3,146 @@ import QtQuick.Layouts 1.15
import org.kde.kirigami 2.13 as Kirigami import org.kde.kirigami 2.13 as Kirigami
Item { Item {
id: root id: root
/** /**
* listItem: Item * @brief This property holds the delegate that will be dragged around.
* The id of the delegate that we want to drag around, which *must* *
* be a child of the actual ListView's delegate * This item *must* be a child of the actual ListView's delegate.
*/ */
property Item listItem property Item listItem
/** /**
* listView: Listview * @brief This property holds the ListView that the delegate belong to.
* The id of the ListView the delegates belong to. */
*/ property ListView listView
property ListView listView
property bool containsMouse
/** /**
* Emitted when the drag handle wants to move the item in the model * @brief This signal is emitted when the drag handle wants to move the item in the model.
* The following example does the move in the case a ListModel is used *
* @code * The following example does the move in the case a ListModel is used:
* onMoveRequested: listModel.move(oldIndex, newIndex, 1) * @code{.qml}
* @endcode * onMoveRequested: listModel.move(oldIndex, newIndex, 1)
* @param oldIndex the index the item is currently at * @endcode
* @param newIndex the index we want to move the item to * @param oldIndex the index the item is currently at
*/ * @param newIndex the index we want to move the item to
signal moveRequested(int oldIndex, int newIndex) */
signal moveRequested(int oldIndex, int newIndex)
/** /**
* Emitted when the drag operation is complete and the item has been * @brief This signal is emitted when the drag operation is complete and the item has been
* dropped in the new final position * dropped in the new final position.
*/ */
signal dropped() signal dropped()
// Emitted when clicking to activate underneath mousearea implicitWidth: Kirigami.Units.iconSizes.smallMedium
signal clicked() implicitHeight: implicitWidth
signal rightClicked()
MouseArea { MouseArea {
id: mouseArea id: mouseArea
anchors.fill: parent anchors.fill: parent
drag { drag {
target: listItem target: listItem
axis: Drag.YAxis axis: Drag.YAxis
minimumY: 0 minimumY: 0
maximumY: listView.height - listItem.height }
filterChildren: true cursorShape: pressed ? Qt.ClosedHandCursor : Qt.OpenHandCursor
}
/* cursorShape: pressed ? Qt.ClosedHandCursor : Qt.OpenHandCursor */
property int startY Kirigami.Icon {
property int mouseDownY id: internal
property Item originalParent source: "handle-sort"
property int autoScrollThreshold: (listView.contentHeight > listView.height) ? listItem.height * 3 : 0 property int startY
property int mouseDownY
property Item originalParent
opacity: mouseArea.pressed || (!Kirigami.Settings.tabletMode && listItem.hovered) ? 1 : 0.6
property int listItemLastY
property bool draggingUp
color: "white"
function arrangeItem() { function arrangeItem() {
var newIndex = listView.indexAt(1, const newIndex = listView.indexAt(1, listView.contentItem.mapFromItem(mouseArea, 0, internal.mouseDownY).y);
listView.contentItem.mapFromItem(listItem, 0, 0).y +
mouseArea.mouseDownY);
if (Math.abs(listItem.y - mouseArea.startY) > height && newIndex > -1 && if (newIndex > -1 && ((internal.draggingUp && newIndex < index) || (!internal.draggingUp && newIndex > index))) {
newIndex !== index) { root.moveRequested(index, newIndex);
console.log("old index is: " + index + " and new index is: " + newIndex); }
root.moveRequested(index, newIndex); }
}
}
preventStealing: false anchors.fill: parent
onPressed: { }
listView.interactive = false; preventStealing: true
mouseArea.originalParent = listItem.parent;
listItem.parent = listView;
listItem.y = mouseArea.originalParent.mapToItem(listItem.parent, listItem.x, listItem.y).y;
mouseArea.originalParent.z = 99;
mouseArea.startY = listItem.y;
mouseArea.mouseDownY = mouse.y;
}
onPositionChanged: {
if (!pressed) {
return;
}
mouseArea.arrangeItem();
scrollTimer.interval = 500 * Math.max(0.1, (1-Math.max(mouseArea.autoScrollThreshold - listItem.y, listItem.y - listView.height + mouseArea.autoScrollThreshold + listItem.height) / mouseArea.autoScrollThreshold)); onPressed: mouse => {
scrollTimer.running = (listItem.y < mouseArea.autoScrollThreshold || internal.originalParent = listItem.parent;
listItem.y > listView.height - mouseArea.autoScrollThreshold); listItem.parent = listView;
} listItem.y = internal.originalParent.mapToItem(listItem.parent, listItem.x, listItem.y).y;
onReleased: { internal.originalParent.z = 99;
listView.interactive = true; internal.startY = listItem.y;
listItem.y = mouseArea.originalParent.mapFromItem(listItem, 0, 0).y; internal.listItemLastY = listItem.y;
listItem.parent = mouseArea.originalParent; internal.mouseDownY = mouse.y;
dropAnimation.running = true; // while dragging listItem's height could change
scrollTimer.running = false; // we want a const maximumY during the dragging time
root.dropped(); mouseArea.drag.maximumY = listView.height - listItem.height;
} }
onCanceled: released()
SequentialAnimation {
id: dropAnimation
YAnimator {
target: listItem
from: listItem.y
to: 0
duration: Kirigami.Units.longDuration
easing.type: Easing.InOutQuad
}
PropertyAction {
target: listItem.parent
property: "z"
value: 0
}
}
Timer {
id: scrollTimer
interval: 500
repeat: true
onTriggered: {
if (listItem.y < mouseArea.autoScrollThreshold) {
listView.contentY = Math.max(0, listView.contentY - Kirigami.Units.gridUnit)
} else {
listView.contentY = Math.min(listView.contentHeight - listView.height, listView.contentY + Kirigami.Units.gridUnit)
}
mouseArea.arrangeItem();
}
}
MouseArea { onPositionChanged: mouse => {
id: clickArea if (!pressed || listItem.y === internal.listItemLastY) {
anchors.fill: parent return;
hoverEnabled: true }
acceptedButtons: Qt.LeftButton | Qt.RightButton
onEntered: root.containsMouse = true internal.draggingUp = listItem.y < internal.listItemLastY
onExited: root.containsMouse = false internal.listItemLastY = listItem.y;
onClicked: {
if (mouse.button === Qt.RightButton) internal.arrangeItem();
root.rightClicked();
else // autoscroll when the dragging item reaches the listView's top/bottom boundary
root.clicked(); scrollTimer.running = (listView.contentHeight > listView.height)
} && ( (listItem.y === 0 && !listView.atYBeginning) ||
} (listItem.y === mouseArea.drag.maximumY && !listView.atYEnd) );
} }
} onReleased: mouse => {
listItem.y = internal.originalParent.mapFromItem(listItem, 0, 0).y;
listItem.parent = internal.originalParent;
dropAnimation.running = true;
scrollTimer.running = false;
root.dropped();
}
onCanceled: released()
SequentialAnimation {
id: dropAnimation
YAnimator {
target: listItem
from: listItem.y
to: 0
duration: Kirigami.Units.longDuration
easing.type: Easing.InOutQuad
}
PropertyAction {
target: listItem.parent
property: "z"
value: 0
}
}
Timer {
id: scrollTimer
interval: 50
repeat: true
onTriggered: {
if (internal.draggingUp) {
listView.contentY -= Kirigami.Units.gridUnit;
if (listView.atYBeginning) {
listView.positionViewAtBeginning();
stop();
}
} else {
listView.contentY += Kirigami.Units.gridUnit;
if (listView.atYEnd) {
listView.positionViewAtEnd();
stop();
}
}
internal.arrangeItem();
}
}
}
}

View file

@ -107,6 +107,7 @@ FocusScope {
implicitHeight: Kirigami.Units.gridUnit * 10 implicitHeight: Kirigami.Units.gridUnit * 10
anchors.right: previewSlide.left anchors.right: previewSlide.left
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color: "white"
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onPressed: previousSlideAction() onPressed: previousSlideAction()
@ -141,6 +142,7 @@ FocusScope {
implicitHeight: Kirigami.Units.gridUnit * 10 implicitHeight: Kirigami.Units.gridUnit * 10
anchors.left: previewSlide.right anchors.left: previewSlide.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color: "white"
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onPressed: nextSlideAction() onPressed: nextSlideAction()

View file

@ -263,7 +263,7 @@ Item {
} }
} }
Kirigami.ListItemDragHandle { Presenter.DragHandle {
id: dragHandle id: dragHandle
anchors.left: parent.left anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter

View file

@ -208,6 +208,23 @@ Item {
text: song.vorder text: song.vorder
padding: 10 padding: 10
onEditingFinished: updateVerseOrder(text); onEditingFinished: updateVerseOrder(text);
background: Rectangle {
color: songVorderField.enabled ? Kirigami.Theme.backgroundColor :
song.vorder.trim().length === 0 ?
Kirigami.Theme.negativeBackgroundColor :
Kirigami.Theme.backgroundColor
implicitWidth: parent.width
implicitHeight: parent.height
radius: 10
border.color: {
if (song.vorder.trim().length === 0)
return Kirigami.Theme.negativeTextColor
else if (songVorderField.enabled)
return Kirigami.Theme.highlightColor
else
return Kirigami.Theme.positiveColor
}
}
} }
Controls.Label { Controls.Label {
@ -251,6 +268,18 @@ Item {
editorTimer.running = false; editorTimer.running = false;
} }
onPressed: editorTimer.running = true onPressed: editorTimer.running = true
background: Rectangle {
color: Kirigami.Theme.backgroundColor
implicitWidth: parent.width
implicitHeight: parent.height
radius: 10
border.color: {
if (songVorderField.enabled)
return Kirigami.Theme.highlightColor
else
return Kirigami.Theme.positiveColor
}
}
} }
} }
@ -325,7 +354,7 @@ Item {
Layout.fillHeight: true Layout.fillHeight: true
text: "Audio" text: "Audio"
icon.name: "folder-music-symbolic" icon.name: "folder-music-symbolic"
onClicked: audioFileDialog.open() onClicked: updateAudioFile()
} }
} }
} }
@ -465,7 +494,8 @@ Item {
songProxyModel.songModel.updateVerseOrder(songIndex, vorder) songProxyModel.songModel.updateVerseOrder(songIndex, vorder)
} }
function updateAudioFile(file) { function updateAudioFile() {
const file = fileHelper.loadFile("Pick Audio");
songProxyModel.songModel.updateAudio(songIndex, file); songProxyModel.songModel.updateAudio(songIndex, file);
} }

View file

@ -92,10 +92,12 @@ mod file_helper {
} }
#[qinvokable] #[qinvokable]
pub fn load_file(self: Pin<&mut Self>) -> QUrl { pub fn load_file(
let file = FileDialog::new() self: Pin<&mut Self>,
.set_title("Load Presentation") title: QString,
.pick_file(); ) -> QUrl {
let title = title.to_string();
let file = FileDialog::new().set_title(title).pick_file();
if let Some(file) = file { if let Some(file) = file {
println!("loading-file: {:?}", file); println!("loading-file: {:?}", file);
let mut string = let mut string =

View file

@ -859,8 +859,10 @@ pub mod song_model {
let mut verse_name = ""; let mut verse_name = "";
debug!(verse = verse); debug!(verse = verse);
for word in keywords.clone() { for word in keywords.clone() {
let end_verse = verse.get(1..2).unwrap(); let end_verse =
let beg_verse = verse.get(0..1).unwrap(); verse.get(1..2).unwrap_or_default();
let beg_verse =
verse.get(0..1).unwrap_or_default();
println!( println!(
"verse: {:?}, beginning: {:?}, end: {:?}, word: {:?}", "verse: {:?}, beginning: {:?}, end: {:?}, word: {:?}",
verse, beg_verse, end_verse, word verse, beg_verse, end_verse, word